在这篇博客中,我们将探讨如何使用K-Means聚类算法来分析一个啤酒数据集。我们将通过Python编程语言和Scikit-learn库来实现这一过程,并使用轮廓系数来评估聚类的效果
简介
K-Means是一种广泛使用的聚类算法,它通过将数据点划分为K个簇来工作,每个簇由其质心(centroid)表示。算法的目标是最小化簇内数据点到质心的距离总和。轮廓系数是一种评估聚类效果的指标,它结合了簇内凝聚度和簇间分离度。
算法原理
K-Means算法基于距离度量来工作,通常使用欧几里得(Euclidean)距离。算法的步骤如下
-
初始化:随机选择K个数据点作为初始的簇中心点。
-
分配:对于数据集中的每个点,计算其与所有簇中心点的距离,并将该点分配给最近的簇中心点。
-
更新:对于每个簇,计算簇中所有点的平均值,并更新簇中心点为该平均值。
-
迭代:重复步骤2和步骤3,直到满足停止条件,如簇中心点的变化小于某个阈值,或者达到预设的最大迭代次数。
数学表达
设数据集为 X = \{x_1, x_2, ..., x_n} ),其中 n 是数据点的数量,每个数据点 xi 有 d 维特征。算法的目标是找到 K 个簇中心点 C = \{c_1, c_2, ..., c_K} ,使得簇内误差平方和最小化:
其中,Si 是分配给第 i 个簇的所有数据点的集合,∣∣x−ci∣∣ 是数据点 x 和簇中心 ci 之间的欧几里得距离。
优缺点
优点:
简单、易于理解和实现。当簇为凸形且大小相似时,聚类效果较好。对大数据集有效。
缺点:
需要预先指定簇的数量 K。对初始簇中心点的选择敏感,可能导致局部最优解。
可能难以处理非凸形簇和大小差异大的簇。
对噪声和异常值敏感。
应用场景
-
客户细分:根据购买行为将客户分为不同的群体。
-
图像压缩:通过聚类减少图像数据的存储空间。
-
社交网络分析:识别社交网络中的社区结构。
-
异常检测:识别数据集中的异常或离群点
代码
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"]]
"""根据分成不同的簇,自动计算轮廓系数得分
"""
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)
#绘制得分结果
import matplotlib.pyplot as plt
plt.plot(list(range(2,10)),scores)
plt.xlabel("Number of clusters nitialized")
plt.ylabel("Sihouette Score")
plt.show()
#聚类
km = KMeans(n_clusters=2).fit(X)
#对聚类结果进行评分
"""采用轮廓系数评分
X:数据集scaled_cluster:聚类结果
score:非标准化聚类结果的轮廓系数
"""
score = metrics.silhouette_score(X,beer.cluster)
print(score)
运行结果
结论
通过上述步骤,我们成功地使用K-Means算法对啤酒数据集进行了聚类分析,并使用轮廓系数评估了聚类效果。轮廓系数得分图帮助我们选择了最佳的簇数量。在实际应用中,我们可以根据业务需求和数据特点选择合适的聚类算法和评估指标。