本文實(shí)例講述了Python聚類算法之基本K均值運(yùn)算技巧。分享給大家供大家參考,具體如下:
基本K均值 :選擇 K 個(gè)初始質(zhì)心,其中 K 是用戶指定的參數(shù),即所期望的簇的個(gè)數(shù)。每次循環(huán)中,每個(gè)點(diǎn)被指派到最近的質(zhì)心,指派到同一個(gè)質(zhì)心的點(diǎn)集構(gòu)成一個(gè)。然后,根據(jù)指派到簇的點(diǎn),更新每個(gè)簇的質(zhì)心。重復(fù)指派和更新操作,直到質(zhì)心不發(fā)生明顯的變化。
# scoding=utf-8import pylab as plpoints = [[int(eachpoint.split("#")[0]), int(eachpoint.split("#")[1])] for eachpoint in open("points","r")]# 指定三個(gè)初始質(zhì)心currentCenter1 = [20,190]; currentCenter2 = [120,90]; currentCenter3 = [170,140]pl.plot([currentCenter1[0]], [currentCenter1[1]],'ok')pl.plot([currentCenter2[0]], [currentCenter2[1]],'ok')pl.plot([currentCenter3[0]], [currentCenter3[1]],'ok')# 記錄每次迭代后每個(gè)簇的質(zhì)心的更新軌跡center1 = [currentCenter1]; center2 = [currentCenter2]; center3 = [currentCenter3]# 三個(gè)簇group1 = []; group2 = []; group3 = []for runtime in range(50): group1 = []; group2 = []; group3 = [] for eachpoint in points: # 計(jì)算每個(gè)點(diǎn)到三個(gè)質(zhì)心的距離 distance1 = pow(abs(eachpoint[0]-currentCenter1[0]),2) + pow(abs(eachpoint[1]-currentCenter1[1]),2) distance2 = pow(abs(eachpoint[0]-currentCenter2[0]),2) + pow(abs(eachpoint[1]-currentCenter2[1]),2) distance3 = pow(abs(eachpoint[0]-currentCenter3[0]),2) + pow(abs(eachpoint[1]-currentCenter3[1]),2) # 將該點(diǎn)指派到離它最近的質(zhì)心所在的簇 mindis = min(distance1,distance2,distance3) if(mindis == distance1): group1.append(eachpoint) elif(mindis == distance2): group2.append(eachpoint) else: group3.append(eachpoint) # 指派完所有的點(diǎn)后,更新每個(gè)簇的質(zhì)心 currentCenter1 = [sum([eachpoint[0] for eachpoint in group1])/len(group1),sum([eachpoint[1] for eachpoint in group1])/len(group1)] currentCenter2 = [sum([eachpoint[0] for eachpoint in group2])/len(group2),sum([eachpoint[1] for eachpoint in group2])/len(group2)] currentCenter3 = [sum([eachpoint[0] for eachpoint in group3])/len(group3),sum([eachpoint[1] for eachpoint in group3])/len(group3)] # 記錄該次對(duì)質(zhì)心的更新 center1.append(currentCenter1) center2.append(currentCenter2) center3.append(currentCenter3)# 打印所有的點(diǎn),用顏色標(biāo)識(shí)該點(diǎn)所屬的簇pl.plot([eachpoint[0] for eachpoint in group1], [eachpoint[1] for eachpoint in group1], 'or')pl.plot([eachpoint[0] for eachpoint in group2], [eachpoint[1] for eachpoint in group2], 'oy')pl.plot([eachpoint[0] for eachpoint in group3], [eachpoint[1] for eachpoint in group3], 'og')# 打印每個(gè)簇的質(zhì)心的更新軌跡for center in [center1,center2,center3]: pl.plot([eachcenter[0] for eachcenter in center], [eachcenter[1] for eachcenter in center],'k')pl.show()運(yùn)行效果截圖如下:

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選