在此页面上,W3schools.com 与纽约数据科学院,为我们的学生提供数字培训内容。
K-means 是一种用于聚类数据点的无监督学习方法。该算法通过最小化每个簇中的方差,迭代地将数据点划分为 K 个簇。
在这里,我们将向您展示如何使用肘部方法估计 K 的最佳值,然后使用 K 均值聚类将数据点分组为聚类。
首先,每个数据点被随机分配到 K 个簇之一。然后,我们计算每个簇的质心(功能上的中心),并将每个数据点重新分配给具有最近质心的簇。我们重复此过程,直到每个数据点的聚类分配不再发生变化。
K 均值聚类要求我们选择 K,即我们要将数据分组到的聚类数量。肘部方法让我们能够绘制惯性(基于距离的度量)并可视化惯性开始线性减小的点。该点称为"eblow",是根据我们的数据对 K 最佳值进行的良好估计。
首先可视化一些数据点:
import matplotlib.pyplot as plt
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
plt.scatter(x, y)
plt.show()
广告
现在我们利用肘法来可视化不同 K 值的惯性:
from sklearn.cluster import KMeans
data = list(zip(x, y))
inertias = []
for i in range(1,11):
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
inertias.append(kmeans.inertia_)
plt.plot(range(1,11), inertias, marker='o')
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()
肘法表明 2 是一个很好的 K 值,因此我们重新训练并可视化结果:
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.labels_)
plt.show()
导入您需要的模块。
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
您可以在我们的中了解 Matplotlib 模块《Matplotlib 教程。
scikit-learn 是一个流行的机器学习库。
创建类似于数据集中两个变量的数组。请注意,虽然我们在这里只使用两个变量,但此方法适用于任意数量的变量:
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
将数据转换为一组点:
data = list(zip(x, y))
print(data)
结果:
[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (6, 22), (10, 21), (12, 21)]
为了找到 K 的最佳值,我们需要对数据运行 K 均值以获得一系列可能的值。我们只有 10 个数据点,因此最大簇数为 10。因此,对于 range(1,11) 中的每个值 K,我们训练一个 K 均值模型并绘制该簇数处的惯性:
inertias = []
for i in range(1,11):
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
inertias.append(kmeans.inertia_)
plt.plot(range(1,11), inertias, marker='o')
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()
结果:
我们可以看到上图中的"elbow"(惯性变得更加线性)位于 K=2 处。然后我们可以再次拟合 K 均值算法并绘制分配给数据的不同簇:
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.labels_)
plt.show()
结果:
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!