close
最近開始在練習用Python寫一些學習類程式,今天要來記錄一下關於kmeans分群的作法,單然這是我個人的做法拉,除了這方法外一定還有更好的方法可用。
此程式需先安裝numpy及matplotlib兩個python的套件
K-means
import numpy as np import matplotlib.pyplot as plt #計算中垂線並分群 def VerticalBisector(parameter,groupPoint): m=-1/(parameter[1][1]-parameter[0][1]/parameter[1][0]-parameter[0][0]) center=[((parameter[1][0]+parameter[0][0])/2),((parameter[1][1]+parameter[0][1])/2)] k=center[1]-m*center[0] count=0 Group1=[] Group2=[] for index in groupPoint: if(groupPoint[count,0]*m-groupPoint[count,1]+k>0): Group1.append([groupPoint[count,0],groupPoint[count,1]]) elif (groupPoint[count,0]*m-groupPoint[count,1]+k<0): Group2.append([groupPoint[count,0],groupPoint[count,1]]) count+=1 Point=[] Point.append(newPoint(Group1)) Point.append(newPoint(Group2)) return Point #使用歐拉公式計算兩點距離 def Euler(groupPoint,parameter): dis=np.sqrt(pow((parameter[0]-groupPoint[0]),2)+pow((parameter[1]-groupPoint[1]),2)) return dis #使用歐拉公式分群 def GroupingEuler(kPoint,parameter): Group1=[] Group2=[] count=0 for index in parameter: if(Euler(index,kPoint[0]) Group1.append(index) else: Group2.append(index) count+=1 point=[] point.append(newPoint(Group1)) point.append(newPoint(Group2)) point.append(Group1) point.append(Group2) return point #計算中心位置 def newPoint(parameter): count=0 X=0 Y=0 for index in parameter: X+=parameter[count][0] Y+=parameter[count][1] count+=1 point=[X/count,Y/count] return point #main program groupPoint = np.random.rand(100,2) prePoint=[[0.1,0.1],[0.2,0.2]] result=VerticalBisector(prePoint,groupPoint) newPoint2=GroupingEuler(result,groupPoint) kPoint=[] kPoint.append(newPoint2[0]) kPoint.append(newPoint2[1]) newkPoint3=GroupingEuler(kPoint,groupPoint) while Euler(kPoint[0],newkPoint3[0])!=0: kPoint=[] kPoint.append(newkPoint3[0]) kPoint.append(newkPoint3[1]) newkPoint3=GroupingEuler(kPoint,groupPoint) #print result list #print(newkPoint3) #劃出結果圖 fig = plt.figure(1) plt.ion() for gr in newkPoint3[2]: plt.scatter(gr[0],gr[1],s=50,c="red") for gr in newkPoint3[3]: plt.scatter(gr[0],gr[1],s=50,c="blue") plt.scatter(newkPoint3[0][0],newkPoint3[0][1],s=60,c="black") plt.scatter(newkPoint3[1][0],newkPoint3[1][1],s=60,c="black") plt.show(1) plt.ioff()
此程式的步驟介紹說明如下
步驟一:
使用中垂線公式求出預設兩點的中線,做第一次分群。
步驟二:
使用歐拉公式計算兩群中心,並重複執行直到兩中心點停止移動為止。
步驟三:
印出結果
結果圖
kmeans 是分群裡的一個經典演算法,藉由簡單的實作,可以幫助自己更了解kmeans到底在做甚麼,以及她是如何運作分群的。
好了,以上是小弟個人關於Kmeans以Python實作的方法,給大家參考,如有誤人子弟之處,還請各位先進給予指教。
如果覺得本篇文章對你有幫助的話,也請別忘記按讚加留言給予鼓勵喔。
此篇文章程式法同時上串於本人的Github上,若有興趣或有不一樣想法的讀者,也可至本人的Github共同編輯喔。
文章標籤
全站熱搜