k均值算法是无监督学习的第一章,看完以后认识到k近邻不算是无监督学习,而k均值算法是。主要目的是将待分类样本进行按簇的分类,簇与簇之间的差别尽量大,簇内的差别尽量小,每个簇的中心使用簇中所含值的均值计算而成。 本篇的内容是先简要介绍k均值聚类算法,然后介绍对聚类后得到的簇进行后处理,作为改进,简介二分k均值聚类算法,最后使用对地理位置进行聚类作为应用典例。
分类的原理依据簇识别,假定一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇是什么。聚类和分类的最大不同在于分类的目标事先已经确定,而聚类则是不一样,其类别并没有预先定义。聚类有时也被称为无监督分类,适用于数值型数据。
1.k均值聚类算法
k均值是发现数据k个簇的算法,簇的个数k是由用户给定的。.每一个簇通过其质心来描述。工作流程为:随机确定k个初始点作为质心。然后将数据集中的每个点分配到每一个簇中,为每一个簇找距离最近的质心,然后将簇的中心店更新为该簇所有点的平均值。
上述过程的伪代码描述如下:
创建k个点作为质心(随机选择的)
当任意一个点簇分配结果发生变化时
对数据集中的每一个数据点
对数据集中的每一个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇计算所有点的均值并将其作为质心
测试算法,运用量化的误差指标如误差平方和来评价算法的结果。同时,计算出的簇质心可以代表整个簇的数据进行决策。
书中有程序用来支持k均值聚类算法,第一个函数是将文本文档导入到列表当中,第二个是计算两个向量之间的欧氏距离。第三个函数是构建簇质心的函数(随机分配)
对于k均值算法的计算流程为:该算法创造k个质心,价格每个点分配到距离最近的质心中,然后再重新计算质心。该过程重复数次,直到数据点的簇不会再改变为止。代码如下:
def kmeans(dataSet,k,distMeas=ditEclud,createCent=randCent)
m=shape(dataSet)[0]
clusterAssment=mat(zeros((m,2)))
centroids=creatCent(dataSet,k)
clusterChanged=True
while clusterChanged:
clusterChanged=Flase
for i in range(m):
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
clusterAssement[i,:]=minIndex,minDist**