Je suis en train de mettre en œuvre des moindres carrés:moindres carrés: Python
je: $ y = \ theta \ omega
$ La solution la moins carrée est \ omega = (\ theta^{T} \ thêta)^{- 1} \ theta^{T} y
Je tryied:
import numpy as np
def least_squares1(y, tx):
"""calculate the least squares solution."""
w = np.dot(np.linalg.inv(np.dot(tx.T,tx)), np.dot(tx.T,y))
return w
Le problème est que cette méthode devient rapidement instable (pour les petits problèmes qu'il s ok)
Je compris que, lorsque je compare le résultat de cette moins calcul carré:
import numpy as np
def least_squares2(y, tx):
"""calculate the least squares solution."""
a = tx.T.dot(tx)
b = tx.T.dot(y)
return np.linalg.solve(a, b)
comparer les deux méthodes: I essayé d'adapter les données avec un polynôme de degré 12 [1, x, x^2, x^3, x^4 ..., x^12]
Première méthode:
Deuxième méthode:
Savez-vous pourquoi la première méthode diverge pour les grands polynômes?
P.S. J'ai seulement ajouté "import numpy as np" pour votre commodité, si vous voulez tester les fonctions.
Avez-vous vu [numpy.linalg.lstsq] (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.lstsq.html)? –
@JonClements Thansk ... J'ai reformulé ma question – james
Ma supposition est parce que la fonction 'inv' ne tient pas compte du fait que la matrice que vous inversez est toujours hermitienne, et trouve juste l'inverse en utilisant un algorithme qui fonctionne pour matrices générales. En plus de la fonction intégrée 'lstsq', votre meilleur pari serait d'utiliser la décomposition de Cholesky à la place (' cholesky'). – Kevin