0

このコードのチャンクはhttp://rosettacode.org/wiki/Multiple_regression#Pythonで見つかりました。これは、Pythonで重回帰を実行します。次のコードでbを印刷すると、x1、...、xNの係数が得られます。ただし、このコードは原点を通る線に適合しています(つまり、結果のモデルには定数が含まれていません)。

私がやりたいのは、原点を通る線をフィットさせたくないことを除いて、まったく同じことです。結果のモデルに定数が必要です。

これを行うための小さな変更であるかどうか、何か考えはありますか?私はPythonでの重回帰に関する多数のドキュメントを検索して見つけましたが、それらは長く、必要なものに対して過度に複雑です。このコードは完璧に機能しますが、原点ではなく切片に適合するモデルが必要な場合を除きます。

import numpy as np
from numpy.random import random

n=100
k=10
y = np.mat(random((1,n)))
X = np.mat(random((k,n)))

b = y * X.T * np.linalg.inv(X*X.T)
print(b)

どんな助けでもいただければ幸いです。ありがとう。

4

3 に答える 3

5

Xにすべて1の行を追加するだけで済みます。

于 2012-09-23T19:26:21.630 に答える
2

おそらく、より安定したアプローチは、とにかく最小二乗アルゴリズムを使用することです。これは、数行でnumpyで実行することもできます。numpy.linalg.lstsqに関するドキュメントをお読みください。

ここに実装例があります:

http://glowingpython.blogspot.de/2012/03/linear-regression-with-numpy.html

于 2012-09-23T19:11:57.897 に答える
1

あなたが書いたb = y * X.T * np.linalg.inv(X * X.T)のは、正規方程式の解であり、これは最小二乗法を多重線形モデルに適合させます。swangの応答は正しい(およびEMSの詳細)--- Xに1の行を追加する必要があります。理論的に機能する理由を知りたい場合は、次のb_iようなものを見つけていることに注意してください。

y_j = sum_i b_i x_{ij}.

1の行を追加するとx_{(k+1)j} = 1、すべてjに設定されます。つまり、次のようなb_iが見つかります。

y_j = (sum_i b_i x_{ij}) + b_{k+1}

k+1st項は常に1にx_ij等しいからです。したがって、b_{k+1}は切片の項です。

于 2012-09-24T02:42:39.763 に答える