机器学习:KMeans

?
?

引言

?
?

k-Means很早就接触了,大四做本科毕设的时候就用的k-Means,最近从新翻到机器学习实战书中讲到,再结合这几年看到的相关的文章,谈一谈KMeans

?
?

算法流程

?
?

首先数据集中的每个样本向量可看作高维空间中的一个点

?
?

那么我们开始的时候可以从数据集中任意选取K个数据点作为初始类中心,也可以创建符合在数据集范围中的k个质心,注意,这里的k个质心可能不是真实存在的k个点(机器学习实战中即是随机生成的在数据集范围内的k个质心),因为之后质心都要重新计算,所以这里并无不可

?
?

然后将每个数据点指派到离它最近的最近的类中,形成k个簇,这里要计算该点到其余所有类中心的距离

?
?

重新计算每个簇的类中心

?
?

直到簇不发生变化或达到最大迭代次数

?
?

算法复杂度

?
?

时间复杂度:O(tkmn) --- t为迭代次数,k为簇的数目,n为样本数,m为维数

空间复杂度:O(nm)

?
?

一般t,k,m均可认为是常量,所以时间和空间复杂度可以简化为O(n),即线性的

?
?

算法实现

?
?

首先是随机产生k个初始化类中心

?
?

def randCent(dataSet, k):

n = shape(dataSet)[1]

centroids = mat(zeros((k,n)))#create centroid mat

for j in range(n):#create random cluster centers, within bounds of each dimension

minJ = min(dataSet[:,j])

rangeJ = float(max(dataSet[:,j]) - minJ)

centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))

return centroids

?
?

该函数主要是随机生成每一维上最大最小值之间的一个值作为该维度上的数值,每一维上都产生一个值,组成一个质心点,共生成k个质心点

?
?

然后就是每个点的分配问题

?
?

在KMeans的主函数中定义一个clusterChanged,初始化为true,只要类还在变化,就一直迭代,直至类不再变化为止

?
?

对m个样本集中的每一个样本i进行循环,将样本i与k个质心都求一个距离,找到最小距离的质心,将该样本分配给这个质心所在的类

?
?

这里程序中用了一个clusterAssment矩阵,一个m×2的矩阵存储m个样本的类别以及样本到该质心的距离

?
?

重新计算质心

?
?

分配完后,重新计算质心

?
?

def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):

m = shape(dataSet)[0]

clusterAssment = mat(zeros((m,2)))#create mat to assign data points

#to a centroid, also holds SE of each point

centroids = createCent(dataSet, k)

clusterChanged = True

while clusterChanged:

clusterChanged = False

for i in range(m):#for each data point assign it to the closest centroid

minDist = inf; minIndex = -1

for j in range(k):

distJI = distMeas(centroids[j,:],dataSet[i,:])

if distJI < minDist:

minDist = distJI; minIndex = j

if clusterAssment[i,0] != minIndex: clusterChanged = True

clusterAssment[i,:] = minIndex,minDist**2

print centroids

for cent in range(k):#recalculate centroids

ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster

centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean

return centroids, clusterAssment

?
?

衡量聚类好坏

?
?

一个度量聚类结果好坏的指标是SSE,误差平方和,也就是之前在clusterAssment矩阵中存的每个样本到质心的距离,SSE越小,代表数据点越接近它们的质心,聚类结果越好

?
?

确定K值的方法

?
?

多次运行尝试,寻找SSE最小的K值

?
?

常用的方法是多次运行,每次使用一组不同的随机初始质心,然后选择具有最小SSE(误差平方和)的簇集 >>> 简单但效果可能不好

?
?

在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的SSE,最后选SSE最小的值对应的k作为最终的集群数目。

?
?

与层次聚类的结合

?
?

首先采用层次聚类算法决定结果中簇大概的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类

?
?

适用情况是(1)样本相对较小例如数百到数千,主要是层次聚类开销较大(2)k相对于样本大小较小

?
?

使用canopy算法进行初始划分

?
?

Canopy聚类在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy ,通过一系列计算得到若干个Canopy

?
?

根据得到的Canopy个数,可以大致推断K的取值,避免了K的盲目性

?
?

Canopy算法

?
?

初始,我们有一组点集S,预设两个距离阈值,T1>T2

?
?

选择一个点P,计算它与S中其他点的距离(这里采用成本低的计算方法),并将此点作为此canopy的质心

?
?

将与P距离为T1以内的点放入该Canopy中,同时删除S中与此点P距离在T2内的点

?
?

这里是为了保证和中心P距离在 T2 以内的点不能再作为其他 Canopy 的中心

?
?

再从S中剩余的点中选取新的Canopy质心,最后点会形成如下形式

?
?

?
?

空聚类的处理

?
?

如果所有的点在指派过程中都没有分配到某个簇,就会得到空簇

?
?

这种情况下需要替补质心,否则平方误差将会偏大

?
?

一种方法是选择一个距离当前任何质心最远的点,这将消除当前对总平方误差影响最大的点

?
?

另一种方法是从具有最大平方误差的簇中选择一个替补的质心,这将分裂簇并降低聚类的总平方误差

?
?

适用范围

?
?

簇与簇之间区别明显,簇大小相近时,结果较理想

