K-means python 程序
了解了一下k-means算法聚类,抄了一份代码
1 # _*_ coding: utf-8 _*_ 2 __Author__ = 'Mr.Black' 3 4 import numpy as np 5 import matplotlib.pyplot as plt 6 7 def initCenters(dataSet, k): 8 numSamples, dim = dataSet.shape # 获得数据的个数与维度 9 centers = np.zeros((k, dim)) # 初始化k个聚类中心点 10 # 随机获取k个聚类中心点 11 for i in range(k): 12 index = int(np.random.uniform(0, numSamples)) 13 centers[i, :] = dataSet[index, :] 14 return centers 15 16 def Dist2Centers(sample, centers): 17 k = centers.shape[0] # 中心点的个数 18 dis2cents = np.zeros(k) 19 for i in range(k): 20 dis2cents[i] = np.sqrt(np.sum(np.power(sample - centers[i,:], 2))) #一个数据点sample到各聚类中心点的距离 21 return dis2cents 22 23 def kmeans(dataSet, k, iterNum): 24 numSamples = dataSet.shape[0] # 数据集点的个数 25 iterCount = 0 26 clusterAssignment = np.zeros(numSamples) # 初始化每个样本点的聚类簇 27 clusterChanged = True # 聚类的簇是否改变 28 centers = initCenters(dataSet, k) 29 while clusterChanged and iterCount < iterNum: 30 clusterChanged = False 31 iterCount = iterCount + 1 # iterNum为需要迭代的次数,这里iterCount为已迭代次数 32 # 计算每个样本点到这k个聚类中心点的距离 33 for i in range(numSamples): 34 dis2cent = Dist2Centers(dataSet[i,:],centers) 35 minIndex = np.argmin(dis2cent) # 第i个点到k个聚类中心最小距离的聚类中心点 36 # 对第i个点进行聚类 37 if clusterAssignment[i] != minIndex: 38 clusterChanged = True 39 clusterAssignment[i] = minIndex # 把该点聚到与中心点距离中最小的中心点 40 # 更新聚类中心点 41 for j in range(k): 42 pointsInCluster = dataSet[np.nonzero(clusterAssignment == j)] # 取出所有聚到第j个聚类中心点的样本点 43 centers[j,:] = np.mean(pointsInCluster, axis=0) # 以所有聚到第j个中心点的样本点的平均值点更新这个聚类中心点 44 return centers, clusterAssignment 45 46 def showCluster(dataSet, k, centers, clusterAssignment): 47 numSamples, dim = dataSet.shape 48 mark = ['or','ob','og','om','oy'] # 样本数据点的样式 49 for i in range(numSamples): # 画出每个样本点 50 markIndex = int(clusterAssignment[i]) 51 plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndex]) 52 mark = ['Dr','Db','Dg','Dm','Dy'] # 聚类中心数据点的样式 53 for i in range(k): #画出每个聚类中心点 54 plt.plot(centers[i,0],centers[i,1],mark[i],markersize=17) 55 plt.show() 56 57 def main(): 58 dataSet = [] 59 dataSetFile = open('./testSet.txt') 60 for line in dataSetFile: 61 lineArr = line.strip().split('\t') 62 dataSet.append([float(lineArr[0]),float(lineArr[1])]) 63 dataSet = np.mat(dataSet) 64 65 k = 4 66 centers_result, clusterAssignment_result = kmeans(dataSet,k,100) 67 showCluster(dataSet,k,centers_result,clusterAssignment_result) 68 69 70 main()

感觉聚的效果不太好
加大迭代次数后(10000),效果又要好点


浙公网安备 33010602011771号