悠悠楠杉
用Python实现KMeans数据聚类:从原理到实战
KMeans聚类、Python机器学习、scikit-learn、数据预处理、肘部法则、轮廓系数
算法原理解析
KMeans的核心思想是通过迭代寻找K个聚类中心,使得样本点到所属簇中心的距离之和最小。其工作流程可分为四步:
- 随机初始化:选择K个点作为初始质心
- 分配阶段:将每个样本点分配到最近的质心
- 更新阶段:重新计算每个簇的质心
- 迭代优化:重复2-3步直至质心稳定
这个看似简单的过程,实际上蕴含着EM算法(期望最大化)的数学原理。当样本点到质心的距离平方和最小时,算法达到收敛。
Python实现步骤
1. 准备环境
python
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
2. 数据预处理
真实数据往往需要先进行标准化处理:
python
scaler = StandardScaler()
scaled_data = scaler.fit_transform(raw_data)
曾有个电商项目,我们忘记做标准化直接聚类,导致高金额特征主导了结果。这个教训说明数据预处理多么重要。
3. 确定最佳K值
使用肘部法则和轮廓系数相结合的方法:python
inertia = []
silhouette = []
K_range = range(2,10)
for k in Krange:
kmeans = KMeans(nclusters=k, randomstate=42)
labels = kmeans.fitpredict(scaleddata)
inertia.append(kmeans.inertia)
silhouette.append(silhouettescore(scaleddata, labels))
绘制肘部曲线
plt.plot(K_range, inertia, 'bx-')
plt.xlabel('K值')
plt.ylabel('距离平方和')
plt.title('肘部法则')
去年分析用户行为数据时,我们发现肘部曲线在K=5处有明显拐点,而轮廓系数也证实这个选择最优。
4. 模型训练与评估
python
optimalk = 5 # 根据上图确定
finalkmeans = KMeans(nclusters=optimalk, randomstate=42)
clusters = finalkmeans.fitpredict(scaleddata)
可视化结果(适用于二维数据)
plt.scatter(scaleddata[:,0], scaleddata[:,1], c=clusters)
plt.scatter(finalkmeans.clustercenters[:,0],
finalkmeans.clustercenters[:,1],
marker='X', s=200, c='red')
实战技巧与陷阱
初始质心问题:KMeans++可以优化随机初始化的缺陷
python KMeans(init='k-means++')
高维数据处理:建议先使用PCA降维
- 分类变量处理:需要转换为数值特征,如独热编码
记得第一次处理混合数据时,我们直接将文本标签编码为1,2,3...导致聚类结果失真。后来采用适当的编码方式才得到合理结果。
进阶优化方向
- Mini Batch KMeans:适用于大数据集
- 层次KMeans:结合层次聚类优点
- 密度敏感的KMeans:改进对非球形簇的识别
最近在金融风控项目中,我们采用改进的KMeans算法处理不均衡数据,准确率提升了15%。
结语
KMeans虽简单,但在实际应用中仍有许多细节需要注意。建议读者尝试用鸢尾花数据集练习,然后逐步应用到自己的业务场景中。当看到杂乱的数据呈现出清晰的聚类模式时,那种发现规律的成就感才是数据分析最迷人的地方。
实践提示:可以尝试用pyecharts制作交互式聚类可视化,比静态图表更能揭示数据内在结构。