Explication du concept d'analyse de régression à l'aide de python Partie 2

Recherche des valeurs α et β

Prenez une image avec un graphique

Dans la [Partie 1] de cet article (http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d), voyez que vous pouvez trouver la valeur minimale si vous corrigez chacun de $ \ alpha $ et $ \ beta $ avec une certaine valeur. Cependant, afin de trouver effectivement les paramètres $ \ alpha, \ beta $ de la droite approximative (droite de régression) pour ces données, ne cherchez pas le cas où $ \ alpha $ et $ \ beta $ ont les valeurs minimales en même temps. Ne doit pas être.

La fonction $ S $ gérée dans la [Partie 1](http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d#Let's Calculate) est organisée comme une fonction à deux variables de $ \ alpha $ et $ \ beta $ comme suit. On dirait.


S(\alpha, \beta) = 
\left( \sum_i^n x_i^2 \right) \alpha^2 + n\beta^2
+ 2 \left( \sum_i^n x_i \right)\alpha \beta
- 2 \left( \sum_i^n x_i y_i \right)\alpha 
- 2 \left( \sum_i^n y_i \right)\beta
+ \sum_i^n y_i^2

De plus, chaque coefficient peut être obtenu à partir des données (calculées dans [Partie 1](http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d#Let's Calculate)).

n=50
\left( \sum_i^n x_i^2 \right) =34288
\left( \sum_i^n y_i^2 \right)=11604
\left( \sum_i^n x_iy_i \right)=18884
\left( \sum_i^n x_i \right)=1240
\left( \sum_i^n y_i \right)=655

Et si vous remplacez ceci


S(\alpha, \beta) = 
34288 \alpha^2 + 50\beta^2
+ 2480\alpha \beta
- 37768\alpha 
- 1310 \beta
+ 11604

Ce sera. Dessinons un graphique de cette courbe quadratique. L'axe vertical $ S $ est la somme des carrés de la distance (erreur) entre chaque point de données et la ligne droite. Trouvez l'endroit où c'est le plus petit.


from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

# set field
X = np.linspace(0.2, 1.3, 100)
Y = np.linspace(-25, 15, 100)

# set data
#sum(x**2)
sum_x_2 = 34288.2988
#sum(y**2)
sum_y_2 = 11603.8684051
#dot(x,y)
sum_xy = 18884.194896
#sum(x)
sum_x = 1239.7
#sum(y)
sum_y = 655.0152
X, Y = np.meshgrid(X, Y)
#S(α,β)=34288α^2 + 50β^2 + 2480αβ − 37768α − 1310β + 11604
S = (sum_x_2 * (X**2)) + (50 * (Y**2)) + (2 * sum_x * X * Y) + (-2 * sum_xy  * X) + (-2 * sum_y * Y) + sum_y_2

# prepare plot
fig = plt.figure(figsize=(18,6))
ax = fig.add_subplot(121, projection='3d', azim=60)
ax.set_xlabel("alpha")
ax.set_ylabel("beta")
ax.set_zlabel("S")

# draw 3D graph
surf = ax.plot_surface(X, Y, S, rstride=1, cstride=1, cmap=cm.coolwarm,
        linewidth=0, antialiased=False)

# draw contour
ax = fig.add_subplot(122)
plt.contour(X,Y,S,50)
ax.set_xlabel("alpha")
ax.set_ylabel("beta")

plt.show()

4dc53003-39ef-ef17-db45-7db46f1efdd9.png

Le graphique 3D à gauche est un peu déroutant, mais en regardant le graphique en courbes de niveau à droite, la valeur minimale au centre de l'ellipse est en quelque sorte proche de la valeur précédemment prédite visuellement $ \ alpha = 0,74, \ beta = -5 $. Je le ferai!

Essayez de résoudre par calcul

Pour le résoudre par calcul, divisez respectivement $ S $ par $ \ alpha $ et $ \ beta $ et trouvez la valeur qui devient 0. Si $ S $ est écrit en fonction de $ \ alpha $ et $ \ beta $, respectivement, ce sera comme suit.


S(\alpha) = \left( \sum_i^n x_i^2 \right) \alpha^2
 + 2\left( \sum_i^n (x_i\beta - x_i y_i ) \right) \alpha 
 + n\beta^2 - 2\beta\sum_i^n y_i + \sum_i^n y_i^2

S(\beta) = n\beta^2
+ 2 \left( \sum_i^n (x_i\alpha - y_i) \right) \beta
+ \alpha^2\sum_i^n x_i^2 - 2\alpha \sum_i^n x_iy_i + \sum_i^n y_i^2

Puisqu'il est partiellement différencié et mis à 0,


\frac{\partial S}{\partial \alpha} = 0,

\frac{\partial S}{\partial \beta } = 0,

Résoudra les équations simultanées de. En d'autres termes


\frac{\partial S}{\partial \alpha} =  2\left(\sum_i^n x_i^2 \right) \alpha +  2\left( \sum_i^n x_i \right) \beta - 2\sum_i^n x_i y_i = 0

\frac{\partial S}{\partial \beta} = 2n\beta + 2\left( \sum_i^n x_i\right) \alpha - 2\sum_i^ny_i = 0

Sera résolu. Substituer la valeur obtenue à partir des données

\frac{1}{2}\frac{\partial S}{\partial \alpha} =  34288 \alpha +  1240 \beta - 18884 = 0
\frac{1}{2}\frac{\partial S}{\partial \beta} = 50 \beta + 1240 \alpha - 655 = 0

Si vous résolvez les équations simultanées en utilisant Python,

from sympy import *
a, b = symbols('a b')
init_printing()

# 34288α + 1240β − 18884 = 0
#    50β + 1240α −   655 = 0
solve([34288 * a + 1240 * b - 18884, 50* b + 1240 * a - 655], [a, b])

a --> 0.746606334842
b --> -5.41583710407

\alpha = 0.746606334842
\beta  = -5.41583710407

Vous pouvez obtenir la solution comme

En remplaçant à nouveau les valeurs de $ \ alpha et \ beta $ et en traçant une ligne droite sur le diagramme de dispersion, le résultat est le suivant.

import numpy as np
import matplotlib.pyplot as plt

data= np.loadtxt('cars.csv',delimiter=',',skiprows=1)
data[:,1] = map(lambda x: x * 1.61, data[:,1])    #km de mph/Convertir en h
data[:,2] = map(lambda y: y * 0.3048, data[:,2])  #Convertir de ft en m

fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
ax.set_xlim(0,50)
ax.set_title("Stopping Distances of Cars with estimated regression line")
ax.set_xlabel("speed(km/h)")
ax.set_ylabel("distance(m)")
plt.scatter(data[:,1],data[:,2])

x = np.linspace(0,50,50)
y = 0.746606334842 * x -5.41583710407
plt.plot(x,y)

estimated.png

Voici la droite de régression: sourire:

Suite pour expliquer avec animation.

Recommended Posts

Explication du concept d'analyse de régression à l'aide de python Partie 2
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Découpez une partie de la chaîne à l'aide d'une tranche Python
Calculer le coefficient de régression d'une analyse de régression simple avec python
Revoir le concept et la terminologie de la régression
Analyse de la variation temporelle des trous noirs en utilisant Python
[Python] Lire le code source de Bottle Part 2
Raccourcir le temps d'analyse d'Openpose à l'aide du son
Essayez d'utiliser le framework Web Python Tornado Partie 1
[Python] Lire le code source de Bottle Part 1
Essayez d'utiliser le module de collections (ChainMap) de python3
Essayez d'utiliser le framework Web Python Tornado Partie 2
[Python + OpenCV] Peignez la partie transparente de l'image en blanc
le zen de Python
Bases de l'analyse de régression
Analyse de régression avec Python
Prédire l'avenir des tendances démographiques dans la ville de Numazu par analyse de régression chronologique à l'aide de Prophet
[Python] [Word] [python-docx] Analyse simple des données de diff en utilisant python
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
Implémentation python de la classe de régression linéaire bayésienne
La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)
Étude de Python Hour8: Utilisation de packages
Vers la retraite de Python2
Analyse statique des programmes Python
python: principes de base de l'utilisation de scikit-learn ①
Analyse de régression simple avec Python
À propos des fonctionnalités de Python
Analyse de données à l'aide de pandas python
Principes de base de Python x SIG (1)
Le pouvoir des pandas: Python
Pensez à l'environnement d'analyse (Partie 1: Vue d'ensemble) * Depuis janvier 2017
Afficher à l'aide du module python du backend mobile Nifty Cloud
[Python] Régression LASSO avec contrainte d'équation utilisant la méthode du multiplicateur
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Principes de base de Python x SIG (3)
L'histoire de Python et l'histoire de NaN
Capture d'image de Firefox en utilisant Python
Première analyse de régression simple en Python
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
[Python] La pierre d'achoppement de l'importation
First Python 3 ~ Le début de la répétition ~
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
Python: Application de l'apprentissage supervisé (retour)
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
Suppression de la brume à l'aide de Python detailEnhanceFilter
Existence du point de vue de Python
[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter
pyenv-changer la version python de virtualenv
[Python] J'ai expliqué en détail la théorie et la mise en œuvre de la régression logistique
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 6: Utilisation du modèle
[Python] Comprendre le potentiel_field_planning de Python Robotics
Évaluer les performances d'un modèle de régression simple à l'aide de la validation d'intersection LeaveOneOut
Revue des bases de Python (FizzBuzz)
Principes de base de Python x SIG (partie 2)