k-means算法的思想比较简单,假设我们要把数据分成K个类,大概可以分为以下几个步骤:
随机选取k个点,作为聚类中心;
计算每个点分别到k个聚类中心的聚类,然后将该点分到最近的聚类中心,这样就行成了k个簇;
再重新计算每个簇的质心(均值);
重复以上2~4步,直到质心的位置不再发生变化或者达到设定的迭代次数。
# dataSet样本点,k 簇的个数 # disMeas距离量度,默认为欧几里得距离 # createCent,初始点的选取 def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): m = shape(dataSet)[0] #样本数 clusterAssment = mat(zeros((m,2))) #m*2的矩阵 centroids = createCent(dataSet, k) #初始化k个中心 clusterChanged = True while clusterChanged: #当聚类不再变化 clusterChanged = False 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 # 第1列为所属质心,第2列为距离 clusterAssment[i,:] = minIndex,minDist**2 print centroids # 更改质心位置 for cent in range(k): ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]] centroids[cent,:] = mean(ptsInClust, axis=0) return centroids, clusterAssment