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),效果又要好点

 

posted @ 2017-05-11 19:21  chen狗蛋儿  阅读(337)  评论(0)    收藏  举报