20

次の形式の古典的な線形回帰問題があります。

y = X b

ここyで、は応答ベクトル Xであり、は入力変数の行列bであり、は検索している適合パラメーターのベクトルです。

Pythonはb = numpy.linalg.lstsq( X , y )、この形式の問題を解決するために提供されています。

ただし、これを使用すると、のコンポーネントの値が非常に大きくなるか、非常に小さくなる傾向がありますb

同じフィットを実行したいのですがb、0から255の間の値を制限します。

オプションのように見えscipy.optimize.fmin_slsqp()ますが、興味のある問題のサイズに対しては非常に遅いことがわかりました(これXは、のようなもの3375 by 1500で、できればさらに大きいものです)。

  1. 制約付き最小二乗近似を実行するための他のPythonオプションはありますか?
  2. または、ラッソ回帰またはリッジ回帰、または大きなb係数値にペナルティを課す他の回帰方法を実行するためのPythonルーチンはありますか?
4

5 に答える 5

10

最近のscipyバージョンには、ソルバーが含まれています。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.lsq_linear.html#scipy.optimize.lsq_linear

于 2012-04-14T15:53:34.163 に答える
10

ラッソ回帰またはリッジ回帰が許容できるとおっしゃっています。これらおよび他の多くの制約付き線形モデルは、scikit-learnパッケージで利用できます。一般化線形モデルのセクションを確認してください。

通常、係数の制約には、ある種の正則化パラメーター(Cまたはアルファ)が含まれます---一部のモデル(CVで終わるモデル)は、交差検定を使用してこれらのパラメーターを自動的に設定できます。正の係数のみを使用するようにモデルをさらに制約することもできます---たとえば、ラッソモデルにはこれに対するオプションがあります。

于 2012-05-30T10:55:41.467 に答える
4

SOのscipy-optimize-leastsq-with-bound-constraintsは、 leastsq_bounds を提供します。これは 、0 <= x_i <=255などのscipyleastsq
+バインドされた制約 です 。 Marquardtアルゴリズム 、別名減衰最小二乗。
境界を実装するにはさまざまな方法があります。leastsq_boundsが最も簡単だと思います。)

于 2012-04-15T11:21:09.943 に答える
1

@conradleeが言うように、LassoとRidgeRegressionの実装はscikit-learnパッケージにあります。これらのリグレッサーは、フィットパラメーターを小さくしたり正にしたりするだけの場合に役立ちます。

ただし、適合パラメーターの境界として他の範囲を課したい場合は、同じパッケージを使用して独自の制約付きリグレッサーを作成できます。例については、この質問に対するDavidDaleの回答を参照してください。

于 2019-08-20T02:19:32.173 に答える
1

最近、Pythonでの線形回帰に関するチュートリアルをいくつか用意しました。これは、係数の制約を含むオプションの1つ(月光)です。

# Constrained Multiple Linear Regression
import numpy as np
nd = 100 # number of data sets
nc = 5   # number of inputs
x = np.random.rand(nd,nc)
y = np.random.rand(nd)

from gekko import GEKKO
m = GEKKO(remote=False); m.options.IMODE=2
c  = m.Array(m.FV,nc+1)
for ci in c:
    ci.STATUS=1
    ci.LOWER = -10
    ci.UPPER =  10
xd = m.Array(m.Param,nc)
for i in range(nc):
    xd[i].value = x[:,i]
yd = m.Param(y); yp = m.Var()
s =  m.sum([c[i]*xd[i] for i in range(nc)])
m.Equation(yp==s+c[-1])
m.Minimize((yd-yp)**2)
m.solve(disp=True)
a = [c[i].value[0] for i in range(nc+1)]
print('Solve time: ' + str(m.options.SOLVETIME))
print('Coefficients: ' + str(a))

非線形ソルバーIPOPTを使用して、ソルバーよりも優れた問題を解決しscipy.optimize.minimizeます。Pythonには他にも制約付き最適化手法があり、Python用の高品質の非線形計画法ソルバーはありますか?で説明されています。

于 2020-09-04T00:41:40.223 に答える