<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
劉然,女,西安工程大學電子資訊學院,2021級研究生
研究方向:影象處理
電子郵件:1654790996@qq.com
劉帥波,男,西安工程大學電子資訊學院,2021級研究生,張宏偉人工智慧課題組
研究方向:機器視覺與人工智慧
電子郵件:1461004501@qq.com
譜聚類是從圖論中演化出來的演演算法,它的主要思想是把所有的資料看做空間中的點,這些點之間可以用邊連線起來。距離較遠的兩個點之間的邊權重值較低,而距離較近的兩個點之間的邊權重值較高,通過對所有資料點組成的圖進行切圖,讓切圖後不同的子圖間邊權重和儘可能的低,而子圖內的邊權重和儘可能的高,從而達到聚類的目的。
對於一個圖G,我們一般用點的集合V和邊的集合E來描述。即為G(V,E)。其中V即為我們資料集裡面所有的點(v1,v2,…vn)。對於V中的任意兩個點,點vi和點vj,我們定義權重wij為二者之間的權重。由於是無向圖,所以wij=wji。
鄰接矩陣(Adjacency Matrix):是表示頂點之間相鄰關係的矩陣。在如圖2-1所示的權重圖當中(假設各權重為1),其鄰接矩陣可表示為圖2-2所示。
在譜聚類中,我們只有資料點的定義,並沒有直接給出這個鄰接矩陣,所以我們可以通過樣本點距離度量的相似矩陣S來獲得鄰接矩陣W。
度矩陣是對角陣,對角上的元素為各個頂點的度。圖2-1的度矩陣為圖2-3所示。
拉普拉斯矩陣L=D-W,其中D為度矩陣,W為鄰接矩陣。圖2-1的拉普拉斯矩陣為圖2-4所示。
用拉普拉斯矩陣求解特徵值,通過確定特徵值(特徵值要遵循從小到大的排列方式)的個數來確定對應特徵向量的個數,從而實現降維,然後再用kmeans將特徵向量進行聚類。
K-Means是聚類演演算法中的最常用的一種,演演算法最大的特點是簡單,好理解,運算速度快,但是隻能應用於連續型的資料,並且一定要在聚類前需要手工指定要分成幾類。
下面,我們描述一下K-means演演算法的過程,為了儘量不用數學符號,所以描述的不是很嚴謹,大概就是這個意思,“物以類聚、人以群分”:
1.首先輸入k的值,即我們希望將資料集經過聚類得到k個分組。
2.從資料集中隨機選擇k個資料點作為初始大哥(質心,Centroid)
3.對集合中每一個小弟,計算與每一個大哥的距離(距離的含義後面會講),離哪個大哥距離近,就跟定哪個大哥。
4.這時每一個大哥手下都聚集了一票小弟,這時候召開人民代表大會,每一群選出新的大哥(其實是通過演演算法選出新的質心)。
5.如果新大哥和老大哥之間的距離小於某一個設定的閾值(表示重新計算的質心的位置變化不大,趨於穩定,或者說收斂),可以認為我們進行的聚類已經達到期望的結果,演演算法終止。
6.如果新大哥和老大哥距離變化很大,需要迭代3~5步驟。
本實驗中使用到的資料集均由sklearn.datasets中提供的方法生成,本實驗中用到了make_circles,make_moons,make_blobs等函數。make_circles生成資料集,形成一個二維的大圓,包含一個小圓,如圖3-1所示;make_moons生成資料集,形成兩個彎月,如圖3-2所示;make_blobs為聚類生成符合正態分佈的資料集,如圖3-3所示。
#匯入需要的包 import numpy as np from sklearn.cluster import KMeans from sklearn.datasets import make_moons#生成資料集,形成兩個彎月。 from sklearn.datasets import make_circles#生成資料集,形成一個二維的大圓,包含一個小圓 from sklearn.datasets import make_blobs#為聚類生成符合正態分佈的資料集,產生一個資料集和相應的標籤 import matplotlib.pyplot as plt
def get_eigen(L, num_clusters):#獲取特徵 eigenvalues, eigenvectors = np.linalg.eigh(L)#獲取特徵值 特徵向量 best_eigenvalues = np.argsort(eigenvalues)[0:num_clusters]#argsort函數返回的是陣列值從小到大的索引值 U = np.zeros((L.shape[0], num_clusters)) U = eigenvectors[:, best_eigenvalues]#將這些特徵取出 構成新矩陣 return U
#K-Means聚類 def cluster(data, num_clusters): data = np.array(data) W = affinity_matrix(data) D = getD(W) L = getL(D, W) eigenvectors = get_eigen(L, num_clusters) clf = KMeans(n_clusters=num_clusters) s = clf.fit(eigenvectors) # 聚類 label = s.labels_ return label
#匯入需要的包 import numpy as np from sklearn.cluster import KMeans from sklearn.datasets import make_moons#生成資料集,形成兩個彎月。 from sklearn.datasets import make_circles#生成資料集,形成一個二維的大圓,包含一個小圓 from sklearn.datasets import make_blobs#為聚類生成符合正態分佈的資料集,產生一個資料集和相應的標籤 import matplotlib.pyplot as plt #定義高斯核函數 def kernel(x1, x2, sigma_sq=0.05): return np.exp(-(np.linalg.norm(x1 - x2) ** 2) / (2 * sigma_sq ** 2)) #定義相似度矩陣 def affinity_matrix(X): A = np.zeros((len(X), len(X)))#零矩陣 for i in range(len(X) - 1):#長度為len(x) 但是從0開始 for j in range(i + 1, len(X)):#從1開始,到len(x) 是方陣 為啥下角標取值的初始值不同??? A[i, j] = A[j, i] = kernel(X[i], X[j]) return A#通過高斯核的計算 給矩陣賦予新值 10*10 # 計算度矩陣 def getD(A): D = np.zeros(A.shape) for i in range(A.shape[0]): D[i, i] = np.sum(A[i, :]) return D #計算拉普拉斯矩陣 def getL(D, A): L = D - A return L def get_eigen(L, num_clusters):#獲取特徵 eigenvalues, eigenvectors = np.linalg.eigh(L)#獲取特徵值 特徵向量 best_eigenvalues = np.argsort(eigenvalues)[0:num_clusters]#argsort函數返回的是陣列值從小到大的索引值 U = np.zeros((L.shape[0], num_clusters)) U = eigenvectors[:, best_eigenvalues]#將這些特徵取出 構成新矩陣 return U #K-Means聚類 def cluster(data, num_clusters): data = np.array(data) W = affinity_matrix(data) D = getD(W) L = getL(D, W) eigenvectors = get_eigen(L, num_clusters) clf = KMeans(n_clusters=num_clusters) s = clf.fit(eigenvectors) # 聚類 label = s.labels_ return label def plotRes(data, clusterResult, clusterNum): """ 結果可似化 : data: 樣本集 : clusterResult: 聚類結果 : clusterNum: 聚類個數 :return: n = len(data) scatterColors = ['black', 'blue', 'red', 'yellow', 'green', 'purple', 'orange'] for i in range(clusterNum): color = scatterColors[i % len(scatterColors)] x1 = [] y1 = [] for j in range(n): if clusterResult[j] == i: x1.append(data[j, 0]) y1.append(data[j, 1]) plt.scatter(x1, y1, c=color, marker='+') if __name__ == '__main__': # # #月牙形資料集,sigma=0.1 # # # cluster_num = 2 # # # data, target = make_moons() # # # label = cluster(data, cluster_num) # # # print(label) # # # plotRes(data, label, cluster_num) # # # # 圓形資料集,sigma=0.05 cluster_num = 2 data, target = make_circles(n_samples=1000, shuffle=True, noise=0.05, factor=0.5) label = cluster(data, cluster_num) print(label) plotRes(data, label, cluster_num) # # # # 正態資料集 # # # # n_samples是待生成的樣本的總數。 # # # # n_features是每個樣本的特徵數。 # # # # centers表示類別數。 # # # # cluster_std表示每個類別的方差,例如我們希望生成2類資料,其中一類比另一類具有更大的方差,可以將cluster_std設定為[1.0, 3.0]。 # # # cluster_num = 2 # # # data, target = make_blobs(n_samples=1500, n_features=2, centers=4, random_state=24) # # # label = cluster(data, cluster_num) # # # print(label) # # # plt.subplot(121) # # # plotRes(data, target, cluster_num) # # # plt.subplot(122) # # # plotRes(data, label, cluster_num) plt.show()
1.<譜聚類(spectral clustering)原理總結 - 劉建平Pinard - 部落格園
2.參考部落格1
3.參考部落格2
4.參考部落格3
到此這篇關於Spectral clustering譜聚類演演算法的實現的文章就介紹到這了,更多相關Spectral clustering譜聚類演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45