无法为一维数据绘制 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近四年球队实力