У меня есть две матрицы 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()')
Добавлено форматирование кода и удалить окончательный декламация для вас. –
Как вы это делаете? – babipsylon