matlab中的马氏距离:pdist2()与mahal()函数

matlab中的马氏距离:pdist2()与mahal()函数,matlab,Matlab,我有两个矩阵X和Y。它们都代表三维空间中的许多位置。X是一个50*3的矩阵,Y是一个60*3的矩阵 我的问题是:为什么将均值函数与“Mahalanobis”结合应用于pdist2()的输出上,却不能给出用mahal()得到的结果 下面是关于我要做什么的更多细节,以及我用来测试它的代码 假设矩阵Y中的60个观测值是在某种实验操作之后获得的。我试图评估这种操作是否对Y中观察到的位置有显著影响。因此,我使用pdist2(X,X,'Mahalanobis')将X与X进行比较以获得基线,然后,将X与Y进行

我有两个矩阵X和Y。它们都代表三维空间中的许多位置。X是一个50*3的矩阵,Y是一个60*3的矩阵

我的问题是:为什么将均值函数与“Mahalanobis”结合应用于pdist2()的输出上,却不能给出用mahal()得到的结果

下面是关于我要做什么的更多细节,以及我用来测试它的代码

假设矩阵Y中的60个观测值是在某种实验操作之后获得的。我试图评估这种操作是否对Y中观察到的位置有显著影响。因此,我使用
pdist2(X,X,'Mahalanobis')
将X与X进行比较以获得基线,然后,将X与Y进行比较(X为参考矩阵:
pdist2(X,Y,'Mahalanobis')
),我画了两个分布图来观察重叠

随后,我计算了两种分布和95%CI的平均马氏距离,并进行了t检验和Kolmogorov-Smirnoff检验,以评估分布之间的差异是否显著。这对我来说似乎非常直观,但是,当使用mahal()进行测试时,我得到了不同的值,尽管参考矩阵是相同的。我不明白两种计算马氏距离的方法到底有什么区别

注释太长@3Electrologos: 你的意思是:d(I)=(Y(I,:)-mu)inv(SIGMA)(Y(I,:)-mu)'?这只是计算马氏体的公式,因此对于pdist2()和mahal()函数应该是相同的。我认为mu是一个标量,SIGMA是一个矩阵,它基于pdist2()和mahal()中作为一个整体的参考分布。只有在mahal中,您才会将样本集的每个点与参考分布的点进行比较,而在pdist2中,您会根据参考分布进行成对比较。实际上,考虑到我的目标,我想我应该选择mahal()而不是pdist2()。我可以根据参考分布解释成对距离,但我认为这不是我需要的

% test pdist2 vs. mahal in matlab

% the purpose of this script is to see whether the average over the rows of E equals the values in d...

% data
X = []; % 50*3 matrix, data omitted
Y = []; % 60*3 matrix, data omitted


% calculations
S = nancov(X);

% mahal()
d = mahal(Y,X); % gives an 60*1 matrix with a value for each Cartesian element in Y (second matrix is always the reference matrix)

% pairwise mahalanobis distance with pdist2()
E = pdist2(X,Y,'mahalanobis',S); % outputs an 50*60 matrix with each ij-th element the pairwise distance between element X(i,:) and Y(j,:) based on the covariance matrix of X: nancov(X)
%{
 so this is harder to interpret than mahal(), as elements of Y are not just compared to the "mahalanobis-centroid" based on X,
% but to each individual element of X
% so the purpose of this script is to see whether the average over the rows of E equals the values in d...
%}

F = mean(E); % now I averaged over the rows, which means, over all values of X, the reference matrix

mean(d)
mean(E(:)) % not equal to mean(d)
d-F' % not zero

% plot output
figure(1)
plot(d,'bo'), hold on
plot(mean(E),'ro')
legend('mahal()','avaraged over all x values pdist2()')
ylabel('Mahalanobis distance')

figure(2)
plot(d,'bo'), hold on
plot(E','ro')
plot(d,'bo','MarkerFaceColor','b')
xlabel('values in matrix Y (Yi) ... or ... pairwise comparison Yi. (Yi vs. all Xi values)')
ylabel('Mahalanobis distance')
legend('mahal()','pdist2()')

两者之间的一个直接区别是,在计算距离之前,从
Y
中的每个点减去
X
的样本平均值


尝试类似的方法,比如
E=pdist2(X,Y-mean(X),'mahalanobis',S)
看看这是否会给你带来与
mahal

相同的结果,我想有两种不同的方法来计算两组数据之间的马氏距离,就像你上面解释的那样: 1) 将样本集中的每个数据点与参考分布计算出的mu和sigma矩阵进行比较(尽管标记一个簇样本集和另一个参考分布可能是任意的),从而计算从每个点到参考分布的所谓马氏质心的距离。 2) 将矩阵Y中的每个数据点与矩阵X中的每个数据点进行比较,X为参考分布(mu和sigma仅从X计算)

距离的值会不同,但我猜当使用方法1或方法2时,簇之间的相异顺序会保持不变?实际上,我想知道,当将10个不同的簇与参考矩阵X进行比较时,或者相互比较时,使用方法1或方法2,差异的顺序是否会有所不同?而且,我无法想象一种方法是错误的,而另一种方法是错误的。虽然方法1在某些情况下看起来更直观,比如我的情况。

注意

mahal(X,Y)

相当于


pdist2(X,平均值(Y),'mahalanobis',cov(Y))。^2

为您添加了代码格式并删除了最后的rant。您在哪里读到的?我尝试了E=pdist2(X,Y-repmat(平均值(X),大小(Y,1),1),‘马氏体’;但这只会增加两两之间的距离,+-减去平均值的大小。因此,我现在得到了巨大的距离值,这是不正确的。我在各自函数的Matlab文档中读到了它。我在问题中添加了对您评论的回复。这篇文章太长了,我测试了很多聚类,这两种方法的有序性似乎都得到了保留,也保留了聚类之间的部分差异。