scikit-learn 线性回归学习

导数知识

几种常见函数的导数:
① C’=0(C为常数);
② (xn)’=nx(n-1) (n∈Q);
③ (sinx)’=cosx;
④ (cosx)’=-sinx;
⑤ (ex)’=ex;
⑥ (ax)’=axIna (ln为自然对数)
⑦ loga(x)’=(1/x)loga(e)

导数的四则运算
①(u±v)’=u’±v’
②(uv)’=u’v+uv’
③(u/v)’=(u’v-uv’)/ v^2
④[u(v)]’=[u’(v)]*v’ (u(v)为复合函数f[g(x)])

矩阵转置
scikit-learn 线性回归学习_第1张图片
线性回归的方程 机器学习本质:解方程 有斜率 截距

线性回归

引言

最小二乘法(Least Squares Method,简记为LSE)是一个比较古老的方法,源于天文学和测地学上的应用需要。在早期数理统计方法的发展中,这两门科学起了很大的作用。丹麦统计学家霍尔把它们称为“数理统计学的母亲”。此后近三百年来,它广泛应用于科学实验与工程技术中。美国统计史学家斯蒂格勒( S. M. Stigler)指出, 最小二乘方法是19世纪数理统计学的压倒一切的主题。1815年时,这方法已成为法国、意大利和普鲁士在天文和测地学中的标准工具,到1825年时已在英国普遍使用。追溯到1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,但是根据大多数人计算的结果来寻找谷神星都没有结果。时年24岁的高斯也计算了谷神星的轨道。奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道重新发现了谷神星。高斯于其1809年的著作《关于绕日行星运动的理论》中。在此书中声称他自1799年以来就使用最小二乘方法,由此爆发了一场与勒让德的优先权之争。近代学者经过对原始文献的研究,认为两人可能是独立发明了这个方法,但首先见于书面形式的,以勒让德为早。然而,现今教科书和著作中,多把这个发明权归功于高斯。其原因,除了高斯有更大的名气外,主要可能是因为其正态误差理论对这个方法的重要意义。勒让德在其著作中,对最小二乘方法的优点有所阐述。然而,缺少误差分析。我们不知道,使用这个方法引起的误差如何,就需建立一种误差分析理论。高斯于1823年在误差e1 ,… , en独立同分布的假定下,证明了最小二乘方法的一个最优性质: 在所有无偏的线性估计类中,最小二乘方法是其中方差最小的!在德国10马克的钞票上有高斯像,并配了一条正态曲线。在高斯众多伟大的数学成就中挑选了这一条,亦可见这一成就对世界文明的影响。

最小二乘法(平方)

scikit-learn 线性回归学习_第2张图片
xi [[0.5],[1],[2],[3],[4]]
yi:1,2,4,6,8
y: = wx + b ----> wx + b
H = ((wxi + b- yi)^2).sum()
w = 2;b = 0-----> H最小值
scikit-learn 线性回归学习_第3张图片
scikit-learn 线性回归学习_第4张图片
scikit-learn 线性回归学习_第5张图片

梯度下降

y = (x - 2.5)**2 - 1
scikit-learn 线性回归学习_第6张图片

线性

得名于f(x)=ax+b的图像的形象 很直观 就是一条直线的形象
scikit-learn 线性回归学习_第7张图片

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib  inline
from sklearn import datasets

# 波士顿房价
boston = datasets.load_boston()

X = np.linspace(0,10,50).reshape(-1,1)
X
#array([[ 0.        ], [ 0.20408163],... [ 9.59183673],[ 9.79591837],[10.        ]])

y = np.random.randint(2,8,size = 1)*X
y
#array([[ 0.        ],[ 1.2244898 ],...[57.55102041],[58.7755102 ],[60.        ]])

y/X
#array([[nan],[ 6.],[ 6.],...[ 6.],[ 6.]])

lr = LinearRegression()
lr.fit(X,y)
# coeficient 效率,斜率
# w ---->weight 权重,
lr.coef_
#array([[6.]])

w ^ = ( X T X ) − 1 X T y \hat{w} = (X^TX)^{-1}X^Ty w^=(XTX)1XTy

# 线性代数中的矩阵运算
np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
#array([[6.]])

