Main Content

nearcorr

フロベニウス距離を最小化することで最近相関行列を計算します。

R2019b 以降

説明

Y = nearcorr(A) は、フロベニウス距離を最小化することで、最近相関行列 Y を返します。

Y = nearcorr(___,Name,Value) では、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。

すべて折りたたむ

特定の半負定値行列について、フロベニウス ノルムの最近相関行列を求めます。

区間 [-1, 1] 内のすべての要素と単位対角をもつ NN 列の対称行列を指定します。

A =  [1.0000   0         0         0   -0.9360 
      0    1.0000   -0.5500   -0.3645   -0.5300 
      0   -0.5500    1.0000   -0.0351    0.0875 
      0   -0.3645   -0.0351    1.0000    0.4557 
     -0.9360   -0.5300    0.0875    0.4557    1.0000]; 

eigを使用して A の固有値を計算します。

eig(A)
ans = 5×1

   -0.1244
    0.3396
    1.0284
    1.4457
    2.3107

最小固有値は 0 より小さくなっています。これは、A が半正定値行列ではないことを示しています。

既定のニュートン アルゴリズムをもつ nearcorr を使用して、最近相関行列を計算します。

B = nearcorr(A)
B = 5×5

    1.0000    0.0372    0.0100   -0.0219   -0.8478
    0.0372    1.0000   -0.5449   -0.3757   -0.4849
    0.0100   -0.5449    1.0000   -0.0381    0.0996
   -0.0219   -0.3757   -0.0381    1.0000    0.4292
   -0.8478   -0.4849    0.0996    0.4292    1.0000

B の固有値を計算します。

eig(B)
ans = 5×1

    0.0000
    0.3266
    1.0146
    1.4113
    2.2475

固有値はすべて 0 以上です。これは、B が半正定値行列であることを意味しています。

nearcorr を使用する場合、名前と値のペアの引数 'method''projection' に設定することで、交代射影アルゴリズムを指定できます。

nearcorr(A,'method','projection') 
ans = 5×5

    1.0000    0.0372    0.0100   -0.0219   -0.8478
    0.0372    1.0000   -0.5449   -0.3757   -0.4849
    0.0100   -0.5449    1.0000   -0.0381    0.0996
   -0.0219   -0.3757   -0.0381    1.0000    0.4292
   -0.8478   -0.4849    0.0996    0.4292    1.0000

また、'Weights' の名前と値のペアの引数を指定することで、要素単位の重みを課すこともできます。要素単位の重みの詳細については、Weightsを参照してください。

W = [0.0000  1.0000  0.1000  0.1500  0.2500 
     1.0000  0.0000  0.0500  0.0250  0.1500 
     0.1000  0.0500  0.0000  0.2500  1 
     0.1500  0.0250  0.2500  0.0000  0.2500 
     0.2500  0.1500  1  0.2500  0.0000];
nearcorr(A,'Weights',W) 
ans = 5×5

    1.0000    0.0014    0.0287   -0.0222   -0.8777
    0.0014    1.0000   -0.4980   -0.7268   -0.4567
    0.0287   -0.4980    1.0000   -0.0358    0.0878
   -0.0222   -0.7268   -0.0358    1.0000    0.4465
   -0.8777   -0.4567    0.0878    0.4465    1.0000

さらに、'Weights' の名前と値のペアの引数を指定することで、N1 列のベクトル化された重みを課すこともできます。ベクトル化された重みの詳細については、Weightsを参照してください。

W = linspace(0.1,0.01,5)'
W = 5×1

    0.1000
    0.0775
    0.0550
    0.0325
    0.0100

C = nearcorr(A,'Weights', W) 
C = 5×5

    1.0000    0.0051    0.0021   -0.0056   -0.8490
    0.0051    1.0000   -0.5486   -0.3684   -0.4691
    0.0021   -0.5486    1.0000   -0.0367    0.1119
   -0.0056   -0.3684   -0.0367    1.0000    0.3890
   -0.8490   -0.4691    0.1119    0.3890    1.0000

C の固有値を計算します。

eig(C)
ans = 5×1

    0.0000
    0.3350
    1.0272
    1.4308
    2.2070

固有値はすべて 0 以上です。これは、C が半正定値行列であることを意味しています。

nearcorr を使用して、欠損値のある株の相関行列の半正定値行列を作成します。

株価に欠損値があると仮定します。

Stock_Missing = [59.875 42.734 47.938 60.359 NaN 69.625 61.500 62.125
                53.188 49.000 39.500 64.813 34.750 56.625 83.000 44.500
                55.750 50.000 38.938 62.875 30.188 43.375 NaN 29.938
                65.500 51.063 45.563 69.313 48.250 62.375 85.250 46.875
                69.938 47.000 52.313 71.016 37.500 59.359 61.188 48.219
                61.500 44.188 NaN 57.000 35.313 55.813 51.500 62.188
                59.230 48.210 62.190 61.390 54.310 70.170 61.750 91.080
                NaN 48.700 60.300 68.580 61.250 70.340 61.590 90.350
                52.900 52.690 54.230 61.670 68.170 NaN 57.870 88.640
                57.370 59.040 59.870 62.090 61.620 66.470 65.370 85.840];

