![97731367c5066edd093b9e77aeaf50d2.png](https://img-blog.csdnimg.cn/img_convert/97731367c5066edd093b9e77aeaf50d2.png)
注: 两整天的成果,谬误之处勿喷
1 聚类概述
样本 - 没有训练的样本 - 没有标注的样本
1.1 相似度度量
1.1.1 距离相似度度量
- 距离度量 $dist(o_{i},o_{j})$
- 欧式距离
- 距离相似度度量 $$sim(o_{i},o_{j})= frac{1}{1+dist(o_{i},o_{j})}$$
1.1.2 密度相似性
- 体现的内涵:
- (1)数据结构特性
- (2)数据结构特性相似
- 密度: 单位空间内对象的个数
- 密度相似度定义: 设$c_{i},c_{j}点的密度为d_{i},d_{j}$ $$density(c_{i},c_{j})=|d_{i}-d_{j}|$$
1.1.3 连通相似性
- 定义:
- 数据集用图表示, 节点是对象,边线是关系
- 簇定义为图的连接分支
1.1.4 概念相似性独立
- 语义的相似性
1.2 质量评价指标
- 内部质量评价标准
- CH指标
- 簇间距离和簇内距离的比值
- CH指标值越大 效果越高
- CH指标
- 外部质量评价标准
- 纯度:取值范围小于1,越大越好
1.3 常用的聚类方法
1.3.1 按照聚类的度量
- 基于距离的聚类算法
- 基于密度的聚类算法
- 基于互连性的聚类算法
1.3.2 基于分析方法的思路
- 划分法:
- 层次法:
- 密度法:
- 网格法
- 模型法
2 层次聚类算法
2.1 层次聚类算法概述
- 自顶向下:divisive
- 自底向上:agglomerrative
- 可以用树状图或者嵌套图表示
- 类间距离度量:
- 最短距离:最大相似度
- 最长距离:最小相似度
- 平均距离
- 中心点距离
2.2 diana算法
2.2.1 diana算法简介
自顶向下分裂
- 输入: 包含n个点(对象)的数据集,簇的数目k。
- 输出: k个簇,达到终止条件规定簇数目
度量方法 - 簇的直径:在一个簇中的任意两个数据点的距离中的最大值 - 平均相异度(平均距离)
```伪代码 将所有对象整个当成一个初始簇; 将splinter group和old party两个对象集合置为空; for (i=1; i≠k; i++) { 在所有簇中挑出具有最大直径的簇C; 找出C中与其他点平均相异度最大的一个点p;【离群点】 把p放入splinter group,剩余的点放在old party中; do【离群点的吸引力】 { 在old party里找出到splinter group中点的最近距离不大于到old party 中点的最近距离的点; 将该点加入splinter group; } until (没有新的old party的点被分配给splinter group); splinter group和old party为被选中的簇分裂成的两个簇,与其他簇一起 组成新的簇集合; }
## 2.2 agnes算法
### 2.2.1 agnes算法简介
*自底向上凝聚*
```伪代码
输入: 包含n个点(对象)的数据集,簇的数目k。
输出: k个簇,达到终止条件规定簇数目。
方法: 其过程描述如下:
将每个点当成一个初始簇;
do
{ 根据两个簇中最近的数据点找到最近的两个簇;
合并两个簇,生成新的簇的集合;
} until (达到定义的簇的数目);
2.3 算法优缺点总结
- 简单,理解容易
- 合并点/分裂点选择不太容易
- 合并/分类的操作不能进行撤销
- 大数据集不太适合
- 执行效率较低O(t*n2), t为迭代次数, n为样本点数。
3 划分法
指定的聚类的数目和目标,通过反复迭代来进行优化
3.1 K-均值
对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大
3.3.1 K-均值聚类步骤
- 1.随机的选取K个中心点,代表K个类别;
- 2.计算N个样本点和K个中心点之间的欧氏距离;
- 3.将每个样本点划分到最近的(欧氏距离最小的)中心点类别中——迭代1;
- 4.计算每个类别中样本点的均值,得到K个均值,将K个均值作为新的中心点——迭代2;
- 5.重复步骤2、3、4;
- 6.满足收敛条件后,得到收敛后的K个中心点(中心点不再变化)
3.1.2 K值的选择
注:引用自易学智能 - 可视化数据,通过观察数据的聚合程度判断K值 - K ≈ sqrt(N/2)
- 拐点法:把聚类结果的F-test值(类间Variance和全局Variance的比值)对聚类个数的曲线画出来,选择图中拐点 - Silhouette法 - 交叉验证 - 核方法:构造Kernal矩阵,对其做eigenvalue decomposition,通过结果统计Compactness,获得Compactness—K曲线,选择拐点
3.1.3 代码实现
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.datasets.samples_generator import make_blobs
X, y_true = mak