機器學習:雙聚類算法


PS:因為沒有找到實際應用的場景,所以兩個示例直接采用了官網的示例。以后遇到實際的應用場景了,再替換成實際的例子。

1.算法簡介

       雙聚類簡單來說就是在數據矩陣A中尋找一個滿足條件矩陣B1的子矩陣A1,而B1是條件矩陣B的一個子矩陣.

2.算法常用的計算模型

       目前定義雙聚類算法有四種比較廣泛的方式:(括號中為sklearn官網的說法)

2.1等值模型(常數值,常量行或常量列)

2.2加法模型(低方差的子矩陣) 

2.3乘法模型(異常高或低的值) 

2.4信息共演模型(相關的行或列) 

3.兩種特殊的雙聚類結果(sklearn官網有算法的) 

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()
View Code

下面三個圖依次表示:原始數據、打亂后的數據、聚類后的效果圖

 

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()
View Code

 下面四個圖依次表示:原始數據、打亂后的數據、進行雙聚類重排后的數據、按棋盤結構排列的數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM