點雲學習 3 2 聚類演算法之譜聚類

2021-10-12 08:16:49 字數 3472 閱讀 3495

譜聚類推導過程較為繁瑣,本文不作介紹,重點在於使用python語言實現演算法。

譜聚類步驟:

1.建無向圖,獲取鄰接矩陣w(對稱矩陣)

2.計算拉普拉斯矩陣l l = d-w,其中d為對角陣,每個元素為w在該行求和

3.對l進行特徵分解,獲取最小的k個特徵值對應的特徵向量

4.將k個特徵向量構造成矩陣v

5.i=1,…n,yi對應於v的第i行

6.利用k-means對yi進行聚類

**:

import numpy as np

from sklearn.cluster import kmeans

import matplotlib.pyplot as plt

class

spectralclustering()

:def

__init__

(self,k,n)

:#k表示knn搜尋範圍,n表示聚類數量

self.k = k

self.n = n

self.__labels =

none

deffit

(self,x)

: x = np.array(x)

n =len(x)

a = np.zeros(n,n)

#距離矩陣

w = np.zeros(n,n)

#鄰接矩陣

d = np.zeros(n,n)

#d矩陣

#計算距離矩陣a

for i in

range

(n):

for j in

range

(n):

a[i]

[j]= np.sqrt(np.

sum(

(x[i]

-x[j])**

2)) a[j]

[i]= a[i]

[j]#距離矩陣應為對稱矩陣

#計算鄰接矩陣w(無向圖)

#w矩陣相當於knn,選取距離某點最近的k個點,值設為1,其他值設為0

for index,each in

enumerate

(a):

index_array = np.argsort(each)

w[index]

[index_array[

1:self.k+1]

]=1 w =

(w + w.t)/2

#保證w為對稱矩陣

#計算d矩陣

for k in

range

(n):

d[k]

[k]= np.

sum(w[k]

)#計算拉普拉斯矩陣

l = d - w

#特徵分解

lam, h = np.linalg.eig(l)

sorted_idx = np.argsort(lam)

eigenvalue = lam[sorted_idx]

eigenvector = h[

:,sorted_idx]

v = eigenvector[:,

:self.n]if(

isinstance

(v[0][

0],complex))

:#判斷是否虛數

v =abs(v)

#kmeans此處不再用python一行一行地寫了...,直接從sklearn中呼叫或參考本人之前的部落格

k_means = kmeans(init=

'k-means++'

, n_clusters=self.n, tol=1e-

6)k_means.fit(v)

self.__labels = k_means.labels_

defpredict

(self,data)

:return np.copy(self.__labels)

#使用sklearn的公共資料集看一下聚類效果如何

defgenerate_dataset

(n=300

, noise=

0.07

, random_state=

42, visualize=

false):

from sklearn.datasets import make_moons

x, y = make_moons(n, noise=noise, random_state=random_state)

if visualize:

fig, ax = plt.subplots(figsize=(16

,9))

ax.set_title(

'test dataset for spectral clustering'

, fontsize=

18, fontweight=

'demi'

) ax.scatter(x[:,

0], x[:,

1], c=y, s=

50, cmap=

'viridis'

) plt.show(

)return x

if __name__ ==

'__main__'

:# create dataset:

n =2 k =

5 x = generate_dataset(visualize=

false

)# spectral clustering estimation:

sc = spectralclustering(k,n)

sc.fit(x)

category = sc.predict(x)

# visualize:

color =

['red'

,'blue'

,'green'

,'cyan'

,'magenta'

] labels =

[f'cluster'

for k in

range

(k)]

for k in

range

(k):

plt.scatter(x[category == k][:

,0], x[category == k][:

,1], c=color[k]

, label=labels[k]

) plt.xlabel(

'x')

plt.ylabel(

'y')

plt.legend(

) plt.title(

'spectral clustering testcase'

) plt.show(

)

聚類效果:

20150916譜聚類學習

什麼是譜聚類?譜聚類的思想是生成乙個帶權無向圖g。g的每個頂點表示乙個樣本,連線頂點的邊表示兩個樣本之間具有相似性,邊的權值即樣本之間的相似度大小。然後對圖進行分割,使得不同組之間的邊的相似度盡可能的小,組內邊的相似度盡可能的大。因此,譜聚類需要解決兩個問題 如何生成帶權無向圖g?如何對圖進行分割?...

機器學習 譜聚類

譜聚類,譜就是指矩陣所有的特徵值的集合 而矩陣指的是由所有資料形成的圖的laplacian矩陣。因此譜聚類就是計算資料的laplacian矩陣的特徵向量,再取特徵向量中的一部分進行kmeans聚類。but,為什麼是laplacian矩陣?為什麼不直接對原始資料kmeans聚類?這也就是譜聚類實現起來...

機器學習 譜聚類

聚類確實是將相似的樣本歸為一類,使同類樣本相似度盡可能高,異類的相似性盡可能低。譜聚類 是採用圖的思想。樣本點作為圖中的點,邊為樣本點之間的相似度。所以譜聚類就是想去邊,去掉邊的權重盡量小,即異類樣本間盡量不同 子圖內邊的權重盡量大,同類樣本盡可能相似。n 知識點 核函式的理解 就是高維空間中的兩個...