Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.

Überblick

Beschreibt die Methode der kleinsten Quadrate. Berechnen Sie zuerst mit konkreten numerischen Werten, suchen Sie dann die allgemeine Formel und implementieren Sie sie schließlich in Python.

Was ist die Methode der minimalen Quadrate?

Die Regressionsanalyse ist eine Methode zur Ableitung der Formel, die am besten zu den Probendaten passt, und zur Vorhersage des numerischen Werts der neuen Daten, eine der typischen Methoden. Leiten Sie einen relationalen Ausdruck ab, der den Fehler zwischen den Beispieldaten und dem aus dem Ausdruck erhaltenen Wert minimiert.

Konkretes Beispiel

Angenommen, Sie sagen das Wachstum von Hatsuka-Rettich voraus. Derzeit messen wir am 4. Tag, wie viele Zentimeter Blätter jeden Tag herauskommen.

Tag 1 Tag 2 Tag 3 Tag 4
0.3 1.9 2.8 4.3

Ich habe diese Daten grafisch dargestellt. Die $ x $ -Achse ist die Anzahl der Tage und die $ y $ -Achse ist die Blattlänge.

radish1.png

Die hypothetische Funktion sei eine lineare Funktion. Die Gleichung der linearen Funktion lautet

y = ax + b 

Berechnen Sie also die Werte von $ a $ und $ b $, um eine schöne Funktion zu erhalten. Suchen Sie als Bild eine lineare Funktion, die so gut wie möglich zu den Daten passt, wie in der roten Grafik dargestellt.

radish2.png

Zunächst wird aus der hypothetischen Funktion $ y = ax + b $ der Wert von $ y $ am 0. bis 4. Tag (die Anzahl der Tage beträgt $ x $) berechnet und der Fehler aus den tatsächlichen Wachstumsdaten berechnet. (Tag 0 ist der Tag, an dem die Samen begraben werden)

Tage(x) Tag 0 Tag 1 Tag 2 Tag 3 Tag 4
Aufzeichnung 0.0cm 0.3cm 1.9cm 2.8cm 4.3cm
Berechnet aus der Formel(y) b a+b 2a+b 3a+b 4a+b
Error(y-Aufzeichnung) b-0 (a+b)-0.3 (2a+b)-1.9 (3a+b)-2.8 (4a+b)-4.3

Der Fehler ist die Länge des rosa Teils in der folgenden Grafik.

radish2_2.png

Quadrieren Sie und addieren Sie dann, damit der Fehler nicht negativ ist. Unter der Annahme, dass der Gesamtfehler $ J $ ist, lautet die Berechnung wie folgt.

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

Finden Sie $ a $ und $ b $, die dieses $ J $ minimieren, und Sie sind fertig.

Wenn $ J $ teilweise als Funktion von $ a $ als 0 differenziert wird und $ J $ teilweise als Funktion von $ b $ als 0 differenziert wird und zwei gleichzeitige Gleichungen gelöst werden, ist $ J $ das Minimum. Naru $ a $ und $ b $ werden berechnet.

Hier finden Sie den Mindestwert einer zweidimensionalen Funktion mit zwei Variablen. http://mathtrain.jp/quadratic

Die obige Formel unterscheidet sich teilweise durch $ a $ ($ \ frac {∂J} {∂a} $), und die untere Formel unterscheidet sich teilweise durch $ b $ ($ \ frac {∂J} {∂b). } $).

