2013-11-12 3 views
2

У меня есть две матрицы X и Y. Оба представляют собой несколько позиций в 3D-пространстве. X - матрица 50 * 3, Y - матрица 60 * 3.Расстояние Махаланобиса в матрице: pdist2() против mahal()

Мой вопрос: почему применение средней функции по выходу pdist2() в сочетании с «Махаланобисом» не дает результата, полученного с помощью mahal()?

Подробнее о том, что я пытаюсь сделать ниже, а также код, который я использовал для проверки этого.

Предположим, что 60 наблюдений в матрице Y получены после некоторой экспериментальной манипуляции. Я пытаюсь оценить, оказало ли это манипулирование существенное влияние на позиции, наблюдаемые в Y. Поэтому я использовал pdist2(X,X,'Mahalanobis') для сравнения X и X для получения базовой линии, а затем от X до Y (с X эталонная матрица: pdist2(X,Y,'Mahalanobis')) , и я построил оба распределения, чтобы посмотреть на перекрытие.

Впоследствии я вычислил среднее расстояние Махаланобиса как для распределения, так и для 95% ДИ, и провел t-тест и тест Колмогорова-Смирнова, чтобы оценить, была ли разница между распределениями значительной. Это показалось мне очень интуитивным, однако при тестировании с помощью mahal() я получаю разные значения, хотя эталонная матрица одинакова. Я не понимаю, в чем разница между двумя способами вычисления расстояния махаланобиса.

комментарий, который слишком долго @ 3lectrologos: Вы имеете в виду это: D (I) = (Y (I,:) - мю) инв (SIGMA) (Y (I,:) - му) '? Это просто формула для вычисления махаланобиса, поэтому она должна быть одинаковой для функций pdist2() и mahal(). Я думаю, что mu является скаляром, а SIGMA - матрицей, основанной на эталонном распределении в целом как в pdist2(), так и в 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()') 
+0

Добавлено форматирование кода и удалить окончательный декламация для вас. –

+0

Как вы это делаете? – babipsylon

ответ

1

Непосредственное различие между ними состоит в том, что mahal вычитает среднее значение выборки X из каждой точки в Y перед вычислением расстояния.

Попробуйте что-нибудь наподобие E = pdist2(X,Y-mean(X),'mahalanobis',S);, чтобы узнать, дает ли тот же результат, что и mahal.

+0

Где вы это читали? Я попробовал E = pdist2 (X, Y-repmat (среднее (X), размер (Y, 1), 1), 'mahalanobis', S); , но это только увеличило попарные расстояния с + - размером среднего вычитаемого .... Теперь я получаю огромные значения расстояния, что неверно .... – babipsylon

+0

Я прочитал его в документации Matlab о соответствующих функциях. – 3lectrologos

+0

Я добавил ответ на ваш комментарий в вопросе. Это было слишком долго, чтобы публиковать здесь. – babipsylon

0

Ну, я думаю, есть два разных способа расчета расстояния махаланобиса между двумя кластерами данных, как вы объясните выше: 1) вы сравниваете каждую точку данных с вашим образцом, установленным с матрицами mu и sigma, вычисленными из вашего ссылочного распределения (хотя обозначение одного набора образцов кластера и другого ссылочного распределения может быть произвольным), тем самым вычисляя расстояние от каждой точки до этого так называемого централизованного центра тяжести ссылочного распределения. 2) вы сопоставляете каждое значение с матрицей Y с каждой точкой отсчета матрицы X, при этом X ссылочное распределение (mu и сигма рассчитываются только от X)

Значения расстояний будут разными, но я думаю, что порядковый порядок несходства между кластерами сохраняется при использовании метода 1 или 2? Я на самом деле интересно, когда сравнение 10 различных кластеров с эталонной матрицей X, или друг с другом, если порядок несходства будет отличаться, используя метод 1 или метод 2? Кроме того, я не могу представить ситуацию, когда один метод был бы неправильным, а другой - нет. Хотя метод 1 кажется более интуитивным в некоторых ситуациях, например, у меня.

+0

Я тестировал для многих кластеров, и свойство ординалов кажется сохраненным по обоим методам, а также часть величины разности между кластерами. – babipsylon

1

Обратите внимание, что

mahal(X,Y)

эквивалентно

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

Смежные вопросы