corrを使用して相関行列を計算してから、eigを使用して相関行列が半正定値かどうか確認します。

A = corr(Stock_Missing, 'Rows','pairwise');
eig(A)
ans = 8×1

   -0.1300
   -0.0398
    0.0473
    0.2325
    0.6278
    1.6276
    1.7409
    3.8936

A0 より小さい固有値を持っています。これは、相関行列が半正定値ではないことを示しています。

この相関行列で nearcorr を使用して、すべての固有値が 0 以上である半正定値行列を生成します。

B = nearcorr(A);
eigenvalues = eig(B)
eigenvalues = 8×1

    0.0000
    0.0000
    0.0180
    0.2205
    0.5863
    1.6026
    1.7258
    3.8469

Copyright 2019 The MathWorks, Inc.

入力引数

すべて折りたたむ

入力相関行列。区間 [-1 1] 内のすべての要素と単位対角をもつ N 行 N 列の対称近似相関行列を指定します。A の入力は半正定値行列である場合と、そうでない場合があります。

例: A = [1.0000 0 0 0 -0.9360 0 1.0000 -0.5500 -0.3645 -0.5300 0 -0.5500 1.0000 -0.0351 0.0875 0 -0.3645 -0.0351 1.0000 0.4557 -0.9360 -0.5300 0.0875 0.4557 1.0000]

データ型: single | double

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: nearcorr(A,'Tolerance',1e-7,'MaxIterations',500,'Method','newton','Weights',weight_vector) は、フロベニウス距離を最小化することで、最近相関行列を返します。

アルゴリズムの終了許容誤差。'Tolerance' と正のスカラーから構成されるコンマ区切りのペアとして指定します。

例: 'Tolerance',1e-7

データ型: single | double

ソルバーの最大反復回数。'MaxIterations' と正の整数から構成されるコンマ区切りのペアとして指定します。

例: 'MaxIterations',500

データ型: single | double

最近相関行列の問題を解くメソッド。'Method' と次のテーブルのいずれかの値から構成されるコンマ区切りのペアとして指定します。

説明
'newton'

ニュートン アルゴリズムは二次収束アルゴリズムです。

'newton' メソッドを指定した場合、Weights には対称行列または N1 列のベクトルのいずれかを指定できます。

'projection'

交代射影アルゴリズムは、高精度かつ最高の線形で最近相関行列に収束できます。

'projection' メソッドを指定した場合、WeightsN1 列のベクトルでなければなりません。

例: 'Method','projection'

データ型: char | string

入力行列のエントリの信頼水準に関する重み。'Weights' と、対称行列または N1 列のベクトルのいずれかで構成されるコンマ区切りのペアとして指定します。

  • 対称行列 — 要素単位の重み付けを行うために、すべての要素が 0 以上である対称行列 W として Weights を指定した場合、最近相関行列 Y は (W ⚬ (A-Y)) のノルムを最小化することで計算されます。重みの値が大きいほど、A 内の対応する要素に適用される重要度が大きくなります。

  • N1 列のベクトル — 正の数値をもつ N1 列のベクトル w として Weights を指定した場合、最近相関行列 Y は (diag(w)0.5 × (A-Y) × diag(w)0.5) のノルムを最小化することで計算されます。

メモ

行列の重みは相関行列の個々のエントリに重みを適用します。非スパース行列を指定しなければなりませんが、どのエントリが一致するのがより重要であるかを制御できます。あるいは、ベクトルの重みはすべての列 (および対応する行) に重みを適用します。行列の重みと比較して、指定しなければならない重みは小さいですが、列全体 (および対応する行) が単一の重みで重み付けされます。

例: 'Weights',W

データ型: single | double

出力引数

すべて折りたたむ

入力 A に対する最近相関行列。半正定値行列として返されます。

参照

[1] Higham, N. J. "Computing the Nearest Correlation Matrix — A Problem from Finance." IMA Journal of Numerical Analysis. Vol. 22, Issue 3, 2002.

[2] Qi, H. and D. Sun. "An Augmented Lagrangian Dual Approach for the H-Weighted Nearest Correlation Matrix Problem." IMA Journal of Numerical Analysis. Vol. 31, Issue 2, 2011.

[3] Pang, J. S., D. Sun, and J. Sun. "Semismooth Homeomorphisms and Strong Stability of Semidefinite and Lorentz Complementarity Problems." Mathematics of Operation Research. Vol. 28, Number 1, 2003.

拡張機能

バージョン履歴

R2019b で導入