首页 / 资讯中心 / 文章详情

机器学习之K-means聚类

机器学习之K-means聚类 ★ FEATURED ARTICLE
K-means聚类K-means聚类属于无监督学习中最经典、最实用的迭代式聚类算法。无监督学习不需要标签数据算法**自主发现数据中的规律、相似性和差异性**核心任务是聚类。聚类目标是将相似的数据点归为一组形成不同的簇cluster【类比理解】整理没有标签的照片根据照片内容、颜色、场景等特征将它们分为风景、人物、美食等不同的组别这就是聚类的思想。算法核心思想迭代优化含义寻找K个中心点Centroids算法通过不断优化这些中心点的位置最终将数据划分为K个簇。K-means算法的详细流程1、初始化随机选择K个点作为初始中心点。2、计算距离与分配计算每个点到K个中心点的欧氏距离。d(x1−x2)2(y1−y2)2 d \sqrt{(x_1 - x_2)^2 (y_1 - y_2)^2}d(x1​−x2​)2(y1​−y2​)2​3、分配簇标签将每个数据点分配给最近的中心点形成K个簇每个点会得到簇标签0到K-1。4、更新中心点计算每个簇内所有点的坐标平均值将该平均位置作为新的中心点。5、判断收敛重复步骤2-4直到中心点位置不再发生显著变化或达到最大迭代次数。K值的选择肘部法则K值选择是K-means算法中关键问题之一。K值过小会导致不同类型的数据被错误归为一组K值过大会导致过渡分割失去聚类的意义。计算不同K值下的Inertia簇内误差平方和绘制K值与Inertia的曲线。寻找曲线的“拐点”该点对应的K值通常是较优选择。Inertia误差指标衡量每个数据点到其所属簇的中心点的距离平方和计算方式先计算每个点Xi到其所属簇中心点μci的欧氏距离将距离求平方然后将所有数据点的距离平方值累加。Inertia∑i1n∥xi−μci∥2 Inertia \sum_{i1}^{n} \| x_i - \mu_{c_i} \|^2Inertiai1∑n​∥xi​−μci​​∥2指标含义Inertia 越小说明簇内的点越紧密聚类效果越好。随 K 值增加而减少K 值越大每个簇越小数据点离其中心点越近Inertia 自然越小。⚠️ 特别警告不要盲目追求最小值当 K 等于数据点总数时每个点自己就是一个簇Inertia 等于 0但这毫无意义。需要在聚类质量低 Inertia和簇数量合理的 K 值之间寻找平衡。案例鸢尾花分类第一步超参数调优模型选择importmatplotlib.pyplotaspltfromsklearn.datasetsimportload_irisfromsklearn.clusterimportKMeansfromsklearn.decompositionimportPCAfromsklearn.metricsimportsilhouette_scoreimportseabornassns plt.rcParams[font.sans-serif][SimHei,Microsoft YaHei]# 黑体优先备选微软雅黑plt.rcParams[axes.unicode_minus]False# 解决负号变成方框sns.set(fontSimHei)# seaborn热力图也要指定字体# 1. 加载数据irisload_iris()xiris.data y_trueiris.target# 保留真实标签最后用来对比聚类时不使用# 2. 特征标准化(必需)fromsklearn.preprocessingimportStandardScaler scalerStandardScaler()x_scaledscaler.fit_transform(x)# --- 肘部法则寻找最优 K 值 ---inertias[]K_range_elbowrange(1,11)# 肘部法则从 K1 开始算forkinK_range_elbow:modelKMeans(n_clustersk,random_state42,n_init10)model.fit(x_scaled)inertias.append(model.inertia_)# 绘制肘部法则曲线plt.figure(figsize(6,4))plt.plot(K_range_elbow,inertias,markero,colorblue)plt.xlabel(K值)plt.ylabel(Inertia (簇内误差平方和))plt.title(肘部法则寻找最优 K 值)plt.axvline(x3,colorred,linestyle--,label拐点在 K3)plt.legend()plt.tight_layout()plt.show()# --- 轮廓系数法寻找最优 K 值 ---sil_scores[]K_range_silrange(2,11)# 轮廓系数必须从 K2 开始算forkinK_range_sil:modelKMeans(n_clustersk,random_state42,n_init10)labelsmodel.fit_predict(x_scaled)scoresilhouette_score(x_scaled,labels)sil_scores.append(score)# 绘制轮廓系数曲线plt.figure(figsize(6,4))plt.plot(K_range_sil,sil_scores,markero,colorgreen)plt.xlabel(K值)plt.ylabel(Silhouette Score)plt.title(轮廓系数法寻找最优 K 值)plt.axvline(x3,colorred,linestyle--,labelK3)plt.legend()plt.tight_layout()plt.show()# --- 用最优 K 聚类 PCA 可视化 ---best_k3modelKMeans(n_clustersbest_k,random_state42,n_init10)labelsmodel.fit_predict(x_scaled)pcaPCA(n_components2)x_pcapca.fit_transform(x_scaled)plt.figure(figsize(6,5))plt.scatter(x_pca[:,0],x_pca[:,1],clabels,cmapviridis,s40)plt.title(fKMeans 聚类结果 (K{best_k}, PCA 降维))plt.xlabel(PC1)plt.ylabel(PC2)plt.show()第二步模型构建与应用fromsklearn.clusterimportKMeansfromsklearn.datasetsimportload_iris# 1、 加载数据irisload_iris()xiris.data y_trueiris.target# 保留真实标签最后用来对比聚类时不使用# 2、 特征标准化必需fromsklearn.preprocessingimportStandardScaler scalerStandardScaler()x_scaledscaler.fit_transform(x)# 3、模型 训练预测k_optimal3kmeansKMeans(n_clustersk_optimal,random_state42,n_init10# 设置多次运行取最优)clusterskmeans.fit_predict(x_scaled)# 同时完成训练和预测返回每个点的簇标签# 5. 评估计算轮廓系数# 5.1: 内部指标fromsklearn.metricsimportsilhouette_score,davies_bouldin_score# 轮廓系数衡量每个点与其所在簇的相似度以及与其他簇的分离度。范围[-1, 1]越大越好接近1scoresilhouette_score(x_scaled,clusters)print(f轮廓系数:{score:.3f})# 通常0.35 ~ 0.5很好以上不错# DB指数基于簇内距离与簇间距离的比值。范围[0,∞)值越小越好接近0表示聚类质量高db_scoredavies_bouldin_score(x_scaled,clusters)print(fDB指数:{db_score:.3f})# 5.2: 外部指标fromsklearn.metricsimportadjusted_rand_score,normalized_mutual_info_score# 范围[-1, 1]越大越好通常0.4 ~ 0.6不错0.6 ~ 0.8很不错以上很好ariadjusted_rand_score(y_true,clusters)# 范围[0, 1]越大越好通常0.5 ~ 0.7不错以上很好nminormalized_mutual_info_score(y_true,clusters)print(fARI:{ari:.3f}, NMI:{nmi:.3f})---------------------------------------------------------------------------------轮廓系数:0.460DB指数:0.834ARI:0.620,NMI:0.659---------------------------------------------------------------------------------常见问题与解决方案问题类别问题描述解决方案忽略数据标准化年龄20-60和收入20000-200000量纲差异巨大收入会主导聚类结果。使用StandardScaler将所有特征转换为均值0、标准差1的分布。盲目选择K值随意设置K3或K5没有依据。使用肘部法则、轮廓系数等方法结合业务需求确定K值。处理非球形簇数据呈现月牙形、环形等复杂形状K-means效果差。考虑使用DBSCAN、层次聚类等能处理任意形状簇的算法。忽略异常值极端值严重影响中心点计算导致聚类偏差。在聚类前进行异常值检测和处理或使用鲁棒的聚类算法。K-means性能提升技巧实用技巧说明特征标准化K-means基于距离计算不同量纲的特征会导致某些特征主导聚类结果。使用StandardScaler或MinMaxScaler进行标准化确保所有特征在同一尺度上。K-means初始化sklearn默认使用K-means算法选择初始中心点它比随机初始化更智能能大幅减少陷入局部最优的风险。多次运行取最优通过n_init参数设置算法运行多次默认10次选择inertia最小的结果。这能有效避免因初始化不当导致的糟糕结果。使用Mini-batch K-means对于超大规模数据集使用MiniBatchKMeans。它每次只使用部分数据更新中心点速度快但牺牲了一些精度。适合百万级以上的数据。
阅读完成 · 觉得有帮助?
咨询建站