Python如何通过手肘法实现k_means聚类详解
什么是 k-Means 聚类
k-Means 是一种常见的聚类算法,它将 n 个数据点分成 k 个集群,使得每个点都属于其所属集群的平均值,又称为质心。一个样本点最终将会归属到距离其最近的质心所属的集群中。这也意味着,如果聚类效果不佳,任意两个聚类之间的距离会非常接近,欠拟合或过拟合。
手肘法
k-Means 聚类中的 k 值如何选取是一个非常重要的问题。可以使用统计机器学习中的手肘法来选择 k 值。
手肘法的基本思路是,对于不同的 k 值,计算各个数据点到其所属聚类中心的距离的平方和,然后选择“肘部”处对应的 k 值作为数据进行聚类的 k 值。
找到“肘部”的方法是,将每个 k 值下的误差值用图表表示。观察图表,对于 k 值,它的错误值在达到某个值之后,将不再显著降低,这个地方就是“肘部”。
代码示例
以下是 Python 代码示例,展示了如何使用 k-Means 聚类和手肘法来完成聚类。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
# 生成聚类数据
X = np.array([
[1, 2],
[1, 4],
[1, 0],
[4, 2],
[4, 4],
[4, 0]
])
# 用 KMeans 聚类算法进行聚类
wcss = []
for i in range(1, 7):
kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
# 分析手肘法
plt.plot(range(1, 7), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
上面代码示例中,我们生成了一个数据集,其中包含两个特征的六个数据点。我们然后使用 k-Means 聚类算法将其聚类为两个聚类。接着,我们使用手肘法绘制出 k 值区间[1,6]下的错误值变化图,并通过观察图形找到了一个折点,即分界点,这个分别点为 2。
下面的示例中,我采用一个真实的数据集完成 k-Means 聚类,还展示了如何使用手肘法决定 k 值。这个数据集是红酒数据集中的一份子,它包含 13 个特征和 178 个观测值。
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
# 加载数据
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df = pd.read_csv(url, header=None)
X = df.iloc[:, 1:].values
# 使用手肘法选择 k 值
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
# 可视化手肘法
plt.plot(range(1, 11), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
# 使用 k = 3 进行聚类
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, n_init=10, random_state=0)
y_kmeans = kmeans.fit_predict(X)
上述代码示例加载了红酒数据集。然后使用 KMeans 算法计算 k 值区间[1,10]下的误差平方和。根据可视化的手肘法曲线,结果显示最优 k 值。
最终,我们使用 k = 3 对数据集进行聚类。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python如何通过手肘法实现k_means聚类详解 - Python技术站