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共同編輯喔。
文章標籤
全站熱搜
留言列表