2017-10-11 18 views
1

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:

enter image description here

Deuxième méthode:

enter image description here

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.

+1

Avez-vous vu [numpy.linalg.lstsq] (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.lstsq.html)? –

+0

@JonClements Thansk ... J'ai reformulé ma question – james

+1

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

Répondre

3

Il y a trois points ici:

L'une est qu'il est généralement mieux (plus rapide, plus précis) pour résoudre des équations linéaires plutôt que de calculer des inverses. La seconde est que c'est toujours une bonne idée d'utiliser ce que vous savez sur un système d'équations (par exemple que la matrice de coefficients est définie positive) lors du calcul d'une solution, dans ce cas vous devez utiliser numpy.linalg.lstsq

La troisième concerne plus spécifiquement les polynômes. Lorsque vous utilisez des monômes comme base, vous pouvez vous retrouver avec une matrice de coefficients très mal conditionnée, ce qui signifie que les erreurs numériques ont tendance à être importantes. C'est parce que, par exemple, les vecteurs x-> pow (x, 11) et x-> pow (x, 12) sont presque parallèles. Vous obtiendriez un ajustement plus précis, et seriez capable d'utiliser des degrés plus élevés, si vous deviez utiliser une base de polynômes orthogonaux, par exemple https://en.wikipedia.org/wiki/Chebyshev_polynomials ou https://en.wikipedia.org/wiki/Legendre_polynomials

+0

Était sur le point d'écrire une réponse similaire. Le vôtre est meilleur. Cependant, il n'est pas clair pour moi ce que vous essayez d'exprimer dans votre premier point. Je ne suis pas familier avec ça. Je pensais que, lors de la résolution d'un ensemble d'équations linéaires (matrices), cela implique de calculer les inverses. Par conséquent, je ne vois pas quel genre d'opération vous utiliseriez pour résoudre des équations linéaires sans calculer d'inverse? – henry

+1

@DoHe Par exemple si P est psd, il a une factorisation cholesky P = L * L 'avec L triangulaire inférieur. Ensuite, pour résoudre P * x = y pour x, vous devez d'abord résoudre L * z = y pour z, puis résoudre L '* x = z pour x (ces éléments ne nécessitent pas de mémoire supplémentaire car les solutions peuvent être mises en place). les systèmes sont faciles. Lorsque vous calculez l'inverse, vous résolvez efficacement n équations, P * f1 = e1, P * f2 = e2 etc et puis lorsque vous appliquez l'inverse à la rhs vous combinez ces solutions. Il y a donc deux étapes et les erreurs numériques s'accumuleront entre ces deux étapes. – dmuir

+0

Merci beaucoup pour votre réponse !! :) – james

0

Je vais améliorer ce qui a été dit auparavant. J'ai répondu à cette question yesterday. Le problème avec les polynômes d'ordre supérieur est ce qu'on appelle les phénomènes de Runge. La raison pour laquelle la personne a recours à des polynômes orthogonaux connus sous le nom de polynômes d'Hermite est qu'ils tentent de se débarrasser du Gibbs phenomenon qui est un effet oscillatoire défavorable lorsque les méthodes de la série de Fourier sont appliquées à des signaux non périodiques.

Vous pouvez parfois améliorer sous le conditionnement avoir recours à des méthodes de régularisation si la matrice est de rang inférieur comme je l'ai fait dans l'autre poste. D'autres parties peuvent être dues aux propriétés de lissage du vecteur.