目录
[1. 认识聚类算法](#1. 认识聚类算法)
[2. 聚类的流程](#2. 聚类的流程)
[3. 簇内误差平方和](#3. 簇内误差平方和)
[1. 重要参数n_clusters](#1. 重要参数n_clusters)
[2. 模型评估指标](#2. 模型评估指标)
[1. 类型](#1. 类型)
[2. KMeans参数列表](#2. KMeans参数列表)
[3. KMeans属性列表](#3. KMeans属性列表)
[4. KMeans接口列表](#4. KMeans接口列表)
一、初识聚类
1. 认识聚类算法
聚类算法又叫做 " 无监督分类 " ,其目的是 ++将数据划分成有意义或有用的组(或族)++。这种划分可以 基于我们的 业务需求 或 建模需求来 完成,也可以 单纯地帮助我们 探索数据的 自然结构和分布。
聚类和分类的不同:
2. 聚类的流程
这个过程在可以 由下图来显示,我们规定,将数据分为 4 簇(K=4),其中白色 X 代表质心的位置:
在每次迭代中 被分配到 这个质心上的 样本都是 一致的,即 每次新生成的簇 都是 一致的,所有的样本点 都不会再 从一个簇转移到 另一个簇,质心就 不会变化了。
3. 簇内误差平方和
被分在同一个簇 中的数据是 有相似性的,而 不同簇中的数据是 不同的。聚类算法追求 " 簇内差异小、簇外差异大 〞。而这个"差异",由 样本点到 其所在簇的质心的 距离来衡量。++对于一个簇来说,所有 样本点到质心的 距离之和越小,就认为这个簇中的样本越相似,簇内差异就越小。++
距离的衡量方法有多种,令 x 表示簇中的 一个样本点,𝛍 表示该簇中的 质心,n 表示 每个样本点中的 特征数目,i 表示组成点 x 的每个特征,则 该样本点 到质心的距离 可以由以下距离 来度量:
如采用欧几里得距离,则一个簇中 所有样本点到质心的距离的 平方和为:
其中,m 为一个簇中样本的 个数,j 是每个样本的编号。这个公式被称为 簇内平方和 (cluster Sum of Square) 又叫做 Inertia。而将一个 数据集中的 所有簇的 簇内平方和相加,就得到了整体平方和 (Total Cluster Sum of Square) ,又叫做 total inertia。 Total Inertia 越小,代表着每个簇内样本 越相似,聚类的效果就越好。因此 KMeans 追求的是,求解能够让 Inertia 最小化的质心。
Inertia越小模型越好吗?
***① 它不是有界的。*我们只知道 Inertia 是 越小越好,是 0 最好,但我们不知道,一个较小的 Inertia 究竟 有没有达到 模型的极限,能否 继续提高。
② 计算太容易受到 特征数目的 影响。 数据维度很大的时候,Inertia 的计算量 会陷入++维度诅咒++之中,计算量 会爆炸,不适合 用来一次次 评估模型。
③ 会受到 超参数 K 的影响。 ++随着 K 越大,Inertia 注定会 越来越小++,但这并不代表 模型的效果 越来越好了。
④ Inertia 对数据的分布有假设。 它假设数据 ++满足 凸分布(即数据在 二维平面图像上 看起来是一个 凸函数的 样子),并且它 假设数据是 各向同性的( isotropic ),即是 说数据的属性 在不同方向上 代表着 相同的含义++。但是 现实中的 数据往往不是这样。所以使用Inertia 作为评估指标,会让聚类算法 在一些细长簇、环形簇、或者不规则形状的 流形时表现不佳:
补充:
每个距离都有自己对应的 Inertia。过去的经验 总结出 不同距离所对应的 质心选择方法和 Inertia,在 Kmeans 中,只要 使用了 正确的质心 和 距离组合,无论 使用什么样的 距离,都 可以达到 不错的 聚类效果。
二、KMeans介绍
涉及模块:sklearn.cluster
1. 重要参数n_clusters
使用 Kmeans 进行聚类。首先要 猜测一下,数据中有几个簇。
2. 模型评估指标
(1)真实标签己知的时候
(2)真实标签未知的时候
++完全 依赖于评价簇内的 稠密程度(簇内差异小)和 簇间的 离散程度(簇外差异大)来 评估聚类的效果++ 。其中 轮廓系数是最常用的聚类算法的评价指标。它对 每个样本来定义,能 够同时衡量:
① 样本与 其自身 所在的簇中的 其他样本的 相似度 a,等于 样本与 同一簇中 所有其他点之间的 平均距离。
② 样本 与 其他簇中的 样本的 相似度 b,等于 样本与 下一个最近的 簇中的 所有点之间的平均距离。
++根据聚类的要求 " 簇内差异小,簇外差异大 〞,我们希望 b 永远大于 a,并且大得越多越好。++
单个样本的 轮廓系数计算为:
经解析可得:
轮廓系数范围是(-1,1),其中++值 越接近 1 表示样本 与自己所在的簇中的样本 很相似,并且与 其他簇中的 样本不相似。当 样本点与 簇外的样本 更相似的时候,轮廓系数就 为负。当 轮廓系数为 0 时,则 代表两个簇中的 样本相似度一致,两个簇本 应该是一个簇++ 。可以 总结为 轮廓系数越接近于 1 越好,负数 则表示聚类 效果非常差。
如果一个簇中的大多数样本 具有比较高的轮廓系数,则 簇会有较高的 总轮廓系数,则整个数据集的 平均轮廓系数越高,则 聚类是合适的。如果 许多样本点具有低轮廓系数 甚至负值,则 聚类 是不合适的,聚类的超参数 K 可能设定得 太大或者太小。
python
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples
# X:样本特征
# y_pred:模型预测结果
# 返回的是一个数据集中 所有样本的轮廓系数的均值
silhouette_score(X, y_pred)
silhouette_score(X, cluster_.labels_)
# 返回的是数据集中 每个样本 自己的轮廓系数
silhouette_samples(X, y_pred)
补充:
三、sklearn中的聚类算法(自查)
1. 类型
聚类算法在 sklearn 中有两种表现形式 ,一种是类,需要实例化,训练 并使用 接口 和属性 来 调用结果。另一种是函数(function),只需要 输入特征矩阵 和 超参数,即可 返回聚类的 结果和 各种指标。