譜聚類推導過程較為繁瑣,本文不作介紹,重點在於使用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 知識點 核函式的理解 就是高維空間中的兩個...