K-Means 与轮廓系数
交替把样本分给最近中心并更新均值,最小化簇内平方距离;轮廓系数辅助评价 K。
学习前需要掌握
背景与问题
客户数据没有类别标签时,可以先按特征相似性寻找分组。但“相似”由特征、尺度和距离定义;算法给出的簇不天然等于真实客户类型。K-Means 与轮廓系数提供一种特定几何结构的拟合和诊断。
概念定义
K-Means 在预先指定 K 后最小化样本到所属中心的平方欧氏距离和。算法交替分配最近中心和更新簇均值。轮廓系数用样本的簇内平均距离 a 与最近其他簇平均距离 b 比较,取 (b−a)/max(a,b),并不是到中心距离的比值。
直观理解
把点分给最近服务站,再把站点搬到所服务点的平均位置,反复直到变化较小。轮廓系数则问:这个点和自己组成员是否真的比和邻组成员更接近。
核心原理
最近分配和均值更新使当前目标不增,但结果可能停在局部解,初始化与随机种子会影响答案。K-Means++ 和多次初始化改善起点选择,却不保证找到了所有数据的全局最优。
最优簇内平方和随 K 增加不会升高,不能只用训练 inertia 选 K。轮廓偏好紧凑分离的簇,也可能低估非球形结构;其有效输入通常要求至少两个簇且簇数小于样本数,单点簇的约定需看实现。
不同单位会扭曲欧氏距离,应依据任务决定缩放与特征权重,而不是机械地把所有变量视为等价。异常点、密度差异和弯曲簇可能使 K-Means 不合适,需结合稳定性和实际解释比较其他方法。
数学表达
K-Means 与轮廓的不同目标
μ 是簇中心;a 为本簇其他点平均距离,b 为最近其他簇的平均距离。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1确定哪些特征和距离具有任务意义,必要时缩放。
- 2选择候选 K,并为每个 K 做多次初始化。
- 3交替分配最近中心和计算簇均值。
- 4记录 inertia、簇大小、轮廓与跨次稳定性。
代码对应位置
示例 1四个点同时核对中心、inertia 与轮廓:在可手算构造数据上拟合 K-Means,簇编号不作为语义标签。
手算与场景核对
一维点为 0、1、9、10,K=2 时可分成 [0,1] 与 [9,10],中心为 0.5 与 9.5。四个点到中心的平方距离各为 0.25,所以 inertia=1。
点 0 的簇内平均距离 a=1,另一簇平均距离 b=(9+10)/2=9.5,轮廓约 0.894737。点 1 的 b=8.5,轮廓约 0.882353;对称四点的平均轮廓约 0.888545。
计算与实现步骤
- 确定哪些特征和距离具有任务意义,必要时缩放。
- 选择候选 K,并为每个 K 做多次初始化。
- 交替分配最近中心和计算簇均值。
- 记录 inertia、簇大小、轮廓与跨次稳定性。
- 检查代表样本、异常点和业务含义,避免把最大内部指标当真值。
代码实现
示例 1
四个点同时核对中心、inertia 与轮廓
example_01.py用途:在可手算构造数据上拟合 K-Means,簇编号不作为语义标签。
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
X = np.array([[0.0], [1.0], [9.0], [10.0]])
model = KMeans(n_clusters=2, n_init=10, random_state=42).fit(X)
centers = sorted(model.cluster_centers_.ravel())
print("centers=" + ",".join(f"{x:.3f}" for x in centers))
print(f"inertia={model.inertia_:.3f}")
print(f"silhouette={silhouette_score(X, model.labels_):.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
在可手算构造数据上拟合 K-Means,簇编号不作为语义标签。
X- 完整特征矩阵,每行一个样本、每列一个特征。
model- 组合预处理和估计器的模型对象。
Step 1 · 1–3 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_scoreStep 2 · 5–10 行
调用 fit 学习训练数据中的参数;若在 Pipeline 中,预处理器与模型会按顺序拟合。
X = np.array([[0.0], [1.0], [9.0], [10.0]])
model = KMeans(n_clusters=2, n_init=10, random_state=42).fit(X)
centers = sorted(model.cluster_centers_.ravel())
print("centers=" + ",".join(f"{x:.3f}" for x in centers))
print(f"inertia={model.inertia_:.3f}")
print(f"silhouette={silhouette_score(X, model.labels_):.6f}")预期输出或运行结果
centers=0.500,9.500 inertia=1.000 silhouette=0.888545
常见错误 · 3 条
- 用离中心距离替代轮廓所需的样本平均距离。
- 只看 inertia 越小越好,最终选到接近样本数的 K。
- 把簇编号或高轮廓直接解释成客观真实类别。
实际应用
- 对近似紧凑欧氏结构做探索分组或向量量化。
- 在固定特征表示下比较多个 K 的几何质量。
常见错误
- 用离中心距离替代轮廓所需的样本平均距离。
- 只看 inertia 越小越好,最终选到接近样本数的 K。
- 把簇编号或高轮廓直接解释成客观真实类别。
资料与假设
参见 scikit-learn:K-Means 与聚类评估。 本页数值均为构造例;涉及模型分数时仅说明给定数据与协议下的计算。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。