Python機器學習 9 聚類演算法之K均值

2022-08-31 10:21:08 字數 3750 閱讀 3868

我們之前接觸的所有機器學習演算法都有乙個共同特點,那就是分類器會接受2個向量:乙個是訓練樣本的特徵向量x,乙個是樣本實際所屬的型別向量y。由於訓練資料必須指定其真實分類結果,因此這種機器學習統稱為有監督學習。

然而有時候,我們只有訓練樣本的特徵,而對其型別一無所知。這種情況,我們只能讓演算法嘗試在訓練資料中尋找其內部的結構,試圖將其類別挖掘出來。這種方式叫做無監督學習。由於這種方式通常是將樣本中相似的樣本聚集在一起,所以又叫聚類演算法。

下面我們介紹乙個最常用的聚類演算法:k均值聚類演算法(k-means)。

k-means演算法思想簡單,效果卻很好,是最有名的聚類演算法。聚類演算法的步驟如下:

1:初始化k個樣本作為初始聚類中心;

2:計算每個樣本點到k個中心的距離,選擇最近的中心作為其分類,直到所有樣本點分類完畢;

3:分別計算k個類中所有樣本的質心,作為新的中心點,完成一輪迭代。

通常的迭代結束條件為新的質心與之前的質心偏移值小於乙個給定閾值。

下面給乙個簡單的例子來加深理解。如下圖有4個樣本點,座標分別為a(-1,-1),b(1,-1),c(-1,1),d(1,1)。現在要將他們聚成2類,指定a、b作為初始聚類中心(聚類中心a0, b0),指定閾值0.1。k-means迭代過程如下:

step 1.1:計算各樣本距離聚類中心的距離:

樣本a:d(a,a0) = 0; d(a,b0) = 2;因此樣本a屬於a0所在類;

樣本b:d(b,a0) = 2; d(b,b0) = 0;因此樣本b屬於b0所在類;

樣本c:d(c,a0) = 2; d(c,b0) = 2.8;;因此樣本c屬於a0所在類;

樣本c:d(d,a0) = 2.8; d(d,b0) = 2;;因此樣本c屬於b0所在類;

step 1.2:全部樣本分類完畢,現在計算a0類(包含樣本ac)和b0類(包含樣本bd)的新的聚類中心:

a1 = (-1, 0); b1 = (1,0);

step 1.3:計算聚類中心的偏移值是否滿足終止條件:

|a1-a0| = |(-1,0)-(-1,-1) | = |(0,1)| = 1 >0.1,因此繼續迭代。

此時的狀態如下圖所示:

step 2.1:計算各樣本距離聚類中心的距離:

樣本a:d(a,a1) = 1; d(a,b1) = 2.2;因此樣本a屬於a1所在類;

樣本b:d(b,a1) = 2.2; d(b,b1) = 1;因此樣本b屬於b1所在類;

樣本c:d(c,a1) = 1; d(c,b1) = 2.2;;因此樣本c屬於a1所在類;

樣本d:d(d,a1) = 2.2; d(d,b1) = 1;;因此樣本c屬於b1所在類;

step 2.2:全部樣本分類完畢,現在計算a1類(包含樣本ac)和b1類(包含樣本bd)的新的聚類中心:

a2 = (-1, 0); b2 = (1,0);

step 2.3:計算聚類中心的偏移值是否滿足終止條件:

|a2-a1| = |b2-b1| = 0 <0.1,因此迭代終止。

下面這個測試資料有點類似sns中的好友關係,假設是10個來自2個不同的圈子的同學的sns聊天記錄。顯然,同乙個圈子內的同學會有更密切的關係和互動。

資料如下所示,每一行代表乙個好友關係。如第一行表示同學0與同學1的親密程度為9(越高表示聯絡越密切)。

顯然,這個資料中並沒有告知我們這10個同學分別屬於哪個圈子。因此我們的目標是使用k-means聚類演算法,將他們聚成2類。

這是個上三角矩陣,因為這個資料中認為好友關係是對稱的。上圖其實很快能發現,0,1,2,3,4使用者緊密聯絡在一起,而5,6,7,8,9組成了另外乙個圈子。

下面我們看看k-means演算法能否找出這個答案。

k-means演算法的python**如下:

#

-*- coding: utf-8 -*-

from matplotlib import

pyplot

import

scipy as sp

import

numpy as np

from sklearn import

svmimport

matplotlib.pyplot as plt

from sklearn.cluster import

kmeans

from scipy import

sparse #

資料讀入

data = np.loadtxt('

2.txt')

x_p = data[:, :2] #

取前2列

y_p = data[:, 2] #

取前2列

x = (sparse.csc_matrix((data[:,2], x_p.t)).astype(float))[:, :].todense()

nuser =x.shape[0] #

視覺化矩陣

pyplot.imshow(x, interpolation='

nearest')

pyplot.xlabel('使用者

')pyplot.ylabel('使用者

')pyplot.xticks(range(nuser))

pyplot.yticks(range(nuser))

pyplot.show() #

使用預設的k-means演算法

num_clusters = 2clf = kmeans(n_clusters=num_clusters, n_init=1, verbose=1)

clf.fit(x)

print

(clf.labels_) #

指定使用者0與使用者5作為初始化聚類中心

init = np.vstack([ x[0], x[5] ])

clf = kmeans(n_clusters=2, init=init)

clf.fit(x)

print(clf.labels_)

輸出結果如下:

initialization complete

iteration  0, inertia 581.000

iteration  1, inertia 417.643

converged at iteration 1

[0 0 1 1 1 1 1 1 1]

[0 0 0 0 1 1 1 1 1]

可以看到,使用預設的k-means演算法將使用隨機的初始值,因此每次執行的結果都不一樣。

上面的輸出中將0,1使用者聚類到一起,效果並不理想。然而,如果我們可以確定使用者0與使用者5是有很大區別的,就可以指定使用者0和使用者5作為k-means聚類演算法的初始值。可以看到和我們的預期完全一致,這樣效果就非常好了。

由於k-means畢竟是無監督學習,在很多情況下自然無法與有監督學習的演算法進行同樣標準的比較。但其不需要監督的特性,廣泛應用與社交圖譜(如本例)、相似性匹配(如搜尋相似的新聞、帖子)等引用場景。

Python 機器學習 KMeans聚類演算法

k means是迭代動態聚類演算法中的一種,其中k表示類別數,means表示均值,屬於無監督學習演算法.k means演算法的步驟 第一步 確定乙個超引數k,就是將樣本聚集為幾類 第二步 在所有樣本中隨機選擇k個點,作為中心 第三步 依次計算除這k個中心點外的每乙個點和k個中心點的距離,找出最近的距...

機器學習演算法總結9 k means聚類演算法

無監督學習 訓練樣本的標記資訊是未知的,目標是通過對無標記訓練樣本的學習來揭示資料的內在性質及規律,為進一步的資料分析提供基礎。聚類是典型無監督學習任務,它試圖將資料集中的樣本劃分為若干個通常是不相交的子集,每個子集稱為乙個簇。距離度量 通過距離來定義相似度度量,距離越大,相似度越小。最常用的距離度...

機器學習 聚類 密度聚類演算法

一,介紹 密度聚類演算法有多種,我們這裡主要介紹一種著名的密度聚類演算法 dbscan。首先,我們通過下圖了解幾個概念 1 鄰域,與中心x距離不超過 距離,如上圖紅色虛線圈 2 核心物件,確定聚類的初始點,如上圖的x1 3 密度直達,在聚類核心物件鄰域內的點,如上圖x2由x1密度直達 4 密度可達,...