Die lineare Analyse nach der Methode der kleinsten Quadrate wird als multiple Regressionsanalyse für mehrere Variablen und einfache Regressionsanalyse für eine Variable bezeichnet. Einfache Regressionsanalyse, dh die Gleichung $ y = ax + b $ für eine lineare Funktion.
Da es sich um eine Regressionsanalyse handelt, möchten wir eine gerade Linie finden, die passt, dh wir möchten die optimalen Werte von $ a $ und $ b $ finden. x und y werden als Daten angegeben.
Ich untersuche, wie es geht, und es gibt verschiedene Dinge, wie die Verwendung einer Bibliothek wie Scicit-Learn, das Berechnen der Kovarianz usw. und das einfache Lösen, aber da es sich um eine Methode mit minimalen Quadraten handelt, kann dies leicht durchgeführt werden? Ich dachte. Versuch es.
Ich möchte $ a, b $ als Vektor kennen
A = \left(
\begin{array}{c}
a \\
b \\
\end{array}
\right)
Schreiben. Die Datengruppe $ X und Y $ kann auch durch einen Vektor dargestellt werden, aber da wir sie hier in Form einer Matrix (simultane Gleichungen) erstellen möchten, wird $ X $ wie folgt geschrieben.
X = \left(
\begin{array}{cc}
x_1 & 1\\
x_2 & 1\\
\vdots \\
x_n & 1
\end{array}
\right)
Der Punkt ist zu sagen. Mit anderen Worten, die simultanen Gleichungen
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)
nicht wahr. Die Dimensionsanalyse zeigt, dass N × 2 ≤ 2 × 1 = N × 1 ist. Wenn Sie danach die verallgemeinerte inverse Matrix $ X ^ \ dagger $ verwenden
A = X^\dagger Y
Kann auf einen Schlag gelöst werden.
Dies erleichtert die Implementierung. Unten ist der Testcode.
import numpy as np
import random
def linear_regression():
#Machen Sie zuerst die Antwort
a = 2
b = 10
x_true = np.arange(0.0,50.0,1.0)
y_true = a * x_true + b
#Erstellen Sie Daten, indem Sie zufällig vom richtigen Antwortwert abweichen
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)
#Datengruppenmatrix
X = np.c_[xd, np.linspace(1,1,len(xd))]
print(X)
#Minimum-Square-Methode: Multiplizieren Sie einfach die verallgemeinerte inverse Matrix von links
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()
Das Ergebnis ist wie folgt:
wahr ist die ursprüngliche gerade Linie. Da der Wert von dort zufällig geändert wird, stimmt er nicht überein, scheint aber zu stimmen. Wenn dies der Fall ist, scheint es, dass eine Regressionsanalyse leicht durchgeführt werden kann, ohne auf Bibliotheken angewiesen zu sein.
Recommended Posts