python - 使用 NumPY 改进 KNN 线性搜索效率

标签 python numpy machine-learning

我正在尝试计算测试集中每个点与训练集中每个点的距离:

这就是我的循环现在的样子:

 for x in testingSet
    for y in trainingSet
        print numpy.linalg.norm(x-y)

其中testingSet和trainingSet是numpy数组,其中两个集合的每一行保存一个示例的特征数据。

但是,它的运行速度非常慢,需要 10 多分钟,因为我的数据集较大(测试集为 3000,训练集约为 10,000)。这与我的方法有关还是我错误地使用了 numPY?

最佳答案

这是因为你天真地迭代了数据,而 Python 中的循环速度很慢。相反,使用 sklearn pairwise distance functions ,或者更好 - 使用 sklearn efficient nearest neighbour搜索(如 BallTree 或 KDTree)。如果你不想用sklearn,还有一个module in scipy 。最后你可以用“矩阵技巧”来计算这个,因为

|| x - y ||^2 = <x-y, x-y> = <x,x> + <y,y> - 2<x,y>

你可以这样做(假设你的数据是以矩阵形式给出的 X 和 Y):

X2 = (X**2).sum(axis=1).reshape((-1, 1))
Y2 = (Y**2).sum(axis=1).reshape((1, -1))
distances = np.sqrt(X2 + Y2 - 2*X.dot(Y.T))

关于python - 使用 NumPY 改进 KNN 线性搜索效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457604/

相关文章:

python - 使用 scipy.sparse.csc_matrix.toarray() 将稀疏矩阵转换为数组时出错

python - xgboost 的哪些功能受种子(random_state)影响?

java - 为什么 % 运算符在 Python 和 Java 中的工作方式不同?

python - 尝试在 Python 中使用 LetsEncrypt 运行 SSL 包装的 BaseHTTPServer 失败

python - 来自 cStringIO 对象的 Numpy 数组并避免复制

machine-learning - 在主题建模中使用 Word2vec 输出作为 LDA 的输入

python - 如何在 clf.predict_proba() 中找到对应的类

python - Numpy:如何为不同索引的数组的每一列设置column[index:]=value?

python - 使用 Python 从 windows media player 获取当前播放的歌曲

python - 关于如何在单词列表上创建随机森林分类器有什么建议吗?