使用 K-means 的数据集的 3D 绘图

Posted

技术标签:

【中文标题】使用 K-means 的数据集的 3D 绘图【英文标题】:3D plotting of a dataset that uses K-means 【发布时间】:2021-03-07 07:30:39 【问题描述】:
X, t = make_swiss_roll(n_samples=1000, noise=0.2, random_state=42)
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)                   # Number of clusters == 3
kmeans = kmeans.fit(X)                          # Fitting the input data
labels = kmeans.predict(X)                      # Getting the cluster labels
centroids = kmeans.cluster_centers_             # Centroid values
print("Centroids are:", centroids)              # From sci-kit learn

fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(111, projection='3d')

x = np.array(labels==0)
y = np.array(labels==1)
z = np.array(labels==2)
ax.scatter(x,y,z, marker="s"[kmeans.labels_], s=40, cmap="RdBu")

我正在尝试通过为属于它们的类的所有标签着色来以 3D 绘制集群,并使用单独的符号绘制质心。我设法让 KMeans 技术发挥作用,至少我相信我做到了。但我一直试图用 3D 绘制它。我相信可以有一个简单的解决方案,我只是没有看到它。有谁知道我需要在解决方案中进行哪些更改才能实现这一目标?

【问题讨论】:

您不希望它做什么?你有错误吗?剧情不对吗? @wundermahn 是的,我尝试了代码,情节不起作用 那么@OkayDataScience 应该在问题中包含错误。 @okayDataScience 一切都好吗? @ombk 是的,完美!我是如此接近thx!不知道如何给你更多的信任或我们对堆栈溢出很陌生 【参考方案1】:

试试这个,现在簇是黑色的X:

from sklearn.datasets import make_swiss_roll
X, t = make_swiss_roll(n_samples=1000, noise=0.2, random_state=42)
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)                   # Number of clusters == 3
kmeans = kmeans.fit(X)                          # Fitting the input data
labels = kmeans.predict(X)                      # Getting the cluster labels
centroids = kmeans.cluster_centers_             # Centroid values
print("Centroids are:", centroids)              # From sci-kit learn

fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(111, projection='3d')

x = np.array(labels==0)
y = np.array(labels==1)
z = np.array(labels==2)


ax.scatter(X[x][:, 0], X[x][:, 1], X[x][:, 2], color='red')
ax.scatter(X[y][:, 0], X[y][:, 1], X[y][:, 2], color='blue')
ax.scatter(X[z][:, 0], X[z][:, 1], X[z][:, 2], color='yellow')
ax.scatter(centroids[:, 0], centroids[:, 1], centroids[:, 2],
            marker='x', s=169, linewidths=10,
            color='black', zorder=50)

【讨论】:

确实如此。发现一样【参考方案2】:
import matplotlib.pyplot as plt
from sklearn.datasets import make_swiss_roll
from mpl_toolkits.mplot3d import Axes3D
X, t = make_swiss_roll(n_samples=1000, noise=0.2, random_state=42)
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)                   # Number of clusters == 3
kmeans = kmeans.fit(X)                          # Fitting the input data
labels = kmeans.predict(X)                      # Getting the cluster labels
centroids = kmeans.cluster_centers_             # Centroid values
# print("Centroids are:", centroids)              # From sci-kit learn


fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')

x = np.array(labels==0)
y = np.array(labels==1)
z = np.array(labels==2)


ax.scatter(centroids[:,0],centroids[:,1],centroids[:,2],c="black",s=150,label="Centers",alpha=1)
ax.scatter(X[x,0],X[x,1],X[x,2],c="blue",s=40,label="C1")
ax.scatter(X[y,0],X[y,1],X[y,2],c="yellow",s=40,label="C2")
ax.scatter(X[z,0],X[z,1],X[z,2],c="red",s=40,label="C3")

【讨论】:

以上是关于使用 K-means 的数据集的 3D 绘图的主要内容,如果未能解决你的问题,请参考以下文章

第五节 算法的分类介绍和数据集的划分

sklearn:计算测试数据集上k-means的准确度得分

如何将 RDD [ Vector ] 中的合成控制数据集转换为 K-Means 算法

使用python在高斯过程回归中训练数据集的数据增强

数据挖掘聚类之k-means(转载)

图例条目的数量等于数据集的大小