机器学习实战--kmeans实例讲解

来源:互联网 发布:mysql nvl 编辑:程序博客网 时间:2024/06/01 16:42

前面几篇讲了机器学习中的分类,今天讲一下聚类算法–kmeans,聚类通俗地说就是将一堆数据分成几堆,属性相似的在一起(物以类聚人以群分)。
kmeans的原理十分简单,直接上步骤:

  1. 我们假定将数据分成k堆,先从数据里面随机选k个点作为初始质心
  2. 依次计算剩下的数据距每个质心的距离,为每个点选取距离最小的质心
  3. 这就完成了一次聚类,但是效果肯定不是很好,我们针对每个堆再计算质心,得到k个新的质心
  4. 再对所有的数据计算距每个新的质心的距离,再为每个点选取新的距离最小的质心
  5. 不停的循环这个过程,直到质心不再改变为止
from numpy import *def loadDataSet(filename):    dataMat=[]    fr=open(filename)    for line in fr.readlines():        curline=line.strip().split('\t')        fltline=map(float,curline)        dataMat.append(list(fltline))    return dataMatdef disEclud(vecA,vecB):    return sqrt(sum(pow(vecA-vecB,2)))def randCent(dataSet,k):    n=shape(dataSet)[1]    centroids=mat(zeros((k,n)))    for j in range(n):        L=[x[j] for x in dataSet]        minJ=min(L)        maxJ=max(L)        rangeJ=float(maxJ-minJ)        centroids[:,j]=minJ+rangeJ*random.rand(k,1)    return centroidsdataMat=loadDataSet("data/datingTestSet2.txt")centroids=randCent(dataMat,4)def kMeans(dataSet,k,distMeas=disEclud,createCent=randCent):    m=shape(dataSet)[0]    clusterAssment=mat(zeros((m,2)))    centroids=createCent(dataSet,k)    clusterChanged=True    while clusterChanged:        clusterChanged=False        for i in range(m):            minDist=inf            minIndex=-1            for j in range(k):                distJI=distMeas(array(centroids[j]),dataSet[i])                if distJI<minDist:                    minDist=distJI                    minIndex=j            if clusterAssment[i,0]!=minIndex:                clusterChanged=True            clusterAssment[i,:]=minIndex,minDist**2        for cent in range(k):            L=[]            for temp in range(m):                if clusterAssment[temp,0]==cent:                    L.append(dataSet[temp])            print(type(L))            centroids[cent,:]=mean(L,axis=0)    return centroids,clusterAssmentcentroids,clusterAssment=kMeans(dataMat,5)print(centroids)
原创粉丝点击