L'analyse linéaire par la méthode des moindres carrés est appelée analyse de régression multiple pour plusieurs variables et analyse de régression simple pour une variable. Analyse de régression simple, c'est-à-dire l'équation $ y = ax + b $ pour une fonction linéaire.
Puisqu'il s'agit d'une analyse de régression, nous voulons trouver une ligne droite qui correspond, c'est-à-dire que nous voulons trouver les valeurs optimales de $ a $ et $ b $. x et y sont donnés sous forme de données.
J'étudie comment le faire, et il y a diverses choses telles que l'utilisation d'une bibliothèque telle que scicit-learn, le calcul de la covariance, etc. J'ai pensé. Essayez-le.
Je veux connaître $ a, b $ comme vecteur
A = \left(
\begin{array}{c}
a \\
b \\
\end{array}
\right)
Écrire. Le groupe de données $ X et Y $ peut également être représenté par un vecteur, mais puisque nous voulons le faire sous la forme d'une matrice (équations simultanées) ici, $ X $ s'écrit comme suit.
X = \left(
\begin{array}{cc}
x_1 & 1\\
x_2 & 1\\
\vdots \\
x_n & 1
\end{array}
\right)
Le point est de dire. En d'autres termes, les équations simultanées
XA = Y \\
\left(
\begin{array}{cc}
x_1 & 1\\
x_2 & 1\\
\vdots \\
x_n & 1
\end{array}
\right)\left(
\begin{array}{c}
a \\
b \\
\end{array}
\right)
=
\left(\begin{array}{c}
y_1\\
y_2\\
\vdots \\
y_n
\end{array}\right)
n'est-ce pas. L'analyse dimensionnelle montre que N × 2 ・ 2 × 1 = N × 1. Après cela, si vous utilisez la matrice inverse généralisée $ X ^ \ dagger $
A = X^\dagger Y
Peut être résolu en un seul coup.
Cela facilite la mise en œuvre. Voici le code de test.
import numpy as np
import random
def linear_regression():
#Faites d'abord la réponse
a = 2
b = 10
x_true = np.arange(0.0,50.0,1.0)
y_true = a * x_true + b
#Créez des données en décalant aléatoirement de la valeur de réponse correcte
xd = np.zeros(len(x_true))
yd = np.zeros(len(y_true))
for i in range(len(xd)):
yd[i] = y_true[i] + 100*(random.randint(-10,10)/100)
for i in range(len(xd)):
xd[i] = x_true[i] + 10*(random.randint(-10,10)/100)
print(xd)
print(yd)
#Matrice de groupe de données
X = np.c_[xd, np.linspace(1,1,len(xd))]
print(X)
#Méthode du carré minimum: il suffit de multiplier la matrice inverse généralisée à partir de la gauche
A = np.linalg.pinv(X) @ yd
y_est = x_true * A[0] + A[1]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(xd, yd, label='data')
ax.plot(x_true,y_true, label='true')
ax.plot(x_true,y_est, label='linear regression')
ax.legend()
ax.grid()
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.tight_layout()
plt.show()
return
if __name__ == '__main__' :
linear_regression()
Le résultat est le suivant:
vrai est la ligne droite d'origine. Puisque la valeur est modifiée de manière aléatoire à partir de là, elle ne correspond pas, mais elle semble correspondre. Si tel est le cas, il semble que l'analyse de régression puisse être facilement réalisée sans s'appuyer sur des bibliothèques.
Recommended Posts