下面的欧几里德距离算法创建MxN输入矩阵的行之间的距离的MxM矩阵(表示某个N维空间中的点).该算法的速度为O(m^2).如果只对彼此最接近的行(即点)感兴趣,这能得到改进吗?(我的下游任务包括执行K-NN等)

import numpy as np


vectors = np.random.randn(100, 20)
m = vectors.shape[0]

distances = np.zeros([m, m])
for i in range(m):
    vec = vectors[i]
    distances[i] = [np.linalg.norm(vec - vectors[j]) for j in range(m)]

推荐答案

我建议利用scipy的浓缩距离矩阵,而不是成对比较的for循环.特别是,

from scipy.spatial.distance import pdist, squareform
distances = squareform(pdist(vectors))

提供约85倍的加速比!文档可以在here上找到.

从根本上说,复杂性似乎仍然是二次的(因为您需要将vectors个元素中的每个元素相互比较).然而,该实现利用了对称性和每个元素到其自身的距离为0的事实,从而仅计算上三角子矩阵,然后将其沿对角线镜像以获得二次距离矩阵.

您的代码运行时间为71ms,而SciPy运行时间为0.83ms;前面提到的加速85倍.

无论如何,如果您try 运行knn,您可能想要考虑scikit-learn,在那里您可以简单地提供vectors作为X,如here所示.

Python相关问答推荐

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

从dict的列中分钟

如何在Python中并行化以下搜索?

基于字符串匹配条件合并两个帧

在含噪声的3D点网格中识别4连通点模式

在ubuntu上安装dlib时出错

多处理队列在与Forking http.server一起使用时随机跳过项目

如何并行化/加速并行numba代码?

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何指定列数据类型

CommandeError:模块numba没有属性generated_jit''''

如何使用两个关键函数来排序一个多索引框架?

Python Pandas—时间序列—时间戳缺失时间精确在00:00

跳过嵌套JSON中的级别并转换为Pandas Rame

从源代码显示不同的输出(机器学习)(Python)

SpaCy:Regex模式在基于规则的匹配器中不起作用

将像素信息写入文件并读取该文件

如何在python tkinter中绑定键盘上的另一个回车?

如何从一个维基页面中抓取和存储多个表格?

如何定义一个将类型与接收该类型的参数的可调用进行映射的字典?