[PYTHON] Einfache Regressionsanalyse, verstanden durch mathematische Überprüfung des Moore'schen Gesetzes an der High School

Einführung

Eine einfache Regressionsanalyse kann einfach mit dem Modell linear_model.LinearRegression () von scikit-learn durchgeführt werden. Ich kann es schaffen Hier wird nach Überprüfung des Prinzips der einfachen Regressionsanalyse eine einfache Regressionsanalyse ohne Verwendung von LinearRegression () kontinuierlich durchgeführt. Insbesondere unter Verwendung von CPU-Listendaten "wird sich die Integrationsdichte von Halbleiterschaltungen in anderthalb bis zwei Jahren verdoppeln" [Moore. Ich möchte zeigen, dass das Gesetz von empirisch gilt.

Prinzip der einfachen Regressionsanalyse

Eine einfache Regressionsanalyse sagt die Zielvariable (y) mit einer erklärenden Variablen (x) voraus und drückt die Beziehung zwischen ihnen in Form einer linearen Gleichung y = ax + b aus. Wenn zum Beispiel mehrere Paare von x und y als Beispieldaten erhalten werden, wie beispielsweise die Lernzeit (x) und die Noten (y) von Schülern, basierend auf diesen Daten, zum Beispiel eine neue Lernzeit (x) Wenn es bekannt ist, ist es eine einfache Regressionsanalyse, die die entsprechende Vorhersage der Leistung (y) ermöglicht. download.png

Das Durchführen einer einfachen Regressionsanalyse entspricht dem Ermitteln der Geraden y = ax + b. Wie finden Sie die Pisten a und y Abschnitt b? Hier kommt das Konzept der Methode der kleinsten Quadrate ins Spiel. A und b können unter Verwendung der als Methode der kleinsten Quadrate bezeichneten Methode erhalten werden.

Die gewünschte Regressionslinie wie folgt ausdrücken:

\hat{y}= ax+b

Die Methode der kleinsten Quadrate entspricht dem Finden von a und b, die E unten minimieren.

E = \sum_{i=1}^{N}  (y_i - \hat{y_i})^2 = \sum_{i=1}^{N}  (y_i - (ax_i + b))^2 ...(1)
(y_i ist die y-Koordinate jedes Datenpunkts in der Stichprobe,\hat{y_i}Ist eine gerade Linie\hat{y}= ax+b Bedeutet die y-Koordinate des vorhergesagten Werts auf.)

(Abgesehen davon ist es nicht möglich, die Differenz zwischen den Datenpunkten und den vorhergesagten Werten einfach zu summieren und wie unten gezeigt zu minimieren?

\sum_{i=1}^{N}  (y_i - \hat{y_i})

Wenn Sie einen Moment darüber nachdenken, werden Sie vielleicht verstehen, dass sich die Datenpunkte, wenn sie über oder unter dem vorhergesagten Wert liegen, gegenseitig aufheben und die Gesamtdifferenz weniger berechnet wird, als es aussieht. Daher ist es notwendig, sie zu quadrieren. )

Kommen wir nun zum Hauptthema zurück. Wie können wir dann das Paar von a und b finden, das E in (1) oben minimiert? Gleichung (1) kann als quadratische Gleichung mit a und b als zwei Variablen betrachtet werden (xi und yi sind bekannt und können als Konstanten betrachtet werden).

Das heißt, wenn Gleichung (1) für a und b teilweise differenziert wird und das Paar von a und b erhalten wird, bei dem sie = 0 werden, dann können a und b erhalten werden, die E minimieren.

Berechnen wir jetzt.

 \frac{\partial E}{\partial a} = \sum_{i=1}^{N}  2(y_i - (ax_i+b))(-x_i)
=2(-\sum_{i=1}^{N} x_iy_i + a\sum_{i=1}^{N}x_i^2+b\sum_{i=1}^{N}x_i)=0
 \frac{\partial E}{\partial b} = \sum_{i=1}^{N}  2(y_i - (ax_i+b))(-1)
=2(-\sum_{i=1}^{N} y_i + a\sum_{i=1}^{N}x_i+b\sum_{i=1}^{N}1)=0

Das ist,

a\sum_{i=1}^{N}x_i^2+b\sum_{i=1}^{N}x_i=\sum_{i=1}^{N} x_iy_ich ...(2)
a\sum_{i=1}^{N}x_i+bN=\sum_{i=1}^{N} y_ich · · ·(3)

Hier

A =\sum_{i=1}^{N}x_i^2,\quad B =\sum_{i=1}^{N}x_i,\quad C =\sum_{i=1}^{N}x_iy_i,\quad D =\sum_{i=1}^{N}y_i

(2) und (3) sind

aA+bB=C ...(2)'
aB+bN=D ...(3)'

Kann gemacht werden. Lösen wir diese simultane Gleichung stetig (der Index von Σ wird unten weggelassen, um die Schwierigkeit des Lesens zu beseitigen).

(2)'\times N - (3)'\Aus Zeiten B.\\
a(AN-B^2)=CN-BD\\
\therefore a = \frac{CN-BD}{AN-B^2}=\frac{N\sum x_iy_i-\sum x_i\sum y_i}{N\sum x_i^2-(\sum x_i)^2}\\=\frac{\bar{xy}-\bar{x}\bar{y}}{\bar{x^2}-\bar{x}^2} \quad(N Nenner^Geteilt durch 2)・ ・ ・(4)

Ähnlich,

(2)'\times B - (3)'\Aus Zeiten A.\\
b(B^2-AN)=BC-AD\\
\therefore b = \frac{BC-AD}{B^2-AN}=\frac{\sum x_i\sum x_iy_i-\sum x_i^2\sum y_i}{(\sum x_i)^2-N\sum x_i^2}=\frac{\sum x_i^2\sum y_i-\sum x_i\sum x_iy_i}{N\sum x_i^2-(\sum x_i)^2}\\=\frac{\bar{x^2}\bar{y}-\bar{x}\bar{xy}}{\bar{x^2}-\bar{x}^2} \quad(N Nenner^Geteilt durch 2)・ ・ ・(5)

Jetzt haben wir ein Paar von a und b, das E minimiert. Sie können a und b leicht finden, indem Sie die x- und y-Koordinaten der Datenpunkte der Probendaten in die Gleichungen (4) und (5) einsetzen. Die zu erhaltende Regressionslinie ergibt sich schließlich aus (4) und (5).

\hat{y}=ax+b=\frac{\bar{xy}-\bar{x}\bar{y}}{\bar{x^2}-\bar{x}^2}x+\frac{\bar{x^2}\bar{y}-\bar{x}\bar{xy}}{\bar{x^2}-\bar{x}^2}・ ・ ・(6)

Kann ausgedrückt werden als.

Moores Gesetz

Bisher haben wir das Prinzip der einfachen Regressionsanalyse schon lange gesehen. Unter Verwendung einer einfachen Regressionsanalyse stellt Moores Gesetz fest, dass sich "die Integrationsdichte von Halbleiterschaltungen in anderthalb bis zwei Jahren verdoppelt". Ich würde gerne sehen, ob /mu/A02712.html) empirisch ermittelt wurde. Lassen Sie uns zunächst die CSV der Liste abrufen, die den historischen Übergang der Anzahl der CPU-Prozessoren durch Scraping unter Bezugnahme auf hier zeigt.

Vorbereitung

Sobald Sie die Daten haben, beginnen wir mit der Codierung. Schauen wir uns zunächst die erfassten Daten an.

import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('processor.csv', sep='\t')
df

Daten wie diese werden ausgegeben. Screen Shot 2020-02-28 at 16.19.40.png

Als nächstes extrahieren wir nur das CPU-Release-Jahr und die Anzahl der Transistoren und geben es als df1 aus.

df1 = pd.concat([df['Date ofintroduction'], df['MOS transistor count'] ], axis=1)
df1

Es wird wie folgt sein. Screen Shot 2020-02-28 at 16.22.38.png Von den Transistorzähldaten kann die mit "?" Nicht verwendet werden. Schließen wir sie also aus.

df2 = df1[df1['MOS transistor count'] != '?']
df2.head(10)

Es wurde schön wie unten. Screen Shot 2020-02-28 at 16.30.03.png

Bei Betrachtung der Daten bleibt der Kommentar [] nach dem Veröffentlichungsjahr und der Anzahl der Transistoren erhalten. Da die Kommas, die die Anzahl der Transistoren durch drei Ziffern trennen, ein Hindernis darstellen, entfernen wir sie durch die folgende Operation.

#Spezifiziert zum Entfernen von Nicht-Zahlen (dreistelliges Trennkomma)
decimal = re.compile(r'[^\d]')
#Kommentar zum Erscheinungsjahr[Extrahieren Sie nur den linken Teil von "" und fügen Sie ihn als "Jahr" -Spalte zu df2 hinzu.
df2['year'] = df2['Date ofintroduction'].apply(lambda x: int(x.split('[')[0]))
#Extrahieren Sie den ersten übereinstimmenden Nummernteil (einschließlich Komma) für die Anzahl der Transistoren, entfernen Sie dann das Komma und fügen Sie es als Spalte "Transistoranzahl" zu df2 hinzu.
df2['transistor count'] = df2['MOS transistor count'].apply(lambda x:  int(decimal.sub('', re.match(r'[\d, \,]+', x).group() )))
#Ausgabe
df2

