7 个版本
0.1.6 | 2022年3月12日 |
---|---|
0.1.5 | 2022年3月11日 |
0.1.3 | 2022年1月17日 |
6 in #initial
每月 23 次下载
34KB
368 行
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 -h
或 wsp --help
获取有关参数的更多信息。
依赖关系
~3–4MB
~56K SLoC