古典的な線形 次の形式の回帰問題があります:
_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
_のようなもので、できればさらに大きくなります) 。
b
係数値にペナルティを課す他の回帰方法を実行するためのルーチンはありますか?最近のscipyバージョンには、ソルバーが含まれています。
ラッソ回帰またはリッジ回帰が許容できるとおっしゃっています。これらおよび他の多くの制約付き線形モデルは、 scikit-learn パッケージで利用できます。 一般化線形モデルのセクション を確認してください。
通常、係数の制約には、ある種の正則化パラメーター(Cまたはアルファ)が含まれます---一部のモデル(CVで終わるモデル)は、交差検定を使用してこれらのパラメーターを自動的に設定できます。正の係数のみを使用するようにモデルをさらに制約することもできます---たとえば、ラッソモデルにはこれに対するオプションがあります。
scipy-optimize-leastsq-with-bound-constraints on SOは、leastsq_bounds、つまり scipy lesssq + 0 <= x_i <= 255などのバインドされた制約。
(Scipyのleastsqは、広く使用されている Levenberg–Marquardtアルゴリズム のいくつかの実装の1つであるMINPACKをラップします。
境界を実装するにはさまざまな方法があります。 lesssq_boundsは私が最も簡単だと思います。)
@conradleeが言うように、LassoとRidge Regressionの実装は scikit-learn パッケージにあります。これらのリグレッサーは、適合パラメーターを小さくするか正にするだけの場合に役立ちます。
ただし、適合パラメーターの境界として他の範囲を課したい場合は、同じパッケージを使用して独自の制約付きリグレッサーを作成できます。例については、David Daleによる この質問 への回答を参照してください。