資源簡介
K-means算法是很典型的基于距離的聚類算法,采用距離作為相似性的評價指標,即認為兩個對象的距離越近,其相似度就越大。該算法認為簇是由距離靠近的對象組成的,因此把得到緊湊且獨立的簇作為最終目標。
本代碼提供了k-means算法的python實現,并使用matlibplot可視化算法結果

代碼片段和文件信息
#?coding:utf-8
import?numpy?as?np
import?pylab?as?pl
import?random?as?rd
import?imageio
#計算平面兩點的歐氏距離
step=0
color=[‘.r‘‘.g‘‘.b‘‘.y‘]#顏色種類
dcolor=[‘*r‘‘*g‘‘*b‘‘*y‘]#顏色種類
frames?=?[]
def?distance(a?b):
????return?(a[0]-?b[0])?**?2?+?(a[1]?-?b[1])?**?2
#K均值算法
def?k_means(x?y?k_count):
????count?=?len(x)??????#點的個數
????#隨機選擇K個點
????k?=?rd.sample(range(count)?k_count)
????k_point?=?[[x[i]?[y[i]]]?for?i?in?k]???#保證有序
????k_point.sort()
????global?frames
????global?step
????while?True:
????????km?=?[[]?for?i?in?range(k_count)]??????#存儲每個簇的索引
????????#遍歷所有點
????????for?i?in?range(count):
????????????cp?=?[x[i]?y[i]]???????????????????#當前點
????????????#計算cp點到所有質心的距離
????????????_sse?=?[distance(k_point[j]?cp)?for?j?in?range(k_count)]
????????????#cp點到那個質心最近
????????????min_index?=?_sse.index(min(_sse))???
????????????#把cp點并入第i簇
????????????km[min_index].append(i)
????????#更換質心
????????step+=1
????????k_new?=?[]
????????for?i?in?range(k_count):
????????????_x?=?sum([x[j]?for?j?in?km[i]])?/?len(km[i])
????????????_y?=?sum([y[j]?for?j?in?km[i]])?/?len(km[i])
????????????k_new.append([_x?_y])
????????k_new.sort()????????#排序
????????#使用Matplotlab畫圖
????????pl.figure()
????????pl.title(“N=%dk=%d??iteration:%d“%(countk_countstep))
????????for?j?in?range(k_count):
????????????pl.plot([x[i]?for?i?in?km[j]]?[y[i]?for?i?in?km[j]]?color[j%4])
????????????pl.plot(k_point[j][0]?k_point[j][1]?dcolor[j%4])
????????pl.savefig(“1.jpg“)
????????frames.append(imageio.imread(‘1.jpg‘))
????????if?(k_new?!=?k_point):#一直循環直到聚類中心沒有變化
????????????k_point?=?k_new
????????else:
????????????return?km
#計算SSE
#?def?calc_sse(x?y?k_count):
#?????count?=?len(x)??????????????????????????????#點的個數
#?????k?=?rd.sample(range(count)?k_count)????????#隨機選擇K個點
#?????k_point?=?[[x[i]?[y[i]]]?for?i?in?k]
#?????k_point.sort()??????????????????????????????#保證有序
#?????#centroid
#?????sse?=?[[]?for?i?in?range(k_count)]
#?????while?True:
#?????????ka?=?[[]?for?i?in?range(k_count)]??????#存儲每個簇的索引
#?????????sse?=?[[]?for?i?in?range(k_count)]
#?????????#遍歷所有點
#?????????for?i?in?range(count):
#?????????????cp?=?[x[i]?y[i]]???????????????????#當前點
#?????????????#計算cp點到所有質心的距離
#?????????????_sse?=?[distance(k_point[j]?cp)?for?j?in?range(k_count)]
#?????????????#cp點到那個質心最近
#?????????????min_index?=?_sse.index(min(_sse))
#?????????????#把cp點并入第i簇
#?????????????ka[min_index].append(i)
#?????????????sse[min_index].append(min(_sse))
#?????????#更換質心
#?????????k_new?=?[]
#?????????for?i?in?range(k_count):
#?????????????_x?=?sum([x[j]?for?j?in?ka[i]])?/?len(ka[i])
#?????????????_y?=?sum([y[j]?for?j?in?ka[i]])?/?len(ka[i])
#?????????????k_new.append([_x?_y])
#?????????k_new.sort()????????#排序
#?????????#更換質心
#?????????if?(k_new?!=?k_point):
#?????????????k_point?=?k_new
#?????????else:
#?????????????break
#?????s?=0
#?????for?i?in?range(k_count):
#?????????s?+=?sum(sse[i])
#?????return?s
x?y?=?np.load
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????46896??2017-12-12?11:16??K-means\1.jpg
?????文件????????937??2014-03-18?10:03??K-means\2.csv
?????文件?????933746??2017-12-12?11:16??K-means\k-means.gif
?????文件???????3504??2017-12-12?10:48??K-means\K-means.py
?????目錄??????????0??2017-12-12?10:48??K-means
-----------?---------??----------?-----??----
???????????????985083????????????????????5
- 上一篇:torch1.0.0安裝
- 下一篇:Python語言及其應用 pdf
評論
共有 條評論