3

27 変数の 2 つの行ベクトル間のマハラノビス距離mahalを計算するために適用しようとしました。つまり、とは 2 つのベクトルです。ただし、エラーが発生します。 mahal(X, Y)XY

The number of rows of X must exceed the number of columns.

数分の調査の後、このように使用できないことがわかりましたが、その理由はまだわかりません. 説明してもらえますか?

mahalまた、メソッドの例を以下に示します。

>> mahal([1.55 5 32],[5.76 43 34; 6.7 32 5; 3 3 5; 34 12 6;])

ans =    
   11.1706

この場合、MATLABがどのように答えを計算するかを誰かが明確にすることができますか?

編集:
マハラノビス距離を計算するこのコードを見つけました:

S = cov(X);
mu = mean(X);
d = (Y-mu)*inv(S)*(Y-mu)'
d = ((Y-mu)/S)*(Y-mu)'; % <-- Mathworks prefers this way

でテストしたところ[1.55 5 32]、関数 (11.1706)[5.76 43 34; 6.7 32 5; 3 3 5; 34 12 6;]を使用した場合と同じ結果が得られ、mahal27 変数の 2 つのベクトル間の距離を計算しようとしたところ、うまくいきました。あなたはそれについてどう思いますか?mahal関数が必要なことを実行できないため、このソリューションを当てにすることはできますか?

4

1 に答える 1

4

mahal(X,Y)...このエラーが発生しました:
"The number of rows of X must exceed the number of columns."

ドキュメントには、Y列よりも多くの行が必要であると記載されています (ドキュメントでは、最初の入力パラメーターではなく、2 番目の入力パラメーターとして示されていることにも注意してください) X。これは、フィードしている2 番目の配列mahalに列よりも多くの行があることを意味します。

なぜそんなに重要なのですか?この制限の目的はmahal、マハラノビス距離の計算に使用される相関行列を作成するのに十分なデータが にあることを確認することです。十分な情報がない場合、出力はガベージになります。

あなたの場合、入力配列は 2 つの入力ベクトルで、それぞれに 27 個の要素があります。27 の要素は異なる観測に対応していますか、それとも 27 の変数の 1 つの観測ですか? 前者の場合は、両方のベクトルが列ベクトルであることを確認してください。

mahal(X(:), Y(:))

そして、あなたは行ってもいいです。各ベクトルに含まれる観測値が 1 つだけの場合、共分散行列の推定は完全に不正確になります。繰り返しますが、入力の行は観測値でなければなりません!

この場合、MATLABがどのように答えを計算したかを誰かが明確にすることができますか?

2 つのベクトルxyの間のマハラノビス距離は次のとおりです。ここで、Sはそれらの共分散行列です。dM(x, y) = sqrt((x-y)TS-1(x-y))

MATLAB 1 mahal(Y,X)では、次の方法で効率的に実装されます。

m = mean(X,1);
M = m(ones(ry,1),:);
C = X - m(ones(rx,1),:);
[Q,R] = qr(C,0);

ri = R'\(Y-M)';
d = sum(ri.*ri,1)'*(rx-1);

次の方法で確認できます。

type mahal

MATLAB は平方単位でマハラノビス距離を計算することに注意してください。したがって、この例では、マハラノビス距離は実際には 11.1706 の平方根、つまり3.3422 です。

mahal関数が必要なことを実行できないため、この [私の] ソリューションを当てにできますか?

すべてを正しく行っているため、安全に使用できます。そうは言っても、MATLAB は正当な理由 (上記) で 2 番目の入力配列の次元を制限していることに注意してください。

X行が 1 つしかない場合、cov自動的に列ベクトルに変換されます。これは、各値が異なる観測として扱われることを意味します。結果Sは不正確になります(ガベージではない場合)。


1 MATLAB リリース バージョン R2007b を確認。

于 2013-05-11T23:04:05.603 に答える