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

前面几篇讲了机器学习中的分类,今天讲一下聚类算法–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 dataMat
def 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 centroids
dataMat=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 distJIif 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,clusterAssment
centroids,clusterAssment=kMeans(dataMat,5)
print(centroids)

你可能感兴趣的:(机器学习)