Si nous voulons rechercher les paramètres optimaux thêta pour un modèle de régression linéaire en utilisant l'équation normale avec:
thêta = inv (X ^ T * X) * X ^ T * y
une étape consiste à calculer inv (X ^ T * X). Par conséquent, numpy fournit np.linalg.inv () et np.linalg.pinv ()
Bien que cela conduise à des résultats différents:
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]]
La première sortie, c'est-à-dire la sortie de pinv est la bonne et recommandée en plus dans les documents numpy.linalg.pinv () . Mais pourquoi est-ce et où sont les différences/avantages/inconvénients entre inv () et pinv ().
Si le déterminant de la matrice est nul, il n'aura pas d'inverse et votre fonction inv ne fonctionnera pas. Cela se produit généralement si votre matrice est singulière.
Mais Pinv le fera. En effet, pinv renvoie l'inverse de votre matrice lorsqu'elle est disponible et le pseudo inverse lorsqu'elle ne l'est pas.
Les différents résultats des fonctions sont dus à des erreurs d'arrondi dans l'arithmétique à virgule flottante
Vous pouvez en savoir plus sur le fonctionnement du pseudo-inverse ici
inv
et pinv
sont utilisés pour calculer l'inverse (pseudo) comme une matrice autonome. Ne pas les utiliser réellement dans les calculs.
Pour de telles solutions de système linéaire, l'outil approprié à utiliser est numpy.linalg.lstsq
(ou de scipy) si vous avez une matrice de coefficients non inversible ou numpy.linalg.solve
(ou de scipy) pour les matrices inversibles.