机器学习 - K 均值聚类
在本页面,W3schools.com 与 NYC 数据科学学院 合作,为我们的学生提供数字培训内容。
K 均值聚类
K 均值聚类是一种无监督学习方法,用于对数据点进行聚类。该算法通过最小化每个聚类的方差,迭代地将数据点划分为 K 个聚类。
在本节中,我们将向您展示如何使用肘部法估计 K 的最佳值,然后使用 K 均值聚类将数据点分组到聚类中。
它是如何工作的?
首先,每个数据点被随机分配到 K 个聚类中的一个。然后,我们计算每个聚类的质心(功能上是中心),并将每个数据点重新分配到具有最接近质心的聚类。我们重复此过程,直到每个数据点的聚类分配不再改变。
K 均值聚类要求我们选择 K,即我们要将数据分组到的聚类数量。肘部法让我们绘制惯性(基于距离的度量)并可视化它开始线性下降的点。这个点被称为“肘部”,是根据我们的数据估计 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()
结果
我们可以看到,上面图形中的“肘部”(惯性变得更加线性的地方)位于 K=2。然后,我们可以再次拟合我们的 K 均值算法,并绘制分配给数据的不同聚类。
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.labels_)
plt.show()
结果