144

多重回帰を行う Python ライブラリが見つからないようです。私が見つけたのは単純な回帰だけです。従属変数 (y) をいくつかの独立変数 (x1、x2、x3 など) に対して回帰する必要があります。

たとえば、次のデータを使用します。

print 'y        x1      x2       x3       x4      x5     x6       x7'
for t in texts:
    print "{:>7.1f}{:>10.2f}{:>9.2f}{:>9.2f}{:>10.2f}{:>7.2f}{:>7.2f}{:>9.2f}" /
   .format(t.y,t.x1,t.x2,t.x3,t.x4,t.x5,t.x6,t.x7)

(上記の出力:)

      y        x1       x2       x3        x4     x5     x6       x7
   -6.0     -4.95    -5.87    -0.76     14.73   4.02   0.20     0.45
   -5.0     -4.55    -4.52    -0.71     13.74   4.47   0.16     0.50
  -10.0    -10.96   -11.64    -0.98     15.49   4.18   0.19     0.53
   -5.0     -1.08    -3.36     0.75     24.72   4.96   0.16     0.60
   -8.0     -6.52    -7.45    -0.86     16.59   4.29   0.10     0.48
   -3.0     -0.81    -2.36    -0.50     22.44   4.81   0.15     0.53
   -6.0     -7.01    -7.33    -0.33     13.93   4.32   0.21     0.50
   -8.0     -4.46    -7.65    -0.94     11.40   4.43   0.16     0.49
   -8.0    -11.54   -10.03    -1.03     18.18   4.28   0.21     0.55

線形回帰式を取得するには、これらを Python でどのように回帰させますか。

Y = a1x1 + a2x2 + a3x3 + a4x4 + a5x5 + a6x6 + +a7x7 + c

4

15 に答える 15

111

sklearn.linear_model.LinearRegressionそれをします:

from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit([[getattr(t, 'x%d' % i) for i in range(1, 8)] for t in texts],
        [t.y for t in texts])

次にclf.coef_、回帰係数があります。

sklearn.linear_model回帰に対してさまざまな種類の正則化を行うための同様のインターフェースもあります。

于 2012-07-13T22:41:50.063 に答える
64

ここに私が作成した小さな回避策があります。Rで確認したところ、正しく動作しました。

import numpy as np
import statsmodels.api as sm

y = [1,2,3,4,3,4,5,4,5,5,4,5,4,5,4,5,6,5,4,5,4,3,4]

x = [
     [4,2,3,4,5,4,5,6,7,4,8,9,8,8,6,6,5,5,5,5,5,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,7,7,7,7,7,6,5],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,7,7,7,7,7,6,6,4,4,4]
     ]

def reg_m(y, x):
    ones = np.ones(len(x[0]))
    X = sm.add_constant(np.column_stack((x[0], ones)))
    for ele in x[1:]:
        X = sm.add_constant(np.column_stack((ele, X)))
    results = sm.OLS(y, X).fit()
    return results

結果:

print reg_m(y, x).summary()

出力:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.535
Model:                            OLS   Adj. R-squared:                  0.461
Method:                 Least Squares   F-statistic:                     7.281
Date:                Tue, 19 Feb 2013   Prob (F-statistic):            0.00191
Time:                        21:51:28   Log-Likelihood:                -26.025
No. Observations:                  23   AIC:                             60.05
Df Residuals:                      19   BIC:                             64.59
Df Model:                           3                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1             0.2424      0.139      1.739      0.098        -0.049     0.534
x2             0.2360      0.149      1.587      0.129        -0.075     0.547
x3            -0.0618      0.145     -0.427      0.674        -0.365     0.241
const          1.5704      0.633      2.481      0.023         0.245     2.895

==============================================================================
Omnibus:                        6.904   Durbin-Watson:                   1.905
Prob(Omnibus):                  0.032   Jarque-Bera (JB):                4.708
Skew:                          -0.849   Prob(JB):                       0.0950
Kurtosis:                       4.426   Cond. No.                         38.6

