Décrit la méthode des moindres carrés. Tout d'abord, calculez avec des valeurs numériques concrètes, puis trouvez la formule générale et enfin implémentez-la en Python.
L'analyse de régression est une méthode permettant de dériver la formule qui correspond le mieux aux données de l'échantillon et de prédire la valeur numérique des nouvelles données, ce qui est l'une des méthodes typiques. Dérivez une expression relationnelle qui minimise l'erreur entre les exemples de données et la valeur obtenue à partir de l'expression.
Supposons que vous prédisiez la croissance du radis Hatsuka. Actuellement, le 4e jour, nous mesurons le nombre de centimètres de feuilles qui sortent chaque jour.
Jour 1 | Jour 2 | Jour 3 | Jour 4 |
---|---|---|---|
J'ai fait un graphique de ces données. L'axe $ x $ est le nombre de jours et l'axe $ y $ est la longueur de la feuille.
Soit la fonction hypothétique une fonction linéaire. L'équation de la fonction linéaire est
y = ax + b
Donc, calculez ce que devraient être les valeurs de $ a $ et $ b $ pour créer une fonction agréable. En tant qu'image, trouvez une fonction linéaire qui correspond le plus possible aux données, comme indiqué dans le graphique rouge.
Tout d'abord, à partir de la fonction hypothétique $ y = ax + b $, la valeur de $ y $ du 0e au 4e jour (le nombre de jours est $ x $) est calculée, et l'erreur des données de croissance réelle est calculée. (Le jour 0 est le jour où les graines sont enterrées)
Journées( |
Jour 0 | Jour 1 | Jour 2 | Jour 3 | Jour 4 |
---|---|---|---|---|---|
Record | |||||
Calculé à partir de la formule( |
|||||
Erreur( |
L'erreur est la longueur de la partie rose dans le graphique ci-dessous.
Carré, puis additionnez pour que l'erreur ne soit pas négative. En supposant que l'erreur totale est de $ J $, le calcul est le suivant.
J = b^2+((a+b)-0.3)^2+((2a+b)-1.9)^2+((3a+b)-2.8)^2+((4a+b)-4.3)^2\\
\\
=30a^2+20ab-59.4a+5b^2-18.6b+30.03
Trouvez $ a $ et $ b $ qui minimisent ce $ J $ et vous avez terminé.
Si $ J $ est partiellement différencié en fonction de $ a $ comme 0, et $ J $ est partiellement différencié en fonction de $ b $ comme 0, et que deux équations simultanées sont résolues, $ J $ est le minimum. Naru $ a $ et $ b $ sont calculés.
Voir ici pour la valeur minimale d'une fonction bidimensionnelle à deux variables. http://mathtrain.jp/quadratic
La formule ci-dessus est partiellement différenciée par $ a $ ($ \ frac {∂J} {∂a} $), et la formule inférieure est partiellement différenciée par $ b $ ($ \ frac {∂J} {∂b) } $).
\left\{
\begin{array}{ll}
0 = 60a+20b-59.4 \\
0 = 20a+10b-18.6
\end{array}
\right.
Lorsque vous résolvez les équations simultanées,
\left\{
\begin{array}{ll}
a = 1.11 \\
b=-0.36
\end{array}
\right.
La porte à côté
y = 1.11x - 0.36
J'ai pu dériver la fonction. Après avoir dessiné avec un graphique
Ça fait du bien !!
radish_plot.py
import matplotlib.pyplot as plt
import numpy as np
# data set
plt.plot([0,0.3,1.9,2.8,4.3], "bo")
plt.title("radish growth")
plt.xlabel("X:days")
plt.ylabel("Y:length")
plt.xlim([0,4])
plt.xticks(np.arange(1,5,1))
plt.ylim([0,4])
plt.yticks(np.arange(0,6,1))
# Graph
x = np.arange(0,10,0.01)
y = 1.11*x -0.36
plt.plot(x,y,"r-")
plt.show()
Dans l'exemple concret, la fonction hypothétique est une fonction linéaire, mais elle peut être plus appropriée pour une fonction quadratique ou une fonction cubique. C'est peut-être généralement une relation plus complexe.
Si vous adaptez l'exemple du radis Hatsuka à une fonction quadratique,
Et cela peut être considéré comme une meilleure formule. En outre, la croissance du radis Hatsuka peut être affectée non seulement par le nombre de jours, mais aussi par la quantité de soleil et la quantité d'eau.
Par conséquent, considérons un exemple concret en le convertissant en une formule générale.
S'il y a des facteurs $ x_ {1} $, $ x_ {2} $ qui déterminent la longueur de la feuille, tels que le nombre de jours, la quantité d'ensoleillement, la quantité d'eau à donner et $ \ cdots $$ n $, respectivement. , $ x_ {3} $ $ \ cdots $ $ x_ {n} $. Soit le coefficient de $ x_ {n} $ $ \ theta_ {n} $.
La fonction et la fonction d'hypothèse que vous souhaitez finalement dériver peuvent être exprimées par la formule suivante. ($ X_ {1} $ ne signifie pas $ x $ au carré, c'est une fonction qui dépend de $ x $. Il peut être utile de regarder le dernier code Python.)
h_{\theta}(x) = \theta_{0}x_{0} + \theta_{1}x_{1} + \theta_{2}x_{2} +\cdots + \theta_{n}x_{n}
$ \ Theta_ {0} $ est la partie $ b $ de l'exemple concret et est considéré comme $ x_ {0} = 1 $. Soudainement, $ h_ {\ theta} (x) $ est sorti, mais $ y $ dans l'exemple concret est la longueur de la feuille.
La fonction hypothétique ci-dessus peut être liée à la fonction d'exemple concrète $ y = 1,11x --0,36 $ comme suit.
Supposons qu'il existe plusieurs exemples de données pour cette fonction hypothétique et que les données soient les suivantes.
(1 fixe) |
(Journées) |
(Heure du soleil h) |
(Teneur en eau ml) |
(Longueur des feuilles cm) |
|
---|---|---|---|---|---|
Les données de la colonne $ j $ de la ligne $ i $ peuvent être représentées par $ x_ {j} ^ {(i)} $, $ y ^ {(i)} $, et une fois mappées, cela ressemble à ceci. C'est une forme. Cela ressemble à un exposant, mais il ne montre que les données.
(1 fixe) |
(Journées) |
(Heure du soleil h) |
(Teneur en eau ml) |
(Longueur des feuilles cm) |
|
---|---|---|---|---|---|
Lorsque les données de la première colonne sont affectées à $ h_ {\ theta} (x) $, elles sont exprimées comme $ h_ {\ theta} (x ^ {(1)}) $.
De cette manière, l'erreur totale de la fonction hypothétique peut être réécrite comme la fonction suivante. $ m $ est le nombre d'ensembles de données. Dans l'exemple du tableau ci-dessus, c'est 4.
J(\theta_{0},\theta_{1}, \cdots,\theta_{n})= \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2
L'erreur totale $ J (\ theta_ {0}, \ theta_ {1}, \ cdots, \ theta_ {n}) $ est la plus petite $ \ theta_ {0}, \ theta_ {1}, \ cdots, \ theta_ Le but est de dériver un ensemble de {n} $.
À partir de là, remplaçons-le par une matrice. Une matrice est un élément puissant qui peut calculer des données à la fois.
Premièrement, pour représenter la fonction hypothétique $ h_ {\ theta} (x) $ comme une matrice, $ \ theta_ {0} $, $ \ theta_ {1} $, $ \ cdots $ $ \ theta_ {n} $, $ X_ {0} $, $ x_ {1} $, $ \ cdots $ $ x_ {n} $ est représenté par une matrice.
\theta=\begin{bmatrix}
\theta_{0} \\
\theta_{1} \\
\vdots\\
\theta_{n}
\end{bmatrix}
,
x=\begin{bmatrix}
x_{0} \\
x_{1} \\
\vdots\\
x_{n}
\end{bmatrix}
Placé de cette façon, $ h_ {\ theta} (x) $ peut être représenté par le produit de la matrice transposée de $ \ theta $ et de la matrice $ x $.
h_{\theta}(x)= \theta^T x\\
Veuillez vous référer ici pour la translocation et l'empilement de la matrice. http://www.sist.ac.jp/~kanakubo/research/hosoku/trans_gyoretu.html
L'ensemble de données $ x ^ {(i)} $ dans la colonne $ i $ est représenté par une matrice, et la matrice $ X $ étant donné tous les ensembles de données est représentée par la matrice transposée de chaque colonne. $ y ^ {(i)} $ est également représenté par une matrice.
x^{(i)}=\begin{bmatrix}
x_{0}^{(i)} \\
x_{1}^{(i)} \\
\vdots\\
x_{n}^{(i)}
\end{bmatrix}
,
X=\begin{bmatrix}
(x^{(1)})^T \\
(x^{(2)})^T \\
\vdots\\
(x^{(m)})^T
\end{bmatrix}
=
\begin{bmatrix}
x_{0}^{(1)} & x_{1}^{(1)} & \cdots & x_{n}^{(1)} \\
x_{0}^{(2)} & x_{1}^{(2)} & \cdots & x_{n}^{(2)} \\
\vdots & \vdots & & \vdots\\
x_{0}^{(m)} & x_{1}^{(m)} & \cdots & x_{n}^{(m)} \\
\end{bmatrix}
,
y=\begin{bmatrix}
y^{(1)} \\
y^{(2)} \\
\vdots\\
y^{(m)}
\end{bmatrix}
Cela semble déroutant, mais je viens de convertir le tableau ci-dessus en matrice.
Et l'histoire saute aussitôt.
Lorsqu'il est placé de cette manière, $ \ theta $, qui minimise l'erreur totale $ J (\ theta) $, peut être obtenu en résolvant l'équation matricielle suivante.
\theta =
(X^tX)^{-1}X^ty
Voir ici pourquoi cette formule est utilisée. http://mathtrain.jp/leastsquarematrix
De plus, $ X ^ {-1} $ est appelé la matrice inverse de $ X $, voir ici. http://mathtrain.jp/inversematrix
Mettez l'ensemble de données dans cette formule pour trouver $ \ theta $, et placez-le dans $ \ theta_ {0}, \ theta_ {1}, \ cdots, \ theta_ {n} $ de $ h (\ theta) $ pour obtenir le minimum La formule de la fonction (fonction modèle) par la méthode du carré est terminée.
J'ai écrit cette méthode des moindres carrés en Python. On vous demandera $ \ theta $ en une seule ligne! !!
Le premier est l'ensemble de données. Un nombre aléatoire est ajouté à la fonction $ y = 3 + 2 \ cos (x) + \ frac {1} {2} x $ pour générer une erreur.
linalg_lstsq.py
x = arange(-3, 10, 0.1)
y = 3 + 2 * np.cos(x) + (1/2) * x + np.random.normal(0.0, 1.0, len(x))
Dans la formule générale, $ x_ {1} $ est $ \ cos (x) $ et $ x_ {2} $ est $ x $. Si les coefficients à calculer peuvent être calculés de sorte que $ \ theta_ {0} $ soit proche de $ 3 $, $ \ theta_ {1} $ est proche de $ 2 $, et $ \ theta_ {2} $ est proche de $ \ frac {1} {2} $. C'est bon.
Créez une matrice $ X $ avec tous les jeux de données.
linalg_lstsq.py
n = 3
X = np.zeros((len(x), n), float)
X[:,0] = 1
X[:,1] = np.cos(x)
X[:,2] = x
L'expression pour $ \ theta $ est cette seule ligne utilisant linalg.lstsq dans la bibliothèque Numpy.
linalg_lstsq.py
(theta, residuals, rank, s) = linalg.lstsq(X, y)
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html
En conséquence, c'est devenu comme ça.
linalg_lstsq.py
import numpy as np
import matplotlib.pyplot as plt
# data-set
x = np.arange(-3, 10, 0.1)
y = 3 + 2 * np.cos(x) + (1/2) * x + np.random.normal(0.0, 1.0, len(x))
n = 3
X = np.zeros((len(x), n), float)
X[:,0] = 1
X[:,1] = np.cos(x)
X[:,2] = x
# Least square method
(theta, residuals, rank, s) = np.linalg.lstsq(X, y)
# data-set plot
plt.plot(x, y, 'b.')
# h(theta) plot
plt.plot(x, theta[0] + theta[1] * X[:,1] + theta[2] * X[:,2], 'r-')
plt.title("linalg.lstsq")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()
print('θ[0]: %s' % theta[0])
print('θ[1]: %s' % theta[1])
print('θ[2]: %s' % theta[2])
J'ai pu obtenir une valeur assez proche, et même si vous regardez le graphique, cela correspond! !!
Depuis que je viens de commencer à étudier l'apprentissage automatique, j'apprends les algorithmes et les idées standard. Je ne peux rien écrire de nouveau, mais j'espère que cela aide quelqu'un.