#数据分析 #主成分 #矩阵 #坐标 #距离 #车辆路径问题 #相似性

pcoa

此软件包提供了一种在距离(相似性)矩阵上应用主坐标分析的方法

3 个版本

0.1.2 2024年1月26日
0.1.1 2024年1月25日
0.1.0 2024年1月25日

#2415 in 算法

Apache-2.0

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=BAAC=CABC=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