ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

多次元尺度構成法

多次元尺度構成法の紹介

データの可視化において最も重要な目標の 1 つは、点が互いにどれだけ近くにあるか、あるいは、遠くにあるかという感覚を得ることです。時には、散布図によりこれを行うことができます。しかし、解析によっては、ユーザーがもつデータは、点の形にはなっておらず、事例、観測、問題間の類似度や非類似度のペアの形になっていることもあります。プロットする点がありません。

データがペア間の距離ではなく、点の形をしていても、これらのデータの散布図は有効ではないでしょう。データの種類によっては、2 点がどれだけ "近い" かを測る適切な方法は、そのユークリッド距離ではないでしょう。生のデータの散布図がユークリッド距離の比較を容易にする一方、それらは、たとえば、市街地距離、あるいは、より一般的な非類似度など、点間の他の種類の距離を比較する場合、必ずしも有効ではありません。また、変数が多い場合、データが小さい数の次元数で表されていないと、距離を可視化することが非常に難しくなります。通常、次元を減らす何らかの並べ替えが必要です。

多次元尺度構成法 (MDS) はこれらの問題すべてに取り組む 1 組の方法です。MDS は、多くの種類の距離または非類似度の尺度について互いにどれほど近い点であるかを可視化し、データを低次元で表現することができます。MDS は、生データを必要としませんが、ペア間の距離または非類似度行列のみを必要とします。

古典的多次元尺度構成法

古典的多次元尺度構成法の紹介

この例では、cmdscale を使用して古典的 (計量) 多次元尺度構成法 (別名「主座標分析」) を実施する方法を示します。

cmdscale は入力として点間の距離の行列をとり、点の構成を作成します。理想的に、これらの点は、2 次元あるいは 3 次元にあり、それらの間のユークリッド距離はオリジナルの距離行列を再び生成します。このようにして、cmdscale によって作成された点の散布図は、オリジナルの距離の視覚的な表現を提供します。

非常に単純な例として、点間の距離だけから、点の集合を復元することができます。最初に、4 番目の座標に小さい成分をもつ 4 次元の点を作成し、それらの点を距離に変換します。

rng('default');  % For reproducibility
X = [normrnd(0,1,10,3),normrnd(0,.1,10,1)];
D = pdist(X,'euclidean');

次に、cmdscale を使用して、それらの点間の距離の配置を見つけます。cmdscale は、正方行列、あるいは、この例のように、pdist により生成された上三角形のベクトルとして距離を受け取ります。

[Y,eigvals] = cmdscale(D);

cmdscale は、2 つの出力を生成します。最初の出力、Y は、再構成された点を含む行列です。2 番目の出力 eigvals は、"内積行列" と呼ばれることもある並べ替えされた固有値を含むベクトルであり、これは最も簡単な場合、Y*Y' に等しくなります。これら固有値の相対的な大きさは、再構成された点をもつオリジナルの距離行列 D を再生成する Y の対応する列の相対的な寄与を示します。

format short g
[eigvals eigvals/max(abs(eigvals))]
ans =

        35.41            1
       11.158      0.31511
       1.6894      0.04771
       0.1436    0.0040553
   7.5802e-15   2.1407e-16
    6.299e-15   1.7789e-16
   2.1747e-15   6.1415e-17
  -4.8934e-17  -1.3819e-18
  -5.9631e-16   -1.684e-17
  -2.8339e-15  -8.0032e-17

eigvals が正と (丸め誤差内の) 零の固有値のみを含む場合、正の固有値に相当する Y の列は、D の正確な再構成を提供します。たとえば、pdist を使用して計算された、その点間のユークリッド距離、D の値に (丸め誤差内で) 等しいという意味で、

maxerr4 = max(abs(D - pdist(Y)))   % Exact reconstruction
maxerr4 =

   5.9952e-15

eigvals の固有値の 2 つまたは 3 つが残りのものよりもはるかに大きい場合、Y の対応する列に基づく距離行列は、オリジナルの距離行列 D をほぼ再構成します。この意味で、これらの列は、適当にデータを記述する低次元の表現を形成します。しかし、適切な低次元の再構成を見つけることは、必ずしも可能ではありません。

maxerr3 = max(abs(D - pdist(Y(:,1:3))))  % Good reconstruction in 3D
maxerr2 = max(abs(D - pdist(Y(:,1:2))))  % Poor reconstruction in 2D
maxerr3 =

     0.043142


maxerr2 =

      0.98315

3 次元における再構成は、D を非常によく再生しますが、2 次元における再構成は、D の最大値と同じ大きさの次数をもつ誤差をもちます。

