我有一个包含约 200 个 99x20 频率数组的数据集,每一列的总和为 1。我已经使用像 这样的热图绘制了这些图.每个数组都非常稀疏,每 99 个位置只有大约 1-7/20 个值是非零值。
但是,我想根据它们的频率分布的相似程度(最小欧氏距离或类似的东西)对这些样本进行聚类。我将每个 99x20 的数组排列成一个 1980x1 的数组,并将它们聚合成一个 200x1980 的观察数组。
在找到集群之前,我尝试使用 scipy.cluster.vq.whiten
对数据进行白化。 whiten
通过方差对每一列进行标准化,但由于我将数据数组展平的方式,我有一些 (8) 列的频率全为零,因此方差为零。因此,白化数组具有无限值,质心查找失败(或给出 ~200 个质心)。
我的问题是,我应该如何解决这个问题?到目前为止,我已经尝试过了
- 不要白化数据。这会导致 k-means 每次运行时都会给出不同的质心(有些符合预期),尽管大大增加了
iter
关键字。 - 在我展平它们之前调换数组。零方差列只是移动。
是否可以只删除其中一些零方差列?这会以任何方式偏向聚类吗?
编辑:我也尝试过使用我自己的美白功能
for i in range(arr.shape[1]):
if np.abs(arr[:,i].std()) < 1e-8: continue
arr[:,i] /= arr[:,i].std()
这似乎可行,但我不确定这是否会以任何方式影响聚类。
谢谢
最佳答案
删除全 0 的列不应使数据产生偏差。如果你有N维数据,但是一维都是同一个数,那和有N-1维数据是完全一样的。这个有效维度的属性叫做 rank .
考虑 3-D 数据,但所有数据点都在 x=0 平面上。你能看出这与 2D 数据完全一样吗?
关于Python - 使用 K-means 聚类。一些方差为零的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15553035/