Kmeans和kmeans++

来源:互联网 发布:java try是干什么的 编辑:程序博客网 时间:2024/06/02 18:10

聚类算法分类

划分聚类 Partitioning Methods :K-means
层次聚类 Hierachical Methods: Bottum-Up,Top-Down, BIRCH, CURE, CHAMELEON
基于密度的聚类 Density-based Methods: DBSCAN
基于网格的聚类 Grid-based Methods:CLIQUE
基于模型算法 Model-based Methods:统计方案,神经网络方案

kmeans

算法思想

初始随机给定K个簇中心,按照距离最近 原则把待分类的样本点分到各个簇,然后按平均法重新 计算各个簇的质心,从而确定新的簇心,迭代计算,直 到簇心的移动距离小于某个给定的误差值。使用算法描述语言

步骤

1.任意选择K个点作为初始聚类中心;
2. 计算每个样本点到聚类中心的距离,将每个样本点划分到离 该点最近的聚类中去;
3. 计算每个聚类中所有点的坐标平均值,并将这个平均值作为 新的聚类中心。
反复执行2、3,直到聚类中心的移动小于某误差值或者聚类次数 达到要求为止。
计算距离的方法通常是欧几里得距离

Dist=(x1x2)2+(y1y2)2

损失函数

每一次选取好新的中心点,我们就要 计算一下当前选好的中心点损失为多少,这个损失代表着偏移量, 越大说明当前聚类的效果越差,计算公式称为(Within-Cluster Sum of Squares, WCSS)

L(C)=kϵKiϵKxick2

其中,xi表示某一对象,ck表示该对象所属类别的中心点。整个式子的含义就是对各个类别下的对象,求对象与中心点的欧式距离的平方,把所有的平方求和就是损失。

K-means缺陷

K值需要预先给定,算法对初始选取的聚类中心点是敏感的,不同的随机种子点得到的聚类结果完全不同。
对于可以确定K值不会太大但不明确精确的k值的场景,可以进行迭代运算,然后找出损失函数最小时所对应的k值。

kmeans++

K-Means++算法选择初始聚类中心的思想是:初始的聚
类中心之间的相互距离要尽可能远。算法步骤如下:
1. 随机挑选一个点作为第一个聚类中心;
2. 对于每一个点x,计算和其最近的一个聚类中心的距离D(x), 将所有距离求和得到Sum(D(x));
3. 然后,再取一个随机值,用权重的方式来取计算下一个“种子 点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随 机值Random,然后用Random=D(x),直到其<=0,此时的点 就是下一个“种子点”(其思想是,D(x)较大的点,被选取作 为聚类中心的概率较大);
4. 重复2和3,直到K个聚类中心被选出来;
5. 利用这K个初始聚类中心进行K-Means算法。

代码实现

默认k-means算法:

from pyspark.mllib.clustering import KMeansval clusters = new KMeans().setK(numClusters).setMax Iterations(numIterations).run(parsedData)

设置初始k选取方式为k-means++:

initMode = "k-means||"clusters = KMeans.train(parsedData, 3, maxIterations=20, runs=10, initializationMode=initMode, seed=50, initializationSteps=5, epsilon=1e-4)

层次聚类

  • 自底向上型(agglomerative):开始每个样本都属于自己独立的cluster,在每个时间节点上,找2个最接近的类聚合,知道所有的样本都属于一个cluster
  • 自上向下型(divisive): 开始所有的样本都属于一个cluster,依次踢掉最不内聚的样本,一直重复上一步直到所有样本都属于自己这个cluster
    层次聚类不用指定聚类个数k,计算复杂度O(N03),比k-means慢

高斯混合聚类GMM

流程跟k-means相似,是典型的EM过程,知道特征和GMM各个初始参数(均值向量,协方差矩阵,分布系数),计算属于每个类别的后验概率。根据这个概率调整参数,再计算后验概率…直到收敛。
软聚类:每个样本属于类别的概率
GMM优势:

  • 可理解性好(可以看做是多个分布的组合)
  • 速度快(因为EM的高效算法时间复杂度为o(N)))
  • 学术上比较直观:最大数据似然概率
  • 可以扩展到多个其他分布的混合:多个多项式分布做类别判定。

