Matlab求两个向量之间的各种距离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab求两个向量之间的各种距离相关的知识,希望对你有一定的参考价值。

matlab中有一个函数pdist可以求一个m*n的矩阵X,m行个向量,两两之间的各种距离。

我现在的情况是:
矩阵X。维数为M*a
矩阵Y。维数为M*a
我想求矩阵X每一行的向量,和矩阵Y对应行的向量之间的各种距离。最后是一个M*1的一位距离向量。
请问变成如何实现。

最好不是那种循环
for i = 1:M
s(i) = ....
end

(1)通过matlab特有的向量化计算方法。
(2)计算以下距离:
1. 欧氏距离
2. 曼哈顿距离
3. 切比雪夫距离
4. 闵可夫斯基距离
5. 标准化欧氏距离
6. 马氏距离
7. 夹角余弦
8. 汉明距离
9. 杰卡德距离 & 杰卡德相似系数
10. 相关系数 & 相关距离
11. 信息熵

我有一个笨点的方法:用pdist2函数
R = pdist2(X, Y),最后从结果的M行M列矩阵中取出需要的数据就可以。
参考技术A arrayfun函数

Matlab中的马氏距离

【中文标题】Matlab中的马氏距离【英文标题】:Mahalanobis distance in Matlab 【发布时间】:2016-04-21 09:52:12 【问题描述】:

我想计算输入特征向量 Y (1x14) 到矩阵 X (18x14) 中所有特征向量的马氏距离。 X 的每 6 个向量代表一个类(所以我有 3 个类)。然后根据马氏距离,我将选择最接近输入的向量并将其分类为三个类别之一。

我的问题是当我使用以下代码时,我只得到一个值。如何获得输入 Y 和 X 中每个向量之间的马氏距离。所以最后我有 18 个值,然后我选择最小的一个。任何帮助将不胜感激。谢谢。

注意:我知道马氏距离是对点 P 和分布 D 之间距离的度量,但我不知道如何将其应用于我的情况。

Y = test1;         % Y: 1x14 vector 
S = cov(X);        % X: 18x14 matrix 
mu = mean(X,1);
d = ((Y-mu)/S)*(Y-mu)' 

我也尝试将矩阵 X 分成 3;所以每一个代表一个类的特征向量。这是代码,但它不能正常工作,我得到了 3 个距离,有些有负值!

 Y = test1;
 X1 = Action1;
 S1 = cov(X1);
 mu1 = mean(X1,1);
 d1 = ((Y-mu1)/S1)*(Y-mu1)' 

 X2 = Action2;
 S2 = cov(X2);
 mu2 = mean(X2,1);
 d2 = ((Y-mu2)/S2)*(Y-mu2)'

 X3= Action3;
 S3 = cov(X3);
 mu3 = mean(X3,1);
 d3 = ((Y-mu3)/S3)*(Y-mu3)' 


d= [d1,d2,d3];
MahalanobisDist= min(d)

最后一件事,当我使用 Matlab 提供的 mahal 函数时,我得到了这个错误: 警告:矩阵接近奇异或严重缩放。结果可能不准确。

【问题讨论】:

当我搜索时,我发现了这个东西 **" 选择池化独立马氏距离作为度量 - 对所有类使用相同的对角协方差矩阵,通过池化所有数据生成 -" **但我不知道这是什么意思? 【参考方案1】:

如果您必须自己实现距离(例如学校作业),这对您绝对没有用,但如果您只需要计算距离作为其他计算的中间步骤,我强烈推荐 d = Pdist2(a,b, distance_measure) 文档在matlabs site

它计算向量(甚至矩阵)ba 中的所有元素之间的成对距离,并将它们存储在向量 d 中,其中列对应于 b 中的条目,行是条目来自a。所以 d(i,j) 是b 中的row ja 中的row i 之间的距离(希望这是有道理的)。如果您希望它甚至可以通过参数找到k 最近的邻居,这是一个很棒的功能。

在您的情况下,您将使用以下代码,您最终会得到元素之间的距离以及索引

%number of neighbors 
K = 1;

% X=18x14, Y=1x14, dist=18x1
[dist, iidx] = pdist2(X,Y,'mahalanobis','smallest',K); 

%to find the class, you can do something like this
num_samples_per_class = 6;
matching_class = ceil(iidx/ num_samples_per_class);

【讨论】:

有效!非常感谢@andrew。感谢您的帮助。 很高兴@HindFawzi 我也制作并编辑以轻松提取班级编号

以上是关于Matlab求两个向量之间的各种距离的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何用代码表示两个数之间的街区(曼哈顿)距离

各种距离

MATLAB 求两个矩阵的 欧氏距离

如何找到距离等于 X 的两个向量的点

优化算法孪生支持向量机(TWSVM)含Matlab源码 1257期

在matlab中如何求两个列矩阵的协方差?