编程语言
首页 > 编程语言> > Python – 使用K-means进行聚类.某些列的方差为零

Python – 使用K-means进行聚类.某些列的方差为零

作者:互联网

我有一个由~200个99×20频率组成的数据集,每列总和为1.我用热像图画了这些.每个阵列非常稀疏,每99个位置只有大约1-7 / 20个值非零.

但是,我想根据频率曲线的相似程度(最小欧氏距离或类似距离)对这些样本进行聚类.我已经将每个99×20阵列安排到一个1980×1阵列中,并将它们聚合成一个200×1980的观察阵列.

在找到群集之前,我尝试使用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.

考虑三维数据,但所有数据点都在x = 0平面上.你能看到这与2D数据完全一样吗?

标签:python,cluster-analysis,k-means,bioinformatics,variance
来源: https://codeday.me/bug/20190620/1244875.html