基於Python的K means聚類演算法

2021-08-03 02:49:54 字數 2410 閱讀 3097

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個資料做聚類中心,並將結果存放在 ...