K最近邻搜索插入符R实现

时间:2017-12-03 14:01:31

标签: r optimization machine-learning time-complexity r-caret

[编辑:我知道它也更快,因为该功能是用C语言编写的,但我想知道它是否对所有训练实例进行强力搜索或更复杂的事情]

我正在R中实现KNN算法用于研究目的。 我还通过与插入符实现进行比较来检查代码的正确性。

问题在于两个版本的执行时间。我的版本似乎需要花费很多时间,而插入符号实现速度非常快(即使交叉验证有10倍)。

为什么呢?我正在计算我的测试实例与训练测试实例的每个欧氏距离。这意味着我正在进行NxM距离计算(其中N是我的测试实例,M是我的训练实例):

for (i in 1:nrow(test)){
    distances <- c()
    classes <- c()
    for(j in 1:nrow(training)){
        d = calculateDistance(test[i,], training[j,])
        distances <- c(distances, d)
        classes <- c(classes, training[j,][[15]])
    }
}

插入符号实现是否使用了一些近似搜索?或者是精确搜索,例如使用kd-tree?如何加快搜索速度?我有14个问题的功能,但我一直在读,kd-tree建议用于1到5个功能的问题。

编辑:

我找到了R( VR_knn )调用的C函数,它是pretty complex for me to understand, maybe someone can help

无论如何,我已经在cpp中写了一个强力搜索,这似乎比我以前的R版本更快,(但不像插入符号C版本那么快)

#include <Rcpp.h>
using namespace Rcpp;

double distance(NumericVector x1, NumericVector x2){
     int vectorLen = x1.size();
     double sum = 0;
     for(int i=0;i<vectorLen-1;i++){
         sum = sum + pow((x1.operator()(i)-x2.operator()(i)),2);
     }
     return sqrt(sum);

}

// [[Rcpp::export]]
void searchCpp(NumericMatrix training, NumericMatrix test) {
    int numRowTr = training.rows();
    int numColTr = training.cols();
    int numRowTe = test.rows();
    int numColTe = test.cols();
    for (int i=0;i<numRowTe;i++)
    {
        NumericVector test_i = test.row(i);
        NumericVector distances = NumericVector(numRowTe);
        for (int j=0;j<numRowTr;j++){
            NumericVector train_j = training.row(j);
            double dist = distance(test_i, train_j);
            distances.insert(i,dist);
        }
    }
}

0 个答案:

没有答案