文章目录
无监督机器学习
有X
没有Y
利用X相似性
聚类
对大量未标注的数据集,按内在相似性划分为多个类别,类别内相似度大,类之间相似度小
相似度
聚类
簇
本质上,N个样本,映射到K个簇中
每个簇至少有一个样本
一般情况下,一个样本只属于一个簇(也有一个样样本属于多个簇的)
最基本:
先给定一个初始划分,迭代改变样本和簇的隶属关系,每次都比前一次好
聚类是一种无监督的机器学习任务,它可以自动将数据划分成类cluster。因此聚类分组不需要提前被告知所划分的组应该是什么样子的。因为我们甚至可能都不知道我们再寻找什么,所以聚类是用于知识发现而不是预测
聚类原则
K-Means聚类
K-均值算法是发现给定数据集的k个簇的算法,簇个数是用户给定的,每一个簇通过其质心(centroid)即簇中所有点的中心来描述。
K-均值算法的流程:
(1)对于输入样本集 {x1,x2,…,xm},随机确定k个质心 {μ1,μ2,…,μk};
(2)计算每个样本xj到各个质心μi的欧式距离:dji=||xj-μi||2;
(3)根据距离最近的μ确定样本xj的簇标记:labelj=arg minidji;
(4)循环将数据集中的每个样本分配到各个簇中(染色),每个簇的样本数量为N1,N2,…,Nk;
(5)更新每个簇的质心的位置,为该簇所有样本的均值;
(6)重复上述步骤(染色分配-移动质心-重新染色-再次移动…),直到所有的质心均不再更新;或者达到设定的某个终止条件,如最大迭代次数、最小调整幅度阈值、最小平方误差MSE等。
举例子
先验知识:
K-Means 改进
K-Mediods
数组1,2,3,4,100的均值为22, 其实求均值的话,离里面大多数的值还是比较远的
取中位数的话是3, 更好一些, 因为100可能是噪声
二分K-Means
为了克服K-means算法容易收敛于局部极小值的问题,可以使用bisecting K-means算法弱化随机初始质心的影响。
K-means++算法的流程是:
(1)将所有的样本作为一个簇
(2)根据某种规则将该簇一分为二
(3)选择其中一个簇继续划分,直到达到停止条件(聚簇数量、迭代次数、最小SSE等)。
选择划分聚簇的规则一般有两种:
(1)选择样本量最大的簇进行划分;
(2)选择SSE值最大的簇进行划分。
K-Means++
K-means++算法可以解决K-means对初始质心比较敏感的问题,算法的区别主要在于选择的初始k个质心的之间的相互距离要尽可能的远。
K-means++算法的流程是:
(1)从数据集中随机选择一个样本作为第一个质心;
(2)对数据集中的每个样本,计算它到所有已有质心的距离的总和D(x);
(3)采用线性概率选择出下一个聚类中心点,即D(x)较大的点成为新增质心的概率较大;
(4)重复步骤2直到找到k个聚类中心点
(5)使用得到的k个质心作为初始化质心运行K-means算法。
K-means++算法的缺点:
(1)有可能选中离群点作为质心;
(2)计算距离质心最远的点的开销比较大;
(3)由于质心的选择过程中的内在有序性(第k个质心的选择依赖前k-1个质心的值),
在扩展方面存在着性能问题。
Mini Batch K-Means
Mini Batch K-means算法是K-means算法的一种优化变种,采用随机抽取的小规模数据子集训练算法,减少计算时间,同时试图优化目标函数。Mini Batch K-means算法可以减少K-means算法的收敛时间,而且产生的结果一般只略差于K-means算法。
算法步骤如下:
(1)首先抽取数据集部分样本,使用K-means构建出k个质心的模型;
(2)继续抽取数据集中的部分样本,将其添加到模型中,分别分配给距离最近的质心;
(3)更新质心的位置;
(4)循环迭代(2、3)步操作,直到质心稳定或者达到指定迭代次数,停止计算。
效果:
K-Means可以的优化参数
选择适当的K值
聚类的“相对误差”
聚类中,error是用MSE算出来的
K均值损失函数
求偏导
K的选择
K = N, MSE 为 0
K = 1, MSE就是原始数据的方差
选择一开始下降速度快,后来下降速度慢的
elbow method, 不止于K均值
不同的K:
Canopy聚类
Canopy属于一种‘粗’聚类算法,即使用一种简单、快捷的距离计算方法将数据集分为若干可重叠的子集canopy,这种算法不需要指定k值、但精度较低,可以结合K-means算法一起使用:先由Canopy算法进行粗聚类得到k个质心,再使用K-means算法进行聚类。
Canopy算法步骤如下:
(1)将原始样本集随机排列成样本列表L=[x1,x2,...,xm](排列好后不再更改),根据先验知识或
交叉验证调参设定初始距离阈值T1、T2,且T1>T2 。
(2)从列表L中随机选取一个样本P作为第一个canopy的质心,并将P从列表中删除。
(3)从列表L中随机选取一个样本Q,计算Q到所有质心的距离,考察其中最小的距离D:
如果D≤T1,则给Q一个弱标记,表示Q属于该canopy,并将Q加入其中;
如果D≤T2,则给Q一个强标记,表示Q属于该canopy,且和质心非常接近,
所以将该canopy的质心设为所有强标记样本的中心位置,并将Q从列表L中删除;
如果D>T1,则Q形成一个新的聚簇,并将Q从列表L中删除。
(4)重复第三步直到列表L中元素个数为零。
注意:
(1)‘粗’距离计算的选择对canopy的分布非常重要,如选择其中某个属性、其他外部属性、欧式距离等。
(2)当T2<D≤T1时,样本不会从列表中被删除,而是继续参与下一轮迭代,直到成为新的质心
或者某个canopy的强标记成员。
(3)T1、T2的取值影响canopy的重叠率及粒度:当T1过大时,会使样本属于多个canopy,
各个canopy间区别不明显;当T2过大时,会减少canopy个数,而当T2过小时,会增加
canopy个数,同时增加计算时间。
(4)canopy之间可能存在重叠的情况,但是不会存在某个样本不属于任何canopy的情况。
(5)Canopy算法可以消除孤立点,即删除包含样本数目较少的canopy,往往这些canopy包含的是
孤立点或噪音点。
层次聚类
理解起来有点像无监督的决策树
分裂的层次聚类: DIANA
步骤:
(1)把原始数据集去不断的分裂
(2)然后去计算每个子数据集里面的相似性
(3)再不断的分裂,把数据集分为很多的类别
凝聚的层次聚类: AGNES
步骤:
(1)把一个个样本,不断的自底向上的聚类
(2)然后一层一层的来聚
(3)最后聚成一个完整的数据集
如果我们只关心结果的话,那么在某一时刻是要停止聚类的,在一些数据集中做层次聚类是合适的,包含层次的数据集! 地域!
如果两个样本,可以很好的度量距离,如果已经聚了一层,如何度量簇之间的相似性
最小距离:两个簇中,最接近样本的距离,城市和城市边界最短距离,成链状一条直线了
最大距离:两个簇中,最远的样本的距离,某一个簇存在异常值就很麻烦,簇本身比较狭长
平均距离:
两两样本距离的平均
两两样本距离的平方和
密度聚类
统计样本周边的密度,把密度给定一个阈值,不断的把样本添加到最近的簇
人口密度,根据密度,聚类出城市
解决类似圆形的K-Means聚类的缺点,密度聚类缺点计算复杂度大,空间索引来降低计算时间,降低查找速度
DBSCAN
密度可达
谱和谱聚类
谱: Y = A*X, 矩阵X乘以A等于对矩阵X做了空间线性变换,那么Y=map[X], A就是map这个线性算子,它的所有特征值的全体,称之为方阵的谱
方阵的谱半径为最大的特征值
谱聚类是一种基于图论的聚类方式,通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而达到对样本数据进行聚类的目的
谱聚类
L矩阵是N*N的,N是样本个数,实数形成的对数矩阵,求特征值和特征向量
L*ui = lambda i*ui, lambda是特征值,ui是特征向量,一组lambda有从大到小可以排序
每个对应的lambda都对应一个ui,每个ui是一个个的列向量,比如u11, u21, u31, un1
根据排序默认从小到大,逆序之后我们就取前面的几个ui列向量就可以了,其实这是一种降维
然后我们的前面的这几个列向量ui就成了新的对应每个样本的几个重要的特征
最后我们用K-Means聚类算法对样本进行聚类就好了
谱聚类和PCA的关系
就是Laplace矩阵做了一个主成分分析PCA,然后做K均值聚类
PCA降维
效果图
代码实现
DBSCAN - 基于密度的噪声应用空间聚类
import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
def expand(a, b)