简单线性回归介绍
首先,线性回归当然是为了解决回归问题了。这种线性回归思想简单,容易实现,是许多强大的非线性模型的基础。相对kNN,他的结果具有很好的可解释性。线性回归,蕴含机器学习中的很多重要思想。
在生活中,有很多关系可以匹配我们的线性模型。例如房屋面积和价格的走势:
我们用一条线来拟合:
所以,线性回归的定义就是,寻找一条直线,最大程度的“拟合”样本特征和样本输出标记之间的关系。
样本特征只有一个,称为简单线性回归。
损失函数
假设我们找到最佳拟合的直线方程:
y
=
a
x
+
b
y=ax+b
y=ax+b
对于每一个样本点
x
(
i
)
x^{(i)}
x(i),根据我们的直线方程,预测值为:
y
^
(
i
)
=
a
x
(
i
)
+
b
\hat{y}^{(i)}=ax^{(i)}+b
y^(i)=ax(i)+b
真值为
y
(
i
)
y^{(i)}
y(i)
我们希望
y
^
(
i
)
\hat{y}^{(i)}
y^(i)和
y
(
i
)
y^{(i)}
y(i)之间的差距尽量小,结果越准确,表达他们的差距:
y
(
i
)
−
y
^
(
i
)
y^{(i)}-\hat{y}^{(i)}
y(i)−y^(i)
也就是
∣
y
(
i
)
−
y
^
(
i
)
∣
|y^{(i)}-\hat{y}^{(i)}|
∣y(i)−y^(i)∣
也可以通过以下表达:
(
y
(
i
)
−
y
^
(
i
)
)
2
(y^{(i)}-\hat{y}^{(i)})^2
(y(i)−y^(i))2
考虑上所有的样本
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2
∑i=1m(y(i)−y^(i))2
我们的目标是使得
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2
∑i=1m(y(i)−y^(i))2尽可能小,我们有条件
y
^
(
i
)
=
a
x
(
i
)
+
b
\hat{y}^{(i)}=ax^{(i)}+b
y^(i)=ax(i)+b,将
y
^
(
i
)
\hat{y}^{(i)}
y^(i)代入公式,就是使得:
∑
i
=
1
m
(
y
(
i
)
−
a
x
(
i
)
−
b
)
2
\sum_{i=1}^{m}(y^{(i)}-ax^{(i)}-b)^2
∑i=1m(y(i)−ax(i)−b)2尽可能小。
我们的目标就是找到a和b,使得
∑
i
=
1
m
(
y
(
i
)
−
a
x
(
i
)
−
b
)
2
\sum_{i=1}^{m}(y^{(i)}-ax^{(i)}-b)^2
∑i=1m(y(i)−ax(i)−b)2尽可能小。在机器学习里面我们把
∑
i
=
1
m
(
y
(
i
)
−
a
x
(
i
)
−
b
)
2
\sum_{i=1}^{m}(y^{(i)}-ax^{(i)}-b)^2
∑i=1m(y(i)−ax(i)−b)2称为损失函数(loss function),也叫效用函数(utility function)。通过分析问题,确定问题的损失函数或者效用函数;通过最优化损失函数或者效用函数,获得机器学习模型。
在很多机器学习的模型中,都是这种套路,例如线性回归、多项式回归、逻辑回归、SVM、神经网络等。
最小二乘法
找到a和b,使得
∑
i
=
1
m
(
y
(
i
)
−
a
x
(
i
)
−
b
)
2
\sum_{i=1}^{m}(y^{(i)}-ax^{(i)}-b)^2
∑i=1m(y(i)−ax(i)−b)2尽可能小,也就是最小化误差的平方,是一个典型的最小二乘法问题。(最小二乘法,二乘又叫平方,使“离差平方和为最小”的方法叫最小二乘法)
通过求a和b的偏导,使得偏导为零,我们能够先求出b,再求出a,我们直接得出结论:
b
=
y
‾
−
a
x
‾
b=\overline{y}-a\overline{x}
b=y−ax
a
=
∑
i
=
1
m
(
x
(
i
)
−
x
‾
)
(
y
(
i
)
−
y
‾
)
∑
i
=
1
m
(
x
(
i
)
−
x
‾
)
2
a=\frac{\sum_{i=1}^{m}(x^{(i)}-\overline{x})(y^{(i)}-\overline{y})}{\sum_{i=1}^{m}(x^{(i)}-\overline{x})^2}
a=∑i=1m(x(i)−x)2∑i=1m(x(i)−x)(y(i)−y)
有兴趣的可以查阅资料或者自己推导。
现在先通过这种形式,计算出结果,稍后我们会通过向量的形式,优化我们的计算。
简单线性回归的实现
首先把架子搭建起来
根据公式,计算出x平均值和y平均值,然后再计算出a的分子分母:
计算出a和b然后计算y预测值:
将y的预测值和x与y画在同一个图上,可以很直观的看到我们的预测的直线:
输入一个x并预测,然后查看a(斜率)和b(截距)的值:
向量化运算
介绍
a的表达式为:
a
=
∑
i
=
1
m
(
x
(
i
)
−
x
‾
)
(
y
(
i
)
−
y
‾
)
∑
i
=
1
m
(
x
(
i
)
−
x
‾
)
2
a=\frac{\sum_{i=1}^{m}(x^{(i)}-\overline{x})(y^{(i)}-\overline{y})}{\sum_{i=1}^{m}(x^{(i)}-\overline{x})^2}
a=∑i=1m(x(i)−x)2∑i=1m(x(i)−x)(y(i)−y)
我们通过上面的代码知道,通过for循环的方式进行,这样效率比较低,比较好的方式是通过向量的方式。
先看百度百科关于向量点乘的解释:
向量
w
w
w为
(
w
(
1
)
,
w
(
2
)
,
.
.
.
,
w
(
m
)
)
(w^{(1)},w^{(2)},...,w^{(m)})
(w(1),w(2),...,w(m))
向量
v
v
v为
(
v
(
1
)
,
v
(
2
)
,
.
.
.
,
v
(
m
)
)
(v^{(1)},v^{(2)},...,v^{(m)})
(v(1),v(2),...,v(m))
根据向量点乘代数意义:
w
⋅
v
=
∑
i
=
1
m
w
(
i
)
⋅
v
(
i
)
w\cdot v={\sum_{i=1}^{m}w^{(i)}\cdot {v}^{(i)}}
w⋅v=∑i=1mw(i)⋅v(i)
假设向量
x
(
i
)
−
x
‾
x^{(i)}-\overline{x}
x(i)−x为
w
(
i
)
w^{(i)}
w(i)
假设向量
y
(
i
)
−
y
‾
y^{(i)}-\overline{y}
y(i)−y为
v
(
i
)
v^{(i)}
v(i)
a就可以为
a
=
∑
i
=
1
m
(
x
(
i
)
−
x
‾
)
(
y
(
i
)
−
y
‾
)
∑
i
=
1
m
(
x
(
i
)
−
x
‾
)
2
=
∑
i
=
1
m
w
(
i
)
⋅
v
(
i
)
∑
i
=
1
m
v
(
i
)
⋅
v
(
i
)
a=\frac{\sum_{i=1}^{m}(x^{(i)}-\overline{x})(y^{(i)}-\overline{y})}{\sum_{i=1}^{m}(x^{(i)}-\overline{x})^2}=\frac{\sum_{i=1}^{m}w^{(i)} \cdot v^{(i)}}{\sum_{i=1}^{m}v^{(i)} \cdot v^{(i)} }
a=∑i=1m(x(i)−x)2∑i=1m(x(i)−x)(y(i)−y)=∑i=1mv(i)⋅v(i)∑i=1mw(i)⋅v(i)
也就是
a
=
w
⋅
v
v
⋅
v
a=\frac{w\cdot v}{v\cdot v}
a=v⋅vw⋅v
向量的运算,numpy经过优化的,计算速度可以大幅提升。
只需要把原来a的计算方式修改为:
(x - x_mean).dot(y - y_mean) / (x - x_mean).dot(x - x_mean)
x和y分别是向量。
计算
先计算基本的平均值:
然后向量化运算得出回归直线,又简洁速度又快:
性能对比
我们写两个函数,第一个是普通方式,第二个是向量化过的方式,模拟一百万数据的时候,性能对比:
速度大概相差50倍数,说明了向量化计算的优势。
线性回归的评测标准
为了找到a和b使得
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2
∑i=1m(y(i)−y^(i))2也就是
∑
i
=
1
m
(
y
(
i
)
−
a
x
(
i
)
−
b
)
2
\sum_{i=1}^{m}(y^{(i)}-ax^{(i)}-b)^2
∑i=1m(y(i)−ax(i)−b)2尽可能小,我们使用了最小二乘法和向量化的方法。
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2
∑i=1m(y(i)−y^(i))2的大小,是我们衡量的标准。
在数学上,还有另外一个衡量标准,均方误差MSE(Mean Squared Error),计算方式:
1
m
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2
m1∑i=1m(y(i)−y^(i))2
这个均方误差是之前我们为了保证每项为正,且可导,我们对式子做了一个平方,会导致量纲的问题,例如房价为万元,平方后会变成万元的平方,所以我们要改进。
进一步,有一个均方根误差RMSE(Root Mean Squared Error):
1
m
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
=
M
S
E
\sqrt{\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^2}=\sqrt{ MSE}
m1∑i=1m(y(i)−y^(i))2=MSE
还有一个,平均绝对误差MAE(Mean Absolute Error):
1
m
∑
i
=
1
m
∣
y
(
i
)
−
y
^
(
i
)
∣
\frac{1}{m}\sum_{i=1}^{m}| y^{(i)}-\hat{y}^{(i)}|
m1∑i=1m∣y(i)−y^(i)∣由于绝对值不是处处可导的,这个误差方式不便用来求极值。
来看看RMSE和MAE的对比,我们通过sklearn导入了自带的衡量的库,并且计算出MSE和MAE:
对比自己实现的MSE和MAE:
结果一致。
在机器学习里面,其实还有一个很好的评判标准R Squared,计算方式如下:
R
2
=
1
−
s
s
r
e
s
i
d
u
a
l
s
s
t
o
t
a
l
R^2=1-\frac{ss_{residual}}{ss_{total}}
R2=1−sstotalssresidual也等于
1
−
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
2
∑
i
=
1
m
(
y
‾
(
i
)
−
y
(
i
)
)
2
1-\frac{\sum_{i=1}^{m}(\hat y^{(i)}-{y}^{(i)})^2}{\sum_{i=1}^{m}(\overline y^{(i)}-{y}^{(i)})^2}
1−∑i=1m(y(i)−y(i))2∑i=1m(y^(i)−y(i))2
s
s
r
e
s
i
d
u
a
l
ss_{residual}
ssresidual表示 residual sum of squares,计算方式为:
s
s
r
e
s
i
d
u
a
l
=
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
2
ss_{residual}=\sum_{i=1}^{m}(\hat y^{(i)}-{y}^{(i)})^2
ssresidual=∑i=1m(y^(i)−y(i))2,它表示使用我们模型预测产生的错误
s
s
t
o
t
a
l
ss_{total}
sstotal表示total sum of squares,计算方式为:
s
s
r
e
s
i
d
u
a
l
=
∑
i
=
1
m
(
y
‾
(
i
)
−
y
(
i
)
)
2
ss_{residual}=\sum_{i=1}^{m}(\overline y^{(i)}-{y}^{(i)})^2
ssresidual=∑i=1m(y(i)−y(i))2,它表示使用平均值作为预测值也就是
y
=
y
‾
y=\overline y
y=y(Baseline Model基准模型)预测产生的错误。
对于这个R,有如下说明:
- R 2 R^2 R2<=1
- R 2 R^2 R2越大越好,当我们的预测模型不产生任何错误, R 2 R^2 R2等于1。
- 当我们的模型等于基准模型, R 2 R^2 R2等于0
- 如果
R
2
R^2
R2<=0,说明我们学习到的模型还不如基准模型。此时,很有可能我们的数据不存在任何线性关系。
其实 R 2 R^2 R2进一步推导,就是:
R 2 = 1 − s s r e s i d u a l s s t o t a l = 1 − ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 ∑ i = 1 m ( y ‾ ( i ) − y ( i ) ) 2 = 1 − ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 / m ∑ i = 1 m ( y ‾ ( i ) − y ( i ) ) 2 / m = 1 − M S E ( y ^ , y ) V a r ( y ) R^2=1-\frac{ss_{residual}}{ss_{total}}=1-\frac{\sum_{i=1}^{m}(\hat y^{(i)}-{y}^{(i)})^2}{\sum_{i=1}^{m}(\overline y^{(i)}-{y}^{(i)})^2}=1-\frac{\sum_{i=1}^{m}(\hat y^{(i)}-{y}^{(i)})^2/m}{\sum_{i=1}^{m}(\overline y^{(i)}-{y}^{(i)})^2/m}=1-\frac {MSE(\hat y,y)}{Var(y)} R2=1−sstotalssresidual=1−∑i=1m(y(i)−y(i))2∑i=1m(y^(i)−y(i))2=1−∑i=1m(y(i)−y(i))2/m∑i=1m(y^(i)−y(i))2/m=1−Var(y)MSE(y^,y)分母上面是MSE,下面是方差。
通过sklearn引入r2_score并且与我们自己实现的r2_score对比,一致:
多元线性回归
多元线性回归,其实就是把二维的变成多维,公式变成了:
y
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
y=\theta _0+\theta _1x_1+...+\theta _nx_n
y=θ0+θ1x1+...+θnxn
预测值的计算:
y
^
(
i
)
=
θ
0
+
θ
1
X
1
(
i
)
+
θ
2
X
2
(
i
)
+
.
.
.
+
+
θ
n
X
n
(
i
)
\hat y^{(i)}=\theta_0+\theta_1X^{(i)}_1+\theta_2X^{(i)}_2+...++\theta_nX^{(i)}_n
y^(i)=θ0+θ1X1(i)+θ2X2(i)+...++θnXn(i)
我们的目标是使得
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat y^{(i)})^2
∑i=1m(y(i)−y^(i))2尽可能小,而
y
^
(
i
)
=
θ
0
+
θ
1
X
1
(
i
)
+
θ
2
X
2
(
i
)
+
.
.
.
+
+
θ
n
X
n
(
i
)
\hat y^{(i)}=\theta_0+\theta_1X^{(i)}_1+\theta_2X^{(i)}_2+...++\theta_nX^{(i)}_n
y^(i)=θ0+θ1X1(i)+θ2X2(i)+...++θnXn(i)
也就是,我们要找到
θ
0
,
θ
1
,
θ
2
,
.
.
.
,
θ
n
\theta_0,\theta_1,\theta_2,...,\theta_n
θ0,θ1,θ2,...,θn使得
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat y^{(i)})^2
∑i=1m(y(i)−y^(i))2尽可能小
令
θ
=
(
θ
0
,
θ
1
,
θ
2
,
.
.
.
θ
n
)
T
\theta=(\theta_0,\theta_1,\theta_2,...\theta_n)^T
θ=(θ0,θ1,θ2,...θn)T
令
X
0
(
i
)
=
1
X^{(i)}_0=1
X0(i)=1
X
(
i
)
=
(
X
0
(
i
)
,
X
1
(
i
)
,
X
2
(
i
)
,
.
.
.
,
X
n
(
i
)
)
X^{(i)}=(X^{(i)}_0,X^{(i)}_1,X^{(i)}_2,...,X^{(i)}_n)
X(i)=(X0(i),X1(i),X2(i),...,Xn(i))
所以根据向量点乘代数意义我们很容易知道
y
^
(
i
)
=
θ
0
+
θ
1
X
1
(
i
)
+
θ
2
X
2
(
i
)
+
.
.
.
+
θ
n
X
n
(
i
)
=
θ
0
X
0
(
i
)
+
θ
1
X
1
(
i
)
+
θ
2
X
2
(
i
)
+
.
.
.
+
θ
n
X
n
(
i
)
=
X
(
i
)
⋅
θ
\hat y^{(i)}=\theta_0+\theta_1X^{(i)}_1+\theta_2X^{(i)}_2+...+\theta_nX^{(i)}_n=\theta_0X^{(i)}_0+\theta_1X^{(i)}_1+\theta_2X^{(i)}_2+...+\theta_nX^{(i)}_n=X^{(i)} \cdot \theta
y^(i)=θ0+θ1X1(i)+θ2X2(i)+...+θnXn(i)=θ0X0(i)+θ1X1(i)+θ2X2(i)+...+θnXn(i)=X(i)⋅θ
我们令
X
b
X_b
Xb
而
θ
=
(
θ
0
,
θ
1
,
θ
2
,
.
.
.
θ
n
)
T
\theta=(\theta_0,\theta_1,\theta_2,...\theta_n)^T
θ=(θ0,θ1,θ2,...θn)T,所以
y
^
=
X
b
⋅
θ
\hat y=X_b \cdot \theta
y^=Xb⋅θ
使
∑
i
=
1
m
(
y
(
i
)
−
y
^
(
i
)
)
2
\sum_{i=1}^{m}(y^{(i)}-\hat y^{(i)})^2
∑i=1m(y(i)−y^(i))2尽可能小,就是使:
(
y
−
X
b
⋅
θ
)
T
(
y
−
X
b
⋅
θ
)
(y-X_b \cdot \theta)^T(y-X_b \cdot \theta)
(y−Xb⋅θ)T(y−Xb⋅θ)尽可能小,
求
θ
\theta
θ,数学上多元线性回归的正规方程解(Normal Equation)
θ
=
(
X
b
T
X
b
)
−
1
X
b
T
y
\theta =(X^T_b X_b)^{-1}X^T_by
θ=(XbTXb)−1XbTy
这个虽然是向量方法,还是存在时间复杂度高的问题,时间复杂度为
O
(
n
3
)
O(n^3)
O(n3),可以优化到
O
(
n
2.4
)
O(n ^ {2.4})
O(n2.4)
在我们得到的
θ
\theta
θ向量里,
θ
0
\theta_0
θ0是截距(intercept),其他的
θ
1
,
θ
2
,
θ
3
,
.
.
,
θ
n
\theta_1,\theta_2,\theta_3,..,\theta_n
θ1,θ2,θ3,..,θn都称为系数(coefficients)
总结
- 评价线性回归模型,使用R Squared
- 线性回归算法是典型的参数学习,对比kNN是非参数学习
- 线性回归算法只能解决回归问题。虽然很多分类方法中,线性回归是基础(如逻辑回归)。对比kNN,kNN既能解决分类问题,也可以解决回归问题。
- 线性回归算法对数据有假设,假设数据是线性的。对比kNN对数据没有假设。
- 对结果具有强解释性,kNN得到的结果没有可解释性,
- 多元线性回归方程正规解: θ = ( X b T X b ) − 1 X b T y \theta =(X^T_b X_b)^{-1}X^T_by θ=(XbTXb)−1XbTy