#points #space #distance #space-filling #set #initial #subset

bin+lib wsp

Rust 实现的 WSP 空间填充算法

7 个版本

0.1.6 2022年3月12日
0.1.5 2022年3月11日
0.1.3 2022年1月17日

6 in #initial

每月 23 次下载

MIT 协议

34KB
368

GitHub Crates.io docs.rs

rust-wsp

A rust implementation of the WSP space filling algorithm.

本实现基于 J. Santiago 等人的论文

[1] Santiago, J., Claeys-Bruno, M., & Sergent, M. (2012). Construction of space-filling designs using WSP algorithm for high dimensional spaces. Chemometrics and Intelligent Laboratory Systems, 113, 26-31.

包使用

将以下行添加到 Cargo.toml 文件

[dependencies]
wsp = "0.1.6"

使用场景

空间填充算法允许从一个给定的空间中移除彼此过于接近的点。给定一个最小距离 d_min 和一个初始点集,wsp 构建一个子集,其中所有剩余的点彼此之间的距离至少为 d_min

wsp 还提供了经典 WSP 算法的替代版本。在某些场景中,没有关于选择 d_min 的任何线索,但需要子集中有给定数量的剩余点。adaptive_wsp 搜索最佳的 d_min 以创建一个目标点数的子集。

示例

WSP

以下示例使用种子 51 从均匀随机分布生成 1000 个点,在一个 20 维空间中。生成使用种子 51。最小距离任意设置为 3.0。

// Generates the initial set
let mut points = wsp::PointSet::init_from_random(1000, 20, 51);

// Only keep distant enough points
let d_min = 3.0;
wsp::wsp(&mut points, d_min);

// Iterate over the remaining points
for valid_point in points.get_remaining() {
    println!("{:?}", valid_point);
}

自适应 WSP

下一个示例使用 adaptive_wsp 函数的详细模式。由于种子,初始集与上一个示例类似。我们的目标是找到一个最小距离,使得结果集只包含 100 个点。

// Generates the initial set
let mut points = wsp::PointSet::init_from_random(1000, 20, 51);

// Adaptive WSP makes a binary search to reach the target
// number of remaining points
let objective_nb: usize = 100;
wsp::adaptive_wsp(&mut points, objective_nb, false);

// Save the result in a CSV file
if let Err(err) = points.save_in_csv("wsp.csv", false) {
    println!("Error writing in CSV: {}", err);
    std::process::exit(1);
}

二进制使用

使用 cargo install wsp 安装 rust-wsp crate 的二进制版本。两者 wsp()adaptive_wsp 都可以通过命令行使用。

经典 WSP

您可以使用以下命令运行经典 WSP 版本

wsp -n 1000 -m 20 -d 0.5

这将运行具有 1000 个初始点的 WSP 算法。每个点有 10 个维度。每个点之间的最小距离,如[1]中所述,设置为 0.5。目前,算法使用 l1(曼哈顿)距离,因为它在高度空间中比 l2(欧几里得)距离提供更好的分离。结果存储在名为 wsp.csv 的文件中。每行表示一个 20 维空间中的点,该点与其他邻居的距离足够远。您可以使用 -o 选项更改输出文件。

自适应 WSP

$ wsp -n 1000 -m 20 --adaptive 100

与上一个命令类似,初始空间被填充了1000个20维的点。然而,现在,用户不需要指定点之间的最小距离,而是指定结果集中所需的点数。算法将进行二分搜索,直到1)结果集包含所需的点数,或者2)无法找到达到这个数量的距离。在后一种情况下,rust-wsp使用能够使空间中点数最接近所需值的最小距离

考虑以下示例,我们希望在20维空间中包含200个点,初始时填充1000个点

$ wsp -n 1000 -m 20 --adaptive 200 -v
Iter #1: distance=7.430897367982144, nb_active=5
Iter #2: distance=5.028120018334874, nb_active=98
Iter #3: distance=3.826731343511239, nb_active=591
Iter #4: distance=4.427425680923057, nb_active=270
Iter #5: distance=4.727772849628966, nb_active=168
Iter #6: distance=4.577599265276012, nb_active=209
Iter #7: distance=4.652686057452489, nb_active=170
Iter #8: distance=4.615142661364251, nb_active=195
Iter #9: distance=4.5963709633201315, nb_active=207
Iter #10: distance=4.605756812342191, nb_active=194
Iter #11: distance=4.601063887831161, nb_active=191
Iter #12: distance=4.5987174255756464, nb_active=206
Iter #13: distance=4.599890656703404, nb_active=206
Iter #14: distance=4.600477272267282, nb_active=201
Iter #15: distance=4.600770580049222, nb_active=194
Iter #16: distance=4.600623926158252, nb_active=194
Iter #17: distance=4.600550599212767, nb_active=197
[...]
Iter #53: distance=4.60049404718639, nb_active=201
Iter #54: distance=4.600494047186391, nb_active=197
Last iter: best approximation is distance=4.600477272267282, nb_active=201
Nb active: 201

算法进行了54次迭代,直到完全探索最小距离搜索空间。它将(如果需要)重新计算空间,以最小距离达到集合中目标活动点数的最佳近似值。这里,它是201,与目标相比有1个误差。默认情况下,结果矩阵也存储在名为 wsp.csv 的文件中。

更多帮助

运行 wsp -hwsp --help 获取有关参数的更多信息。

依赖关系

~3–4MB
~56K SLoC