PS:由於沒有找到實際應用的場景,因此兩個示例直接採用了官網的示例。之後遇到實際的應用場景了,再替換成實際的例子。html
1.算法簡介算法
雙聚類簡單來講就是在數據矩陣A中尋找一個知足條件矩陣B1的子矩陣A1,而B1是條件矩陣B的一個子矩陣.數組
2.算法經常使用的計算模型dom
目前定義雙聚類算法有四種比較普遍的方式:(括號中爲sklearn官網的說法)ide
2.1等值模型(常數值,常量行或常量列)函數
2.2加法模型(低方差的子矩陣) spa
2.3乘法模型(異常高或低的值) 線程
2.4信息共演模型(相關的行或列) 翻譯
3.兩種特殊的雙聚類結果(sklearn官網有算法的) code
3.1對角線結構
3.2棋盤格結構
4.雙聚類的兩種算法
雙聚類的算法有不少種,這裏只介紹sklearn官網提供的兩種算法,也就是上述兩種特殊結構的算法。
4.1光譜聯合聚類(Spectral Co-Clustering)
說明:由於咱們不本身動手寫算法,因此這裏的公式就略過了。
4.1.1 算法做用
該算法找到的值高於相應的其餘行和列中的值。每行和每列只屬於一個雙聚類,所以從新排列行和列中的這些高值,使這些分區沿着對角線連續顯示。
4.1.1 主要計算過程
1)按照數學公式對矩陣進行預處理
2)對處理後的矩陣進行行和列的劃分,以後按照另一個數學公式生產一個新的矩陣Z
3)對矩陣Z的每行使用k-means算法
4.1.2 sklearn中的函數
1) sklearn.cluster.bicluster. SpectralCoclustering
2)主要參數(詳細參數)
n_clusters :聚類中心的數目,默認是3
svd_method:計算singular vectors的算法,‘randomized’(默認) 或 ‘arpack’.
n_svd_vecs :計算singular vectors值時使用的向量數目
n_jobs :計算時採用的線程或進程數量
3)主要屬性
rows_ :二維數組,表示聚類的結果。其中的值都是True或False。若是rows_[i,r]爲True,表示聚類i包含行r
columns_:二維數組,表示聚類的結果。
row_labels_ :每行的聚類標籤列表
column_labels_ :每列的聚類標籤列表
4)官網示例
import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_biclusters from sklearn.datasets import samples_generator as sg from sklearn.cluster.bicluster import SpectralCoclustering from sklearn.metrics import consensus_score data, rows, columns = make_biclusters( shape=(300, 300), n_clusters=5, noise=5, shuffle=False, random_state=0) plt.matshow(data, cmap=plt.cm.Blues) plt.title("Original dataset") data, row_idx, col_idx = sg._shuffle(data, random_state=0) plt.matshow(data, cmap=plt.cm.Blues) plt.title("Shuffled dataset") model = SpectralCoclustering(n_clusters=5, random_state=0) model.fit(data) print(model.rows_[0]) print("*******************************************") print(model.rows_[1]) score = consensus_score(model.biclusters_, (rows[:, row_idx], columns[:, col_idx])) print("consensus score: {:.3f}".format(score)) fit_data = data[np.argsort(model.row_labels_)] fit_data = fit_data[:, np.argsort(model.column_labels_)] plt.matshow(fit_data, cmap=plt.cm.Blues) plt.title("After biclustering; rearranged to show biclusters") plt.show()
下面三個圖依次表示:原始數據、打亂後的數據、聚類後的效果圖
4.2光譜雙聚類(Spectral Biclustering)
4.2.1 算法做用
該算法假定輸入的數據矩陣具備隱藏的棋盤結構,所以能夠對其中的行和列進行劃分,使得行簇和列簇的笛卡爾積中的任何雙聚類的條目近似恆定。例如,若是有兩個行分區和三個列分區,則每行將屬於三個雙彙集,而每列將屬於兩個雙彙集。
該算法對矩陣的行和列進行劃分,使相應的blockwise-constant棋盤格矩陣可以很好地逼近原始矩陣。
4.2.2 主要計算過程
1)對矩陣進行歸一化
2)計算前幾個singular vectors 值(奇異向量?總感受這麼翻譯很彆扭)
3)根據這些singular vectors值進行排序,使其能夠更好的經過piecewise-constant向量進行近似表示
4) 使用一維k均值找到每一個向量的近似值,並使用歐幾里德距離進行評分
5) 選擇最佳左右singular vectors的一些子集
6) 將數據投影到這個singular vectors的最佳子集並彙集
4.2.3 sklearn中的函數
1) sklearn.cluster.bicluster.SpectralBiclustering
2)主要參數(詳細參數)
n_clusters :單個數值或元組,棋盤結構中的行和列彙集的數量
method:把singular vectors值歸一化並轉換成biclusters的方法。默認值是‘bistochastic’。
3)主要屬性
rows_ :二維數組,表示聚類的結果。其中的值都是True或False。若是rows_[i,r]爲True,表示聚類i包含行r
columns_:二維數組,表示聚類的結果。
row_labels_ :每行的分區標籤列表
column_labels_ :每列的分區標籤列表
4)官網示例
import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_checkerboard from sklearn.datasets import samples_generator as sg from sklearn.cluster.bicluster import SpectralBiclustering from sklearn.metrics import consensus_score n_clusters = (4, 3) data, rows, columns = make_checkerboard( shape=(300, 300), n_clusters=n_clusters, noise=10, shuffle=False, random_state=0) plt.matshow(data, cmap=plt.cm.Blues) plt.title("Original dataset") data, row_idx, col_idx = sg._shuffle(data, random_state=0) plt.matshow(data, cmap=plt.cm.Blues) plt.title("Shuffled dataset") model = SpectralBiclustering(n_clusters=n_clusters, method='log', random_state=0) model.fit(data) score = consensus_score(model.biclusters_, (rows[:, row_idx], columns[:, col_idx])) print("consensus score: {:.1f}".format(score)) fit_data = data[np.argsort(model.row_labels_)] fit_data = fit_data[:, np.argsort(model.column_labels_)] plt.matshow(fit_data, cmap=plt.cm.Blues) plt.title("After biclustering; rearranged to show biclusters") plt.matshow(np.outer(np.sort(model.row_labels_) + 1, np.sort(model.column_labels_) + 1), cmap=plt.cm.Blues) plt.title("Checkerboard structure of rearranged data") plt.show()
下面四個圖依次表示:原始數據、打亂後的數據、進行雙聚類重排後的數據、按棋盤結構排列的數據