如何确定 K-means 和散点图使用哪个 `x` 参数?
How to determine which `x` argument to use for K-means and scatter plots?
我正在尝试在 Python 中实现和可视化 K-means 算法代码。我有一个使用 make_blobs
创建的数据集,然后我使用 K-means 拟合数据并使用 matplotlib.pyplot.scatter
.
可视化结果
这是我的代码:
导入和数据创建步骤
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
n_samples = 3000
random_state = 1182
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
# X.shape = (3000, 2)
# y.shape = (3000,) -> y's values range from 0 to 2.
原始数据的散点图
plt.scatter(X[:, 0], X[:, 1])
plt.title("Original Dataset Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("X[:, 1]")
plt.show()
K-Means训练和可视化
kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)
colors = { 0: 'r',
1: 'b',
2: 'g'}
label_color = [colors[l] for l in y]
plt.scatter(X[:, 0], kmeans_model.labels_, c=label_color)
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()
我的问题是:当我使用 plt.scatter
和 X[:, 1]
而不是 X[:, 0]
时,就像我在给定代码中所做的那样,我得到一个不同的图,尽管具有相同的簇:
这是否仍然被认为是 K-means 和散点图的正确实现和使用?如果是这样,是否有特殊原因应该选择某些 x
值而不是其他值?
这是一种非常奇怪的集群可视化方式。如果你想看看你的模型有多好,你只需要像在第一张图中那样绘制所有的斑点,然后提供一个着色序列 label_color
。
plt.scatter(X[:,0], X[:,1], c=label_color)
您使用 X[:,0] 或 X[:,1] 的问题设置不正确。这两个维度都代表数据,您的图表在某种程度上是正确的,但它们不可解释。
您的K-means
同时考虑了X[:,0]
和X[:,1]
。聚类是在二维上完成的。
呈现 K-Means 的正确方法是显示两个维度,并使用着色(就像您所做的那样)。
关于你的问题 - 不同的原因是你使用 1 个图表的第一个维度,因此你根据那里的 [:,0]
坐标显示点,而在第二个中你根据 [:,1]
.
正确的方法是使用两个坐标,使用着色,如果可能 - 添加簇质心总是很好:
正在更改您的代码:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
n_samples = 3000
random_state = 1182
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)
colors = { 0: 'r',
1: 'b',
2: 'g'}
label_color = [colors[l] for l in y]
plt.scatter(X[:, 0],X[:,1], c=label_color, s=10)
plt.scatter(kmeans_model.cluster_centers_[:,0],kmeans_model.cluster_centers_[:,1],s=300,marker='+',c='y')
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()
将产生:
请注意,我为集群质心添加了一条线。
我正在尝试在 Python 中实现和可视化 K-means 算法代码。我有一个使用 make_blobs
创建的数据集,然后我使用 K-means 拟合数据并使用 matplotlib.pyplot.scatter
.
这是我的代码:
导入和数据创建步骤
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
n_samples = 3000
random_state = 1182
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
# X.shape = (3000, 2)
# y.shape = (3000,) -> y's values range from 0 to 2.
原始数据的散点图
plt.scatter(X[:, 0], X[:, 1])
plt.title("Original Dataset Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("X[:, 1]")
plt.show()
K-Means训练和可视化
kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)
colors = { 0: 'r',
1: 'b',
2: 'g'}
label_color = [colors[l] for l in y]
plt.scatter(X[:, 0], kmeans_model.labels_, c=label_color)
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()
我的问题是:当我使用 plt.scatter
和 X[:, 1]
而不是 X[:, 0]
时,就像我在给定代码中所做的那样,我得到一个不同的图,尽管具有相同的簇:
这是否仍然被认为是 K-means 和散点图的正确实现和使用?如果是这样,是否有特殊原因应该选择某些 x
值而不是其他值?
这是一种非常奇怪的集群可视化方式。如果你想看看你的模型有多好,你只需要像在第一张图中那样绘制所有的斑点,然后提供一个着色序列 label_color
。
plt.scatter(X[:,0], X[:,1], c=label_color)
您使用 X[:,0] 或 X[:,1] 的问题设置不正确。这两个维度都代表数据,您的图表在某种程度上是正确的,但它们不可解释。
您的K-means
同时考虑了X[:,0]
和X[:,1]
。聚类是在二维上完成的。
呈现 K-Means 的正确方法是显示两个维度,并使用着色(就像您所做的那样)。
关于你的问题 - 不同的原因是你使用 1 个图表的第一个维度,因此你根据那里的 [:,0]
坐标显示点,而在第二个中你根据 [:,1]
.
正确的方法是使用两个坐标,使用着色,如果可能 - 添加簇质心总是很好:
正在更改您的代码:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
n_samples = 3000
random_state = 1182
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)
colors = { 0: 'r',
1: 'b',
2: 'g'}
label_color = [colors[l] for l in y]
plt.scatter(X[:, 0],X[:,1], c=label_color, s=10)
plt.scatter(kmeans_model.cluster_centers_[:,0],kmeans_model.cluster_centers_[:,1],s=300,marker='+',c='y')
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()
将产生:
请注意,我为集群质心添加了一条线。