k-means:只有二维空间中的一维聚类预测

数据挖掘 scikit-学习 k-均值 预言 聚类
2022-02-25 14:38:33

对于这个数据集,我的 k-means 模型的预测似乎只考虑了水平轴,尽管聚类中心似乎是合理的。

这个分类有问题吗?请注意背景中网格的颜色。

我用的是scikit-learn,这里是分类和可视化的代码片段。

model = KMeans(n_clusters = 5)    
model.fit(df_stuff[['Stuff','Other Stuff']])

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])

ax.scatter(df_stuff['Stuff'], df_stuff['Other Stuff'],c=model.labels_,s=80,cmap='rainbow')
ax.set_xlabel('Stuff')
ax.set_ylabel('Other Stuff')
ax.set_title('Strange Clusters')

# Draw Cluster Centers
for center in model.cluster_centers_:
    ax.scatter(center[0],center[1],c='black',s=5120,alpha=0.2)

# Draw Cluster Grid
cluster_grid = {'x': [], 'y': [], 'cluster': []}
for x in np.linspace(df_stuff['Stuff'].min(),df_stuff['Stuff'].max(),25):
    for y in np.linspace(0.35,0.6,25):
        cluster_grid['x'].append(x)
        cluster_grid['y'].append(y)
        cluster_grid['cluster'].append(model.predict([[x,y]])[0])

ax.scatter(cluster_grid['x'],cluster_grid['y'],c=cluster_grid['cluster'],cmap='rainbow',alpha=0.4,s=10)

我奇怪的集群的情节

3个回答

KMeans 确实正确地做了它应该做的事情。

只需正确绘制数据,两个轴上的比例相同......

Y 偏差无关紧要,与 X 轴相比它们很小。偏差大 100 倍,因此平方偏差甚至 10000 倍。由于 KMeans 最小化平方误差,因此只有 x 很重要

正确绘制后,您的数据更像这样:

你过度拟合你的数据。您正在为约 20 个数据点拟合 5 个集群。红色和蓝色集群只有一个数据点。要么获取更多数据,要么拟合更少的集群。

Elbow 方法帮助确定有多少集群是合适的。

问题可能不是您的集群。但是您的聚类的视觉表示。目前尚不清楚为什么要在硬编码网格上绘制元素。您应该只绘制原始数据的实际值。就像是:

import matplotlib.pyplot as plt

# Plot the data
X = df_stuff[['Stuff','Other Stuff']]
plt.scatter(X[:, 0], X[:, 1], c=model.predict(X))

# Plot k-means clusters centers
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black')