學習筆記 機器學習實戰 Kmeans

2021-08-20 11:17:11 字數 2784 閱讀 2216

kmeans演算法注釋版,新手小白,如有錯誤,還請不吝指教

#kmeans演算法

def kmeans(dataset, k):

dataset = mat(dataset) #轉換成mat型別

m = shape(dataset)[0] #獲取資料集的行數

#第一列記錄資料集的類別,第二列記錄資料集到聚類中心的距離

clusterassment = mat(zeros((m,2)))#初始化

centroids = randomcentroids(dataset, k)#獲取聚類中心

clusterchanged = true #用於判斷聚類中心是否改變

while clusterchanged:

clusterchanged = false

for i in range(m):

mindist = inf #最小距離初始化

minindex = -1 #最小距離下標初始化

for j in range(k):

#求解聚類中心與資料集的歐式距離

distance = euclideandistance(centroids[j,:],dataset[i,:])

if distance < mindist:

mindist = distance

minindex = j

if clusterassment[i,:] != minindex:

clusterchanged = true

clusterassment[i,:] = minindex,mindist**2

print(centroids)#輸出聚類中心

for cent in range(k):

ptsinclust = dataset[nonzero(clusterassment[:,0].a==cent)[0]]

centroids[cent,:] = mean(ptsinclust, axis=0)#axis=0表示在列上對聚類中心的資料取平均值,即更新聚類中心

return centroids, clusterassment

對於下面這行**,單獨解釋。

ptsinclust = dataset[nonzero(clusterassment[:,0].a==cent)[0]]
舉個例子:

a = [[0,1],[2,0],[3,0],[0,4]]

a = mat(a)

print(a)

輸出為:

[[0 1]

[2 0]

[3 0]

[0 4]]

此時a是乙個4*2的矩陣,若使用nonzero()函式,則有輸出

print(nonzero(a))
(array([0, 1, 2, 3], dtype=int64), array([1, 0, 0, 1], dtype=int64))
可見,nonzero(),返回兩個元組:

第乙個元組裡有,不為零元素的行的索引,以及該元素的型別

第二個元組中則是不為零元素的列的索引,以及該元素的型別

而對於kmeans演算法中的第25行**中的.a,其實是就是返回陣列本身。

在kmeans這個**裡,矩陣型別和陣列(array)型別的形式是一樣的,所以加不加.a結果都一樣。

具體參考numpy官方文件

貼個圖,我想文件中的.a和kmeans演算法中的.a應該是一回事。

拿之前的矩陣a舉例(下同):

print(nonzero(a[:,0].a))

print(nonzero(a[:,0]))

(array([1, 2], dtype=int64), array([0, 0], dtype=int64))

(array([1, 2], dtype=int64), array([0, 0], dtype=int64))

在kmeans演算法中,要在資料集中選擇和聚類中心相同類別的下標,並且將該條資料歸類到該聚類中心,

首先要得到該資料的下標,假設現在要求第三個聚類中心的下標,有如下**:

print(nonzero(a[:,0].a==3))

print(nonzero(a[:,0]==3))

(array([2], dtype=int64), array([0], dtype=int64))

(array([2], dtype=int64), array([0], dtype=int64))

由上面的結果可知,返回了兩個元組,但是我們只想得到該條資料的下標,所以只需取它的行資訊,則有:

print(nonzero(a[:,0].a==3)[0])

print(nonzero(a[:,0]==3)[0])

[2]

[2]

發現輸出為該條資料的下標,即我們想要的結果,同時我們也可以觀察到,無論有沒有.a,結果都是一樣的。

解釋完畢,實在是學不動了,寫個部落格放鬆一下心情。

參考資料: 

機器學習實戰之KMean

kmeans演算法步驟 1.確定聚類個數k 2.隨機選擇k個質心 3.對於所有樣本點 根據樣本點到質心的距離分類 4.分類完成後,如果所有樣本點的類別沒有變化,演算法結束 如果有變化,重新計算質心 當前類中樣本的平均值 回到步驟3 幾個問題 1.聚類個數k的確定 2.初始時質心的選取 3.容易出現區...

《機器學習實戰》學習筆記

很久沒寫過部落格了,一重開就給自己挖了這麼乙個大坑 最近一段時間看了 機器學習實戰 這本書,感覺寫得不錯,認真看了看。關於這本書的書評及購買事宜請移步豆瓣 京東 亞馬遜等 這裡不多說。不過有一點,感覺這本書有個很好的地方是給出了各個演算法的python實現 和講解,要求不高的話可以拿來用了 懶 在這...

《機器學習實戰》學習筆記

目錄 第2章 k 近鄰演算法 第3章 決策樹 第4章 基於概率論的分類方法 樸素貝葉斯 第5章 logistic回歸 第7章 利用adaboost元演算法提高分類效能 第8章 數值型資料 回歸 1.python console匯入knn.py檔案 import knn1.reload的使用方法 fr...