此次的作業是要求我們利用所學知識實現利用python實現k-means演算法,首先我們先來簡單的介紹一下k-means演算法:
k-means演算法接受輸入量k;然後將n個資料物件劃分為k個聚類以便使得所獲得的聚類滿足:同一聚類中的物件相似度較高;而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個「中心物件」來進行計算的。
k-means演算法是一種基於樣本間相似性度量的間接聚類方法,屬於非監督學習方法。在利用python實現時,主要為以下5步:
①首先,設定乙個k值,k值為分成類的數量,需要幾個類,k就為多少;
②隨機選取k個點,將這k個點作為此次聚類的中心點(在此次演算法實現的過程中,由於我們是隨機選取的中心點,所以每次的結果可能不同,屬於正常情況);
③遍歷所有的點,計算所有的點距離k個聚類中心點的距離,最終求的結果,比較所選取的點到各個聚類中心的距離,哪個聚類中心距離樣本點最近,該樣本點就歸屬於哪一類,即歸屬於哪個聚類中心點;
④現在,我們通過第②布所隨機選區的k個中心點,進而通過第③步得到了k個聚類,現在,我們需要根據我們所得的新的聚類,計算新的聚類中心,此時,新的聚類中心即為我們所得聚類的包含的所有點的平均值,通過計算平均值,我們得到了新的聚類中心點;
⑤通過第⑤步我們得到了新的聚類中心點,再利用新的聚類中心點繼續執行步驟③和步驟④,直到聚類中心點不再變化為止,最終我們會得到乙個最優聚類。
import matplotlib.pyplot as plt
import numpy as np
#載入資料
defload_data_set()
:"""
載入資料
:return:返回兩個陣列
data_arr 原始資料的特徵
label_arr 每個樣本對應的類別
"""data_arr =
label_arr =
f =open
('存放資料的txt檔案位址'
,'r'
)for line in f.readlines():
line_arr = line.strip(
).split(
)[np.
float
(line_arr[0]
),np.
float
(line_arr[1]
)])int
(line_arr[2]
))return np.array(data_arr)
,np.array(label_arr)
x,label = load_data_set(
)#繪製出資料點分析看有幾個聚類
#建立k個聚類陣列,用於存放屬於該聚類的點
clusters =
p1 =[6
,4]p2 =[1
,3]cluster_center = np.array(
[p1,p2]
)k =
2for i in
range
(k):
)epoch =
3for _ in
range
(epoch)
:for j in
range
(k):
clusters[i]=[
]#計算所有點到該聚類中心的距離
for i in
range
(x.shape[0]
):xi = x[i]
distances = np.
sum(
(clusters_center-xi)**2
,axis=1)
#距離哪個聚類中心點近,就把這個點的序號加到那個聚類中
c = np.argmin(distances)
clusters[c]
#重新計算k個聚類的聚類中心,(沒各聚類所有的點加起來取平均值)
for i in
range
(k):
clusters_center[i]
= np.
sum(x[clusters[i]
],axis=0)
/len
(clusters[i]
)plt.scatter(x[clusters[0]
,0],x[clusters[0]
,1])
plt.scatter(x[clusters[1]
,0],x[clusters[1]
,1])
基於Python的K means簡單分類
對於k means的分類實現,我用的是jupyter notebook,這樣更方便,可視性更強。用python對衛星資料進行非監督分類,需要gdal,numpy和sklearn,如果檢視資料,還需要matplotlib import numpy as np from sklearn import c...
基於Python的K means聚類演算法
k means聚類的基本原理就不多闡述了,這裡直接講解如何實現。效果圖 紅色節點代表聚類中心,藍色節點和綠色節點代表不同的兩類 可以看到,初始時綠色節點很少且大多聚集於左下方,隨著聚類中心的移動,綠色節點區域越來越大,直到最後會穩定下來。一 建節點類 由於該聚類演算法是基於二維的,因此基本元素就是節...
kmeans演算法(python實現)
import numpy as np import matplotlib.pyplot as plt initialize center函式通過使用numpy庫的 zeros函式和random.uniform函式,隨機選取 了k個資料做聚類中心,並將結果存放在 了k個資料做聚類中心,並將結果存放在 ...