\left\{
\begin{array}{ll}
0 = 60a+20b-59.4 \\
0 = 20a+10b-18.6 
\end{array}
\right.

Wenn Sie die simultanen Gleichungen lösen,

\left\{
\begin{array}{ll}
a = 1.11 \\
b=-0.36
\end{array}
\right.

Nebenan

y = 1.11x - 0.36 

Ich konnte die Funktion ableiten. Nach dem Zeichnen mit einem Diagramm

radish3_ans.png

Es fühlt sich sehr gut an !!

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()              

Allgemeine Formel

Im konkreten Beispiel ist die hypothetische Funktion eine lineare Funktion, kann jedoch für eine quadratische Funktion oder eine kubische Funktion besser geeignet sein. Vielleicht ist es normalerweise eine komplexere Beziehung.

Wenn Sie das Beispiel des Hatsuka-Rettichs an eine quadratische Funktion anpassen,

radish4.png

Und dies kann als eine bessere Formel angesehen werden. Das Wachstum von Hatsuka-Rettich kann nicht nur durch die Anzahl der Tage, sondern auch durch die Sonnenzeit und die Wassermenge beeinflusst werden.

Betrachten wir daher ein konkretes Beispiel, indem wir es in eine allgemeine Formel umwandeln.

Wenn es $ x_ {1} $ gibt, bestimmen $ x_ {2} $ Faktoren die Länge des Blattes, wie z. B. die Anzahl der Tage, die Menge an Sonnenschein, die Menge an Wasser, die gegeben werden soll, und $ \ cdots $$ n $. , $ x_ {3} $ $ \ cdots $ $ x_ {n} $. Der Koeffizient von $ x_ {n} $ sei $ \ theta_ {n} $.

Die Funktion und Hypothesenfunktion, die Sie endgültig ableiten möchten, kann durch die folgende Formel ausgedrückt werden. ($ X_ {1} $ bedeutet nicht $ x $ im Quadrat, sondern eine Funktion, die von $ x $ abhängt. Es kann hilfreich sein, sich den letzten Python-Code anzusehen.)

h_{\theta}(x) = \theta_{0}x_{0} + \theta_{1}x_{1} + \theta_{2}x_{2} +\cdots + \theta_{n}x_{n}

$ \ Theta_ {0} $ ist der $ b $ Teil des konkreten Beispiels und wird als $ x_ {0} = 1 $ betrachtet. Plötzlich kam $ h_ {\ theta} (x) $ heraus, aber $ y $ im konkreten Beispiel ist die Länge des Blattes.

Die obige hypothetische Funktion kann wie folgt mit der konkreten Beispielfunktion $ y = 1.11x --0.36 $ verknüpft werden.

y = -0.36 × 1 + 1.11 × x
h_{\theta}(x) = \theta_{0} × x_{0} + \theta_{1} × x_{1}

Angenommen, es gibt mehrere Beispieldaten für diese hypothetische Funktion, und die Daten lauten wie folgt.

x_{0}
(1 behoben)
x_{1}
(Tage)
x_{2}
(Sonnenlichtzeit h)
x_{3}
(Wassergehalt ml)
\cdots y
(Blattlänge cm)
1 1 14 150 \cdots 0.3
1 2 14 100 \cdots 1.9
1 3 14.1 160 \cdots 2.8
1 4 14.1 160 \cdots 4.3

Die Daten in der Spalte $ j $ der Zeile $ i $ können als $ x_ {j} ^ {(i)} $, $ y ^ {(i)} $ dargestellt werden. Wenn sie zugeordnet sind, sieht es so aus. Es ist eine Form. Es sieht aus wie ein Exponent, zeigt aber nur die Daten an.

x_{0}
(1 behoben)
x_{1}
(Tage)
x_{2}
(Sonnenlichtzeit h)
x_{3}
(Wassergehalt ml)
\cdots y
(Blattlänge cm)
x_{0}^{(1)} x_{1}^{(1)} x_{2}^{(1)} x_{3}^{(1)} \cdots y^{(1)}
x_{0}^{(2)} x_{1}^{(2)} x_{2}^{(2)} x_{3}^{(2)} \cdots y^{(2)}
x_{0}^{(3)} x_{1}^{(3)} x_{2}^{(3)} x_{3}^{(3)} \cdots y^{(3)}
x_{0}^{(4)} x_{1}^{(4)} x_{2}^{(4)} x_{3}^{(4)} \cdots y^{(4)}

Wenn die Daten in der ersten Spalte $ h_ {\ theta} (x) $ zugewiesen werden, werden sie als $ h_ {\ theta} (x ^ {(1)}) $ ausgedrückt.

Auf diese Weise kann der Gesamtfehler aus der hypothetischen Funktion wie folgt umgeschrieben werden. $ m $ ist die Anzahl der Datensätze. Im Beispiel der obigen Tabelle ist es 4.

J(\theta_{0},\theta_{1}, \cdots,\theta_{n})= \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 

Der Gesamtfehler $ J (\ theta_ {0}, \ theta_ {1}, \ cdots, \ theta_ {n}) $ wird minimiert $ \ theta_ {0}, \ theta_ {1}, \ cdots, \ theta_ Das Ziel ist es, eine Menge von {n} $ abzuleiten.

Von hier aus ersetzen wir es durch eine Matrix. Eine Matrix ist ein leistungsstarkes Element, mit dem Daten gleichzeitig berechnet werden können.

Um die hypothetische Funktion $ h_ {\ theta} (x) $ als Matrix darzustellen, müssen zunächst $ \ theta_ {0} $, $ \ theta_ {1} $, $ \ cdots $ $ \ theta_ {n} $, $ X_ {0} $, $ x_ {1} $, $ \ cdots $ $ x_ {n} $ wird durch eine Matrix dargestellt.

\theta=\begin{bmatrix}
\theta_{0} \\
\theta_{1} \\
\vdots\\
\theta_{n} 
\end{bmatrix}
,
  x=\begin{bmatrix}
x_{0} \\
x_{1} \\
\vdots\\
x_{n} 
\end{bmatrix}

Auf diese Weise platziert, kann $ h_ {\ theta} (x) $ durch das Produkt der transponierten Matrix von $ \ theta $ und der Matrix $ x $ dargestellt werden.

h_{\theta}(x)= \theta^T x\\

Die Translokation und das Stapeln der Matrix finden Sie hier. http://www.sist.ac.jp/~kanakubo/research/hosoku/trans_gyoretu.html

Der Datensatz $ x ^ {(i)} $ in der Spalte $ i $ wird durch eine Matrix dargestellt, und die Matrix $ X $ bei allen Datensätzen wird durch die transponierte Matrix jeder Spalte dargestellt. $ y ^ {(i)} $ wird auch durch eine Matrix dargestellt.

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}

Es sieht verwirrend aus, aber ich habe gerade die obige Tabelle in eine Matrix konvertiert.

Und die Geschichte bläst sofort weg.

Auf diese Weise kann $ \ theta $, das den Gesamtfehler $ J (\ theta) $ minimiert, durch Lösen der folgenden Matrixgleichung erhalten werden.

\theta =
(X^tX)^{-1}X^ty

Hier erfahren Sie, warum diese Formel verwendet wird. http://mathtrain.jp/leastsquarematrix

Außerdem wird $ X ^ {-1} $ als inverse Matrix von $ X $ bezeichnet (siehe hier). http://mathtrain.jp/inversematrix

Fügen Sie den Datensatz in diese Formel ein, um $ \ theta $ zu finden, und geben Sie ihn in $ \ theta_ {0}, \ theta_ {1}, \ cdots, \ theta_ {n} $ von $ h (\ theta) $ ein, um das Minimum zu erhalten Die Funktionsformel (Modellfunktion) nach der Quadratmethode ist vervollständigt.

Ich habe es in Python geschrieben

Ich habe diese Methode der kleinsten Quadrate in Python geschrieben. Sie werden in nur einer Zeile nach $ \ theta $ gefragt! !!

Erstens ist der Datensatz. Der Funktion $ y = 3 + 2 \ cos (x) + \ frac {1} {2} x $ wird eine Zufallszahl hinzugefügt, um einen Fehler zu erzeugen.

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)) 

