学习目标 😀 掌握线性回归模型公式含义 😀 掌握 LinearRegression API 的使用
话不多说,直接上图,浅显易懂!🥹

线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。
特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归。
通用公式 h(w)=w{1}x{1}+w{2}x{2}+w{3}x{3}+...+b=w^Tx+b,
其中w, x可以理解为矩阵:w= \begin{pmatrix} b \ w{1} \ w{2} \ \vdots \end{pmatrix}, x= \begin{pmatrix} 1 \ x{1} \ x{2}\\vdots \end{pmatrix}
线性回归用矩阵表示举例:
\begin{cases}1 \times x{1} + x{2} = 2 \ 0 \times x{1} + x{2} = 2 \ 2 \times x{1} + x{2} = 3 \end{cases}
写成矩阵形式🥹 :

那么怎么理解呢?我们来看几个例子💯 :
上面两个例子, 我们看到特征值与目标值之间建立了一个关系,这个关系可以理解为线性模型 。
线性回归当中主要有两种模型, 一种是线性关系,另一种是非线性关系。 在这里我们只能画一个平面更好去理解,所以都用单个特征或两个特征举例子。
线性关系 :


注释:单特征与目标值的关系呈直线关系,或者两个特征与目标值呈现平面的关系 更高维度的我们不用自己去想,记住这种关系即可

注释:为什么会这样的关系呢?原因是什么? 如果是非线性关系,那么回归方程可以理解为: w_1x_1+w_2x_2^2+w_3x_3^2
sklearn中, 线性回归的API在linear_model模块中
sklearn.linear_model.LinearRegression()

代码实现💯 :
from sklearn.linear_model import LinearRegression
# 加载数据
x = [[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
# 实例化API
estimator = LinearRegression()
# 使用fit方法进行训练
estimator.fit(x,y)
print(estimator.coef_)
# 对未知样本预测
estimator.predict([[100, 80]])4. 小结 🍬 线性回归公式 h(w)=w{1}x{1}+w{2}x{2}+w{3}x{3}+...+b=w^Tx+b,h(w) 为目标值 🍬 线性回归公式中,w、b 代表模型参数 🍬 LinearRegression.fit 表示模型训练函数 🍬 LinearRegression.predict 表示模型预测函数
线性回归模型的目标:通过学习得到线性方程的这两个权值,如在y=kx+b中,得到k和b两个权值,并用这个方程解释变量和目标变量之间的关系。

学习目标 😀 掌握损失函数的概念与作用 😀 了解正规方程 😀 掌握正规方程的使用
在学习损失函数之前,我们先熟悉一下数学导数的概念🍭 :
导数(Derivative),也叫导函数值。又名微商,是微积分中的重要基础概念。


损失函数的概念💘 :
损失函数的作用:
先看下面的例子,有如下一组训练数据:
X = [0.0, 1.0, 2.0, 3.0]
y = [0.0, 2.5, 3.3, 6.2]
很显然,上面的数据中,X与y的关系可以近似的表示为一元线性关系, 即 y = WX
注意:当前例子中, y 和 X均为已知,由训练数据给出,W为未知
训练线性回归模型模型的过程实际上就是要找到一个 合适的W ,那么什么才是合适的W,我们先随机的给出几个W看下效果
🐻 当W = 5.0时如下图所示:

从上图中可以观察到模型预测值与真实值不同,我们希望通过一个数学表达式来表示这个差值:
我们将距离定义为: distance = \hat{y}-y
🐻 根据上面的公式, 我们可以计算出当W=5.0时预测的误差分别为:
d_0 = 0-0 = 0
d_1 = 5-2.5 = 2.5
d_2 = 10-3.3 = 6.7
d_3 = 15-6.2 = 8.8
在前面的概念中提到, 损失函数的计算结果应该为一个具体的实数,因此我们将上面所有点的预测误差相加得到:
cost(w)=d_0+d_1+d_2+d_3
cost(5) = 0+2.5+6.7+8.8 = 18
从上面的结果中发现,误差有些大,我们的模型应该还有调整的空间。
🐻 尝试将W减小,令W=0.5

根据公式 distance = \hat{y}-y, 我们可以计算出当W=0.5时预测的误差分别为:
d_0 = 0-0 = 0
d_1 = 0.5-2.5 = -2
d_2 = 1-3.3 = -2.3
d_3 = 1.5-6.2 = -4.7
cost(w)=d_0+d_1+d_2+d_3
cost(0.5) = 0-2-2.5-4.7 = -9
🐻 再尝试W=2:

根据公式 distance = \hat{y}-y, 我们可以计算出当W=2时预测的误差分别为:
d_0 = 0-0 = 0
d_1 = 2-2.5 = -0.5
d_2 = 4-3.3 = 0.7
d_3 = 6-6.2 = -0.2
cost(w)=d_0+d_1+d_2+d_3
cost(2) = 0-0.5+0.7-0.2 = 0
我们前面提到,利用损失函数可以确定损失的大小,损失越小的模型效果越好,通过对比发现
cost(5) = 0+2.5+6.7+8.8 = 18
cost(0.5) = 0-2-2.5-4.7 = -9
cost(2) = 0-0.5+0.7-0.2 = 0
当前的计算方法中
综上所述,我们用来衡量回归损失的时候, 不能简单的将每个点的预测误差相加
回归问题的损失函数通常用下面的函数表示💘 :

我们的目标是: 找到该损失函数最小时对应的 w、b.

那么,该公式是得出的?


话不多说,直接上代码演示💯 :
import numpy as np
from sklearn.linear_model import LinearRegression
if __name__ == '__main__':
# 特征值
x = np.mat([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]])
# 目标值
y = np.mat([84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]).transpose()
# 给特征值增加一列1
ones_array = np.ones([len(x), 1])
x = np.hstack([ones_array, x])
# 使用正规方程公式计算 w、b
w = (x.transpose() * x) ** -1 * x.transpose() * y
print('[%.1f %.1f %.1f]' % (w[0][0], w[1][0], w[2][0]))
# 使用 LinearRegression 求解
estimator = LinearRegression(fit_intercept=True)
estimator.fit(x, y)
print(estimator.coef_[0])
# 输出结果
# [0.0 0.3 0.7]
# [0. 0.3 0.7]5. 小结 🍬 损失函数在训练阶段能够指导模型的优化方向,在测试阶段能够用于评估模型的优劣。 🍬 线性回归使用平方损失 🍬 正规方程是线性回归的一种优化方法