k-means聚類的基本原理就不多闡述了,這裡直接講解如何實現。
效果圖(紅色節點代表聚類中心,藍色節點和綠色節點代表不同的兩類):
可以看到,初始時綠色節點很少且大多聚集於左下方,隨著聚類中心的移動,綠色節點區域越來越大,直到最後會穩定下來。
一、建節點類
由於該聚類演算法是基於二維的,因此基本元素就是節點,這裡就將每個節點作為乙個類node。
其中nearest_node是乙個list,其含義是:
①如果該節點是普通節點,則儲存其歸屬的聚類中心;
②如果該節點是聚類中心,則儲存對應的普通節點。
class node:
x = 0
y = 0
distance = 0
nearest_node =
def __init__(self):
self.x = random.uniform(0, 1)
self.y = random.uniform(0, 1)
self.nearest_node =
def distance(self, node):
x1 = (self.x - node.x) * (self.x - node.x)
y1 = (self.y - node.y) * (self.y - node.y)
distance = math.sqrt(x1 + y1)
return distance
二、計算節點歸於哪個聚類中心
利用node類中的distance方法計算每個普通節點歸屬於哪個聚類中心。
for i in range(0, len(node)):
min = 999
index = 0
for j in range(0, len(center)):
if node[i].distance(center[j]) < min:
min = node[i].distance(center[j])
index = j
三、更新聚類中心位置
對每乙個聚類中心而已,找到其對應的所有普通節點,求出它們的平均位置(即x座標和y座標的位置)。
接著就以這個平均位置作為自身新的位置。
for i in range(0, len(center)):四、畫出拓撲圖,標記聚類中心x_total = 0
y_total = 0
x_new = 0
y_new = 0
for item in center[i].nearest_node:
x_total += item.x
y_total += item.y
print x_total
print y_total
x_new = x_total / len(center[i].nearest_node)
y_new = y_total / len(center[i].nearest_node)
center[i].x = x_new
center[i].y = y_new
如果是聚類中心,則用紅色節點表示;
如果是第一類普通節點,則用藍色節點表示;
如果是第二類普通節點,則用綠色節點表示。
for item in node:
if item.nearest_node[0] == center[0]:
plt.plot(item.x, item.y, 'bo')
if item.nearest_node[0] == center[1]:
plt.plot(item.x, item.y, 'go')
item.nearest_node =
for item in center:
plt.plot(item.x, item.y, 'ro')
item.nearest_node =
plt.show()
原始碼: 基於python的k means演算法實現
此次的作業是要求我們利用所學知識實現利用python實現k means演算法,首先我們先來簡單的介紹一下k means演算法 k means演算法接受輸入量k 然後將n個資料物件劃分為k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中...
基於Python的K means簡單分類
對於k means的分類實現,我用的是jupyter notebook,這樣更方便,可視性更強。用python對衛星資料進行非監督分類,需要gdal,numpy和sklearn,如果檢視資料,還需要matplotlib import numpy as np from sklearn import c...
kmeans演算法(python實現)
import numpy as np import matplotlib.pyplot as plt initialize center函式通過使用numpy庫的 zeros函式和random.uniform函式,隨機選取 了k個資料做聚類中心,並將結果存放在 了k個資料做聚類中心,並將結果存放在 ...