In der allgemeinen Formel ist $ x_ {1} $ $ \ cos (x) $ und $ x_ {2} $ ist $ x $. Wenn die zu berechnenden Koeffizienten so berechnet werden können, dass $ \ theta_ {0} $ $ 3 $ ist, ist $ \ theta_ {1} $ $ 2 $ und $ \ theta_ {2} $ liegt nahe bei $ \ frac {1} {2} $. Es ist in Ordnung.

Erstellen Sie eine Matrix $ X $ mit allen Datensätzen.

linalg_lstsq.py


n = 3
X = np.zeros((len(x), n), float)
X[:,0] = 1
X[:,1] = np.cos(x)
X[:,2] = x

Der Ausdruck für $ \ theta $ ist diese eine Zeile, die linalg.lstsq in der Numpy-Bibliothek verwendet.

linalg_lstsq.py


(theta, residuals, rank, s) = linalg.lstsq(X, y)

https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html

Infolgedessen wurde es so.

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])

lstsqrs3.png lstsqrs_2-3.png

Ich konnte einen ziemlich genauen Wert erhalten, und selbst wenn Sie sich die Grafik ansehen, passt sie! !!

Ende

Da ich gerade angefangen habe, maschinelles Lernen zu studieren, lerne ich die Standardalgorithmen und -ideen. Ich kann nichts ganz Neues schreiben, aber ich hoffe, es hilft jemandem.