Das Ergebnis ist wie folgt, und Sie können sehen, dass die Spalten "Jahr" und "Transistoranzahl" neu hinzugefügt wurden und die Daten sauber sind. Screen Shot 2020-02-28 at 16.38.21.png

Handlung

Zeichnen wir ein Streudiagramm der horizontalen Achse "Jahr" und der vertikalen Achse "Anzahl der Transistoren" basierend auf den gereinigten Daten.

#Streudiagramm der Probendaten
X = df2['year']
Y = df2['transistor count']

plt.scatter(X, Y)
plt.xlabel('year')
plt.ylabel('transistor count')
plt.show()

Sie sehen, dass die Anzahl der Transistoren exponentiell zunimmt. download (1).png

Nehmen wir nun das Protokoll der Anzahl der Transistoren und zeichnen es erneut auf.

#Log-Streudiagramm der Probendaten
Y = np.log(Y)
plt.scatter(X, Y)
plt.xlabel('year')
plt.ylabel('transistor count')
plt.show()

Sie können eine schöne lineare Beziehung sehen. download (2).png

Wenden wir nun eine einfache Regressionsanalyse auf dieses Diagramm an. Lassen Sie uns die in "Prinzip der einfachen Regressionsanalyse" abgeleitete Gleichung (6) in den Code einfügen.

#Log-Streudiagramm der Probendaten
Y = np.log(Y)
plt.scatter(X, Y ,alpha=.8)

#Ableitung der Regressionslinie
denom = (X**2).mean() - (X.mean())**2 # a,Nenner von b
a = ( (X*Y).mean() - X.mean()*Y.mean() ) / denom
b = ( Y.mean()*(X**2).mean() - X.mean()*(X*Y).mean() ) / denom

#Ausdruck der Regressionslinie
pred_Y = a*X + b

# R-Berechnung des Quadrats
SSE_l = (Y - pred_Y).dot( (Y - pred_Y) )
SSE_m = (Y - Y.mean()).dot( (Y - pred_Y.mean()) )

r2 = 1 - SSE_l / SSE_m

plt.plot(X, pred_Y, 'k', label='$\hat{y}=ax+b$')
plt.title('$R^2 = %s$'%round(r2,2))
plt.ylabel('transistor count')
plt.xlabel('year')
plt.legend()
plt.show()

