【问题标题】:Using scipy kmeans for cluster analysis使用 scipy kmeans 进行聚类分析
【发布时间】:2017-11-23 10:33:38
【问题描述】:

我想了解scipy.cluster.vq.kmeans

有许多点分布在二维空间中,问题是将它们分组为集群。这个问题在阅读this question 时引起了我的注意,我认为scipy.cluster.vq.kmeans 将是可行的方法。

这是数据:

使用以下代码,目标是获取 25 个集群中每个集群的中心点。

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.vq import vq, kmeans, whiten

pos = np.arange(0,20,4)
scale = 0.4
size = 50
x = np.array([np.random.normal(i,scale,size*len(pos)) for i in pos]).flatten()
y = np.array([np.array([np.random.normal(i,scale,size) for i in pos]) for j in pos]).flatten()


plt.scatter(x,y, s=16, alpha=0.4)


#perform clustering with scipy.cluster.vq.kmeans
features = np.c_[x,y]

# take raw data to cluster
clusters = kmeans(features,25)
p = clusters[0]
plt.scatter(p[:,0],p[:,1], s=81, c="crimson")

# perform whitening (normalization to std) first
whitened = whiten(features) 
clustersw = kmeans(whitened,25)
q = clustersw[0]*features.std(axis=0)
plt.scatter(q[:,0],q[:,1], s=25, c="gold")

plt.show()

结果如下所示:

红点表示没有白化的聚类中心位置,黄点表示使用白化的簇中心位置。虽然它们不同,但主要问题是它们显然不是都在正确的位置。因为集群都被很好地分开了,我很难理解为什么这个简单的集群会失败。

我阅读了this question,其中报告了kmeans 没有给出准确的结果,但答案并不令人满意。将kmeans2minit='points' 一起使用的建议解决方案也不起作用;即kmeans2(features,25, minit='points') 给出与上述类似的结果。

所以问题是,有没有办法用scipy.cluster.vq.kmeans 执行这个简单的聚类问题?如果是这样,我将如何确保获得正确的结果。

【问题讨论】:

  • 我只是在做同样的事情(受同样问题的启发)。通过为kmeansiter 参数使用较大的值,我得到了更可靠的结果,高达iter=800。是的,这让它变慢了。
  • 真的吗?使用iter=800 我得到的大致相同; image here.
  • 我的集群的方差比你的高。当我收紧集群时,我不得不进一步提高iter。我刚刚运行了一个示例,其中iter=2000 还不够,但iter=10000 找到了预期的中心。 (我并不是说这是解决问题的好方法;我只是在探索如何让kmeans 工作。)
  • 好的,所以对于上面的例子,使用 iter=4000 就可以了。如果您愿意,请随时提供该答案作为答案。当然,了解将 iter 设置为 10、50 或 10000 背后的逻辑会更有趣,但我认为它仍然回答了这个问题。

标签: python numpy scipy cluster-analysis k-means


【解决方案1】:

在这样的数据上,白化不会产生影响:您的 x 轴和 y 轴已经进行了类似的缩放。

K-means 不能可靠地找到全局最优值。它往往会陷入局部最优。这就是为什么使用多次运行并仅保持最佳拟合并尝试复杂的初始化过程(如 k-means++)的原因。

【讨论】:

  • 您能否详细说明“像 k-means++ 这样的复杂初始化过程”是什么意思?
  • Google for k-means++
  • 好的,对不起,我的意思是从问题中得到问题,实现 k-means++ 的方法是什么?有 scipy 功能吗?我需要更改为 scikit-learn 或其他库吗?因此,这个问题的答案是否是仅使用 scipy 工具是不可能的?
  • 您需要了解问题,而不仅仅是找到有时更好,有时没有的功能/选项。
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 2019-11-27
  • 2019-01-06
  • 2018-02-05
  • 2016-05-11
  • 2018-01-21
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多