次の正規方程式を使用して線形回帰モデルの最適なパラメーターシータを検索する場合:
theta = inv(X ^ T * X)* X ^ T * y
1つのステップは、inv(X ^ T * X)を計算することです。したがって、numpyは np.linalg.inv() および np.linalg.pinv() を提供します
これは異なる結果につながりますが:
X=np.matrix([[1,2104,5,1,45],[1,1416,3,2,40],[1,1534,3,2,30],[1,852,2,1,36]])
y=np.matrix([[460],[232],[315],[178]])
XT=X.T
XTX=XT@X
pinv=np.linalg.pinv(XTX)
theta_pinv=(pinv@XT)@y
print(theta_pinv)
[[188.40031946]
[ 0.3866255 ]
[-56.13824955]
[-92.9672536 ]
[ -3.73781915]]
inv=np.linalg.inv(XTX)
theta_inv=(inv@XT)@y
print(theta_inv)
[[-648.7890625 ]
[ 0.79418945]
[-110.09375 ]
[ -74.0703125 ]
[ -3.69091797]]
最初の出力、つまりpinvの出力は正しいものであり、さらに numpy.linalg.pinv() のドキュメントで推奨されています。しかし、なぜこれがあり、inv()とpinv()の違い/長所/短所はどこにありますか?.
行列式の行列式がゼロの場合、逆行列はなく、inv関数は機能しません。これは通常、行列が特異な場合に発生します。
しかし、pinvはそうします。これは、pinvが利用可能な場合は行列の逆行列を返し、利用できない場合は擬似逆行列を返すためです。
関数の異なる結果は、浮動小数点演算の丸め誤差によるものです
擬似逆関数の仕組みについて詳しく読むことができます here
inv
およびpinv
は、(擬似)逆行列をスタンドアロン行列として計算するために使用されます。実際に計算に使用しないでください。
このような線形システムソリューションの場合、使用する適切なツールは numpy.linalg.lstsq
(またはscipyから)非可逆係数行列または numpy.linalg.solve
(またはscipyから)可逆行列の場合。