缺点:与k-means相似,初始化敏感,要手工指定k的个数,不适用于非凸分布数据集。

k-means可以看作是“混合高斯聚类在混合成分方差相等、且每个样本派给一个混合成分时的特例”

处理非凸数据的方法:核方法、基于密度的聚类方法

基于密度的聚类

基于密度的聚类算法认为,在整个样本空间点中,各目标类簇是由一群的稠密样本点组成的,而这些稠密样本点被低密度区域(噪声)分割,而算法的目的就是要过滤低密度区域,发现稠密样本点。
DBSCAN(Density-based Spatial Clustering of Applications with Noise)是一种基于高密度联通区域的聚类算法,它将类簇定义为高密度相连点的最大集合,它本身对噪声不敏感,并且能发现任意形状的类簇。
DBSCAN中的的几个定义:
- Ε领域:给定对象半径为Ε内的区域称为该对象的Ε领域
- 核心对象:如果给定对象Ε领域内的样本点数大于等于MinPts,则称该对象为核心对象。
- 直接密度可达:对于样本集合D,如果样本点q在p的Ε领域内,并且p为核心对象,那么对象q从对象p直接密度可达。
- 密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。
- 密度相连:对于样本集合D中的任意一点O,如果存在对象p到对象o密度可达,并且对象q到对象o密度可达,那么对象q到对象p密度相连。
密度可达是直接密度可达的传递闭包,并且这种关系是非对称的。密度相连是对称关系。DBSCAN目的是找到密度相连对象的最大集合。
Eg: 假设半径Ε=3,MinPts=3,点p的E领域中有点{m,p,p1,p2,o}, 点m的E领域中有点{m,q,p,m1,m2},点q的E领域中有点{q,m},点o的E领域中有点{o,p,s},点s的E领域中有点{o,s,s1}.那么核心对象有p,m,o,s(q不是核心对象,因为它对应的E领域中点数量等于2,小于MinPts=3);点m从点p直接密度可达,因为m在p的E领域内,并且p为核心对象;点q从点p密度可达,因为点q从点m直接密度可达,并且点m从点p直接密度可达;点q到点s密度相连,因为点q从点p密度可达,并且s从点p密度可达。
算法:DBSCAN
输入:E — 半径
MinPts — 给定点在E领域内成为核心对象的最小领域点数
D — 集合
输出:目标类簇集合
方法:repeat
1) 判断输入点是否为核心对象
2) 找出核心对象的E领域中的所有直接密度可达点
util 所有输入点都判断完毕
repeat
针对所有核心对象的E领域所有直接密度可达点找到最大密度相连对象集合,
中间涉及到一些密度可达对象的合并。
Util 所有核心对象的E领域都遍历完毕

谱聚类

建立在谱图理论基础上,与传统的聚类算法相似,具有能在任意形状的样本空间上聚类且收敛于全局最优解的优点。
将聚类问题转换为图的最优划分问题。
将数据集中的每个对象看作是图的顶点V,将顶点间的相似度化作相应顶点连接变得权值,这样得到一个基于相似度的无向加权图,图论的最优划分准则就是使划分成的子图内部相似度最大,子图之间的相似度最小。
步骤:
- 构建表示对象集的相似度矩阵W
- 通过计算相似度矩阵或拉普拉斯矩阵的前k个特征值和特征向量,构造特征向量空间
- 利用k-means或其他经典的聚类算法对特征空间中的特征向量进行聚类。
相似矩阵:P^(-1)*A*P=B,则称矩阵A与B相似,记为A~B.
拉普拉斯矩阵:L=D-A,D为图的度矩阵,A为邻接矩阵,度矩阵在有向图中,只需要考虑出度或者入度中的一个。

划分准则:

谱聚类算法将聚类问题转化为图的划分问题之后,基于图论的划分准则的优劣直接影响到聚类结果的好坏。常见的划分准则有Mini cut,Average cut,Normalized cut,Min-max cut,Ratio cut,MNcut等。

典型算法

根据谱聚类算法所使用的划分准则,可以把算法分为二路谱聚类算法和多路谱聚类算法,前者使用2-way划分准则而后者使用k-way划分准则。

0 0