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

时间:2013-11-12 15:58:08

标签: matlab

我有两个矩阵X和Y.两者都代表3D空间中的多个位置。 X是50 * 3矩阵,Y是60 * 3矩阵。

我的问题:为什么将平均函数应用于pdist2()的输出与'Mahalanobis'结合使用不能得到用mahal()获得的结果?

有关我在下面尝试做的更多细节,以及我用来测试它的代码。

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

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

评论太长@ 3lectrologos: 你的意思是这样的:d(I)=(Y(I,:) - mu) inv(SIGMA)(Y(I,:) - mu)'?这只是计算mahalanobis的公式,因此对于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()')

3 个答案:

答案 0 :(得分:1)

两者之间的一个直接差异是mahal在计算距离之前从X中的每个点减去Y的样本均值。

尝试E = pdist2(X,Y-mean(X),'mahalanobis',S);之类的内容,看看它是否能提供与mahal相同的结果。

答案 1 :(得分:1)

请注意

mahal(X,Y)

相当于

pdist2(X,mean(Y),'mahalanobis',cov(Y)).^2

答案 2 :(得分:0)

嗯,我猜有两种不同的方法可以计算两组数据之间的马哈拉诺比斯距离,如上所述: 1)您将样本集中的每个数据点与根据参考分布计算的mu和sigma矩阵进行比较(尽管标记一个样本集和另一个参考分布可能是任意的),从而计算从每个点到此所谓的马哈拉诺比斯的距离 - 参考分布的中心。 2)您将矩阵Y中的每个数据点与矩阵X的每个数据点进行比较,其中X为参考分布(mu和sigma仅从X计算)

距离的值会有所不同,但我猜使用方法1或2时,群集之间的相异性的序数顺序是否会被保留?我真的想知道在将10个不同的聚类与参考矩阵X或彼此进行比较时,如果不同的顺序使用方法1或方法2不同?另外,我无法想象一种方法会出错而另一种方法出错的情况。虽然方法1在某些情况下看起来更直观,比如我的。