【问题标题】:K-means Clustering in PythonPython中的K-means聚类
【发布时间】:2016-02-01 05:27:41
【问题描述】:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


x = [916,684,613,612,593,552,487,484,475,474,438,431,421,418,409,391,389,388,
    380,374,371,369,357,356,340,338,328,317,316,315,313,303,283,257,255,254,245,
    234,232,227,227,222,221,221,219,214,201,200,194,169,155,140]

kmeans = KMeans(n_clusters=4)
a = kmeans.fit(np.reshape(x,(len(x),1)))
centroids = kmeans.cluster_centers_

labels = kmeans.labels_

print(centroids)
print(labels)

colors = ["g.","r.","y.","b."]

for i in range(len(x)):
    plt.plot(x[i], colors[labels[i]], markersize = 10)

plt.scatter(centroids[:, 0], marker = "x", s = 150, linewidths = 5, zorder = 10)
plt.show()

上面的代码显示了 4 个集群,但它们绝对不是我想要的。

我也收到了一个错误,这使得情况变得更糟。我得到的输出如下图所示。

我得到的错误是:TypeError: scatter() missing 1 required positional argument: 'y' 错误没什么大不了的,因为无论如何我都不喜欢我拥有的东西。

下图是我希望集群输出的样子。

【问题讨论】:

    标签: python cluster-analysis k-means


    【解决方案1】:

    由于您只使用一维,您应该了解您正在计算的确切内容。使用 KMeans,您可以提取四个平均值;您可以在这里做的最好的事情是使用显示这些值的四条水平线绘制如下数据。我得到下面的图片和下面的代码。这张图片与您为 2D 显示的图片的 1D 等效。

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.cluster import KMeans
    
    
    x = [916,684,613,612,593,552,487,484,475,474,438,431,421,418,409,391,389,388,
        380,374,371,369,357,356,340,338,328,317,316,315,313,303,283,257,255,254,245,
        234,232,227,227,222,221,221,219,214,201,200,194,169,155,140]
    
    kmeans = KMeans(n_clusters=4)
    a = kmeans.fit(np.reshape(x,(len(x),1)))
    centroids = kmeans.cluster_centers_
    
    labels = kmeans.labels_
    
    print(centroids)
    print(labels)
    
    colors = ["g.","r.","y.","b."]
    
    for i in centroids: plt.plot( [0, len(x)-1],[i,i], "k" )
    for i in range(len(x)):
        plt.plot(i, x[i], colors[labels[i]], markersize = 10)
    
    plt.show()
    

    使用 1D 数据计算 kmeans 更有趣的是使用如下曲线(来自页面 http://lasp.colorado.edu/home/sorce/2013/01/28/the-sorce-mission-celebrates-ten-years/),因为您显然可以看到两个不同的平均值:

    【讨论】:

    • 我完全不知道应该如何使用我的数据集进行 K-means 聚类。我有医院数据集。我的代码中的数字是美国每个州的平均分母值。你介意看看我的数据集并帮我弄清楚我可以使用哪些参数来使用 python 进行二维 K 均值聚类吗?我可以通过电子邮件将数据集发送给您。
    【解决方案2】:

    您的数据是一维的

    不要指望在没有数据的情况下绘制漂亮的二维图。

    要消除警告,您可以设置y=x。但不会有太大变化,数据会继续是一维线。

    您当然可以添加随机噪声,并将 y 设置为随机值。但这意味着编造虚假数据。

    对于一维算法,我建议完全不使用聚类。这些算法专为复杂的多元数据而设计,在这些数据中,您再也无法提供良好的统计模型。一维数据可以进行排序,从而实现更高效的算法。您可以轻松地对此类数据进行 KDE,并拟合数以千计的统计分布。这将为您提供一个具有更高统计功效的更有意义的模型。

    快速浏览一下您的情节,我会说没有集群。相反,在我看来,您的数据看起来像一个带有明显异常值的偏态正态分布(在这个数据集大小下是可以预料的)。请尝试更统计的方法。

    【讨论】:

      【解决方案3】:

      您的数据是一维的(一条线),如果您想在帖子中像图片一样以二维可视化,您应该使用二维或多维数据,例如[[1,3], [2,3], [1,5]]. 在 k-means 之后,它们被分成 k 个簇,您可以使用 scatter 来可视化输出。对了,scatter取x和y,scatter是二维可视化。

      我建议你看一下 Python 数据挖掘工具 Orange。您可以通过拖放来执行 k-means。

      并轻松可视化 k-means 的输出。

      祝你好运!数据挖掘很有趣:-)

      【讨论】:

        猜你喜欢
        • 2016-08-14
        • 2015-04-11
        • 2011-08-13
        • 2013-08-08
        • 2013-02-14
        • 2018-01-14
        • 2013-01-11
        • 2017-01-01
        • 2017-11-10
        相关资源
        最近更新 更多