Une analyse de régression simple peut être facilement effectuée à l'aide du modèle linear_model.LinearRegression () de scicit-learn. Je peux le faire. Ici, après avoir examiné le principe de l'analyse de régression simple, une analyse de régression simple est effectuée régulièrement sans utiliser LinearRegression (). Plus précisément, en utilisant CPU list data, "La densité d'intégration des circuits semi-conducteurs doublera en un an et demi à deux ans" [Moore. Je voudrais montrer que la loi de est valable empiriquement.
L'analyse de régression simple prédit la variable objective (y) avec une variable explicative (x), et exprime la relation entre elles sous la forme d'une équation linéaire y = ax + b. Par exemple, lorsque plusieurs paires de x et y sont obtenues comme données d'échantillon, telles que le temps d'apprentissage (x) et la note (y) des élèves, sur la base de ces données, par exemple, un nouveau temps d'apprentissage (x) Lorsqu'elle est connue, c'est une simple analyse de régression qui permet la prédiction de performance (y) correspondante.
Effectuer une analyse de régression simple équivaut à trouver la droite y = ax + b. Alors, comment trouvez-vous les pentes a et y section b? C'est là que le concept des moindres carrés entre en jeu. A et b peuvent être obtenus en utilisant la méthode appelée méthode des moindres carrés.
Exprimant la droite de régression souhaitée comme suit,
\hat{y}= ax+b
La méthode des moindres carrés équivaut à trouver a et b qui minimisent E ci-dessous.
E = \sum_{i=1}^{N} (y_i - \hat{y_i})^2 = \sum_{i=1}^{N} (y_i - (ax_i + b))^2 ...(1)
(y_i est la coordonnée y de chaque point de données de l'échantillon,\hat{y_i}Est une ligne droite\hat{y}= ax+b Désigne la coordonnée y de la valeur prédite sur.)
(En passant, n'est-il pas possible de simplement additionner la différence entre les points de données et les valeurs prédites et de la minimiser comme indiqué ci-dessous?
\sum_{i=1}^{N} (y_i - \hat{y_i})
Si vous y réfléchissez un instant, vous comprendrez peut-être que si les points de données sont supérieurs ou inférieurs à la valeur prédite, ils s'annuleront et la différence globale sera calculée moins qu'il n'y paraît, il est donc nécessaire de la mettre au carré. )
Maintenant, revenons au sujet principal. Alors, comment pouvons-nous trouver la paire de a et b qui minimise E dans (1) ci-dessus? L'équation (1) peut être considérée comme une équation quadratique avec a et b comme deux variables (xi et yi sont connus et peuvent être considérés comme des constantes).
En d'autres termes, si l'équation (1) est partiellement différenciée pour a et b et que la paire de a et b à laquelle ils deviennent = 0 est obtenue, alors a et b qui minimisent E peuvent être obtenus.
Calculons maintenant.
\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
C'est,
a\sum_{i=1}^{N}x_i^2+b\sum_{i=1}^{N}x_i=\sum_{i=1}^{N} x_iy_je ...(2)
a\sum_{i=1}^{N}x_i+bN=\sum_{i=1}^{N} y_je · · ·(3)
ici
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) et (3) sont
aA+bB=C ...(2)'
aB+bN=RÉ ...(3)'
Peut être fait. Résolvons régulièrement cette équation simultanée (l'indice de Σ est omis ci-dessous pour éliminer la difficulté de lecture).
(2)'\times N - (3)'\Du temps 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(Dénominateur N^Divisé par 2)・ ・ ・(4)
De même,
(2)'\times B - (3)'\Des temps 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(Dénominateur N^Divisé par 2)・ ・ ・(5)
Maintenant, nous avons une paire de a et b qui minimise E. Vous pouvez facilement trouver a et b en substituant les coordonnées x et y des points de données des échantillons de données dans les équations (4) et (5). La droite de régression à obtenir est finalement de (4) et (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)
Peut être exprimé comme.
Jusqu'à présent, nous avons vu depuis longtemps le principe de l'analyse de régression simple. Maintenant, en utilisant une analyse de régression simple, la loi de Moore déclare que «la densité d'intégration des circuits semi-conducteurs double en un an et demi à deux ans». Je voudrais voir si /mu/A02712.html) est établi empiriquement. Tout d'abord, récupérons le CSV de la liste montrant la transition historique du nombre de processeurs CPU en grattant en référence à here.
Une fois que vous avez les données, commençons à coder. Jetons d'abord un coup d'œil aux données acquises.
import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('processor.csv', sep='\t')
df
Des données comme celles-ci sont produites.
Ensuite, extrayons uniquement l'année de sortie du processeur et le nombre de transistors et sortons-le en tant que df1.
df1 = pd.concat([df['Date ofintroduction'], df['MOS transistor count'] ], axis=1)
df1
Ce sera comme suit. Parmi les données de comptage de transistors, celle avec "?" Ne peut pas être utilisée, donc excluons-la.
df2 = df1[df1['MOS transistor count'] != '?']
df2.head(10)
C'est devenu beau comme ci-dessous.
En regardant les données, le commentaire [] reste après l'année de sortie et le nombre de transistors. De plus, comme les virgules qui séparent le nombre de transistors de 3 chiffres sont un obstacle, supprimons-les par l'opération suivante.
#Spécifié pour supprimer les non-nombres (virgule de séparation à trois chiffres)
decimal = re.compile(r'[^\d]')
#Commentaire sur l'année de sortie[Extrayez uniquement la partie gauche de "" et ajoutez-la à df2 en tant que colonne "année".
df2['year'] = df2['Date ofintroduction'].apply(lambda x: int(x.split('[')[0]))
#Extrayez la première partie de numéro correspondant (y compris la virgule) pour le nombre de transistors, puis supprimez la virgule et ajoutez-la à df2 en tant que colonne «compte de transistors».
df2['transistor count'] = df2['MOS transistor count'].apply(lambda x: int(decimal.sub('', re.match(r'[\d, \,]+', x).group() )))
#production
df2
Le résultat est le suivant, et vous pouvez voir que les colonnes «année» et «nombre de transistors» ont été nouvellement ajoutées et les données sont propres.
Dessinons un diagramme de dispersion de l'axe horizontal "année" et de l'axe vertical "nombre de transistors" en fonction des données nettoyées.
#Diagramme de dispersion d'échantillons de données
X = df2['year']
Y = df2['transistor count']
plt.scatter(X, Y)
plt.xlabel('year')
plt.ylabel('transistor count')
plt.show()
Vous pouvez voir que le nombre de transistors augmente de façon exponentielle.
Maintenant, prenons le journal du nombre de transistors et représentons-le à nouveau.
#Diagramme de dispersion du journal des données d'exemple
Y = np.log(Y)
plt.scatter(X, Y)
plt.xlabel('year')
plt.ylabel('transistor count')
plt.show()
Vous pouvez voir une belle relation linéaire.
Appliquons maintenant une analyse de régression simple à ce graphique. Mettons dans le code l'équation (6) dérivée du "Principe de l'analyse de régression simple".
#Diagramme de dispersion du journal des données d'exemple
Y = np.log(Y)
plt.scatter(X, Y ,alpha=.8)
#Dérivation de la droite de régression
denom = (X**2).mean() - (X.mean())**2 # a,dénominateur de b
a = ( (X*Y).mean() - X.mean()*Y.mean() ) / denom
b = ( Y.mean()*(X**2).mean() - X.mean()*(X*Y).mean() ) / denom
#Expression de la droite de régression
pred_Y = a*X + b
# R-calcul du carré
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()
Le résultat est le suivant. (R au carré = 0,91)
(Pour donner une explication supplémentaire sur R-carré ici, R-carré est également appelé coefficient de détermination et est un indice qui montre la validité de la droite de régression en tant que modèle de prédiction. Il peut être exprimé comme suit dans une formule mathématique. Oui (SqE signifie erreur au carré).
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}
Cette formule compare la moyenne, c'est-à-dire la variation des points de données par rapport à la ligne moyenne des données d'échantillon et la variation des points de données par rapport à la droite de régression. Par exemple, lorsque la valeur de ΣSqEline est égale à la valeur de ΣSqEmean, R2 devient 0 et la ligne de régression correspond à la ligne de valeur moyenne des points de données, indiquant qu'elle ne fonctionne pas du tout comme un modèle de prédiction (retour). La ligne droite doit fonctionner comme plus que la ligne droite moyenne, qui est la valeur représentative des données). En revanche, lorsque ΣSqEline vaut 0, tous les points de données sont sur la droite de régression, ce qui signifie que le modèle de prédiction peut prédire complètement les points de données. À ce moment, R2 vaut 1. )
Maintenant, vérifions grossièrement la loi de Moore sur la base de la droite de régression obtenue. Comme nous l'avons vu, la relation entre le nombre de transistors (tc) et la droite de régression peut être exprimée comme suit.
log(tc) = ax + b \\
\therefore tc = \exp(ax + b)
Par conséquent, si le nombre de transistors atteint le double du nombre de transistors dans une certaine année (x1) dans une certaine année (x2),
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}
En d'autres termes, log2 / a calculé à partir de la pente a de la droite de régression signifie le nombre d'années qu'il faut pour que le nombre de transistors double. Calculons immédiatement le nombre d'années sur cette base.
print("time to double:", round(np.log(2)/a,1), "years")
output
time to double: 2.1 years
Il a fallu environ deux ans pour doubler le nombre de transistors. Moore, c'est incroyable.