[编辑:我知道它也更快,因为该功能是用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);
}
}
}