K-means聚类算法

来源:互联网 发布:3d动画软件 编辑:程序博客网 时间:2024/06/06 10:40

K-means 是基础的聚类算法之一。它的思想是首先确定需要把样本聚成K个类别。k是需要不断去尝试和选择的。每个簇的中心用簇均值来表示。

伪代码

  • 输入:K:簇的数量
       D:包含n个对象的数据集
  • 输出:k个簇的集合
  • 步骤:
    1.从D中选择任选k个中心点作为最初的中心点
    repeat
    2.将D中的数据划分到离中心点最近的簇中
    3.重新计算每个簇的均值
    until每个对象所属的簇不发生变化。
k-means容易受到初始点的影响。对异常值很敏感。对于离散数据可使用k-众数的方式来选择中心点。可将k-means和k-众数集成为可以处理有连续和离散数据的算法。
下面是copy自《机器学习实战》的Python代码,在Python3.4环境下。其中的数据集是书中自带的数据集
import numpy as npdef loadDataSet(fileName):    dataMat=[]    fr=open(fileName)    for line in fr.readlines():        curLine=line.strip().split('\t')        fltLine=list(map(float,curLine))        dataMat.append(fltLine)    return dataMat##计算两个样本间的距离def distEclud(vecA,vecB):    return np.sqrt(np.sum(np.power(vecA-vecB,2)))##产生随机中心点,dataSet是mat形式def randCent(dataSet,k):    n=np.shape(dataSet)[1]    centroids=np.mat(np.zeros((k,n)))    for j in range(n):        minJ=min(dataSet[:,1])          rangeJ=float(max(dataSet[:,1])-minJ)        centroids[:,j]=minJ+rangeJ*np.random.rand(k,1)    return  centroids##kMeansdef kMeans(dataSet,k,distMeans=distEclud,createCent=randCent):    m=np.shape(dataSet)[0]    clusterAssment=np.mat(np.zeros((m,2)))    centroids=createCent(dataSet,k)    clusterChanged=True    while clusterChanged:        clusterChanged=False        for i in range(m):            minDist=np.inf            minIndex=-1            for j in range(k):                distJI=distMeans(dataSet[i,:],centroids[j,:])                if minDist>distJI:                    minDist=distJI                    minIndex=j            if clusterAssment[i,0]!=minIndex:                clusterAssment[i,0]=minIndex                clusterAssment[i,1]=minDist                clusterChanged=True        for cent in range(k):            ptsInclust=dataSet[np.nonzero(clusterAssment[:,0].A==cent)[0]] #nonzero的用法            centroids[cent,:]=np.mean(ptsInclust,axis=0)    return centroids,clusterAssmentdataSet=np.mat(loadDataSet('testSet.txt'))cent,clus=kMeans(dataSet,4)                

稍后提供c++版

0 0