我有一个12x202矩阵(有202个特征的12个实例)。我想计算每12个实例之间的马氏距离,但似乎列的数量不能比实例(行)的数量大得多。(我计算12x11矩阵的距离没有问题,但超过11个特征会在MATLAB中使用linkage(X,'ward','mahalanobis');
或mahal(X,X);
或pdist2(X,X,'mahalanobis');
导致错误)
如果你在matlab文档中查看mahal函数,它说:
X和Y的列数必须相同,但可以不同行数。X的行数必须大于列数
我不太擅长统计,所以我不确定为什么这个条件很重要,但我想这是出于效率的原因,而且12个指标太少了,所以考虑更多的指标。
你可以自己计算mahalabanis距离,在同一文档中很容易得到公式,并且给出了一个更好的计算mahalabanis距离的例子:
马氏距离又称二次距离。它的措施两组物体的分离。假设我们有两组,马氏距离由
给出
对于不同的组也是如此,而不是对于相同的组。
在任何情况下你都可以这样写:
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;
我希望这对你有帮助