web-dev-qa-db-ja.com

線形回帰で行列の逆行列を作成するために、numpy.linalg.pinv()がnumpy.linalg.inv()よりも優先される理由

次の正規方程式を使用して線形回帰モデルの最適なパラメーターシータを検索する場合:

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()の違い/長所/短所はどこにありますか?.

6
2Obe

行列式の行列式がゼロの場合、逆行列はなく、inv関数は機能しません。これは通常、行列が特異な場合に発生します。

しかし、pinvはそうします。これは、pinvが利用可能な場合は行列の逆行列を返し、利用できない場合は擬似逆行列を返すためです。

関数の異なる結果は、浮動小数点演算の丸め誤差によるものです

擬似逆関数の仕組みについて詳しく読むことができます here

9
Vedant Shetty

invおよびpinvは、(擬似)逆行列をスタンドアロン行列として計算するために使用されます。実際に計算に使用しないでください。

このような線形システムソリューションの場合、使用する適切なツールは numpy.linalg.lstsq (またはscipyから)非可逆係数行列または numpy.linalg.solve (またはscipyから)可逆行列の場合。

8
percusse