Das Ergebnis ist wie folgt. (R-Quadrat = 0,91) download.png

(Um hier eine ergänzende Erklärung zum R-Quadrat zu geben, wird das R-Quadrat auch als Bestimmungskoeffizient bezeichnet und ist ein Index, der die Gültigkeit der Regressionslinie als Vorhersagemodell anzeigt. Sie kann in einer mathematischen Formel wie folgt ausgedrückt werden. Ja (SqE steht für quadratischen Fehler).

R^2 = 1 - \frac{\sum SqE_{line}}{\sum SqE_{mean}}= 1 - \frac{\sum (y_i - \hat{y_i})^2}{\sum (y_i - \bar{y})^2}

Diese Formel vergleicht den Mittelwert, dh die Variation der Datenpunkte in Bezug auf die durchschnittliche Linie der Probendaten und die Variation der Datenpunkte in Bezug auf die Regressionslinie. Wenn beispielsweise der Wert von ΣSqEline gleich dem Wert von ΣSqEmean ist, wird R2 zu 0, und die Regressionslinie stimmt mit der Durchschnittswertlinie der Datenpunkte überein, was darauf hinweist, dass sie überhaupt nicht als Vorhersagemodell fungiert (Rückgabe). Die gerade Linie sollte mehr als die durchschnittliche gerade Linie sein, die den repräsentativen Wert der Daten darstellt. Wenn andererseits ΣSqEline 0 ist, befinden sich alle Datenpunkte auf der Regressionslinie, was bedeutet, dass das Vorhersagemodell die Datenpunkte vollständig vorhersagen kann. Zu diesem Zeitpunkt ist R2 1. )

Überprüfung des Mooreschen Gesetzes

Lassen Sie uns nun das Moore'sche Gesetz anhand der erhaltenen Regressionslinie grob überprüfen. Wie wir gesehen haben, kann die Beziehung zwischen der Anzahl der Transistoren (tc) und der Regressionslinie wie folgt ausgedrückt werden.

log(tc) = ax + b \\
\therefore tc = \exp(ax + b)

Wenn daher die Anzahl der Transistoren in einem bestimmten Jahr (x1) in einem bestimmten Jahr (x2) die doppelte Anzahl von Transistoren erreicht,

2 = \frac{\exp(ax_2 + b)}{\exp(ax_1 + b)} = exp(a(x_2-x_1))\\
\therefore log2 = a(x_2-x_1)\\
\therefore x_2 - x_1 = \frac{log2}{a}

Mit anderen Worten bedeutet log2 / a, berechnet aus der Steigung a der Regressionslinie, die Anzahl der Jahre, die erforderlich sind, um die Anzahl der Transistoren zu verdoppeln. Berechnen wir sofort die Anzahl der Jahre darauf basierend.

print("time to double:", round(np.log(2)/a,1), "years")

output


time to double: 2.1 years

Es dauerte ungefähr zwei Jahre, um die Anzahl der Transistoren zu verdoppeln. Moore, das ist unglaublich.

Recommended Posts

Einfache Regressionsanalyse, verstanden durch mathematische Überprüfung des Moore'schen Gesetzes an der High School
Einfache Regressionsanalyse mit Python
Erste einfache Regressionsanalyse in Python
Einfache Implementierung einer Regressionsanalyse mit Keras
Grundlagen der Regressionsanalyse
Regressionsanalyse mit Python
2. Multivariate Analyse in Python 1-1. Einfache Regressionsanalyse (Scikit-Learn)
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
2. Multivariate Analyse in Python 1-2. Einfache Regressionsanalyse (Algorithmus)
Eine einfache Datenanalyse von Bitcoin, die von CoinMetrics in Python bereitgestellt wird
Algorithmus für maschinelles Lernen (Einzelregressionsanalyse)
Das Gesetz der Zahlen in Python
Maschinelles Lernen mit Python (2) Einfache Regressionsanalyse