?
?

因为时间复杂度是tkmn的,与样本数量线性相关,所以,对于处理大数据集合,该算法非常高效,且伸缩性较好

?
?

但算法对K与初始聚类中心敏感,经常以局部最优结束

?
?

同时对噪声和孤立点敏感

时间: 2025-01-02 06:10:39

机器学习:KMeans的相关文章

视觉机器学习------K-means算法

K-means(K均值)是基于数据划分的无监督聚类算法. 一.基本原理       聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类.聚类算法可以分为基于划分的方法.基于联通性的方法.基于概率分布模型的方法等,K-means属于基于划分的聚类方法. 基于划分的方法是将样本集组成的矢量空间划分为多个区域{Si}i=1k,每个区域都存在一个区域相关的表示{ci}i=1k,通常称为区域中心.对于每个样本,可以建立一种样本到区域中心的映射q

机器学习-KMeans聚类 K值以及初始类簇中心点的选取

[转]http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html 本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的

[机器学习][K-Means] 无监督学习之K均值聚类

有监督学习虽然高效.应用范围广,但最大的问题就是需要大量的有标签的数据集,但现实生活中我们遇到的大量数据都是没有明确标签的,而且对于庞大的数据集进行标注工作本身也是一项费时费力的工作模式,所以我们希望找到一种方法能自动的挖掘数据集中各变量的关系,然后"总结"出一些规律和特征进行分类,这样的方法我们成为无监督学习(Unsupervised learning). 在无标签的数据集中进行分类的方法成为聚类.顾名思义,聚类就是依照某种算法将相似的样本聚在一起形成一类,而不管它的标签是什么.在聚

机器学习-K-means聚类及算法实现(基于R语言)

K-means聚类 将n个观测点,按一定标准(数据点的相似度),划归到k个聚类(用户划分.产品类别划分等)中. 重要概念:质心 K-means聚类要求的变量是数值变量,方便计算距离. 算法实现 R语言实现 k-means算法是将数值转换为距离,然后测量距离远近进行聚类的.不归一化的会使得距离非常远. 补充:scale归一化处理的意义 两个变量之间数值差别太大,比如年龄与收入的数值差别就很大. 步骤 第一步,确定聚类数量,即k的值 方法:肘部法则+实际业务需求 第二步,运行K-means模型 第三

机器学习K-Means

1.K-Means聚类算法属于无监督学习算法. 2.原理:先随机选择K个质心,根据样本到质心的距离将样本分配到最近的簇中,然后根据簇中的样本更新质心,再次计算距离重新分配簇,直到质心不再发生变化,迭代结束. 3.簇内平方和Inertia:采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和.追求能够让簇内平方和最小化的质心. 4.用sklearn实现K-Means:from sklearn.cluster import KMeans #导入包 cluster = KMeans(n.clus

中文信息处理&amp;机器学习-Kmeans实践

BagOfWords: 1. 见上一篇jieba分词. 2. 见上篇,读取分词后文件 3. 统计词频并表示成向量: sklearn工具包方法: from sklearn.feature_extraction.text import CountVectorizer as cv bows = cv(min_df=2,max_df =10) #词频两次以上,最多10次

机器学习:K-Means/K-Means++

原文地址:https://www.cnblogs.com/wwwjjjnnn/p/9160856.html

机器学习笔记——K-means

K-means是一种聚类算法,其要求用户设定聚类个数k作为输入参数,因此,在运行此算法前,需要估计需要的簇的个数. 假设有n个点,需要聚到k个簇中.K-means算法首先从包含k个中心点的初始集合开始,即随机初始化簇的中心.随后,算法进行多次迭代处理并调整中心位置,知道达到最大迭代次数或中性收敛于固定点. k-means聚类实例.选择三个随机点用作聚类中心(左上),map阶段(右上)将每个点赋给离其最近的簇.在reduce阶段(左下),取相互关联的点的均值,作为新的簇的中心位置,得到本轮迭代的最

Spark2.0机器学习系列之8: 聚类分析(K-Means,Bisecting K-Means,LDA,高斯混合模型)

在写这篇文章之前,先说一些题外话. 许多机器学习算法(如后面将要提到的LDA)涉及的数学知识太多,前前后后一大堆,理解起来不是那么容易. 面对复杂的机器学习模型,尤其是涉及大量数学知识的模型,我们往往要花费大量的时间和精力去推导数学算法(公式),如果过分沉湎于此会忽略了很多背后也许更重要的东西,正所谓只见树木,不见森林,而这是缺乏远见,是迷茫的. 我们需要深入理解模型背后的逻辑和所蕴含的或简或繁的思想.某些思想甚至可能是很美的思想,很伟大的思想.这些理解,使得面对复杂的问题时候,面对陌生问题时,

【机器学习】K-Means 聚类是特殊的矩阵分解问题

[机器学习]K-Means 聚类是特殊的矩阵分解(Matrix Factorization)问题 原文是:<k-Means Clustering Is Matrix Factorization> 本博客是该论文的阅读笔记,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 更多相关博客请猛戳:http://blog.csdn.net/cyh_24 如需转载,请附上本文链接:http://blog.csdn.net/cyh_24/article/details/50408884 论文