Matlab 中的 Mahalanbeesh 距离
Mahalanobis distance in Matlab
我想计算输入特征向量 Y (1x14) 到矩阵 X (18x14) 中所有特征向量的马哈拉诺比斯距离。 X 的每 6 个向量代表一个 class(所以我有 3 个 class)。然后基于马哈拉诺比斯距离,我将选择最接近输入的向量,并将其 class 化为三个 class 之一。
我的问题是当我使用下面的代码时我只得到一个值。我怎样才能得到输入 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;所以每一个代表一个 class 的特征向量。这是代码,但它不能正常工作,我得到了 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
函数时,我得到了这个错误:
警告:矩阵接近奇异或严重缩放。结果可能不准确。
如果你必须自己实现距离(例如学校作业),这对你绝对没有用,但如果你只需要计算距离作为其他计算的中间步骤,我强烈建议 d = Pdist2(a,b, distance_measure)
文档在 matlabs site
它计算向量(甚至矩阵)b
和 a
中的所有元素之间的成对距离,并将它们存储在向量 d
中,其中列对应于中的条目b
并且行是来自 a
的条目。所以 d(i,j) 是 b
中的 row j
和 a
中的 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);
我想计算输入特征向量 Y (1x14) 到矩阵 X (18x14) 中所有特征向量的马哈拉诺比斯距离。 X 的每 6 个向量代表一个 class(所以我有 3 个 class)。然后基于马哈拉诺比斯距离,我将选择最接近输入的向量,并将其 class 化为三个 class 之一。
我的问题是当我使用下面的代码时我只得到一个值。我怎样才能得到输入 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;所以每一个代表一个 class 的特征向量。这是代码,但它不能正常工作,我得到了 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
函数时,我得到了这个错误:
警告:矩阵接近奇异或严重缩放。结果可能不准确。
如果你必须自己实现距离(例如学校作业),这对你绝对没有用,但如果你只需要计算距离作为其他计算的中间步骤,我强烈建议 d = Pdist2(a,b, distance_measure)
文档在 matlabs site
它计算向量(甚至矩阵)b
和 a
中的所有元素之间的成对距离,并将它们存储在向量 d
中,其中列对应于中的条目b
并且行是来自 a
的条目。所以 d(i,j) 是 b
中的 row j
和 a
中的 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);