Расстояние Махаланобиса для матрицы (mxn) с m<< n

У меня есть матрица 12x202 (12 экземпляров, которые имеют 202 функции). Я хочу вычислить расстояние махаланобиса между каждыми 12 экземплярами, но кажется, что число столбцов не может быть очень большим, чем количество экземпляров (строк). (У меня не было проблем с вычислением расстояния для матрицы 12x11, но более 11 объектов вызовут ошибку в MATLAB при использовании любого linkage(X,'ward','mahalanobis'); или же mahal(X,X); или же pdist2(X,X,'mahalanobis');)

1 ответ

Решение

Если вы посмотрите в документации по MATLAB для функции mahal, она говорит:

X и Y должны иметь одинаковое количество столбцов, но могут иметь разное количество строк. X должен иметь больше строк, чем столбцов.

Я не совсем хорош в статистике, поэтому я не уверен, почему это условие важно, но я полагаю, что это из-за соображений эффективности, а также 12 показателей слишком мало, так что стоит подумать о том, чтобы иметь больше показателей.

То, что вы могли бы сделать, это вычислить расстояние махалабониса самостоятельно, легко получить формула в том же документе, а также пример, который дает там лучший расчет для расстояния махалабонуса:

Расстояние Махаланобиса также называют квадратичным расстоянием. Он измеряет разделение двух групп объектов. Предположим, у нас есть две группы со средними, а расстояние Махаланобиса определяется следующим

так же и для другой группы, а не для одной и той же.

В любом случае вы можете использовать это:

function MD = my_MahalanobisDistance(X, Y)

[nX, mX] = size(X);
[nY, mY] = size(Y);

n = nX + nY;

if(mX ~= mY)
    disp('Columns in X must be same as in Y')
else
    xDiff = mean(X) - mean(Y);
    cX = my_covariance(X);
    cY = my_covariance(Y);
    pC = nX/n*cX + nY/n*cY;          
    MD = sqrt(xDiff * inv(pC) * xDiff');
end

и для ковариации:

function C = my_covariance(X) 
[n,m] = size(X); 
Xc = X -repmat(mean(X),n,1); 
C = Xc'* Xc/n;

Я надеюсь, что это поможет вам

Другие вопросы по тегам