当前位置:网站首页>机器学习之聚类——双聚类简介及简单案例

机器学习之聚类——双聚类简介及简单案例

2022-08-10 03:47:00 肥猪猪爸


活动地址:CSDN21天学习挑战赛

 引子:高大上的生物学

        在生物学领域,为了研究基因表达 ,通常使用微阵列记录mRNA分子的含量并对基因的表达强度进行推断。它可以记录人体大量乃至全部基因在不同环境下的表达强度,并以矩阵形式进行储存,这些以矩阵形式存储的数据,被称为基因表达数据。


        可以将基因表达数据抽象成基因表达矩阵,对基因表达数据很重要的一个研究方面就是发现基因和环境所属的类别,也即,对基因表达矩阵进行双聚类(对矩阵的行列两个方向同时聚类)

双聚类算法

总的来说,双聚类的过程就是从原矩阵中获取聚类子矩阵,如下图两个例子

 

双聚类问题描述如下:

        通过公式我们可以观察到,残差是用自身值减去相应行和相应列的平均值,再加上总体平均值得到。也就是说,残差值的大小与自身以及所在的行列中的元素有关。残差值越小,表明该位置上的元素与这一行这一列的相关性越大,在聚类时更有可能划分到一起。而残差值大,则表明本身的值较其他元素差距较大。所以,通过残差我们就可以表示出元素与双向聚类其他元素之间的相关性。

        双向聚类针对不一样的问题有不一样的策略,策略不同,运行效率也不同。策略一般有:贪婪策略(Greedy Iterative Search);穷举策略(Exhaustive Bicluster Enumeration);分而治之策略(Divide-and-Conquer);直接策略等。贪婪策略通过在每一步都选用局部内的最优结果,结合每一步达到最终全局最优;穷举策略由于其复杂度是指数型的,在数据很多的情况下有很大的弊端;分治策略通过将问题划分为不同的独立的小问题,通过逐个解决小问题寻求全局最优解,但这个解并不一定是最好的。

        上面只是对双聚类算法的原理做了最基础的探讨,在具体算法实现中,双聚类算法主要分为基于谱聚类算法的双聚类和基于凸聚类算法的双聚类。具体内容小编会找时间仔细研究并形成博文,尽情期待吧!!!

案例:官方案例

双聚类的案例网上资料比较少,这里附上sklearn官方的一个案例,感官上跟双聚类来一次亲密接触吧!

# Author: Kemal Eren <[email protected]>
# License: BSD 3 clause

import numpy as np
from matplotlib import pyplot as plt

from sklearn.datasets import make_biclusters
from sklearn.cluster 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")

# shuffle clusters
rng = np.random.RandomState(0)
row_idx = rng.permutation(data.shape[0])
col_idx = rng.permutation(data.shape[1])
data = data[row_idx][:, col_idx]

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Shuffled dataset")

model = SpectralCoclustering(n_clusters=5, random_state=0)
model.fit(data)
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()

运行结果如下:

关于双聚类,笔者会更深入的研究,并写出博文,供大家参考!!

作者这水平有限,有不足之处欢迎留言指正

原网站

版权声明
本文为[肥猪猪爸]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_37522117/article/details/126250619