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()

 

此程式的步驟介紹說明如下

步驟一:

使用中垂線公式求出預設兩點的中線,做第一次分群。

步驟二:

使用歐拉公式計算兩群中心,並重複執行直到兩中心點停止移動為止。

步驟三:

印出結果

 

結果圖

Result_fig.png

 


kmeans 是分群裡的一個經典演算法,藉由簡單的實作,可以幫助自己更了解kmeans到底在做甚麼,以及她是如何運作分群的。

好了,以上是小弟個人關於Kmeans以Python實作的方法,給大家參考,如有誤人子弟之處,還請各位先進給予指教。

如果覺得本篇文章對你有幫助的話,也請別忘記按讚加留言給予鼓勵喔。

 

此篇文章程式法同時上串於本人的Github上,若有興趣或有不一樣想法的讀者,也可至本人的Github共同編輯喔。

https://github.com/xiguanTw/Basic-K-means

arrow
arrow
    文章標籤
    Python kmeans
    全站熱搜

    zhong.jun.jimmy 發表在 痞客邦 留言(0) 人氣()