Расстояние Махаланобиса для матрицы (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;
Я надеюсь, что это поможет вам