Kmeans和kmeans++
2016-07-20 15:33
274 查看
聚类算法分类
划分聚类 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=(x1−x2)2+(y1−y2)2
损失函数
每一次选取好新的中心点,我们就要 计算一下当前选好的中心点损失为多少,这个损失代表着偏移量, 越大说明当前聚类的效果越差,计算公式称为(Within-Cluster Sum of Squares, WCSS)L(C)=∑kϵK∑iϵK∥xi−ck∥2
其中,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 KMeans val 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划分准则。相关文章推荐
- 聚类算法之kmeans算法java版本
- python中kmeans聚类实现代码
- kmeans python版
- 数据挖掘-聚类-K-means算法Java实现
- Mahout-kmeans命令行文本文件聚类
- Kmeans
- 基于 Sift + Kmeans + 倒排索引 的图像匹配
- mahout-kmeans笔记
- 一个快速聚类 Kmeans ( GPU Kmens)
- 数据挖掘之KMEANS算法
- Mahout学习——Canopy Clustering
- Kmeans算法详解及实现
- Clustering of residential areas based on residential conditions
- Kmeans 聚类算法
- C++ 实现k-means machine learning 算法 Computer Vision
- 基于Kmeans的证件照背景色替换算法
- Python 实现K-means算法
- spark+eclipse环境搭建同时使用kmeans聚类
- 多目标进化问题,根据PCI进行小区的聚类,Kmeans算法的改进:二次聚类
- k-means--常用于为高斯混合模型设置初始值