2017-08-20 4 views
0

je me rends compte que je pouvais utiliser numpy pour trouver la ligne comme ceci:moindre carré, une ligne 2D

import numpy as np 
import matplotlib.pyplot as plt 
a = np.array([1,2,3,4,6,7]) 
b = np.array([5,4,3,2,-2,-1]) 
k,m = np.polyfit(a,b,1) 
plt.scatter(a,b) 
plt.plot([0,10],[m,10*k+m]) 
plt.show() 

enter image description here

mais je voudrais utiliser le code python brut à la place. Mes maths sont trop rouillées, mais si cela peut être fait dans quelques lignes de code j'apprécierais vraiment l'aide!

+0

Je ne sais pas si je comprends votre question. Que voulez-vous dire par code Python brut? Vous pouvez trouver rapidement les équations pour les estimations des coefficients des moindres carrés ordinaires. Ils seraient assez simples à implémenter, bien que cela ne s'intégrerait pas facilement dans "quelques lignes" sans utiliser les routines d'algèbre matricielle 'numpy' /' scipy'. –

+0

@ juanpa.arrivillaga: Une implémentation de l'algèbre matricielle numpy est certainement assez bonne (mais je ne suis pas capable de comprendre moi-même)! –

+1

Je suis sur mon téléphone, mais vérifiez [ceci] (https://www.google.com/amp/s/thetarzan.wordpress.com/2012/10/27/calculate-ols-regression-manually-in -python-using-numpy/amp /) –

Répondre

1

Si vous êtes à la recherche d'un simple linear regression basé sur la minimisation de l'erreur quadratique, pur implémentation de Python est assez simple (vérifier les équations pour α et β sur le lien ci-dessus):

def linear_fit(x, y): 
    """For set of points `(xi, yi)`, return linear polynomial `f(x) = k*x + m` that 
    minimizes the sum of quadratic errors. 
    """ 
    meanx = sum(x)/len(x) 
    meany = sum(y)/len(y) 
    k = sum((xi-meanx)*(yi-meany) for xi,yi in zip(x,y))/sum((xi-meanx)**2 for xi in x) 
    m = meany - k*meanx 
    return k, m 

Pour votre entrée exemple:

>>> x = [1,2,3,4,6,7] 
>>> y = [5,4,3,2,-2,-1] 
>>> linear_fit(x, y) 
(-1.1614906832298135, 6.285714285714285)