Scikit-learn kmeans 聚类

Posted

技术标签:

【中文标题】Scikit-learn kmeans 聚类【英文标题】:Scikit-learn kmeans clustering 【发布时间】:2015-02-20 01:54:31 【问题描述】:

我应该对一些数据进行 kmeans 集群实现。我从http://glowingpython.blogspot.com/2012/04/k-means-clustering-with-scipy.html 看到的示例在 2 列中显示了他们的测试数据......但是,我给出的数据是 68 个具有 78 个特征的主题(所以 68x78 矩阵)。我应该如何为此创建适当的输入?

我基本上只是尝试输入矩阵,但它似乎没有做我想要的......我不知道为什么会这样。我很困惑该怎么做。

        data = np.rot90(data)
        centroids,_ = kmeans(data,2)
        # assign each sample to a cluster
        idx,_ = vq(data,centroids)

        # some plotting using numpy's logical indexing
        plot(data[idx==0,0],data[idx==0,1],'ob',
             data[idx==1,0],data[idx==1,1],'or')
        plot(centroids[:,0],centroids[:,1],'sg',markersize=8)
        show()

老实说,我不知道要给你看什么样的代码。我告诉你的数据格式已经描述过了。否则和我链接的教程一样。

【问题讨论】:

显示您实际尝试过的代码。除了“似乎没有按照我的意愿行事”之外,您还看到了哪些具体的错误消息或意外行为? i.imgur.com/ILmPQS3.png 我不明白为什么一些更接近一个集群的人被标记为另一个......老实说,我有点希望他们会更加分离(但我想这是可能的他们不是)。 看起来您使用的是 scipy 而不是 scikit-learn。应该可能改变标签。我自己对kmeans还很陌生。话虽如此,78 个功能似乎很多。都是 78 个数字、非分类变量吗? 是的,他们是。话虽如此,我的数据是否组织正确?这个例子使它看起来像 x,y 坐标。我不知道我的数据是如何绘制的。我只有 68 个长度为 78 的向量。我觉得我真的错过了一些东西并变得沮丧。 您只绘制了 78 个维度中的 2 个。在这个 2 维 投影 中看起来更接近红色质心的蓝色点实际上更接近整个 78 维空间中的蓝色质心。 【参考方案1】:

您的可视化仅使用前两个维度

这就是为什么这些点看起来是“不正确的”——它们在不同的维度上更接近。

看看接下来的两个维度:

plot(data[idx==0,2],data[idx==0,3],'ob',
         data[idx==1,2],data[idx==1,3],'or')
    plot(centroids[:,2],centroids[:,3],'sg',markersize=8)
    show()

...对所有剩余的 78 个维度重复...

在这么多特征下,(平方)欧几里得距离变得毫无意义,k-means 结果往往变得与随机凸分区一样好。

要获得更具代表性的视图,请考虑使用MDS 将数据投影到二维中以进行可视化。只需 68 个主题,它应该可以相当快地工作。

请在您的问题中包含可视化。我们没有您的数据。

【讨论】:

以上是关于Scikit-learn kmeans 聚类的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 进行聚类

是否可以在 Python(Scikit-Learn)中对 KMeans 中的非浮点数据进行聚类?

使用 Scikit-learn KMeans 对多维数组进行聚类

[机器学习与scikit-learn-23]:算法-聚类-KMeans算法的工作原理

Scikit-learn的kmeans聚类

如何从 scikit-learn KMeans 中获取聚类中心的文本?