【发布时间】:2018-06-13 10:59:56
【问题描述】:
以下高效且矢量化的 Matlab 代码使用权重向量 WTS(每个维度 1 个权重;所有点的权重相同)计算 2 组点 A 和 B 之间的加权欧几里得距离:
WTS = sqrt(WTS);
% modify A and B against weight values
A = WTS(ones(1,size(A,1)),:).*A;
B = WTS(ones(1,size(B,1)),:).*B;
% calculate distance
AA = sum(A.*A,2);
BB = sum(B.*B,2)';
D = sqrt(AA(:,ones(1,size(B,1))) + BB(ones(1,size(A,1)),:) - 2*A*B');
(来源:https://github.com/nolanbconaway/pairdist/blob/master/pairdist.m)
我的问题是: 是否存在用于类似计算的有效矢量化形式(Matlab、R 或 Julia 都可以),不同之处在于 WTS 是一组具有相同的权重向量大小为 A?换句话说,不是 1 个权重向量,我需要为 A 中的每个点 1 个权重向量。
这个答案似乎可以满足我的需要,但它是用 Python 编写的,我不确定如何将其转换为 Matlab/R/Julia:https://stackoverflow.com/a/19285289/834518
另外,不是Efficiently calculating weighted distance in MATLAB 的重复,因为该问题涉及单个权重向量的情况,我明确要求 N 个权重向量的情况。
编辑:示例应用:RBF 网络和高斯混合模型,您(可以)为每个神经元/组件拥有 1 个权重向量。对于这类问题,有效的解决方案是必不可少的。
【问题讨论】:
-
您是否自己尝试过任何可能使您更接近解决方案的更改?你发现了什么?
-
@rahnema1 不是重复的,只有 1 个权重向量就是这种情况。
-
@MattB。对于 1 个权重向量的情况确实很简单,但是当权重向量与 A 中的点一样多时,我根本看不到如何做同样的事情,至少效率一样高。我尝试了一些不那么科学的临时修改,例如仅将 A 乘以 WTS 或将其包含在 2AB 项中,获得了灾难性的结果。换句话说,我在问之前尝试了很多东西。
-
@MattB。可能需要计算一个具有所有成对差异(而不是距离)的 3D 矩阵,然后我可以将每个矩阵与它对应的权重向量相乘(我认为这就是他在 Python 答案中所做的),但同样,我'不确定如何有效地做到这一点。
-
@DanGetz 正如我在 Distance.jl 解决方案下评论的那样,它要求
A和B大小相同,W是一个向量,但 OP 希望A和 @ 987654329@ 是不同大小的矩阵,W是一个与A大小相同的矩阵。你能出示你的代码吗?
标签: r matlab julia vectorization euclidean-distance