Comment dois-je calculer r-carré à l'aide de Python et Numpy?
Je suis en utilisant Python et Numpy pour calculer un ajustement polynomial de degré arbitraire. Je passe une liste de valeurs de x, les valeurs de y, et le degré du polynôme je veux ajustement (linéaire, quadratique, etc.).
Ce beaucoup de travaux, mais je veux aussi calculer r (coefficient de corrélation) et r-carré(coefficient de détermination). Je compare mes résultats avec Excel meilleur ajustement de courbe de tendance de la capacité, et le r-carré de la valeur qu'il calcule. En utilisant cela, je sais que je suis le calcul de r-squared correctement linéaire de meilleur ajustement (degré est égal à 1). Cependant, ma fonction ne fonctionne pas pour les polynômes de degré supérieur à 1.
Excel est capable de faire cela. Comment dois-je calculer r-squared pour ordre supérieur des polynômes à 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
- Remarque: vous utilisez le degré que dans le calcul des coeffs.
- tydok est correct. Vous êtes le calcul de la corrélation de x et y et r-squared pour y=p_0 + p_1 * x. Voir ma réponse ci-dessous de code qui devrait fonctionner. Si vous n'avez pas l'esprit de me demander, qu'est-ce que votre but ultime? Faites-vous du modèle de sélection (choisir quel est le degré d'utilisation)? Ou quelque chose d'autre?
- La demande se résume à "faire comme Excel". Je reçois le sentiment de ces réponses que les utilisateurs peuvent le lire trop dans le r-carré de la valeur lors de l'utilisation d'un non-linéaires de meilleur ajustement de la courbe. Néanmoins, je ne suis pas un assistant de mathématiques, et c'est la fonctionnalité requise.
Vous devez vous connecter pour publier un commentaire.
De la numpy.polyfit de la documentation, il convient de régression linéaire. Plus précisément, numpy.polyfit avec le degré de " d " correspond à une régression linéaire avec la moyenne de la fonction
E(y|x) = p_d * x**d + p_{d-1} * x **(d-1) + ... + p_1 * x + p_0
Donc, vous avez juste besoin de calculer le R-carré pour qui fit. La page de wikipedia sur la régression linéaire donne plus de détails. Vous êtes intéressé dans R^2 qui vous permet de calculer dans un couple des manières, la easisest probablement
Où j'utilise "y_bar' pour la moyenne des y, et "y_ihat" à l'ajustement de la valeur pour chaque point.
Je suis pas très familier avec numpy (j'ai l'habitude de travailler dans R), alors il est probablement plus propre façon de calculer votre R-squared, mais il convient de corriger
R^2 = 1 - SS_err/SS_tot
, avecR^2 = SS_reg/SS_tot
étant qu'un cas particulier.Un très retard de réponse, mais juste au cas où quelqu'un a besoin d'un prêt de la fonction pour cela:
scipy.les stats.les stats.linregress
c'est à dire
comme dans @Adam Marples de réponse.
De yanl (encore une autre bibliothèque)
sklearn.metrics
a unr2_square
fonction;J'ai été en utilisant ce succès, où x et y sont semblable au tableau.
J'ai posté les indices de référence ci-dessous dans le but de recommander des
numpy.corrcoef
, bêtement, sans se rendre compte que la question d'origine, utilise déjàcorrcoef
et était, en fait, en demandant au sujet d'ordre supérieur polynôme s'adapte. J'ai ajouté une solution réelle à la fonction polynomiale r-squared question à l'aide de statsmodels, et j'ai laissé les repères originaux, qui, bien que hors sujet, sont potentiellement utile à quelqu'un.statsmodels
a la capacité de calculer lar^2
d'une approximation polynomiale directement, voici 2 méthodes...À mieux tirer parti de
statsmodels
, il faut aussi regarder le modèle ajusté résumé, ce qui peut être imprimé ou affiché comme un riche tableau HTML dans Jupyter/IPython notebook. Les résultats de l'objet permet d'accéder à de nombreuses mesures statistiques en plus dersquared
.Ci-dessous ma Réponse où je comparés de divers régression linéaire r^2 méthodes...
La corrcoef fonction utilisée dans la Question calcule le coefficient de corrélation,
r
, seulement pour une simple régression linéaire, de sorte qu'il ne traite pas de la question der^2
supérieur de l'ordre des ajustements polynomiales. Cependant, pour ce que ça vaut, j'ai fini par trouver que pour la régression linéaire, c'est en effet la manière la plus rapide et la plus directe de la méthode de calcul der
.Il s'agissait de mes timeit résulte de la comparaison entre un tas de méthodes pour 1000 aléatoire (x, y) de points:
r
calcul)r
calcul)r
calcul)r
de sortie)La corrcoef méthode de justesse beats calcul de la r^2 "manuellement" à l'aide de numpy méthodes. Il est >5X plus rapide que le polyfit méthode et ~12X plus rapide que la scipy.linregress. Juste pour renforcer ce que numpy est fait pour vous, il est 28X plus vite que pure python. Je ne suis pas bien versé dans les choses comme numba et pypy, de sorte que quelqu'un d'autre aurait pour combler ces lacunes, mais je pense que c'est beaucoup convainquant que
corrcoef
est le meilleur outil pour le calcul der
pour une régression linéaire simple.Voici mon analyse comparative de code. Je copie-collé à partir d'un Jupyter pour ordinateur Portable (difficile de ne pas l'appeler une IPython Notebook...), donc je m'excuse si quelque chose se brisa sur le chemin. L' %timeit magie de commande nécessite IPython.
statsmodels
, et s'est excusé pour l'inutile l'analyse comparative de la régression linéaire de r^2 méthodes, j'ai gardé aussi intéressant, mais hors-sujet info.np.column_stack([x**i for i in range(k+1)])
peut être vectorisées dans numpy avecx[:,None]**np.arange(k+1)
ou de l'utilisation de numpy de vander fonctions qui ont inversé l'ordre des colonnes.L'article de wikipédia sur r-squareds suggère qu'il peut être utilisé pour la générale de l'ajustement du modèle plutôt que de simplement la régression linéaire.
R-squared est une statistique qui s'applique uniquement à la régression linéaire.
Essentiellement, il mesure combien la variation dans les données peut être expliquée par la régression linéaire.
Donc, vous devez calculer la "Somme Totale des Carrés", qui est le total de l'écart au carré de chacune de vos résultats variables à leur moyenne. . .
\sum_{i}(y_{i} - y_bar)^2
où y_bar est la moyenne de y est.
Ensuite, vous calculez la "somme de régression des carrés", qui est la façon dont beaucoup de votre ÉQUIPÉS valeurs diffèrent de la moyenne
\sum_{i}(yHat_{i} - y_bar)^2
et de trouver le ratio de ces deux.
Maintenant, tout ce que vous avez à faire pour un polynôme d'ajustement est de brancher la fiche dans la y_hat est à partir de ce modèle, mais il n'est pas exact de les appeler que r-squared.
Ici est un lien que j'ai trouvé qui parle un peu.
Voici une fonction pour calculer la pondérée r-squared avec Python et Numpy (la plupart du code vient de sklearn):
Exemple:
sorties:
Cela correspond à la formule (miroir):
avec f_i est la valeur prédite à partir de l'ajustement, y_{av} est la moyenne des données observées y_i est les données de l'observation de la valeur. w_i est la pondération appliquée à chaque point de données, généralement w_i=1. L'ESS est la somme des carrés due à une erreur et SST est la somme totale des carrés.
Si vous êtes intéressés, le code R: https://gist.github.com/dhimmel/588d64a73fa4fef02c8f (miroir)