一: 线性回归方程

线性回归(英语:linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量

之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量

的情况称为简单回归,大于一个自变量情况的叫做多元回归

​ 在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这些模型被叫做

线性模型。最常用的线性回归建模是给定X值的y的条件均值是X的仿射函数。不太一般的情况,线性回归模型可以

是一个中位数或一些其他的给定X的条件下y的条件分布的分位数作为X的线性函数表示。像所有形式的回归分析一

样,线性回归也把焦点放在给定X值的y的条件概率分布,而不是X和y的联合概率分布(多元分析领域)。

​ 线性回归有很多实际用途。分为以下两大类:

  1. 如果目标是预测或者映射,线性回归可以用来对观测数据集的和X的值拟合出一个预测模型。当完成这样一个

    模型以后,对于一个新增的X值,在没有给定与它相配对的y的情况下,可以用这个拟合过的模型预测出一个y

    值。

  2. 给定一个变量y和一些变量X1X1,...,XpXp{\displaystyle X_{1}}X_1,...,{\displaystyle X_{p}}X_pX1​X1​,...,Xp​Xp​,这些变量有可能与y相关,线性回归分析可以用来量化y与Xj之

    间相关性的强度,评估出与y不相关的,XjXj{\displaystyle X_{j}}X_jXj​Xj​并识别出哪些XjXj{\displaystyle X_{j}}X_jXj​Xj​的子集包含了关于y的冗余信息。

使用sklearn线性回归模型(jupyter)

这里我们以波士顿的房价数据来进行使用分析

(一): 导入sklearn

import numpy as np# 线性回归,拟合方程,求解系数, 一次幂
# 线性方程:直来直去,不拐弯
from sklearn.linear_model import LinearRegression
# 导入数据集
from sklearn import datasets
# 导入数据分离的方法(获取数据后,一部分数据用来让回归模型学习,另一部分用来预测)
from sklearn.model_selection import train_test_split

(二): 获取波士顿房价数据

# 获取的数据是numpy,ndarray类型
data = datasets.load_boston()
# 该数据内有完整的影响房价的因素和完整的房价信息,本次实验就是将数据分为两部分, 一部分用来训练模型,另一部分用来预测,最后将预测出来的数据和已有的完整信息进行对比,判断该模型是否适用于这组房价数据data   # 查看data的数据结构
data.feature_names   # 查看影响房价的属性名# x是属性,特征,未知数
X = data['data']
X.shape   # 运行结果是(506, 13), 506表示样本是506个, 每个样本采集了13个属性特征;13个属性,需要构建构建了13元一次方程# y是房价的估值
y = data['target']# !!!!!!!!!!
# X, y = datasets.load_boston(True) 获取到X, y的值和以上的一样

(三): 使用模型进行预测

X_train, X_test, y_train, y_test = train_test_split(X, y)   # 将数据进行分离(默认是3:1); train_test_split(X, y)函数会随机打乱顺序display(X_train.shape, X_test.shape)   # (379, 13) ; (127, 13)# 声明算法
linear = LinearRegression()# 训练模型
linear.fit(X_train, y_train)   # X_train, y_train是之前分离出来用来训练模型的数据# 预测
y_ = linear.predict(X_test).round(1)   # X_test是影响房价的因素,该预测模型能根据影响房价的因素预测剩余部分的房价# 预估数据和实际数据比较
print(y_)
print(y_test)

经过估计数据和实际数据对比,说明算法模型适用于数据

(四): 自建方程预测数据 与 使用线性模型得到的数据对比

​ 假设波士顿的房价数据符合线性回归的特性,则我们可以通过构建线性方程来预测波士顿剩余部分的房价信息

根据一次线性回归方程: f(X)=Xw+bf(X) = Xw+bf(X)=Xw+b 可推导得出: f(X)=w1x1+W2x2+...+w13x13+bf(X) = w_1x_1+W_2x_2+...+w_{13}x_{13} +bf(X)=w1​x1​+W2​x2​+...+w13​x13​+b (有13个影响房

价的因素)

代码如下:

# 通过训练模型,可从模型中得出系数w
w_ = linear.coef_# 通过训练模型,可从模型中得出截距b
b_ = linear.intercept_# 自建方程
def fun(w_, b_, X):return np.dot(X, w_)+b_# 调用方程得到预估的房价信息
fun(w_, b_, X_test).round(1)   # round(1)保留一位小数
'''
array([31.3, 13.4, 28.6, 20.5, 20.4, 19.4, 32.2, 24. , 25.8, 29.5, 24.5,25.2, 31.9,  8.2, 20.9, 29.3, 22.3, 35.2, 16.4, 18.5, 30.8, 41.1,16.2, 13.7, 17.7, 23.8,  7.8, 12. , 20.5, 15.3, 29.3, 26.8, 31.8,26. , 30.4, 39.2, 25.3, 40.7, 11.6, 27.3, 16.7, 18.8, 19.5, 19.9,20.7, 22.8, 17.4, 21.6, 23.3, 30. , 25.2, 23.7, 34.2, 18.2, 33.5,16. , 28.3, 14.1, 24.2, 16.2, 16.7, 23.5, 16. , 21.4, 21.8, 28.2,25.7, 31.2, 18.8, 26.4, 28.3, 21.9, 27.5, 27.1, 27.1, 15. , 26. ,26.3, 13.2, 13.3, 26.1, 20.5, 16.8, 24.3, 36.6, 21.4,  8.3, 27.8,3.6, 19.2, 27.5, 33.6, 28.4, 34.3, 28.2, 13.3, 18. , 23.5, 30.4,32.9, 23.7, 30.5, 19.8, 19.5, 18.7, 30.9, 36.3,  8. , 18.2, 13.9,15. , 26.4, 24. , 30.2, 20. ,  5.6, 21.4, 22.9, 17.6, 32.8, 22.1,32.6, 20.9, 19.3, 23.1, 21. , 21.5])
'''# 使用sklesrn中的线性模型得到的预估房价信息
linear.predict(X_test).round(1)
'''
array([31.3, 13.4, 28.6, 20.5, 20.4, 19.4, 32.2, 24. , 25.8, 29.5, 24.5,25.2, 31.9,  8.2, 20.9, 29.3, 22.3, 35.2, 16.4, 18.5, 30.8, 41.1,16.2, 13.7, 17.7, 23.8,  7.8, 12. , 20.5, 15.3, 29.3, 26.8, 31.8,26. , 30.4, 39.2, 25.3, 40.7, 11.6, 27.3, 16.7, 18.8, 19.5, 19.9,20.7, 22.8, 17.4, 21.6, 23.3, 30. , 25.2, 23.7, 34.2, 18.2, 33.5,16. , 28.3, 14.1, 24.2, 16.2, 16.7, 23.5, 16. , 21.4, 21.8, 28.2,25.7, 31.2, 18.8, 26.4, 28.3, 21.9, 27.5, 27.1, 27.1, 15. , 26. ,26.3, 13.2, 13.3, 26.1, 20.5, 16.8, 24.3, 36.6, 21.4,  8.3, 27.8,3.6, 19.2, 27.5, 33.6, 28.4, 34.3, 28.2, 13.3, 18. , 23.5, 30.4,32.9, 23.7, 30.5, 19.8, 19.5, 18.7, 30.9, 36.3,  8. , 18.2, 13.9,15. , 26.4, 24. , 30.2, 20. ,  5.6, 21.4, 22.9, 17.6, 32.8, 22.1,32.6, 20.9, 19.3, 23.1, 21. , 21.5])
'''

通过自建模型获取预估数据与使用模型获取预估数据进行比较,两组数据完全一致;

(五): 使用线性回归,求解斜率和截距

  • 根据最小二乘法: min⁡w∣∣Xw−y∣∣22\min_{w}||Xw-y||_2^2wmin​∣∣Xw−y∣∣22​ 推到得出公式: w=(XTX)−1XTyw = (X^TX)^{-1}X^Tyw=(XTX)−1XTy

以上公式只能求出w,我们可以先求出w再计算出b;

  • 但此处我们有更简单的方法:

    根据线性回归方程 f(x)=w1x1+w2x2+bf(x) = w_1x_1+w_2x_2+bf(x)=w1​x1​+w2​x2​+b 我们可以将方程中的b看成是w3x30w_3x_3^0w3​x30​,

所以可得: f(x)=w1x11+w2x21+w3x30f(x) = w_1x_1^1+w_2x_2^1+w_3x_3^0f(x)=w1​x11​+w2​x21​+w3​x30​

代码如下:

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn import datasetsX, y = datasets.load_boston(True)
linear = LinearRegression()
linear.fit(X,y)
w_ = linear.coef_
b_ = linear.intercept_# 向X中插入一列全是1的数据(任何数的0次方都是1)
X = np.concatenate([X, np.ones(shape = (506, 1))], axis=1)# 根据最小二乘法的推导公式:w和b的值为(最后一个值是b)
w = ((np.linalg.inv(X.T.dot(X))).dot(X.T)).dot(y)
# 以上w的写法过于装逼,所以分解为:
# A = X.T.dot(X)   求X和转置后的X的内积(公式中的XTX)
# B = np.linalg.inv(A)   求A的逆矩阵(公式中的-1次方)
# C = B.dot(X.T)   求以上矩阵和X的转置矩阵的内积(公式中的XT)
# w = C.dot(y)   与y求内积,得出w和b
'''
运行结果:
array([-1.08011358e-01,  4.64204584e-02,  2.05586264e-02,  2.68673382e+00,-1.77666112e+01,  3.80986521e+00,  6.92224640e-04, -1.47556685e+00,3.06049479e-01, -1.23345939e-02, -9.52747232e-01,  9.31168327e-03,-5.24758378e-01,  3.64594884e+01])
'''print(b_)
'''
运行结果:
36.45948838509001
'''

扩展一: 最小二乘法和向量范数

min⁡w∣∣Xw−y∣∣22\min_{w}||Xw-y||_2^2wmin​∣∣Xw−y∣∣22​

  • 右上角的2是平方
  • 右下角的2是向量2范数
  • 竖线内的表达式是向量

根据最小二乘法的公式, 推导得出
w=(XTX)−1XTyw = (X^TX)^{-1}X^Tyw=(XTX)−1XTy

向量的1-范数(表示各个元素的绝对值的和)
∣∣X∣∣1=∑i=1n∣xi∣||X||_1 = \sum\limits_{i=1}^n |x_i|∣∣X∣∣1​=i=1∑n​∣xi​∣

向量的2-范数(表示每个元素的平方和再开平方)
∣∣X∣∣2=∑i=1nxi2||X||_2 = \sqrt{\sum\limits_{i=1}^n x_i^2}∣∣X∣∣2​=i=1∑n​xi2​​

向量的无穷范数(所有向量元素绝对值中的最大值)
∣∣X∣∣∞=max⁡1≥i≤n∣Xi∣||X||_{\infty} = \max\limits_{1 \geq i \leq n}|X_i|∣∣X∣∣∞​=1≥i≤nmax​∣Xi​∣

扩展二: 导数, 偏导数

导数:
对函数f(x)=x2+3x+8f(x) = x^2+3x+8f(x)=x2+3x+8 求导得: f(x)′=2x+3f(x)' = 2x+3f(x)′=2x+3

求导规则:

  • 参数求导为0
  • 参数乘变量求导为常数
  • 变量的次方求导: xyx^yxy求导为yxy−1yx^{y-1}yxy−1
  • 复合函数求导:
    • $$(x^2-x)^2$$求导: 先将括号看成一个整体求导, 结果再乘以括号内的求导结果
      
    • $$2(x^2-x)(2x-1)$$
      

偏导数:
有多个变量得函数求导:

对函数: f(x,y)=x2+xy+y2f(x, y) = x^2+xy+y^2f(x,y)=x2+xy+y2 求导:

求导规则: 多变量函数只能针对某一个变量求导,此时将其他变量看成常数

将x看成常数a: fa(y)=a2+ay+y2f_a(y) = a^2+ay+y^2fa​(y)=a2+ay+y2

求导得:fa′(y)=a+2yf_a'(y) = a+2yfa′​(y)=a+2y

故求导得: ∂f∂y(x,y)=x+2y\frac{\partial f}{\partial y}(x,y)=x+2y∂y∂f​(x,y)=x+2y

实现线性回归的两种方式:

  1. 正规方程

  2. 梯度下降

二: 正规方程

(一): 损失函数

最小二乘法:

min⁡w∣∣Xw−y∣∣22\min\limits_{w}||Xw-y||_2^2wmin​∣∣Xw−y∣∣22​

当X和y都是常数时,按照向量2范数将上面的最小二乘法解开:

f(w)=(Xw−y)2f(w)=(Xw-y)^2f(w)=(Xw−y)2

将X,y替换成常数a,b

f(w)=(aw−b)2f(w)=(aw-b)^2f(w)=(aw−b)2

f(w)=a2w2−2abw+b2f(w)=a^2w^2 - 2abw + b^2f(w)=a2w2−2abw+b2

​ 由于最小二乘法方程的函数值都是大雨或等于0的,所以此时得到一个开口向

上的抛物线(一元二次方程)

​ 此时的f(w)f(w)f(w)就是损失函数,在此时求该函数的导数(抛物线函数顶点的导数为0)

就能得到该函数的最小值,也就是最小损失

f′(w)=2a2w−2ab=0f'(w)=2a^2w-2ab=0f′(w)=2a2w−2ab=0

此时即可算出最小的www,即最小损失

(二): 矩阵常用求导公式

X的转置矩阵对X矩阵求导, 求解出来是单位矩阵

  • dXTdX=I\frac{dX^T}{dX} = IdXdXT​=I

  • dXdXT=I\frac{dX}{dX^T} = IdXTdX​=I

X的转置矩阵和一个常数矩阵相乘再对X矩阵求导, 求解出来就是改常数矩阵

  • dXTAdX=A\frac{dX^TA}{dX} = AdXdXTA​=A
  • dAXdX=AT\frac{dAX}{dX} = A^TdXdAX​=AT
  • dXAdX=AT\frac{dXA}{dX} = A^TdXdXA​=AT
  • dAXdXT=A\frac{dAX}{dX^T} = AdXTdAX​=A

(三): 正规方程矩阵推导过程

此时X,w,y都是矩阵

1: 公式化简

1: 最小二乘法:

f(w)=∣∣Xw−y∣∣22f(w) = ||Xw-y||_2^2f(w)=∣∣Xw−y∣∣22​

2: 向量2范数:

∣∣X∣∣2=∑i=1nxi2||X||_2 = \sqrt{\sum\limits_{i = 1}^nx_i^2}∣∣X∣∣2​=i=1∑n​xi2​​

3: 将向量2范数的公式带入到最小二乘法中得:

f(w)=((Xw−y)2)2f(w)=(\sqrt{(Xw-y)^2})^2f(w)=((Xw−y)2​)2

4. 化简:

f(w)=(Xw−y)2f(w)=(Xw-y)^2f(w)=(Xw−y)2

由于X, w, y都是矩阵, 运算后还是矩阵; 矩阵得乘法是一个矩阵得行和另一个矩阵得列相乘; 所以矩阵的平方就是该矩阵乘以他本身的转置矩阵

5. 所以:

f(w)=(Xw−y)T(Xw−y)f(w)=(Xw-y)^T(Xw-y)f(w)=(Xw−y)T(Xw−y)

6. 展开:

注意: 整体转置变成每个元素都转置时,若是有乘法, 则相乘的两个矩阵要交换位置; 如下所示!!!

f(w)=(wTXT−yT)(Xw−y)f(w)=(w^TX^T-y^T)(Xw-y)f(w)=(wTXT−yT)(Xw−y)

f(w)=wTXTXw−wTXTy−yTXw+yTyf(w)=w^TX^TXw-w^TX^Ty-y^TXw+y^Tyf(w)=wTXTXw−wTXTy−yTXw+yTy

注意: 若想交换两个相乘的矩阵在算式中的位置,则交换之后双方都需要转置一次; 如下所示!!!

f(w)=wTXTXw−(XTy)T(wT)T−yTXw+yTyf(w)=w^TX^TXw-(X^Ty)^T(w^T)^T-y^TXw+y^Tyf(w)=wTXTXw−(XTy)T(wT)T−yTXw+yTy

f(w)=wTXTXw−yTXw−yTXw+yTyf(w)=w^TX^TXw-y^TXw-y^TXw+y^Tyf(w)=wTXTXw−yTXw−yTXw+yTy

f(w)=wTXTXw−2yTXw+yTyf(w) = w^TX^TXw - 2y^TXw + y^Ty f(w)=wTXTXw−2yTXw+yTy

2: 求导

f(w)=wTXTXw−2yTXw+yTyf(w) = w^TX^TXw - 2y^TXw + y^Ty f(w)=wTXTXw−2yTXw+yTy

这里 yTyy^TyyTy 是常数求导后为0

2yTXw2y^TXw2yTXw 求导:

d(2yTX)wdw=(2yTX)T=2XT(yT)T=2XTy\frac{d(2y^TX)w}{dw}=(2y^TX)^T=2X^T(y^T)^T=2X^Tydwd(2yTX)w​=(2yTX)T=2XT(yT)T=2XTy

wTXTXww^TX^TXwwTXTXw求导:

dwTXTXwdw=d(wTXTX)wdw+dwT(XTXw)dw=(wTXTX)T+XTXw=XT(XT)T(wT)T+XTXw=2XTXw\frac{dw^TX^TXw}{dw}=\frac{d(w^TX^TX)w}{dw}+\frac{dw^T(X^TXw)}{dw}=(w^TX^TX)^T+X^TXw=X^T(X^T)^T(w^T)^T+X^TXw=2X^TXwdwdwTXTXw​=dwd(wTXTX)w​+dwdwT(XTXw)​=(wTXTX)T+XTXw=XT(XT)T(wT)T+XTXw=2XTXw

所以:

f′(w)=2XTXw−2XTyf'(w) = 2X^TXw - 2X^Tyf′(w)=2XTXw−2XTy

令f′(w)=0f'(w)=0f′(w)=0,则:

2XTXw−2XTy=02X^TXw - 2X^Ty = 02XTXw−2XTy=0

XTXw=XTyX^TXw=X^TyXTXw=XTy

矩阵运算没有除法,可以用逆矩阵实现除法的效果

等式两边同时乘以XTXX^TXXTX的逆矩阵(XTX)−1(X^TX)^{-1}(XTX)−1

(XTX)−1(XTX)w=(XTX)−1XTy(X^TX)^{-1}(X^TX)w=(X^TX)^{-1}X^Ty(XTX)−1(XTX)w=(XTX)−1XTy

Iw=(XTX)−1XTyIw=(X^TX)^{-1}X^TyIw=(XTX)−1XTy I是单位矩阵

得到正规方程:

w=(XTX)−1XTyw=(X^TX)^{-1}X^Tyw=(XTX)−1XTy

(四): 数据挖掘实例(预测2020年淘宝双十一交易额)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressionX = np.arange(2009, 2020)   # 年份
X = X -2008   # 年份数值太大,差别不明显
y = np.array([0.5, 9.36, 52, 191, 350, 571, 912, 1207, 1682, 2135, 2684])   # 09年到19年的交易额

假设X和y之间是一元三次的关系(按照前几年的数据走势提出的假设)

f(x)=w1x+w2x2+w3x3+bf(x)=w_1x+w_2x^2+w_3x^3+bf(x)=w1​x+w2​x2+w3​x3+b

f(x)=w0x0+w1x1+w2x2+w3x3f(x)=w_0x^0+w_1x^1+w_2x^2+w_3x^3f(x)=w0​x0+w1​x1+w2​x2+w3​x3

# X_oo = np.concatenate([a,a])   # 横着级联
X_train = np.c_[X**0, X**1, X**2, X**3]   # 竖着级联
'''
array([[   1,    1,    1,    1],[   1,    2,    4,    8],[   1,    3,    9,   27],[   1,    4,   16,   64],[   1,    5,   25,  125],[   1,    6,   36,  216],[   1,    7,   49,  343],[   1,    8,   64,  512],[   1,    9,   81,  729],[   1,   10,  100, 1000],[   1,   11,  121, 1331]], dtype=int32)
'''linear = LinearRegression(fit_intercept=False)   # 声明算法; fit_intercept=False将截距设置为0, w0就是截距
linear.fit(X_train, y)   # 训练
w_ = linear.coef_
print(linear.coef_.round(2))   # 获取系数
print(linear.intercept_)   # 获取截距
'''
[ 58.77 -84.06  27.95   0.13]
0.0
'''

可以得到方程:

f(x)=58.77−84.06x+27.95x2+0.13x3f(x)=58.77-84.06x+27.95x^2+0.13x^3f(x)=58.77−84.06x+27.95x2+0.13x3

X_test = np.linspace(0,12,126)   # 线性分割(将0,12之间分成126分)等差数列包含1和12
X_test = np.c_[X_test**0, X_test**1, X_test**2, X_test**3]   # 和训练数据保持一致
y_ = linear.predict(X_test)   # 使用模型预测
plt.plot(np.linspace(0,12,126), y_, color='g')   # 绘制预测方程曲线
plt.scatter(np.arange(1,12), y, color='red')   # 绘制每年的真实销量# 定义函数
fun = lambda x : w_[0] + w_[1]*x + w_[2]*x**2 + w_[-1]*x**3fun(12)
'''3294.2775757576132'''

三: 梯度下降

​ 梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下

来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确

定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体

来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,

如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复

采用同一个方法,最后就能成功的抵达山谷。

(一): 梯度下降

import numpy as np
import matplotlib.pyplot as pltf = lambda w : (w -3.5)**2 -4.5*w +10
d = lambda w : 2*(w-3.5)-4.5   # 梯度 == 导数
step = 0.1   # 梯度下降的步幅,比率,学习率(默认是1)# 求当w(x值)为多少时,得到的函数值最小w = np.random.randint(0,11,size=1)[0]   # 随机生成一个初始值数
last_w = w + 0.1   # 梯度下降,每走一步,目标值,都会更新
precision = 1e-4   # 精确率(误差率,越小越精确,并不是越小越好)
print('==============更新前的w:', w)
w_ = [w]
while True:if np.abs(w - last_w) < precision:    # 退出条件breaklast_w = w    # 更新w -= step*d(w)   # 随机初始值在目标值的左边时, d(w)为负, w = w-step*d(w) 会使得w慢慢变大趋近目标值# 随机初始值在目标值的右边时, d(w)为正, w = w-step*d(w) 会使得w慢慢变小趋近目标值w_.append(w)print('==============更新后的w:', w)

(二): 梯度下降实现线性回归

1. 构造数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressionX = np.linspace(-2, 12, 40).reshape(40,1)
# reshape(40,1)改变形状; 40这个位置可以写成-1, 此时-1代表40; 当后面的1变为2时,此时-1代表20; 也就是说当后面的数值变化时,系统自动用前面规定的总数计算出相应的结果,而这些结果都可以用-1代替;
w = np.random.randint(1,9,size = 1)   # 系数
b = np.random.randint(-5,5,size = 1)   # 截距
y = w*X + b + np.random.randn(40,1) * 2   # 增加噪声
plt.scatter(X, y)   # 绘点

2. 使用sklearn中的回归 - 梯度下降方法计算斜率和截距

linear = LinearRegression()   # 定义算法
linear.fit(X, y)  # 训练
X_test = np.linspace(-2,12,256).reshape(-1, 1)   # 预测数据
y_ = linear.predict(X_test)   # 预测结果
print('真实斜率和截距', w, b)
print('算法计算的斜率和截距', linear.coef_, linear.intercept_)  # 截距和斜率
'''
真实斜率和截距 [5] [3]
算法计算的斜率和截距 [[4.91521288]] [3.06426015]
'''
plt.plot(X_test, y_, color='g')   # 绘制线性回归方程
plt.scatter(X, y, color='r')   # 绘制实际的点

3.自定义梯度下降的类实现sklearn中的回归 - 梯度功能

class LinearModel(object):def __init__(self):   # 初始化, 随机给定截距和斜率self.w = np.random.randn(1)[0]self.b = np.random.randn(1)[0]def model(self, x):return self.w*x + self.b   # 一元一次线性方程; 模型def loss(self,x,y):#损失,最小二乘法cost = (self.model(x) - y)**2 # 损失函数越小越好# 求解梯度,两个未知数,所以,偏导d_w = 2*(self.model(x) - y)*x # 斜率w的偏导d_b = 2*(self.model(x) - y)*1 # 截距b的偏导return cost,d_w,d_bdef gradient_descent(self, step, d_w, d_b):   # 梯度下降self.w -= step*d_w  # 更新斜率self.b -= step*d_b  # 更新截距def fit(self, X, y):   # 训练模型, 将数据给模型,寻找规律precision = 1e-4   # 精确度last_w = self.w + 0.01last_b = self.b + 0.01print('------------------------初始的截距和斜率:', self.w, self.b)while True:if (np.abs(self.w-last_w) < precision) & (np.abs(self.b-last_b) < precision):breaklast_w = self.w   # 更新之前,先保留记录last_b = self.bcost_ = 0dw_ = 0db_ = 0for i in range(40):   # 计算40个,返回40个偏导数,求平均值cost,dw,db = self.loss(X[i,0],y[i,0])cost_ += cost/40dw_ += dw/40db_ += db/40self.gradient_descent(0.01, dw_, db_)print('------------------------更新后的截距和斜率:', self.w, self.b)def predict(self, X):return self.model(X)model = LinearModel()   # 定义算法
w, b = model.fit(X, y)   # 获取斜率和截距
y_ = model.predict(X_test)   # 用测试数据获取目标值
plt.plot(X_test, y_, color='g')   # 绘制线性方程
plt.scatter(X, y, color='r')   # 绘制目标点

(三): 随机梯度下降

1: 公式推导(矩阵)

损失函数:
J(w)=min⁡w∣∣Xw−y∣∣22J(w) = \min\limits_w||Xw-y||_2^2 J(w)=wmin​∣∣Xw−y∣∣22​
1m\frac{1}{m}m1​表示m个样本求平均:
J(w)=1m∑i=1m(∣∣Xiw−yi∣∣22)J(w) = \frac{1}{m}\sum_{i=1}^m(||X_iw-y_i||_2^2) J(w)=m1​i=1∑m​(∣∣Xi​w−yi​∣∣22​)
X, y都是矩阵,去掉求和符号计算:
J(w)=1m(Xw−y)T(Xw−y)J(w) = \frac{1}{m}(Xw - y)^T(Xw - y) J(w)=m1​(Xw−y)T(Xw−y)

J(w)=1m(wTXT−yT)(Xw−y)J(w) = \frac{1}{m}(w^TX^T - y^T)(Xw - y) J(w)=m1​(wTXT−yT)(Xw−y)

J(w)=1m(wTXTXw−wTXTy−yTXw+yTy)J(w) = \frac{1}{m}(w^TX^TXw - w^TX^Ty - y^TXw + y^Ty) J(w)=m1​(wTXTXw−wTXTy−yTXw+yTy)

J(w)=1m(wTXTXw−2yTXw+yTy)J(w) = \frac{1}{m}(w^TX^TXw - 2y^TXw + y^Ty ) J(w)=m1​(wTXTXw−2yTXw+yTy)

J′(w)=1m(2XTXw−2XTy)J'(w) = \frac{1}{m}(2X^TXw - 2X^Ty) J′(w)=m1​(2XTXw−2XTy)

J′(w)=2mXT(Xw−y)J'(w) = \frac{2}{m}X^T(Xw - y) J′(w)=m2​XT(Xw−y)

∇wJ(w)=2mXT(Xw−y)\nabla_{w}J(w) = \frac{2}{m}X^T(Xw - y) ∇w​J(w)=m2​XT(Xw−y)

梯度下降的更新规则:
w=w−ϵ∇wJ(w)w = w-\epsilon \nabla_wJ(w) w=w−ϵ∇w​J(w)

w=w−2ϵmXT(Xw−y)w = w - \frac{2\epsilon}{m}X^T(Xw - y) w=w−m2ϵ​XT(Xw−y)

2: 实现梯度下降类(矩阵)

import numpy as np
import matplotlib.pyplot as pltX = np.linspace(-2, 12, 40).reshape(-1, 1)
w = np.random.randint(2, 12, size=1)
b = np.random.randint(-10, 10, size=1)
y = X*w + b + np.random.randn(40, 1)*2.5
plt.scatter(X, y, color='r')X = np.concatenate([X, np.ones(shape=(40, 1))], axis=1)  def gradient_descent(X,y):theta = np.random.randn(2,1) # theta中既有斜率,又有截距last_theta = theta + 0.1precision = 1e-4epsilon = 0.01while True:# 当斜率和截距误差小于万分之一时,退出if (np.abs(theta - last_theta) < precision).all():break# 更新last_theta = theta.copy()theta = theta - epsilon*2/40*X.T.dot(X.dot(theta) - y)return thetaw_,b_ = gradient_descent(X,y)
j = lambda x : w_*x + b_
plt.scatter(X[:,0],y,color = 'red')
x_test = np.linspace(-2,12,1024)
y_ = j(x_test)
plt.plot(x_test,y_,color = 'green')

(四): 梯度下降法大家族(BGD,SGD,MBGD)

1: 批量梯度下降法(Batch Gradient Descent)

批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新。

θi=θi−α∑j=1m(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)iθi=θi−α∑j=1m(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)i θi=θi−α∑j=1m(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)i
由于我们有m个样本,这里求梯度的时候就用了所有m个样本的梯度数据。

2 随机梯度下降法(Stochastic Gradient Descent)

随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:
θi=θi−α(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)iθi=θi−α(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)i θi=θi−α(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)i

3 小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:
θi=θi−α∑j=tt+x−1(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)iθi=θi−α∑j=tt+x−1(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)i θi=θi−α∑j=tt+x−1(hθ(x(j)0,x(j)1,...x(j)n)−yj)x(j)i

sklearn - 线性回归(正规方程与梯度下降)相关推荐

  1. 13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比

    1.线性回归 1.1 线性模型 试图学得一个通过属性的线性组合来进行预测的函数: 1.2 定义 定义:线性回归通过一个或者多个自变量与因变量之间进行建模的回归分析.其中特点为一个或多个称为回归系数的模 ...

  2. 回归算法-线性回归分析-正规方程和梯度下降

    1.分类和回归最本质的区别 定量输出称为回归,或者说是连续变量预测:     定性输出称为分类,或者说是离散变量预测. 举个特别好理解的例子: 预测明天的气温是多少度,这是一个回归任务: 预测明天是阴 ...

  3. 机器学习(11)线性回归(1)理论:损失函数(含最小二乘法)、正规方程、梯度下降、回归性能评估(均方差)

    目录 一.线性回归基础理论 1.定义与公式 2.线性关系(单特征与双特征) 2-1.单特征线性关系 2-2.双特征平面关系 2-3.其他线性模型 二.线性回归的损失和优化原理 1.损失函数 1.定义 ...

  4. 正规方程,梯度下降,岭回归——机器学习

    线性回归 一. 介绍 1. 1 线性回归API介绍--LinearRegression 二. 线性回归的损失和优化 2.1 全梯度下降算法(FG) 2.2 随机梯度下降算法(SG) 2.3 小批量梯度 ...

  5. 梯度下降python编程实现_【机器学习】线性回归——单变量梯度下降的实现(Python版)...

    [线性回归] 如果要用一句话来解释线性回归是什么的话,那么我的理解是这样子的:**线性回归,是从大量的数据中找出最优的线性(y=ax+b)拟合函数,通过数据确定函数中的未知参数,进而进行后续操作(预测 ...

  6. 【MATLAB】机器学习: 线性回归实验(梯度下降+闭式解)

    实验内容 1.根据梯度下降法完成一元线性回归实验. 2.根据闭式解完成一元线性回归实验. 3.比较两种解下的实验结果. 实验代码 clear;clc; %% 数据导入:划分训练集和测试集 % 数据导入 ...

  7. 【机器学习】浅谈正规方程法梯度下降

  8. 【机器学习】拟合优度度量和梯度下降(红酒数据集的线性回归模型sklearnRidge)

    文章目录 一.拟合优度度量(可决系数) 1.1总离差平方和的分解 1.2 TSS=ESS+RSS 1.3 红酒数据集实例R2_score实现代码 二. 梯度下降 2.1 损失函数直观图(单特征/变量举 ...

  9. 机器学习(11)线性回归(2)实战 -- 正规方程优化、梯度下降优化(波士顿房价预测)

    目录 一.波士顿房价预测(正规方程优化) API 1.获取数据集 2.划分数据集 3.标准化 4. 创建预估器,得到模型 5.模型评估(均方差评估) 代码 二.波士顿房价预测(正规方程优化) API ...

最新文章

  1. 一致性算法- Paxos
  2. 二十一、Hadoop学记笔记————kafka的初识
  3. SAP CRM Enterprise search后退按钮的实现
  4. Hive的安装和配置
  5. 电路宽度测量halcon例子
  6. c free语言自定义函数,C 语言free函数的工作原理
  7. CSS3 Perspective
  8. Vue Bootstrap OSS 实现文件追加上传、断点续传、极速秒传
  9. 【Flink】Flink 1.9 本地运行无法访问界面 {“errors“:[“Not found.“]}
  10. TypeError: __str__ returned non-string (type NoneType)
  11. 关于表、栈、队列的几种操作
  12. cacti设置redis监控端口
  13. Spring MVC - 拦截器实现 和 用户登陆例子
  14. linux445端口是什么,端口445怎么关 445端口是什么服务 445病毒是什么
  15. java 集成 pageoffice 实现 word 文档的在线编辑以及流转
  16. 微信小程序自带地图_微信小程序之地图使用
  17. Spring——事物操作
  18. Auto.js Pro 调起APP并跳转至指定页面
  19. 东京秋叶原谢幕,彼岸电子城路在何方
  20. 【KG】TransE 及其实现

热门文章

  1. LM4f232H5QD评估板 资料 汇总
  2. php mysql ip_使用php和mysql有效禁止IP?
  3. 物理学又不存在了?ChatGPT:室温超导是物理学的一个梦想
  4. 华为C8800真机测试如何打开logcat
  5. 收藏了两年的嵌入式AI资源学习笔记,今天全分享给大家(附代码/资料/视频/学习规划)...
  6. 兄弟连专注IT教育 九周年再创辉煌
  7. 突破ARP防火墙嗅探
  8. linux 防火墙arp问题
  9. mui,uniapp实现APP整包更新,并展示更新进度条
  10. java计算机毕业设计芮城县十全十美火锅店点餐系统源码+系统+数据库+lw文档+mybatis+运行部署