当前位置: 首页 > article >正文

2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。

文章目录

  • sklearn学习(20) 无监督学习-双聚类
    • 1 Spectral Co-Clustering
      • 1.1 数学公式
    • 2 Spectral Biclustering
      • 2.1 数学表示
    • 3 Biclustering 评价

sklearn学习(20) 无监督学习-双聚类

文章参考网站:
https://sklearn.apachecn.org/

https://scikit-learn.org/stable/

Biclustering(双向聚类) 的实现模块是 sklearn.cluster.bicluster双向聚类算法对数据矩阵的行列同时进行聚类。而这些行列的聚类称之为 双向簇(biclusters)。每一次聚类都会基于原始数据矩阵确定一个子矩阵, 并且这些子矩阵具有一些需要的属性。

例如, 给定一个矩阵 (10, 10) , 如果对其中三行二列进行双向聚类,就可以获得一个子矩阵 (3, 2)

>>> import numpy as np
>>> data = np.arange(100).reshape(10, 10)
>>> rows = np.array([0, 2, 3])[:, np.newaxis]
>>> columns = np.array([1, 2])
>>> data[rows, columns]
array([[ 1,  2],
 [21, 22],
 [31, 32]])

为了可视化,给定一个双向簇,数据矩阵的行列可以重新分配,使得该双向簇是连续的。

不同的双向聚类算法在如何定义双向簇方面有所不同,但其中通用类型包括:

  • 常量, 常量行或常量列。
  • 异常高的或者低的值。
  • 低方差的子矩阵。
  • 相互关联的行列。

算法在给双向簇分配行列的方式不同, 会导致不同的双向聚类结构。当行和列分成区块时,会出现块对角或者棋盘结构。

如果每一行和每一列仅属于一个双向簇,重新排列数据矩阵的行和列,会使得双向簇出现在对角线上。下面是一个示例,此结构的双向簇具有比其他行列更高的平均值:

http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_spectral_coclustering_0031.png

在棋盘结构的示例中, 每一行属于所有的列簇, 每一列属于所有的行簇。下面是一个示例,每个双向簇内的值差异较小:

http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_spectral_biclustering_0031.png

在拟合模型之后, 可以在 rows_columns_ 属性中找到行簇和列簇的归属信息(membership)。rows_[i] 是一个二元向量, 其中非零元素表示属于双向簇i 的行。 同样的, columns_[i] 就表示属于双向簇 i 的列。

一些模块也有 row_labels_column_labels_ 属性。 这些模块可以对行列进行分区, 例如在块对角或者棋盘双向簇结构。

注意 双向聚类在不同的领域有很多其他名称,包括 co-clustering, two-mode clustering, two-way clustering, block clustering, coupled two-way clustering 等.有一些算法的名称,比如 Spectral Co-Clustering algorithm, 反应了这些备用名称。

1 Spectral Co-Clustering

SpectralCoclustering(联合谱聚类) 算法找到的双向簇的值比其它的行和列更高。每一个行和列都只属于一个双向簇, 所以重新分配行和列,使得分区连续显示对角线上的高值:

注意

算法将输入的数据矩阵看做成二分图:该矩阵的行和列对应于两组顶点,每个条目对应于行和列之间的边,该算法近似的进行归一化,对图进行切割,找到更重的子图。

1.1 数学公式

找到最优归一化剪切的近似解,可以通过图形的 Laplacian 的广义特征值分解。 通常这意味着直接使用 Laplacian 矩阵. 如果原始数据矩阵 A A A 的形状 m × n m \times n m×n , 则对应的二分图(bipartite graph)的 Laplacian 矩阵具有形状 ( m + n ) × ( m + n ) (m + n) \times (m + n) (m+n)×(m+n) 。 但是, 在这种情况下, 直接使用 A A A , 因为它更小,更有效率。

输入矩阵 A A A 被预处理如下:
A n = R − 1 / 2 A C − 1 / 2 A_n = R^{-1/2} A C^{-1/2} An=R1/2AC1/2
R R R 是对角线矩阵, 其中元素 i i i 等于 ∑ j A i j \sum_{j} A_{ij} jAij C C C 是 对角矩阵,其中元素 j j j 等于 ∑ i A i j \sum_{i} A_{ij} iAij

奇异值分解, A n = U Σ V ⊤ A_n = U \Sigma V^\top An=UΣV , 产生了 A A A 行列的分区. 左边奇异向量的子集给予行分区,右边的奇异向量的子集给予列分区。

奇异向量 ℓ = ⌈ log ⁡ 2 k ⌉ \ell = \lceil \log_2 k \rceil =log2k 从第二个开始, 提供所需的分区信息。这些用于形成矩阵 Z:
Z = [ R − 1 / 2 U C − 1 / 2 V ] Z = \begin{bmatrix} R^{-1/2} U \\ C^{-1/2} V \end{bmatrix} Z=[R1/2UC1/2V]
U U U 的列是 u 2 , … , u ℓ + 1 u_2, \dots, u_{\ell +1} u2,,u+1 , 和 V V V 的列也具有相似特性。

然后 Z Z Z 的所有行通过使用 k-means 进行聚类. 第一个n_rows 标签提供行分区信息, 剩下的 n_columns 标签提供列分区信息。

示例:

  • A demo of the Spectral Co-Clustering algorithm: 如何用双向簇产生一个数据矩阵并应用。
  • Biclustering documents with the Spectral Co-clustering algorithm:一个在 20 个新闻组数据集中发现双向簇的示例

参考资料:

  • Dhillon, Inderjit S, 2001. Co-clustering documents and words using bipartite spectral graph partitioning.

2 Spectral Biclustering

SpectralBiclustering(双向谱聚类) 算法假设输入的数据矩阵具有隐藏的棋盘结构。具有这种结构的矩阵的行列可能被分区,使得在笛卡尔积中的大部分双向簇的列簇和行簇是近似恒定的。

例如,如果有两个行分区和三个列分区,每一行属于三个双向簇,每一列属于两个双向簇。

这个算法对矩阵的行和列进行分区,以至于提供一个相应的块状不变的棋盘矩阵,近似于原始矩阵。

2.1 数学表示

输入矩阵 A A A 先归一化,使得矩阵的棋盘模式更明显。这里有三种方法:

  1. 独立的行列归一化, 如联合谱聚类中所示. 这个方法使得所有行进行行内相加得到一个相同常量,所有列相加得到另一个相同常量。
  2. Bistochastization: 重复行和列归一化直到收敛。该方法使得行和列相加得到一个相同的常数。
  3. 对数归一化: 数据矩阵的对数是 L = log ⁡ A L = \log A L=logA . 列对数就是 L i ⋅ ‾ \overline{L_{i \cdot}} Li , 行 对数就是 L ⋅ j ‾ \overline{L_{\cdot j}} Lj , L ⋅ ⋅ ‾ \overline{L_{\cdot \cdot}} L⋅⋅ L L L 的整体平均. 最终矩阵通过下面的公式计算 K i j = L i j − L i ⋅ ‾ − L ⋅ j ‾ + L ⋅ ⋅ ‾ K_{ij} = L_{ij} - \overline{L_{i \cdot}} - \overline{L_{\cdot j}} + \overline{L_{\cdot \cdot}} Kij=LijLiLj+L⋅⋅

归一化后,第一个的奇异向量被计算,就如同联合谱聚类算法一样。

如果使用对数归一化,则所有的奇异向量都是有意义的。但是, 如果是独立归一化或Bistochastization 被使用, 第一个奇异向量, u 1 u_1 u1 v 1 v_1 v1 。 会被丢弃。 从现在开始, “第一个” 奇异向量指的是 u 2 … u p + 1 u_2 \dots u_{p+1} u2up+1 v 2 … v p + 1 v_2 \dots v_{p+1} v2vp+1 ,除了对数归一化的情况。

给定这些奇异向量,按照分段常数向量的最佳近似程度,将他们排序。使用一维 k-means 找到每个向量的近似值并使用欧氏距离进行评分。最好的左右奇异向量的某个子集被选择。下一步, 数据将被投影到奇异向量的最佳子集并进行聚类。

例如,如果已计算得到 p p p 个奇异向量, q q q 个 最佳得奇异向量可以被找出, 因为 q < p q<p q<p 。让 U U U 为列是 q q q 个最佳左奇异向量的矩阵, 并且 V V V 是用右奇异向量组成的矩阵. 为了划分行, 将 A A A 投影到 q q q 维空间: A ∗ V A*V AV 。把 m × q m \times q m×q 矩阵的 m m m 行作为样本, 然后使用 k-means 的聚类处理产生行标签。类似地,将列投影到 A ⊤ ∗ U A^{\top} * U AU ,并且对 n × q n \times q n×q 矩阵进行聚类得到列标签。

示例:

  • A demo of the Spectral Biclustering algorithm: 一个简单的示例显示如何生成棋盘矩阵和对它进行双向聚类。

参考资料:

  • Kluger, Yuval, et. al., 2003. Spectral biclustering of microarray data: coclustering genes and conditions.

3 Biclustering 评价

有两种评估双聚类结果的方法:内部和外部。内部评估,如聚类稳定性, 依赖于数据和结果本身。目前在scikit-learn中没有内部的双向簇评估。外部评估是指外部信息来源,例如真实解。当处理真实数据时,真实解通常是未知的,但是,由于真实解是已知,因此人造数据的双向聚类可能对于评估算法非常有用。

为了将一组已发现的双向簇与一组真实的双向簇行比较,需要两个相似性度量:

单个双向簇的相似性度量以及将这些个体相似度结合到总分中的度量。

为了比较单个双向簇,可以采用了几种措施。现在,只有Jaccard索引已被实现:
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ J(A, B) = \frac{|A \cap B|}{|A| + |B| - |A \cap B|} J(A,B)=A+BABAB
其中 A A A B B B 是双向簇, ∣ A ∩ B ∣ |A\capB| 是交叉点的元素的数量。

Jaccard 索引 达到最小值0,当biclusters完全不同时,Jaccard指数最小值为0;当biclusters完全相同时,Jaccard指数最大值为1。

一些方法已经开发出来,用来比较两个双向簇的集合(set)。从现在开始, 仅consensus_score (Hochreiter et. al., 2010) 是可以用:

  1. 使用 Jaccard 索引或类似措施, 为每个集合中的一个双向簇对计算簇之间的相似性。
  2. 以一对一的方式将双向簇从一个集合分配给另一个集合,以最大化其相似性的总和。该步骤使用匈牙利算法(Hungarian algorithm)执行。
  3. 相似性的最终总和除以较大集合的大小。

当所有双向簇对都完全不相似时,最小共识得分为0。当两个双向簇集合相同时,最大得分为1。

参考资料:

  • Hochreiter, Bodenhofer, et. al., 2010. FABIA: factor analysis for bicluster acquisition.

http://www.kler.cn/a/451900.html

相关文章:

  • leetcode hot100 将有序数组转化为二叉搜索树
  • Doris 资源软硬限详解
  • 教培行业数字化未来:一站​式开发在线教育系统源码与网校APP详解
  • 如何查看pad的console输出,以便我们更好的进行调试,查看并了解实际可能的问题。
  • 注意力机制详解
  • 串口通信控制LED灯
  • Java 中 getClass() 方法的使用与原理分析:深入理解对象类型信息
  • [C/C++]智能指针是什么?实现原理是什么?
  • 鸿蒙设置app更新跳转华为市场
  • 一个桌面工具条系统,插件一键启动,快速扩展提高工作效率
  • 硬件设计:RS232电平标准
  • 如何在谷歌浏览器中设置默认下载路径
  • R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
  • 集合stream
  • springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目
  • Linux文件目录 --- touch命令创建文件
  • 项目开源能够带来什么?从中得到了什么?
  • 【网络云计算】2024第52周-每日【2024/12/25】小测-理论实操-自己构造场景,写5个系统管理的脚本-解析
  • Python——day09
  • C++之红黑树模拟实现
  • windows10/windows11运行ps1脚本报错的解决方法,签名错误解决方法
  • docker代理配置
  • 【iOS】FFmpeg更改文件名
  • 17_HTML5 Web 存储 --[HTML5 API 学习之旅]
  • CUDA11.4版本的Pytorch下载
  • Visual Studio Code历史版本下载