K-means 聚类算法
K-means 聚类算法是一种基于划分的无监督学习算法,通过迭代优化将数据划分为指定簇数(K 值),使同一簇内样本相似度最大化、簇间差异最大化34。以下从算法原理、实现步骤、应用场景及优缺点展开说明:
一、核心原理与实现步骤
K-均值聚类(K-Means Clustering)是一种无监督学习算法,其基本思想是将数据集划分为K个不同的簇,使得每个样本点都属于离它最近的簇中心。该算法的目标是最小化样本到所属簇心的平方误差和(Sum of Squared Errors,SSE),公式如下:
S S E = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 SSE=\sum _{i=1}^{K}\sum _{x\in C_{i}}||x-\mu _{i}||^{2} SSE=i=1∑Kx∈Ci∑∣∣x−μi∣∣2
其中,K是簇的数量, C i C_{i} Ci 是第 i i i 个簇中的样本集合, μ i \mu _{i} μi 是第 i 个簇的中心, x x x 是簇 C i C_{i} Ci 中的样本点, x − μ i x-\mu _{i} x−μi 表示样本点 x x x 到簇中心 μ i \mu _{i} μi 的欧氏距离。
1.初始化:随机选取 K 个样本作为初始聚类中心。
2.分配样本:计算每个样本到各中心的欧氏距离,将其归类到最近的簇。
3.更新中心:重新计算各簇的均值作为新聚类中心。
4.终止条件:当中心不再变化、样本归属稳定或达到最大迭代次数时,算法终止。
# 导入所需库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
# 加载数据集
iris = load_iris()
X = iris.data[:, 2:4] # 提取花瓣长度和宽度作为特征
# 创建K-means模型
kmeans = KMeans(
n_clusters=3, # 设定簇数为3(根据数据分布选择)
init='k-means++', # 优化初始中心选择
n_init=10, # 运行10次取最优结果
max_iter=300, # 最大迭代次数
random_state=42 # 固定随机种子保证结果可复现
)
# 训练模型并预测簇标签
labels = kmeans.fit_predict(X)
centroids = kmeans.cluster_centers_ # 获取聚类中心坐标
# 可视化聚类结果
plt.figure(figsize=(10,6))
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis', edgecolor='k', s=50)
plt.scatter(centroids[:,0], centroids[:,1], c='red', marker='X', s=200, label='聚类中心')
plt.xlabel('花瓣长度(cm)')
plt.ylabel('花瓣宽度(cm)')
plt.title('鸢尾花数据K-means聚类结果')
plt.legend()
plt.show()
关键参数解析:
参数 | 作用说明 |
---|---|
n_clusters | 指定簇数(K值),需结合业务需求或通过肘部法/轮廓系数评估确定 |
init | 初始化方式:k-means++(默认优化算法)或random (随机选择) |
n_init | 算法运行次数(取效果最优的一次结果),减少初始中心敏感性问题 |
max_iter | 限制单次运行的最大迭代次数,防止非凸数据集陷入无限循环 |
random_state | 控制随机数生成器,确保结果可复现 |
输出结果分析:
1.聚类效果图
数据点按颜色分为3簇,红色标记为聚类中心;
可直观观察簇内紧凑性和簇间分离度;
2.指标计算(扩展代码)
# 计算惯性指标(SSE)
print("Inertia(SSE):", kmeans.inertia_)
SSE值反映簇内样本到中心的距离总和,越小表示聚类效果越好。
3.不同初始化的对比实验
# 对比随机初始化和k-means++的效果
plt.figure(figsize=(12,5))
# 随机初始化(init='random')
plt.subplot(1,2,1)
kmeans_random = KMeans(n_clusters=3, init='random', random_state=42).fit(X)
plt.scatter(X[:,0], X[:,1], c=kmeans_random.labels_, cmap='viridis')
plt.title('随机初始化聚类结果')
# k-means++初始化
plt.subplot(1,2,2)
kmeans_plus = KMeans(n_clusters=3, init='k-means++', random_state=42).fit(X)
plt.scatter(X[:,0], X[:,1], c=kmeans_plus.labels_, cmap='viridis')
plt.title('k-means++初始化结果')
plt.tight_layout()
plt.show()
读者可以根据实际的实验数据和实验类型,选取特定的k值,以达到最好的分类效果。
二、典型应用场景
1. 工业设备检测
案例:安徽遥迈智能科技(电力时序数据处理)
问题背景:
在工业设备监测中,电力设备的运行状态通常通过时序数据(如电压、电流、功率等)进行监控。传统的人工统计设备有效工作时间效率低下,且易受主观因素影响。
K-means的应用:
将电力时序数据按特征(如功率波动、运行时长等)进行聚类,自动划分出“正常运行”“低效运行”“故障前兆”等模式。通过聚类结果识别设备的高效工作区间,替代人工统计,提升效率。
技术优势:
自动化:减少人工干预,降低人力成本。
实时性:可结合流式计算框架(如Apache Flink)实现在线聚类,实时监控设备状态。可扩展性:适用于多维时序数据(如结合时间序列特征工程后)。
潜在改进方向:
引入动态K值选择方法(如肘部法则+轮廓系数)以适应不同设备类型。
结合密度聚类(如DBSCAN)处理噪声数据,提升异常检测的鲁棒性。
2. 能源优化调度
案例:湘能讯杰(微电网风电场景构建)
问题背景:
微电网中的风电输出受天气影响波动大,传统调度模型需手动划分典型场景(如高风速、低风速),导致模型复杂且泛化能力差。K-means的应用:
基于历史风电数据(风速、风向、发电功率等),通过K-means构建有限数量的典型场景(如“大风”“小风”“无风”)。在优化调度中,将实时数据映射到最近场景,简化决策过程。
技术优势:
降维与简化:将连续变量离散化为有限场景,降低模型复杂度。鲁棒性增强:通过聚类中心代表典型场景,减少极端天气的预测误差。
可解释性:聚类结果直观反映风电的典型运行模式。
潜在改进方向:
结合层次聚类(Hierarchical Clustering)验证场景划分的合理性。使用高斯混合模型(GMM)替代K-means,处理场景间的概率分布差异。
3. 通用数据分组
子场景1:图像分割
技术实现:
将图像像素的RGB/HSV值作为特征,通过K-means将像素分组为不同颜色区域。例如:医学图像中分割肿瘤区域(基于灰度或纹理特征)。
挑战:需预处理(如降噪、归一化)以避免噪声干扰聚类结果。高维特征(如卷积特征)需降维(如PCA)后聚类。
子场景2:用户分群
应用案例:
电商平台基于用户购买行为(如消费频率、金额、品类偏好)聚类,划分高价值用户、潜在流失用户等群体。
营销策略差异化:针对不同群体制定个性化推荐或促销活动。
技术要点:特征工程:结合RFM模型(最近购买时间、频率、金额)构建输入特征。评估指标:轮廓系数(Silhouette Score)衡量聚类质量。
子场景3:异常检测
方法:正常数据聚类后,计算样本到最近中心的距离,超出阈值则标记为异常。例如:金融交易中识别欺诈行为(基于交易金额、时间、地点等特征)。
局限性:对分布不均的数据敏感,可能需结合孤立森林(Isolation Forest)等算法。技术共性与注意事项
K值选择:
经典方法:肘部法则(Elbow Method)、轮廓系数(Silhouette Coefficient)。自动化方法:Gap Statistic、贝叶斯信息准则(BIC)。
数据预处理:
标准化(Standardization)或归一化(Normalization)避免量纲影响。缺失值处理:均值填充、插值或删除。
算法局限:
对初始中心敏感,可能陷入局部最优。改进方法:K-means++初始化。仅适用于凸形簇,非凸数据需改用谱聚类(Spectral Clustering)或DBSCAN。
扩展应用:
半监督学习:结合少量标注数据提升聚类效果。深度学习融合:如自编码器(Autoencoder)降维后聚类,适用于复杂数据。
三、优缺点分析
优势 | 局限性 |
---|---|
实现简单,计算效率高6 8 | 需预先指定 K 值 |
适合大规模数据集处理8 | 对初始中心敏感,易陷局部最优 |
结果直观易解释 5 6 ◯ 5 \textcircled{6} 56◯ | 仅适用于凸形数据分布 |
优势
实现简单,计算效率高:该算法在实现上不需要复杂的编程逻辑和大量的计算资源,能够快速地进行数据处理和运算。这可能得益于其基于距离度量和简单迭代的原理。
适合大规模数据集处理:由于其计算效率较高且算法结构相对简单,在面对包含大量数据样本的数据集时,也能够较为高效地完成聚类任务。
结果直观易解释:聚类结果以簇的形式呈现,每个簇内的数据点具有较高的相似性,簇与簇之间有明显的区分,这种结果形式很容易被理解和解读,便于在实际应用中进行分析和决策。
局限性
需预先指定K值:K代表聚类的簇数,在使用该算法之前,需要人为地指定K的值。然而,确定合适的K值并不是一件容易的事情,如果K值选择不当,可能会导致聚类结果不理想。
对初始中心敏感,易陷局部最优:算法在开始迭代时,需要随机选择或指定初始的聚类中心。不同的初始中心选择可能会导致算法收敛到不同的局部最优解,而不是全局最优解,从而影响聚类效果。
仅适用于凸形数据分布:该算法假设数据的空间分布是凸形的,即数据点之间的相似性随着距离的增加而单调递减。对于非凸形的数据分布,该算法可能无法很好地进行聚类,容易将不同簇的数据点错误地划分到同一个簇中。
四、改进方向
K - means++算法的核心思想是在初始中心的选择上引入一定的概率机制,使得初始中心尽可能地分散,从而减少算法陷入局部最优的可能性。具体做法是在选取第一个中心时是随机的,之后选取后续中心时,每个数据点被选为新的中心的概率与其到已选中心的距离平方成正比。这样能在一定程度上改善因初始中心选择不当而对聚类结果产生的不良影响。
肘部法通过计算不同K值下的聚类误差平方和(SSE),观察SSE随着K值增加的变化趋势,当K值增加到一定程度时,SSE的下降速度会明显变缓,这个拐点附近的K值通常是一个较好的选择。轮廓系数则是综合考虑了簇内的紧密程度和簇间的分离程度,系数越接近1,表示聚类效果越好,通过计算不同K值下的轮廓系数,选取系数最大的K值作为最优簇数,以此动态地确定合适的K值,避免因K值指定不当带来的问题。
深度学习模型,如自编码器等,具有强大的特征提取能力,可以先利用深度学习模型对高维数据进行降维和特征提取,将高维复杂的数据转换为低维且更具代表性的特征表示,然后再将这些特征输入到K - means等聚类算法中进行聚类。这样可以有效克服K - means算法仅适用于凸形数据分布以及在处理高维数据时可能存在的不足,提高聚类的准确性和效果。