[PYTHON] Analyse de régression simple par la méthode des moindres carrés

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: test.png

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

Analyse de régression simple par la méthode des moindres carrés
Méthode d'analyse de régression
[TensorFlow] Régression linéaire carrée minimale par méthode de descente de gradient (méthode de descente la plus raide)
Calcul de la matrice d'homographie par la méthode des moindres carrés (méthode DLT)
Méthode du carré minimum (calcul de la matrice triangulaire)
Méthode du carré minimum et méthode d'estimation la plus probable (comparaison par ajustement du modèle)
J'ai essayé la méthode des moindres carrés en Python
Analyse de régression de Poisson
Approximation par la méthode des moindres carrés d'un cercle à deux points fixes
Clustering et analyse en composantes principales par méthode K-means (débutant)
Bases de l'analyse de régression
Analyse de régression avec Python
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 7 Analyse de régression