Python - 使用 K-means 聚类。一些方差为零的列

标签 python cluster-analysis bioinformatics k-means variance

我有一个包含约 200 个 99x20 频率数组的数据集,每一列的总和为 1。我已经使用像 this 这样的热图绘制了这些图.每个数组都非常稀疏,每 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/

相关文章:

python - 根据字符宽度将字符串分成多行(python)

cluster-analysis - DBSCAN 集群 - 当一个集群的边界点被认为是另一个集群的核心点时会发生什么

algorithm - 除了 Levenshtein 之外,用于有序词集和后续聚类的更好的距离度量

linux - 关于构建和运行 Boot2docker 设置的一些问题

python - 反向互补DNA

python - 在 Python 请求 get 或 post 方法上干净地设置 max_retries

python - 如何从 Python 将竖线 (|) 添加到 yaml 文件中

python - 通过相同的键连接大型字典

python - Geoalchemy2 和 ST_Within - 点和多边形之间的类型不匹配?

具有局部性的 Java 分布式对象?