最 小 二 乘 法 H = ∑ i = 0 N ( X w − y ) 2 最小二乘法 H = \sum_{i = 0}^N(Xw - y)^2 H=i=0N(Xwy)2
2 ( X w − y ) X = 0 2(Xw - y)X = 0 2(Xwy)X=0
( X w − y ) X X − 1 = 0 X − 1 (Xw - y)XX^{-1} = 0X^{-1} (Xwy)XX1=0X1
X w − y = 0 Xw - y = 0 Xwy=0
X w = y Xw = y Xw=y
X T X w = X T y X^TXw = X^Ty XTXw=XTy
( X T X ) − 1 ( X T X ) w = ( X T X ) − 1 X T y (X^TX)^{-1}(X^TX)w = (X^TX)^{-1}X^Ty (XTX)1(XTX)w=(XTX)1XTy
I w = ( X T X ) − 1 X T y Iw = (X^TX)^{-1}X^Ty Iw=(XTX)1XTy
w = ( X T X ) − 1 X T y w = (X^TX)^{-1}X^Ty w=(XTX)1XTy
并不是每个矩阵都有逆矩阵,但是都有转置矩阵,现将矩阵乘它的转置矩阵,变成方阵,就有转置矩阵了。

X = boston['data']
y = boston['target']

X.shape
#(506, 13)

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)

X.shape
#(506, 13)

lr = LinearRegression(fit_intercept=False) #不考虑截距
lr.fit(X_train,y_train)
# 斜率个数:属性的个数决定
display(lr.coef_,lr.intercept_)
#array([-0.1412295 ,  0.04181349, -0.01322025,  1.86963613, -4.15101845,6.06733637, -0.01337729, -1.09192302,  0.17925408, -0.00889826,-0.41013493,  0.01643046, -0.3599472 ])
#0.0

# 算法预测的结果
lr.predict(X_test).round(2)[:25]
#array([21.11, 17.72, 31.43,  2.33, 24.62, 19.41, 20.77,  8.16, 26.16,19.31, 20.68,  7.19, 43.46, 24.02, 21.2 , 17.67, 10.54, 14.64,27.81, 27.43, 22.87, 30.66, 19.62, 37.61, 30.9 ])

f ( x ) = w 1 ∗ x 1 + w 2 ∗ x 2 + … … + w 13 ∗ x 13 f(x) = w1*x1 + w2*x2 + …… + w13*x13 f(x)=w1x1+w2x2++w13x13

w = lr.coef_
w
#array([-0.1412295 ,  0.04181349, -0.01322025,  1.86963613, -4.15101845,6.06733637, -0.01337729, -1.09192302,  0.17925408, -0.00889826,-0.41013493,  0.01643046, -0.3599472 ])

X_test.dot(w).round(2)[:25]
#array([21.11, 17.72, 31.43,  2.33, 24.62, 19.41, 20.77,  8.16, 26.16,19.31, 20.68,  7.19, 43.46, 24.02, 21.2 , 17.67, 10.54, 14.64,27.81, 27.43, 22.87, 30.66, 19.62, 37.61, 30.9 ])

# '真实'的房价显示
y_test[:25]
#array([16.4, 18.6, 41.3,  8.8, 22.8, 27.1, 18.7, 27.5, 22. , 14.1, 16.1,5. , 50. , 22.6, 13.8, 20.8, 12. , 12.8, 22.9, 26.5, 21.5, 29.9,18.3, 50. , 50. ])

lr = LinearRegression(fit_intercept=True) #带截距
lr.fit(X_train,y_train)
display(lr.coef_,lr.intercept_)
#array([-1.41151959e-01,  4.11921987e-02, -1.40329665e-03,  1.62461478e+00,-1.74893870e+01,  3.95218799e+00, -4.11935673e-03, -1.60614632e+00,2.97047505e-01, -1.16287244e-02, -9.43595535e-01,  1.09847236e-02,-4.79093686e-01])
#35.204261036207875 #截距

f ( x ) = w 1 ∗ x 1 + w 2 ∗ x 2 + … … + w 13 ∗ x 13 + b f(x) = w1*x1 + w2*x2 + …… + w13*x13 + b f(x)=w1x1+w2x2++w13x13+b

lr.predict(X_test).round(2)[:15]
#array([19.23, 16.17, 33.17,  3.79, 28.58, 19.67, 21.32, 13.91, 27.06,17.79, 18.98,  6.42, 43.27, 24.57, 20.47])

# 根据斜率和截距构造方程,进行求解的结果
(X_test.dot(lr.coef_) + lr.intercept_).round(2)[:15]
#array([19.23, 16.17, 33.17,  3.79, 28.58, 19.67, 21.32, 13.91, 27.06,17.79, 18.98,  6.42, 43.27, 24.57, 20.47])

你可能感兴趣的:(scikit-learn,python,算法,机器学习)