无法为一维数据绘制 K-Means 聚类

Posted

技术标签:

【中文标题】无法为一维数据绘制 K-Means 聚类【英文标题】:Cannot plot K-Means clusters for one-dimensional data 【发布时间】:2021-09-17 23:09:02 【问题描述】:

我正在尝试在我的二元分类任务中实现 K-Means 算法,但我无法绘制结果两个集群的散点图。

我的数据集只是以下形式:

# size, class
  312,  1
  319   1
  227   0       

最小的例子:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.cluster         import KMeans

X = 'size': [312,319,227,301,273,311,277,291,303,381], 'class': [1,1,0,1,0,1,0,0,1,1]
X = pd.DataFrame(data=X)
X_train, X_test, y_train, y_test = train_test_split(X['size'], X['class'], test_size=0.4)
X_train = X_train.values.reshape(-1,1)
X_test  = X_test.values.reshape(-1,1)

kmeans = KMeans(init="k-means++", n_clusters=2, n_init=10, max_iter=300, random_state=42)

kmeans.fit(X_train)
preds = kmeans.predict(X_test)

如何根据预测“preds”绘制散点图,显示两个聚类、“X_test”中的样本和相应颜色(0 和 1)?

【问题讨论】:

您是否遇到任何特定错误?您能否就您面临的问题添加一些详细信息。另外,为什么要将 df 拆分为 X 和 Y。Kmeans 是一种无监督学习,通常没有监督学习模型的目标值(目标为 y)。 感谢@heretolearn 的回答。我知道这是一种无监督的方法,但我只是想看看我是否可以根据“大小”特征对数据进行分类,并且我想通过比较真实标签来评估聚类的成功程度。我遇到了有关数据形状的错误。 this approach 能解决你的问题吗? 【参考方案1】:

由于您只有一个功能,因此您的所有数据都在一条线上。您可以像这样创建散点图:

color = ["blue", "red"]
plt.scatter(X_test.flatten(), [0]*len(X_test), c=[color[p] for p in preds])

如果你想拥有两个特征,你可以修改你的数据:

X = 
    'size_1': [312,319,227,301,273,311,277,291,303,381],
    'size_2': [152,165,301,145,310,145,315,156,160,165],
    'class': [1,1,0,1,0,1,0,0,1,1],

X = pd.DataFrame(data=X)
X_train, X_test, y_train, y_test = train_test_split(X[['size_1', 'size_2']], X['class'], test_size=0.4)

然后你修改散点图:

plt.scatter(X_test.iloc[:,0],X_test.iloc[:,1], c=[color[p] for p in preds])

【讨论】:

感谢您的意见@Pierre-Loic。我试过了,但它在我的实际数据集上给出了一个奇怪的结果:i.postimg.cc/KzMTZTkb/cluster.png 为什么不行?你期待什么? 我希望看到这样的东西i.postimg.cc/ZY3TLHzZ/cluster.png 要拥有像您的图片一样的东西,您需要 2 个特征(垂直轴和水平轴)。您的数据中只有一个(您的“大小”列) 我明白了。如果我想在我的数据集中添加另一个特征,我应该如何调整你的代码以获得我显示的图表?

以上是关于无法为一维数据绘制 K-Means 聚类的主要内容,如果未能解决你的问题,请参考以下文章

K均值聚类--利用k-means算法分析NBA近四年球队实力

K-means聚类算法原理与实现

在python中使用k-means聚类提取质心?

Python | 实现 K-means 聚类——多维数据聚类散点图绘制

聚类的重要性是啥?

在R中练习k-meas聚类