max(max(D))
ans =

       5.8974

eigvals は、負の固有値を含むことがありますが、これは、D の距離は正確には再生することができないことを示します。つまり、点間のユークリッド距離 が D により与えられるような点の配置がないこともあります。大きさにおいて、負の最大固有値が、正の最大固有値に比較して小さい場合、cmdscale により出力される構成は、うまく D を再生します。

例: 多次元尺度構成法

この例では、cmdscale を使用して、米国の 10 都市間の距離を基づく地図を作成する方法を示します。

最初に、距離行列を作成し、cmdscale に渡します。この例では、D は、完全な距離行列です。すなわち、これは、対称な正方行列であり、非対角要素が正で、対角要素はゼロです。

cities = ...
{'Atl','Chi','Den','Hou','LA','Mia','NYC','SF','Sea','WDC'};
D = [    0  587 1212  701 1936  604  748 2139 2182   543;
       587    0  920  940 1745 1188  713 1858 1737   597;
      1212  920    0  879  831 1726 1631  949 1021  1494;
       701  940  879    0 1374  968 1420 1645 1891  1220;
      1936 1745  831 1374    0 2339 2451  347  959  2300;
       604 1188 1726  968 2339    0 1092 2594 2734   923;
       748  713 1631 1420 2451 1092    0 2571 2408   205;
      2139 1858  949 1645  347 2594 2571    0  678  2442;
      2182 1737 1021 1891  959 2734 2408  678    0  2329;
       543  597 1494 1220 2300  923  205 2442 2329     0];
[Y,eigvals] = cmdscale(D);

次に、cmdscale によって返された固有値を見てください。これらのうちのいくつかは負で、オリジナルの距離がユークリッドではないことを示します。これは、地球の曲率のためです。

format short g
[eigvals eigvals/max(abs(eigvals))]
ans =

   9.5821e+06            1
   1.6868e+06      0.17604
       8157.3    0.0008513
       1432.9   0.00014954
       508.67   5.3085e-05
       25.143    2.624e-06
   4.0575e-10   4.2344e-17
       -897.7  -9.3685e-05
      -5467.6   -0.0005706
       -35479   -0.0037026

しかし、この場合、2 つの最大の正の固有値は、大きさにおいて、残りの固有値よりはるかに大きいです。したがって、負の固有値があるにもかかわらず、Y の最初の 2 つの座標は D の合理的な再生に十分です。

Dtriu = D(find(tril(ones(10),-1)))';
maxrelerr = max(abs(Dtriu-pdist(Y(:,1:2))))./max(Dtriu)
maxrelerr =

    0.0075371

ここに、地図として再構成された都市の位置のプロットがあります。構成の方位は任意です。

plot(Y(:,1),Y(:,2),'.')
text(Y(:,1)+25,Y(:,2),cities)
xlabel('Miles')
ylabel('Miles')

非古典的多次元尺度構成法

関数 mdscale は、非古典的多次元尺度構成法を実行します。cmdcale と同様に、"位置" が存在しない非類似度データを可視化するか、その次元を低次元化させることによって高次元のデータを可視化するには mdscale を使用します。両方の関数は、入力として非類似度行列を取り、点の配置を作成します。しかし、mdscale は、欠損データと重みを取り、さまざまな基準の選択を提供して配置を作成します。

たとえば、シリアルのデータは、朝食のシリアルについて 10 個の変数を含みます。mdscale を使用して、これらのデータを 2 次元で可視化できます。まず、データを読み込みます。念のため、この例では、22 個のサブセットの観測からなることを確認します。

load cereal.mat
X = [Calories Protein Fat Sodium Fiber ... 
    Carbo Sugars Shelf Potass Vitamins];
% Take a subset from a single manufacturer
mfg1 = strcmp('G',cellstr(Mfg));
X = X(mfg1,:);
size(X)
ans =
    22 10

次に、pdist を使用して 10 次元のデータを非類似度に変換します。pdist からの出力は、上三角に (23*22/2) 個の要素から成る対称非類似度行列であり、それらがベクトルとして格納されます。

dissimilarities = pdist(zscore(X),'cityblock');
size(dissimilarities)
ans =
     1   231

この例のコードは、最初にシリアルのデータを標準化してから非類似度として市街地距離を利用します。非類似度への変換の選択は、目的に依存します。ここでは簡単な例として選択しています。目的によっては、元のデータが既に非類似度の形式である場合があります。

