0

私の質問がかなり抽象的であることを前もってお詫びしますが、これは間接的にプログラミングアルゴリズムに関する質問であり、これについて疑問に思うプログラマーは私だけではないと思います。

これは、Octave での多変数の通常の最小二乗法 (OLS) 回帰アルゴリズムの実装に関するものです (また、MatLab でも同様であると思います)。私が知る限り、2 つの変数を 1 つの測定だけで線形回帰に入力した場合、結果 (つまり、係数) は数学的に決定されないはずです: 黒魔術を有効な前提として受け入れない限り、各変数が最終結果にどのように影響するか? より一般的なケースでは、結果の係数が意味をなすためには、測定値の数が少なくとも変数の数と等しくなければなりません (統計誤差などは言うまでもありません)。

しかし、Octave は喜んで結果を計算し、何の警告もありません。

octave:1> ols([1], [1, 1])
ans =

   0.50000
   0.50000

言い換えれば、私がこれを正しければ、方程式 1 = x + y が与えられた場合、Octave は喜んで x = y = 0.5 と結論付けます。

そのため、Octave はサタンと直接関係がないと (私としては) 仮定すると、ここに私の質問があります。

  1. 数学的基礎を誤解していますか? 言い換えれば、これはもしかしたら正当な結果なのだろうか?
  2. 私が正しければ、なぜ Octave はエラーを吐き出さないのですか? あるいは、少なくとも、私が分析するように頼んでいる完全に馬鹿げたデータに関して、非常に厳しい警告を出さないのですか?
4

3 に答える 3

1

あなたのシステムは単にフルランクではありません。ドキュメント によると、次のolsようなシステムを解決します

b = pinv(x)*y

または、あなたの場合、単に

b = pinv([1 1])

ans = 

    0.5000
    0.5000

ここpinvで はムーア・ペンローズ擬逆行列です。

于 2013-08-09T22:40:21.783 に答える
0

通常の最小二乗回帰は次のように表されます。

Ax = y

これは通常、疑似逆数を使用して直接解決されます。

x = inv(A'*A)*A'*y

また

x = pinv(A) * y

フルランク行列の場合、コレスキー分解R = chol(A'*A)を実行できます(A'*A) = R'R。これは次のように使用できます。

Ax = y
A'Ax = A'y
R'Rx = A'y
Rx = R'\(A'y)
x = R\(R'\(A'y))

mldivide最後のステップで、バックスラッシュ演算子 ( ) が三角行列を使用して単純な前後置換を実行することに注意してください。R

実際、それが Octave の実装方法です: http://hg.octave.org/octave/file/tip/scripts/statistics/base/ols.m#l110

反復法など、システムを解決する他の方法があります。

于 2013-08-09T23:26:30.810 に答える