✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
一、先搞懂核心:为什么需要 “精确识别聚类数”?
K-means 聚类的核心是将数据划分为 K 个 “相似度高、差异度大” 的簇,但 K 值的选择一直是算法应用的痛点 —— 选小了会导致簇内差异过大,选大了会出现过度聚类(簇间边界模糊),甚至失去实际业务意义。比如分析用户画像时,K=2 可能太笼统,K=20 又会让聚类结果无法落地。
而手肘法(Elbow Method) 是目前最常用、最直观的 K 值确定方法,它通过量化 “聚类效果” 与 “K 值” 的关系,找到兼顾聚类质量和简洁性的最优解,解决了 “凭感觉选 K” 的问题。
二、手肘法的核心原理:用 “误差平方和” 找拐点
- 关键指标:SSE(误差平方和)
SSE 全称 Sum of Squared Errors,计算公式为:
Image
核心逻辑:SSE 反映了簇内样本的紧凑程度 ——SSE 越小,说明簇内样本越集中,聚类效果越好。
- 手肘法的核心规律
当我们从 K=1 开始逐步增加聚类数时,SSE 会呈现明显的 “下降 - 平缓” 趋势:
当 K 较小时(比如 K=1),所有样本被归为一类,SSE 极大;
随着 K 增大,簇被不断拆分,簇内样本越来越集中,SSE 快速下降;
当 K 增加到某个临界值后,再增加 K 值,SSE 的下降幅度会突然变小(因为此时已基本拆分出所有天然簇,再拆分就是 “过度细分”);
这个 “下降幅度突变” 的临界点,就是最优 K 值 —— 它在 SSE-K 曲线中像 “手肘” 一样,因此得名 “手肘法”。
三、精确识别步骤:4 步搞定最优 K 值
步骤 1:数据预处理(基础但关键)
K-means 对数据尺度敏感,且受异常值影响较大,预处理必须做:
标准化 / 归一化:将所有特征转换到同一尺度(比如 Z-score 标准化),避免某一特征主导距离计算;
异常值处理:用箱线图、3σ 原则剔除异常值,或用中位数替换;
降维(可选):若特征维度超过 10 维,建议用 PCA 降维,减少计算量并避免 “维度灾难”。
步骤 2:设定 K 值候选范围
根据数据规模和业务场景设定候选 K 值,比如:
小样本数据(条):K∈[1,10]
中样本数据(1000-10000 条):K∈[1,15]
大样本数据(>10000 条):K∈[1,20]
⚠️ 注意:K 的最大值不宜过大,否则会导致计算量激增,且失去聚类的实际意义。
步骤 3:遍历 K 值,计算对应 SSE
对每个候选 K 值,执行 K-means 聚类并计算 SSE:
对当前 K 值,初始化 K 个质心(随机选择 K 个样本或用 K-means++ 优化初始化);
迭代分配样本(将每个样本归到距离最近的质心)和更新质心(计算每个簇的样本均值);
迭代收敛后,计算当前 K 值对应的 SSE;
重复上述步骤,得到所有候选 K 值的 SSE。
步骤 4:绘制 SSE-K 曲线,找 “手肘点”
以 K 值为横轴,SSE 为纵轴,绘制折线图;
观察曲线趋势:找到 “前半段快速下降,后半段趋于平缓” 的拐点,该拐点对应的 K 值即为最优聚类数。
🌰 示例:若 K=1 时 SSE=1000,K=2 时 SSE=500(下降 50%),K=3 时 SSE=200(下降 60%),K=4 时 SSE=180(下降 10%),K=5 时 SSE=170(下降 5.5%),则 K=3 是手肘点,为最优聚类数。
⛳️ 运行结果
:全年365天实测风力的效果图
Image
Image
第二种:拉丁超立方抽样
Image
Image
📣 部分代码
🔗 参考文献
🎈 部分理论引用网络文献,若有侵权联系博主删除
🏆团队擅长辅导定制多种科研领域MATLAB仿真,助力科研梦: