K-means 算法简介
K-means 是一种常用的无监督学习算法,主要用于数据聚类。它的主要思想是将数据集中的数据分成 K 个簇(Cluster),使得簇内的数据点尽可能相似,而簇间的差异尽可能大。K-means 算法的核心步骤包括初始化质心、分配数据点到最近的质心、更新质心,重复这个过程直到收敛。
导入实验数据
在本实验中,我们将使用一个啤酒数据集,数据集包含每种啤酒的卡路里(calories)、钠含量(sodium)、酒精含量(alcohol)和价格(cost)。这些数据将用于 K-means 聚类分析。
实验数据如下:
实验代码详解
导入库和数据
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics
# 读取文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')
# 传入变量(列名)
X = beer[["calories", "sodium", "alcohol", "cost"]]
print(X)
解释:
- 我们首先导入所需的库。
- 使用
pd.read_table
函数读取名为data.txt
的数据文件,其中sep=' '
表示数据分隔符为空格。 - 然后选择四列数据作为输入特征,并将其存储在变量
X
中。
计算轮廓系数得分
scores = []
for k in range(2, 10): # 寻找合适的K值
labels = KMeans(n_clusters=k).fit(X).labels_
score = metrics.silhouette_score(X, labels) # 轮廓系数
scores.append(score)
print(scores)
解释:
- 这部分代码的目的是找到最适合的簇数量。
- 使用
range(2, 10)
来循环尝试从 2 到 9 个簇。 - 对于每个簇数量,我们使用
KMeans
类进行聚类,并获取聚类标签。 - 使用
metrics.silhouette_score
计算轮廓系数得分,该得分越高表示簇内的数据点越相似,簇间差异越大。 - 得分被存储在列表
scores
中。
绘制得分结果
import matplotlib.pyplot as plt
plt.plot(list(range(2, 10)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Silhouette Score")
plt.show()
解释:
- 使用
matplotlib
绘制簇数量与轮廓系数得分之间的关系。 - 通过观察得分曲线,我们可以找到最佳的簇数量。
聚类
km = KMeans(n_clusters=2).fit(X) # K值为2【分为2类】
beer['cluster'] = km.labels_
解释:
- 根据之前的得分结果,我们选择了 K=2 进行聚类。
- 使用
KMeans
类进行聚类,并将结果存储在beer
DataFrame 的新列cluster
中。
对聚类结果进行评分
score = metrics.silhouette_score(X, beer.cluster)
print(score)
解释:
- 最后,我们再次计算轮廓系数得分,以评估最终聚类结果的质量。
输出结果:
总结
通过上述步骤,我们完成了 K-means 聚类分析的过程。K-means 算法通过迭代的方式不断优化簇内数据的相似性和簇间数据的差异性,从而达到聚类的目的。在本实验中,我们不仅实现了 K-means 算法,还通过轮廓系数得分来评估不同簇数量下的聚类效果,并最终确定了最佳的簇数量。这种方法在很多实际应用中都非常有用,特别是在需要对数据进行分组和分析的场景中。