J'utilise Python et Numpy pour calculer un polynôme de meilleur ajustement de degré arbitraire. Je passe une liste de valeurs x, de valeurs y et du degré du polynôme que je veux ajuster (linéaire, quadratique, etc.).
Cela fonctionne beaucoup, mais je veux aussi calculer r (coefficient de corrélation) et r-carré (coefficient de détermination). Je compare mes résultats avec la capacité de courbe de tendance optimale d'Excel et la valeur au carré qu'il calcule. En utilisant cela, je sais que je calcule correctement le r-carré pour le meilleur ajustement linéaire (degré égal à 1). Cependant, ma fonction ne fonctionne pas pour les polynômes avec un degré supérieur à 1.
Excel est capable de le faire. Comment calculer le r-carré pour les polynômes d'ordre supérieur à l'aide de Numpy?
Voici ma fonction:
import numpy
# Polynomial Regression
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# Polynomial Coefficients
results['polynomial'] = coeffs.tolist()
correlation = numpy.corrcoef(x, y)[0,1]
# r
results['correlation'] = correlation
# r-squared
results['determination'] = correlation**2
return results
la source
Réponses:
D'après la documentation numpy.polyfit , il s'agit d'une régression linéaire. Plus précisément, numpy.polyfit avec le degré 'd' correspond à une régression linéaire avec la fonction moyenne
E (y | x) = p_d * x ** d + p_ {d-1} * x ** (d-1) + ... + p_1 * x + p_0
Il vous suffit donc de calculer le R-carré pour cet ajustement. La page wikipedia sur la régression linéaire donne tous les détails. Vous êtes intéressé par R ^ 2 que vous pouvez calculer de plusieurs manières, la plus simple étant probablement
Où j'utilise 'y_bar' pour la moyenne des y, et 'y_ihat' pour être la valeur d'ajustement pour chaque point.
Je ne suis pas très familier avec numpy (je travaille généralement en R), il y a donc probablement un moyen plus propre de calculer votre R-carré, mais ce qui suit devrait être correct
la source
R^2 = 1 - SS_err/SS_tot
,R^2 = SS_reg/SS_tot
étant juste un cas particulier.Une réponse très tardive, mais juste au cas où quelqu'un aurait besoin d'une fonction prête pour cela:
scipy.stats.linregress
c'est à dire
comme dans la réponse de @Adam Marples.
la source
De yanl (encore une autre bibliothèque)
sklearn.metrics
a uner2_score
fonction;la source
r2_score([1,2,3],[4,5,7])
=-16
?Je l'ai utilisé avec succès, où x et y ressemblent à un tableau.
la source
J'ai initialement publié les points de repère ci-dessous dans le but de recommander
numpy.corrcoef
, stupidement ne me rendant pas compte que la question d'origine utilise déjàcorrcoef
et posait en fait des questions sur les ajustements polynomiaux d'ordre supérieur. J'ai ajouté une solution réelle à la question polynomiale r-carré à l'aide de statsmodels, et j'ai laissé les repères d'origine, qui, bien que hors sujet, sont potentiellement utiles à quelqu'un.statsmodels
a la capacité de calculerr^2
directement l'ajustement polynomial, voici 2 méthodes ...Pour en tirer davantage parti
statsmodels
, il convient également de consulter le résumé du modèle ajusté, qui peut être imprimé ou affiché sous forme de tableau HTML riche dans le notebook Jupyter / IPython. L'objet de résultats donne accès à de nombreuses mesures statistiques utiles en plus dersquared
.Voici ma réponse originale où j'ai comparé diverses méthodes de régression linéaire r ^ 2 ...
La fonction corrcoef utilisée dans la Question calcule le coefficient de corrélation
r
, uniquement pour une seule régression linéaire, elle ne répond donc pas à la question desr^2
ajustements polynomiaux d'ordre supérieur. Cependant, pour ce que cela vaut, j'en suis venu à trouver que pour la régression linéaire, c'est en effet la méthode de calcul la plus rapide et la plus directer
.Ce sont mes résultats timeit en comparant un tas de méthodes pour 1000 points aléatoires (x, y):
r
calcul direct )r
calcul direct )r
calcul direct )r
comme sortie)La méthode corrcoef bat étroitement le calcul du r ^ 2 "manuellement" en utilisant les méthodes numpy. Il est> 5 fois plus rapide que la méthode polyfit et ~ 12 fois plus rapide que scipy.linregress. Juste pour renforcer ce que numpy fait pour vous, il est 28 fois plus rapide que le python pur. Je ne connais pas bien des choses comme numba et pypy, donc quelqu'un d'autre devrait combler ces lacunes, mais je pense que c'est très convaincant pour moi que
corrcoef
c'est le meilleur outil pour calculerr
une simple régression linéaire.Voici mon code d'analyse comparative. J'ai copié-collé à partir d'un notebook Jupyter (difficile de ne pas l'appeler un notebook IPython ...), alors je m'excuse si quelque chose s'est cassé en cours de route. La commande% timeit magic nécessite IPython.
la source
statsmodels
, et je me suis excusé pour l'analyse comparative inutile des méthodes de régression linéaire r ^ 2, que j'ai gardées comme des informations intéressantes, mais hors sujet.np.column_stack([x**i for i in range(k+1)])
peut être vectorisé en numpy avecx[:,None]**np.arange(k+1)
ou en utilisant les fonctions vander de numpy qui ont inversé l'ordre des colonnes.Le R au carré est une statistique qui ne s'applique qu'à la régression linéaire.
Essentiellement, il mesure la variation de vos données qui peut être expliquée par la régression linéaire.
Ainsi, vous calculez la «somme totale des carrés», qui est l'écart carré total de chacune de vos variables de résultat par rapport à leur moyenne. . .
\ sum_ {i} (y_ {i} - y_bar) ^ 2
où y_bar est la moyenne des y.
Ensuite, vous calculez la "somme des carrés de régression", qui correspond à la différence entre vos valeurs FITTED et la moyenne
\ sum_ {i} (yHat_ {i} - y_bar) ^ 2
et trouvez le rapport de ces deux.
Maintenant, tout ce que vous auriez à faire pour un ajustement polynomial est de brancher les y_hat de ce modèle, mais ce n'est pas exact d'appeler cela r-carré.
Voici un lien que j'ai trouvé qui en parle un peu.
la source
L'article de wikipedia sur les r-squareds suggère qu'il peut être utilisé pour l'ajustement général du modèle plutôt que pour la régression linéaire.
la source
Voici une fonction pour calculer le r-carré pondéré avec Python et Numpy (la plupart du code provient de sklearn):
Exemple:
les sorties:
Cela correspond à la formule ( miroir ):
avec f_i est la valeur prédite de l'ajustement, y_ {av} est la moyenne des données observées y_i est la valeur des données observées. w_i est la pondération appliquée à chaque point de données, généralement w_i = 1. SSE est la somme des carrés due à l'erreur et SST est la somme totale des carrés.
Si vous êtes intéressé, le code en R: https://gist.github.com/dhimmel/588d64a73fa4fef02c8f ( miroir )
la source
Voici une fonction python très simple pour calculer R ^ 2 à partir des valeurs réelles et prévues en supposant que y et y_qui sont des séries pandas:
la source
De la source scipy.stats.linregress. Ils utilisent la méthode de la somme moyenne des carrés.
la source
Vous pouvez exécuter ce code directement, cela vous trouvera le polynôme, et vous trouvera la valeur R, vous pouvez mettre un commentaire ci-dessous si vous avez besoin de plus d'explications.
la source