日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】

發布時間:2025/4/16 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

On Spectral Clustering: Analysis and an algorithm

  • https://github.com/Sean16SYSU/MachineLearningImplement

這是一篇引用量很高(7k+)的paper。開篇的abstract就吸引人。

  • 概括: 本文提出了一種簡單的譜聚類算法,該算法易于實現而且表現的不錯,并且基于矩陣攝動理論,我們可以分析算法并找出可以預期的良好條件。

這篇文章的算法主要是關注與n維空間的聚類點。對于這類問題,一個標準的方法就是基于一個生成的方法,在這些方法當中,比如EM算法被用來學習mixture density(混合密度)。

These approaches suffer from several drawbacks. 這些方法有些缺陷。
一個比較好的方法就是用譜方法來做聚類。這里,第一步是,選從距離矩陣中獲取最大幾個特征向量。Here, one uses the top eigenvectors of a matrix derived from the distance between points.

算法

簡直不要太感動!這篇論文把算法寫得太清晰了!!!
給定一個點集S∈RlS \in R^lSRl,然后將這個分到k個類當中。

  • 定義一個親和矩陣A∈Rn?nA \in\mathbb{R}^{n*n}ARn?n。其中Aij=exp(?∣∣si?sj∣∣2/2σ2)A_{ij}=exp(-||s_i-s_j||^2 / 2\sigma^2)Aij?=exp(?si??sj?2/2σ2) 如果i不等于j,否則為0.
  • 定義D是一個對角矩陣。對角元素是A的第i行的求和。定義一個矩陣L=D?1/2AD?1/2L=D^{-1/2}AD^{-1/2}L=D?1/2AD?1/2
  • 找到L的k個最大特征向量x1,x2,x3,...,xkx_1,x_2,x_3,...,x_kx1?,x2?,x3?,...,xk?(選出正交的避免重復的特征值)。然后得到矩陣X=[x1,x2,x3,...,xk]∈Rn?kX=[x_1,x_2,x_3,...,x_k] \in\mathbb{R}^{n*k}X=[x1?,x2?,x3?,...,xk?]Rn?k。注意這里是將這個作為了列向量然后得到的矩陣。
  • 定義矩陣Y,是X的正則化了每一行的之后的結果,使得X的每一行都具有單位長度。Yij=Xij/(∑jXij2)1/2Y_{ij} = X_{ij} / (\sum_j{X_{ij}^2})^{1/2}Yij?=Xij?/(j?Xij2?)1/2
  • 把Y的每行都作為一個在Rk\mathbb{R}^{k}Rk的點。聚類他們到K個不同的類,通過kmeans,或者其他上面什么方法。(降低失真 minimize distortion)
  • 將初始的點分配,就按照Y的每一行所分配的對應的類j。
  • 實現

    • 可以跟這篇文章做對比 Spectral clustering 譜聚類講解及實現
    import numpy as np import numpy as np from sklearn.cluster import KMeansdef spectral_cluster(X, n_clusters=3, sigma=1): '''n_cluster : cluster into n_cluster subsetsigma: a parameter of the affinity matrix'''def affinity_matrix(X, sigma=1):N = len(X)A = np.zeros((N, N))for i in range(N):for j in range(i+1, N):A[i][j] = np.exp(-np.linalg.norm(X[i] - X[j])**2 / (2 * sigma ** 2))A[j][i] = A[i][j]return AA = affinity_matrix(X, sigma)def laplacianMatrix(A):dm = np.sum(A, axis=1)D = np.diag(dm)sqrtD = np.diag(1.0 / (dm ** 0.5))return np.dot(np.dot(sqrtD, A), sqrtD)L = laplacianMatrix(A)def largest_n_eigvec(L, n_clusters):eigval, eigvec = np.linalg.eig(L)index = np.argsort(np.sum(abs(eigvec), 0))[-n_clusters:] # n_clusters largest eigenvectors' indexes.return eigvec[:, index] newX = largest_n_eigvec(L, n_clusters)def renormalization(newX):Y = newX.copy()for i in range(len(newX)):norm = 0for j in newX[i]:norm += (newX[i] ** 2)norm = norm ** 0.5Y[i] /= normreturn YY = renormalization(newX)kmeans = KMeans(n_clusters=n_clusters).fit(Y)return kmeans.labels_
    • 測試效果不錯。但是發現對于那些出現重疊部分的數據(或者是靠的比較近(在歐式空間下)的數據,分類效果就不是很好了)

    • 導入數據

    from sklearn import datasets iris = datasets.load_iris() from sklearn.decomposition import PCA X_reduced = PCA(n_components=2).fit_transform(iris.data)
    • 譜聚類版本
    y = spectral_cluster(X_reduced, n_clusters=3, sigma=1) plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap=plt.cm.Set1)

    • 真實數據版本

    總結

    以上是生活随笔為你收集整理的【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。