我使用sklearnkmeans对数据样本(400 k个样本,维度=205,200个集群)进行了聚类。
我想知道,对于每个集群,集群中心和集群最远样本之间的最大距离,以便了解集群的“大小”。 这是我的代码:
import numpy as np
import scipy.spatial.distance as spd
diam = np.empty([200])
for i in range(200):
diam[i] = spd.cdist(seed[np.newaxis, i, 1:], data[data[:, 0]==i][:,1:]).max()
“种子”是群集中心(200x206)。“seed”的第一列包含集群中的样本数(此处不相关)。
“数据”是样品(400kx206)。数据的第一列包含集群号。
问题:这是使用循环(不是这样的“numpy”)完成的。是否可以“矢量化”它?
我们可以更聪明地编制索引,节省大约4倍的成本。在
首先,让我们构建一些正确形状的数据:
原答案时间:
^{pr2}$莫宁森的回答是:
分析者的回答是:
正如我们所看到的,除了更大的内存占用外,矢量化解决方案并没有真正获得任何好处。为了避免这种情况,我们需要回到原来的答案,这是做这些事情的正确方法,并尝试减少索引的数量:
仔细检查答案:
这就是假设python循环不好的问题。它们通常是,但并非在所有情况下。在
与@Divakar非常相似,但不必排序:
众所周知,
ufunc.at
速度很慢,所以看看哪个更快会很有趣。在这里有一个矢量化方法-
运行时测试并验证输出-
定义函数:
^{pr2}$验证输出:
运行时:
相关问题 更多 >
编程相关推荐