Spectral clustering 谱聚类讲解及实现
簡述
- https://github.com/Sean16SYSU/MachineLearningImplement
這篇是在網上看了wiki之后寫出來的代碼。
附上一篇看過論文之后根據論文實現的版本:【論文閱讀和實現】On Spectral Clustering: Analysis and an algorithm【Python實現】
In multivariate statistics and the clustering of data, spectral clustering techniques make use of the spectrum(eigenvalues) of the similarity matrix of the data to perform dimensionality reduction before clustering in fewer dimensions. The similarity matrix is provided as an input and consists of a quantitative assessment of the relative similarity of each pair of points in the dataset.1 在多元統計和數據聚類當中,譜聚類技術充分利用了數據的相似度矩陣光譜(特征值)來實現在聚類之前的降維到更小的維度下。這個相似度矩陣被提供作為輸入,包括有在每對點之間的關聯相似度的量化方法。
Given an enumerated set of data points, the similarity matrix may be defined as a symmetric matrix A{\displaystyle A}A , where Aij≥0{\displaystyle A_{ij}\geq 0}Aij?≥0represents a measure of the similarity between data points with indices i{\displaystyle i}i and j{\displaystyle j}j.
給一個可數的點集,相似度矩陣可以被定義為一個對稱矩陣 A{\displaystyle A}A , 并且Aij≥0{\displaystyle A_{ij}\geq 0}Aij?≥0表示的是有著下面的index的 i{\displaystyle i}i 和j{\displaystyle j}j 兩個點之間的相似度。
一般來說的譜聚類方法,就是會使用一些標準的聚類方法(包括有Kmean) 相關的拉普拉斯矩陣的特征向量上。 有很多種方式來定義拉普拉斯矩陣,每種都有自己的數學解讀。并且因此這個聚類的也會有不同的解讀。
這些相關的特征向量是一個基于最小的幾個拉普拉斯矩陣的特征值,除了最小的那個0。為了計算的速度,這些特征向量經常被計算為拉普拉斯函數的最大的特征值對應的特征向量。
圖問題的拉普拉斯矩陣被定義為
L:=D?AL:=D-AL:=D?A
D是對角矩陣,然后對角元為對應節點的度。
一個非常著名相關的譜聚類技術,用到了normalized cuts algorithm ,被廣泛用于圖片分割。分割的時候,基于的特征想來是對稱正則化拉普拉斯矩陣的第二小的特征。 這個矩陣被定義為
Lnorm:=I?D?1/2AD?1/2{\displaystyle L^{\text{norm}}:=I-D^{-1/2}AD^{-1/2}}Lnorm:=I?D?1/2AD?1/2
算法
To perform a spectral clustering we need 3 main steps:2
針對圖算法
還是一樣的,為了封裝性,我這就直接寫了 函數內嵌套著函數~
import numpy as np from sklearn.cluster import KMeansdef spectral_cluster(X, n_clusters=3, sigma=1, k=5, n_eigen=10):def graph_building_KNN(X, k=5, sigma=1):N = len(X)S = np.zeros((N, N))for i, x in enumerate(X):S[i] = np.array([np.linalg.norm(x - xi) for xi in X])S[i][i] = 0graph = np.zeros((N, N))for i, x in enumerate(X):distance_top_n = np.argsort(S[i])[1: k+1]for nid in distance_top_n:graph[i][nid] = np.exp(-S[i][nid] / (2 * sigma ** 2))return graphgraph = graph_building_KNN(X, k)def laplacianMatrix(A):dm = np.sum(A, axis=1)D = np.diag(dm)L = D - AsqrtD = np.diag(1.0 / (dm ** 0.5))return np.dot(np.dot(sqrtD, L), sqrtD)L = laplacianMatrix(graph)def smallNeigen(L, n_eigen):eigval, eigvec = np.linalg.eig(L)index = list(map(lambda x: x[1], sorted(zip(eigval, range(len(eigval))))[1:n_eigen+1]))return eigvec[:, index]H = smallNeigen(L, n_eigen)kmeans = KMeans(n_clusters=n_clusters).fit(H)return kmeans.labels_- 測試
- 實際圖
有部分檢測的不是很好,sklearn上的實現的版本,實際上改進之后的版本spectral-embedding,效果好很多。
- sklearn的譜聚類效果圖
https://en.wikipedia.org/wiki/Spectral_clustering ??
https://towardsdatascience.com/spectral-clustering-for-beginners-d08b7d25b4d8 ??
總結
以上是生活随笔為你收集整理的Spectral clustering 谱聚类讲解及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: COP-kMeans限制性--kMean
- 下一篇: 【论文阅读和实现】On Spectral