次に、mdscale を使用して計量的 MDS を実行します。cmdscale とは違って、適切な次元数と、出力の配置を構成するために使用するメソッドを指定しなければなりません。この例の場合、2 次元を使用します。計量的 STRESS の基準は、出力を計算するための一般的な方法です。他の選択肢については、オンライン ドキュメンテーションの mdscale のリファレンス ページを参照してください。mdscale からの 2 番目の出力は、出力の配置の評価に使われた基準の値です。これは、出力の配置の点間の距離が、オリジナルの入力の非類似度をどれほど適切に近似するかを測ります。

[Y,stress] =... 
mdscale(dissimilarities,2,'criterion','metricstress');
stress
stress =
    0.1856

mdscale からの出力プロットは、オリジナルの 10 次元のデータを 2 次元で表し、関数 gname を使用して選択した点のラベルを表示します。

plot(Y(:,1),Y(:,2),'o','LineWidth',2);
gname(Name(mfg1))

非計量多次元尺度構成法

計量多次元尺度構成法は、その点間の距離が与えられた非類似度を近似するように点の配置を作成します。これは厳しすぎる要求で、非計量多次元尺度構成法はこれを少し緩和するように設計されています。非計量多次元尺度構成法では、非類似度自身を近似せずに、非類似度を、非線形であっても単調になるように変換してから近似します。単調性があるので、出力のプロットの距離が大きい (小さい) ほど、より大きい (小さい) 類似度に相当します。ただし、非線形性は mdscale が非類似度の順序の保存のみを試みることを意味します。したがって、異なる尺度での、距離の縮小または拡大があるかもしれません。

mdscale を使用すると、計量多次元尺度構成法とほぼ同じ方法で非計量 MDSを実行します。非計量的 STRESS 基準は、出力を計算するための一般的な方法です。他の選択肢については、オンライン ドキュメンテーションの mdscale のリファレンス ページを参照してください。計量多次元尺度構成法と同様に、mdscale からの 2 番目の出力は、出力の配置に対して評価された、その基準の値です。ただし、非計量多次元尺度構成法の場合、出力の配置の点間の距離 が非類似度をどれほどよく近似するかを測定します。3 番目の出力には、非類似度が返されます。これらは、オリジナルの非類似度を変換した値です。

[Y,stress,disparities] = ... 
mdscale(dissimilarities,2,'criterion','stress');
stress
stress =
    0.1562

非類似度を基に出力の配置の近似を確認し、その相違を理解するには、Shepard プロットを作成するのが役立ちます。

distances = pdist(Y);
[dum,ord] = sortrows([disparities(:) dissimilarities(:)]);
plot(dissimilarities,distances,'bo', ...
     dissimilarities(ord),disparities(ord),'r.-', ...
     [0 25],[0 25],'k-')
xlabel('Dissimilarities')
ylabel('Distances/Disparities')
legend({'Distances' 'Disparities' '1:1 Line'},...
       'Location','NorthWest');

このプロットは、mdscale が、点間の距離が非類似度を近似する 2 次元の点の配置を見つけたことを示します。これは、オリジナルの非類似度の非線形変換と言えます。この不一致が非類似度の関数として凹形状であることは、近似によって、対応する非類似度に比べて点間の間隔が少し縮められる傾向にあることを示します。これは、実際に許容できるものです。

mdscale は、反復アルゴリズムを使用して出力の配置を見つけます。その結果は、しばしば出発点に依存することがあります。既定の設定では、mdscale は、cmdscale を使用して初期の配置を構成し、この選択によって大域的に最適解になることがあります。しかし、mdscale は、基準が局所的に最小となる配置で停止することもあります。このような場合は、別の開始点を使って mdscale を複数回実行することになります。'start''replicates' パラメーターを使って、これを行うことができます。以下のコードは、MDS を 5 回繰り返し実行します。それぞれは、別々に無作為に選択された初期配置で始めます。この基準値は、各繰り返しに対して表示されます。このとき mdscale は、最適近似をもつ配置を返します。

opts = statset('Display','final');
[Y,stress] =... 
mdscale(dissimilarities,2,'criterion','stress',... 
'start','random','replicates',5,'Options',opts);

35 iterations, Final stress criterion = 0.156209
31 iterations, Final stress criterion = 0.156209
48 iterations, Final stress criterion = 0.171209
33 iterations, Final stress criterion = 0.175341
32 iterations, Final stress criterion = 0.185881

mdscale は、いくつかの異なる局所解を探すことに注意してください。これらのいくつかは、cmdscale の開始点として見つけられた解ほど低い stress の値をもちません。

この情報は役に立ちましたか?