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...