目录

机器学习 - K-means


在此页面上,W3schools.com 与纽约数据科学院,为我们的学生提供数字培训内容。


K-means

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()

结果: