3 个版本
0.1.2 | 2024年1月26日 |
---|---|
0.1.1 | 2024年1月25日 |
0.1.0 | 2024年1月25日 |
#2415 in 算法
16KB
227 行
描述
此项目提供了一种简单的方法来在距离(相似性)矩阵上应用主坐标分析。其内部逻辑基于 Python 的 scikit-bio
库。
如何使用
文档可以在 这里 找到。
状态
实验性。
lib.rs
:
此软件包提供应用主坐标分析的功能。
快速入门
对主坐标分析的一个简要介绍。
什么是主坐标分析(PCoA)
PCoA 是一种统计方法,将项目之间的距离数据转换为类似地图的可视化。它有助于揭示哪些项目彼此接近,哪些项目彼此遥远。这种可视化还可以帮助识别项目中的组或聚类。
主坐标分析和多维尺度
多维尺度是一系列统计方法,专注于基于距离的项目映射。主坐标分析是多维尺度的一种,专门用于数值距离,其中没有测量误差——每个项目对都有一个精确的距离度量。
主坐标分析和主成分分析
由于它们有相同的缩写和都涉及降维,PCoA 和主成分分析(PCA)经常被混淆。然而,它们在主要目标上有所不同
- PCA 关注共享方差,旨在将多个变量汇总到最少的组件中,同时最大化每个组件中方差的解释。
- PCoA 强调距离,并努力识别能够捕捉项目之间最大距离的维度。
有关更多信息,请阅读 一篇优秀的文章。
实现
此软件包的实现基于 scikit-bio 实现,但大多数性能优化在这里都没有应用。
使用示例
本节解释了如何使用此库。
简述
假设我们有三个点 A、B、C,它们之间的距离矩阵是 3x3 形状
0 | AB | AC |
BA | 0 | BC |
CA | CB | 0 |
要调用 PCoA
函数,您需要从距离矩阵构建 DMatrix
实例。以下伪代码演示了将要用于函数的一维数组的预期布局
DMatrix::from_column_slice(3, 3, [0,AB,AC,BA,0,BC,CA,CB,0])
DMatrix
是来自 nalgebra
crate 的类型,其他来自此 crate 的类型可以通过 pcoa::nalgebra
导入。
请注意,当前实现假设矩阵是对称的,因此以下等式应该成立:AB=BA
,AC=CA
和 BC=CB
。
作为第二个参数,您需要传递主坐标的维度。通常,它等于 2。
作为结果,将返回另一个 DMatrix
实例,它表示主坐标,可用于在地图上绘制原始项目。
代码示例
一个简约示例
use pcoa::apply_pcoa;
use pcoa::nalgebra::DMatrix;
// here, we have interest in only two coordinates (e.g. x and y)
let number_of_dimensions = 2;
// create a distance matrix from raw data. Matrix is expected to be symmetric with 3x3 shape
let distance_matrix = DMatrix::from_column_slice(3, 3, &[0_f64, 250., 450., 250., 0., 300., 450., 300., 0.]);
// apply pcoa
let coords_matrix = apply_pcoa(distance_matrix, number_of_dimensions).expect("cannot apply PCoA");
// NOTE: transpose matrix to get first column for x coordinates and the second - for y coordinates.
let coords_matrix = coords_matrix.transpose();
let xs: Vec<_> = coords_matrix.column(0).iter().copied().collect();
let ys: Vec<_> = coords_matrix.column(1).iter().copied().collect();
// these are our coordinates
assert_eq!((xs[0].round(), ys[0].round()), (213., -60.));
assert_eq!((xs[1].round(), ys[1].round()), (24., 104.));
assert_eq!((xs[2].round(), ys[2].round()), (-237., -44.));
这里,我们有一个以下距离矩阵作为输入
0 | 250 | 450 |
250 | 0 | 300 |
450 | 300 | 0 |
结果,我们得到以下坐标(在测试和这里四舍五入)
A: (213, -60)
B: ( 24, 104)
C: (-237, -44)
这些坐标保留了点之间的原始距离(有些精度损失)并且可以用于在 2D 空间中可视化原始数据。
依赖关系
~3MB
~57K SLoC