pandasこの回答で示されているように、OLS を実行する便利な方法を提供します。

Pandas Data Frame で OLS 回帰を実行する

于 2013-02-20T02:53:40.180 に答える
55

明確にするために、あなたが示した例は、多変量線形回帰ではなく、多重線形回帰です。違い:

単一のスカラー予測変数 x と単一のスカラー応答変数 y の非常に単純なケースは、単純線形回帰として知られています。多重および/またはベクトル値の予測変数 (大文字の X で示される) への拡張は、多重線形回帰とも呼ばれ、多変数線形回帰とも呼ばれます。ほぼすべての実世界の回帰モデルには複数の予測子が含まれており、線形回帰の基本的な説明は、多くの場合、重回帰モデルの用語で表現されます。ただし、これらの場合、応答変数 y は依然としてスカラーであることに注意してください。多変量線形回帰という別の用語は、y がベクトルの場合を指します。つまり、一般的な線形回帰と同じです。

要するに:

  • 多重線形回帰: 応答 y はスカラーです。
  • 多変量線形回帰: 応答 y はベクトルです。

(別の情報源。)

于 2015-10-28T02:02:22.493 に答える
29

numpy.linalg.lstsqを使用できます:

import numpy as np

y = np.array([-6, -5, -10, -5, -8, -3, -6, -8, -8])
X = np.array(
    [
        [-4.95, -4.55, -10.96, -1.08, -6.52, -0.81, -7.01, -4.46, -11.54],
        [-5.87, -4.52, -11.64, -3.36, -7.45, -2.36, -7.33, -7.65, -10.03],
        [-0.76, -0.71, -0.98, 0.75, -0.86, -0.50, -0.33, -0.94, -1.03],
        [14.73, 13.74, 15.49, 24.72, 16.59, 22.44, 13.93, 11.40, 18.18],
        [4.02, 4.47, 4.18, 4.96, 4.29, 4.81, 4.32, 4.43, 4.28],
        [0.20, 0.16, 0.19, 0.16, 0.10, 0.15, 0.21, 0.16, 0.21],
        [0.45, 0.50, 0.53, 0.60, 0.48, 0.53, 0.50, 0.49, 0.55],
    ]
)
X = X.T  # transpose so input vectors are along the rows
X = np.c_[X, np.ones(X.shape[0])]  # add bias term
beta_hat = np.linalg.lstsq(X, y, rcond=None)[0]
print(beta_hat)

結果:

[ -0.49104607   0.83271938   0.0860167    0.1326091    6.85681762  22.98163883 -41.08437805 -19.08085066]

推定出力は次の方法で確認できます。

print(np.dot(X,beta_hat))

結果:

[ -5.97751163,  -5.06465759, -10.16873217,  -4.96959788,  -7.96356915,  -3.06176313,  -6.01818435,  -7.90878145,  -7.86720264]
于 2014-11-13T21:01:59.500 に答える
10

dfデータを pandas データフレーム ( ) に変換したら、

import statsmodels.formula.api as smf
lm = smf.ols(formula='y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7', data=df).fit()
print(lm.params)

切片項はデフォルトで含まれています。

その他の例については、このノートブックを参照してください。

于 2015-09-11T15:55:55.040 に答える
3

numpy.linalg.lstsqを使用できます

于 2012-07-14T07:25:34.580 に答える
1

以下の関数を使用して、DataFrame に渡すことができます。

def linear(x, y=None, show=True):
    """
    @param x: pd.DataFrame
    @param y: pd.DataFrame or pd.Series or None
              if None, then use last column of x as y
    @param show: if show regression summary
    """
    import statsmodels.api as sm

    xy = sm.add_constant(x if y is None else pd.concat([x, y], axis=1))
    res = sm.OLS(xy.ix[:, -1], xy.ix[:, :-1], missing='drop').fit()

    if show: print res.summary()
    return res
于 2015-08-26T09:37:25.897 に答える