Data structures 如何优化用于计算K-最近邻算法的算法?
KNN是一种简单易行的算法:Data structures 如何优化用于计算K-最近邻算法的算法?,data-structures,time-complexity,knn,Data Structures,Time Complexity,Knn,KNN是一种简单易行的算法: # for each test datapoint in X_test: # calculate its distance from every points in X_train # find the top k most closest points # take majority vote of the k neighbors and use that as prediction for this test data point
# for each test datapoint in X_test:
# calculate its distance from every points in X_train
# find the top k most closest points
# take majority vote of the k neighbors and use that as prediction for this test data point
但我认为时间复杂性还不够好。算法在实际应用中是如何优化的?(比如它使用的是什么技巧或数据结构?k-最近邻算法与其他学习方法不同,因为没有 从训练实例中归纳出模型。数据保持原样;他们 它们只是存储在内存中 将遗传算法与k-NN相结合以提高性能。另一种成功的技术称为实例 同时也提出了面对选择、高效存储和噪声的问题 k-NN。您可以尝试这样做:当一个新实例应该被分类时;而不是 涉及所有学习实例来检索k-邻域,这将增加 计算时间,首先执行实例的较小子集的选择 您也可以尝试:
k-最近邻算法不同于其他学习方法,因为没有 从训练实例中归纳出模型。数据保持原样;他们 它们只是存储在内存中 将遗传算法与k-NN相结合以提高性能。另一种成功的技术称为实例 同时也提出了面对选择、高效存储和噪声的问题 k-NN。您可以尝试这样做:当一个新实例应该被分类时;而不是 涉及所有学习实例来检索k-邻域,这将增加 计算时间,首先执行实例的较小子集的选择 您也可以尝试:
您所描述的是使用O(大小(X_测试)*大小(X_序列)*d)的蛮力kNN计算,其中d是特征向量中的维数 更有效的解决方案是使用空间索引对X_列车数据进行索引。这通常会将单个查找减少到O(log(size(X_train))*d)甚至O(log(size(X_train))+d) 常见的空间索引包括:
- (它们经常被使用,但与“d”的比例很差)
- ,例如
- (通常对于较大的“d”来说效率不高,但例如,在d=1000的情况下工作良好,并且具有极好的删除/插入时间(免责声明,这是我自己的工作))
- (我真的不太了解他们)
- (查找高“d”的速度非常快,但建立时间很长
如果您正在寻找上述一些空间索引的Java实现,请查看。您描述的是使用O(大小(X_测试)*大小(X_序列)*d)的蛮力kNN计算,其中d是特征向量中的维数 更有效的解决方案是使用空间索引对X_列数据进行索引。这通常会将单个查找减少到O(log(size(X_列))*d)甚至O(log(size(X_列))+d) 常见的空间索引包括:
- (它们经常被使用,但与“d”的比例很差)
- ,例如
- (通常对于较大的“d”来说效率不高,但例如,在d=1000的情况下工作良好,并且具有极好的删除/插入时间(免责声明,这是我自己的工作))
- (我真的不太了解他们)
- (查找高“d”的速度非常快,但建立时间很长