【发布时间】:2016-02-08 00:36:02
【问题描述】:
我使用 sklearn Kmeans 对数据样本(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)。 “种子”的第一列包含集群内的样本数(此处无关)。
“数据”是样本(400kx206)。数据的第一列包含集群编号。
问题:这是使用循环完成的(不是那么“numpy”)。是否可以“矢量化”它?
【问题讨论】:
-
这实际上是相当合理的代码。与
cdist内部完成的计算量相比,您的 for 循环相对较小。由于cdist是一个相当理想的速度增益,所以不太可能很大。 -
@Ophion - 可以避免重复的线性搜索
data[:, 0]==i,将复杂度从 O(n**2) 降低到 O(n log(n)) 甚至 O(n) . -
@moarningsun 是的,但什么是可能的和什么是可用的是两件不同的事情,特别是考虑到这是 O(n*m) 而不是 O(n^2) 和 n
-
@Ophion 在我的解决方案中对此进行了快速基准测试。
-
@Divakar 查看我在完整测试集上的更新答案。
标签: python arrays numpy vectorization