30d067ead81320ed8a9112ee25b96762_s.jpg

Recommended Posts

Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe eine Klasse in Python3 und Java geschrieben
[Basic Information Engineer Examination] Ich habe den Algorithmus der euklidischen Methode der gegenseitigen Teilung in Python geschrieben.
Verstehen Sie die Exponentialverteilung sorgfältig und zeichnen Sie in Python
Zeichnen und verstehen Sie die multivariate Normalverteilung in Python
Verstehe die Poisson-Distribution sorgfältig und zeichne in Python
Ich habe Python auf Japanisch geschrieben
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
Ich verstehe Python auf Japanisch!
Beachten Sie, dass es Python 3 unterstützt
[Python] Ich habe das Spiel von pip installiert und versucht zu spielen
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Ich habe python3.4 in .envrc mit direnv geschrieben und es zugelassen, aber ich habe einen Syntaxfehler erhalten
Sortieralgorithmus und Implementierung in Python
Ich habe Fizz Buzz in Python geschrieben
Ich habe die Bewegung Python3 ausprobiert, die die Richtung im Koordinatensystem ändert
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Beachten Sie, dass Python Bilder im Base64-Format dekodiert und lokal speichert
Ich habe die Jumbo-Lotterie zum Jahresende mit Python gekauft und analysiert, die in Colaboratory ausgeführt werden kann
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
Ich habe einen Tri-Tree geschrieben, der für die Implementierung von Hochgeschwindigkeitswörterbüchern in D-Sprache und Python verwendet werden kann
[Basic Information Engineer Examination] Ich habe einen Algorithmus für den Maximalwert eines Arrays in Python geschrieben.
[Python] Süß Ist es süß? Über Suiten und Ausdrücke in offiziellen Dokumenten
Derjenige, der die CSV-Datei teilt, liest und parallel verarbeitet
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Schriftliche Auswahlsortierung in C.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
[Python-Anfänger] Ich habe die Artikel gesammelt, die ich geschrieben habe
Suchen Sie es in der Warteschlange und bearbeiten Sie es
Ich habe den Gleitflügel in der Schöpfung geschrieben.
Ich dachte, es sei dasselbe wie Python, und ich war süchtig nach dem Problem, dass der Ruby-Interpreter nicht gestartet wurde.
Beachten Sie, dass cibuildwheel das Python-Rad (einschließlich des C ++ - Moduls) in großen Mengen mit CI erstellt und auf PyPI hochlädt
[Python] Vorsichtsmaßnahmen beim Erfassen von Daten durch Scraping und Einfügen in die Liste
[Basic Information Engineer Examination] Ich habe einen linearen Suchalgorithmus in Python geschrieben.
Sprechen Sie über die Funktionen, für die Pandas und ich im Projekt verantwortlich waren
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Irgendwie hat der Code, den ich geschrieben habe, funktioniert und ich war beeindruckt, also werde ich ihn veröffentlichen
Ich habe ein PyPI-Modul geschrieben, das den Parameterstil in Pythons sqlite3-Modul erweitert
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
Wenn ich matplotlib in Python versuche, heißt es'cairo.Context '.
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Geschrieben "Einführung in die Effektüberprüfung" in Python
Über den Unterschied zwischen "==" und "is" in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Ich habe versucht, die inverse Gammafunktion in Python zu implementieren
POST JSON mit Python und empfange mit PHP
Diejenige, die den Fortschrittsbalken in Python anzeigt
Ich möchte den Fortschritt in Python anzeigen!