k-means
算法步骤
输入:聚类簇数k,样本集合D
输出:簇划分C={C1,C2,...,Ck}
1.选取k个样本作为初始的均值向量;
2.计算每个数据点到均值向量的距离,数据点距离那个均值向量近,就划分到哪一个类别中;
3.计算每个类别的均值向量(中心点),判断与上一次的是否有变化,有则更新;
4.重复上述步骤,直到每一个类别的均值变化不大为止。
k-means的改进:
k-means的缺点:
- 需要用户事先指定聚类的个数k值
- 对初始聚类中心敏感,选择不同的聚类中心会产生不同的聚类结果
- 无法发现任意簇
k-means++:针对第二个问题进行改进,减少k-means对初始值的依赖性
整体思想和k-means相差不大,主要是在第一步选取初始均值时,不再是随机选取k个数据对象作为初始聚类的中心,而是遵循初始聚类中心之间的聚类尽可能远的原则选取。
选取k个聚类中心的思想:
- 假设已经选取了n个初始聚类中心n<k,在选取第n+1个聚类中心的时候:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心
- 在选取第一个聚类中心(n=1)时,采取随机的方法
算法步骤
输入:簇数目k,数据集D
输出:k个簇
- 从数据集中随机选取一个样本作为初始聚类中心K1
- 对于数据集的每一个点,计算它与已有聚类中心之间的最短聚类,用D(x)表示
- 选取一个新的样本作为聚类中心:原则。D(x)较大的点,被选取作为聚类中心的概率会较大---关键
- 重复步骤2,3,直到选出k个聚类中心
- 重复k-means算法的2-4步骤
mini batch k-means:一种训练方法上的改进:每次训练算法时所随机抽取的数据集子集进行算法训练
Spectural Cluster,基于图论的聚类方法,将无向图划分为两个或两个以上的最优子图,使得子图内部尽量相似,而子图之间的距离尽量较远。
基本思想:利用数据的相似矩阵(拉普拉斯矩阵)进行特征分解后得到特征向向量进行聚类
DBSCAN:密度聚类,聚类的结构通过样本分布的紧密程度确定。
-邻域:样本集与数据点距离不大于的样本集合
核心对象:的邻域至少包含MinPts个样本,那么就是一个核心对象
密度直达:位于的-邻域中,且为核心对象,那么由密度直达
密度可达:对与,若存在样本序列,其中,且由密度直达,则称由密度可达
密度相连:对与,若存在使得与均由密度可达,则称与密度相连。
算法步骤
输入:样本数据集。邻域参数(,MinPts)
输出:划分好的簇,个数不确定
- 根据给定的邻域参数找出所有的核心对象
- 以任一核心对象为出发点,找出由其密度可达的样本生成的聚类簇,知道所有核心对象都被访问过
不需要确定簇数,but需要指定邻域和minPts
Gaussian mixtures:采用概率模型来表达聚类模型
k-mean是将每一个数据点分配到某一个cluster上,GMM是给出每个数据点分配到每个cluster上的概率。
使用混合高斯模型做聚类首先要假设数据点是呈高斯分布的。
单维高斯分布的概率密度函数:
其中,表示高斯分布的均值, 表示方差。
假设混合高斯模型由k个高斯模型组成(即数据包含k个类),则混合高斯模型GMM概率密度函数:
,其中是第k个高斯模型的概率密度函数,是第k个高斯模型的权重。
算法步骤
输入:样本数据集,高斯混合成分个数k
输出:k个簇类
- 初始化高斯混合分布的参数(均值,方差,混合系数)
- 给定每个簇的高斯分布,计算数据点属于每个簇的概率:每个数据集由各混合成分生成的后验概率(贝叶斯定理)
- 计算高斯参数使得数据点的概率最大化
- 重复2,3步骤,迭代更新高斯参数直到参数的变化不大
混合高斯模型里面涉及到的两个知识点:
极大似然估计:清楚某个变量服从的高斯分布,通过采样得到了这个变量的样本数据,想求高斯分布的参数
EM
https://blog.csdn.net/u014665013/article/details/78970184,https://blog.csdn.net/lin_limin/article/details/81048411
上面两个博客写的比较好
高斯分布参数估计逻辑流程,图片来源:https://blog.csdn.net/lin_limin/article/details/81048411
混合高斯分布参数估计逻辑流程, 图片来源:https://blog.csdn.net/lin_limin/article/details/81048411
hierarchical clustering:层次聚类,试图在每个层次对数据集进行划分,形成树形的聚类结构,有自底向上的聚合策略和自顶向下的分拆策略两种
AGENS:自底向上的聚合策略,先将数据集中的每一个样本看作一个初始聚类簇,然后每一步找出距离最近的两个聚类簇进行合并,过程不断重复直到达到预设的聚类簇个数。
算法步骤
输入:样本数据集,距离度量函数d,聚类簇数k
输出:k个簇
- 先将数据集的每个数据点作为一个簇
- 分别计算他们两两之间的距离(根据距离公式d)
- 找出距离最小的两个簇,合并为一个簇
- 重复2,3步骤,直到簇数达到预设的聚类簇数
效率低