什么是线性回归模型
上一篇文章,我们讲了一个非常朴素而直观的学习模型——线性感知器,这个学习模型主要用于分类问题, 如我们之前说到的原鸢尾花分类例子。那么,对应另外一些非分类问题,比如信用额度评估,房屋价格评估等,我们又有什么办法呢?
通过对线性感知器进行一些改良,我们得到一个称作线性回归的学习算法,可以用来解决这类问题。
举个栗子
我们以房屋价格评估为例,来看一下线性回归是如何实现的。假设影响房屋价格的因素有地上建筑面积, 地下室面积, 占地面积,卧室数, 洗手间数, 楼层数,景观,房屋状况,建造年限这些因素, 暂且不考虑地段和不动产市场的波动,并且假设房屋的价格和以上房屋的基本情况成线性关系。
那么我们是否可以找到一组合适的权重参数,使得他们的线性组合恰好是房屋的价格?
让我们用数学的语言来描述以上问题。
输入参数 x x x:
- 卧室数 ( x 1 x_1 x1)
- 洗手间数( x 2 x_2 x2)
- 地上建筑面积( x 3 x_3 x3)
- 地下室面积( x 4 x_4 x4)
- 房屋占地面积( x 5 x_5 x5)
- 楼层数( x 6 x_6 x6)
- 景观( x 7 x_7 x7) (0 - 5 打分, 5分为最好,0分为最差)
- 房屋状况( x 8 x_8 x8) ( 0 - 5 打分, 5分为最好,0分为最差)
- 建造年限( x 9 x_9 x9)
权重参数 w w w:
对应每一组输入参数 x i x_i xi都分配一个权重参数记作 w i w_i wi,共有9个权重参数。
输出 p r e d i c t _ p r i c e predict\_price predict_price:
p r e d i c t _ p r i c e predict\_price predict_price = ∑ i = 1 9 w i ∗ x i \sum_{i=1}^9w_i * x_i ∑i=19wi∗xi
最优权重参数
此时,我们并不知道输入参数中哪些比较重要,权重值应当比较大,哪些比较次要, 数值应当比较小。那么要如何来获得这个最优权重参数呢?
在这里我们必须注意到“最优”两个字,最优就是意味着衡量评估的正确率达到最佳。实际上,评估价格很难完全等同于实际成交价格,但是我们可以衡量评估价格和实际成交价格的差距。
我们将
x
x
x和
y
y
y放到二维平面里,可以这样来理解线性回归,下图左中的空心点是房屋的实际成交价格,紫色小点则是我们的预测价格,空心点到实心点的距离就是我们预测的偏差值,而我们的任务就是求一组权重值
W
W
W使得整个偏差值最小。但
x
x
x的个数增加到2个,则线性函数就是个平面,如右图所示,实际上但
x
x
x大于2个以上则就无法再用图像来表示了。
很自然的,我们会想到用方差来衡量。考虑全部的样本数据,我们可以通过以下算式求得均方差。
a v g _ e r r o r = 1 N ∑ j = 1 N ( ∑ i = 1 9 w i ∗ x i ( n ) − y ( n ) ) 2 avg\_error = \frac1N\sum_{j=1}^N(\sum_{i=1}^9w_i * x_i^{(n)}- y^{(n)})^2 avg_error=N1∑j=1N(∑i=19wi∗xi(n)−y(n))2
此处,我们可以把最优化权重参数这个问题归结为对全部的样本,如何获得最小化方差。为了解决这个问题,我们首先要矢量化参数。
矢量化参数
为了方便计算,我们将以上参数矢量化。在机器学习中,我们需要进行大量的数值计算,比如累加,乘积等,相比使用循环语句,矢量化可以大大提高计算效率。
输入参数矢量化
- 每组输入参数构建成列矢量形式如下:
x = ( x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 , x 9 ) x = (x_1,x_2 ,x_3,x_4,x_5,x_6,x_7,x_8,x_9) x=(x1,x2,x3,x4,x5,x6,x7,x8,x9)
假设共有N组这样的训练数据, 每一组输出参数记为 x ( i ) x^{(i)} x(i) 。
构建输入矩阵(N x 9): X = { − x ( 1 ) − − x ( 2 ) − . . . − x ( N ) − } = { x 1 ( 1 ) x 2 ( 1 ) . . . x 9 ( 1 ) x 1 ( 2 ) x 2 ( 2 ) . . . x 9 ( 2 ) . . . . . . . . . . . . x 1 ( N ) x 2 ( N ) . . . x 9 ( N ) } X = \left\{ \begin{matrix} -x^{(1)} -\\ -x^{(2)}- \\ ...\\ -x^{(N)}- \end{matrix} \right\} = \left\{\begin{matrix} x_1^{(1)} & x_2^{(1)}&...&x_9^{(1)}\\ x_1^{(2)} & x_2^{(2)}&...&x_9^{(2)}\\ ...&...&...&...\\ x_1^{(N)} & x_2^{(N)}&...&x_9^{(N)}\\ \end{matrix}\right\} X=⎩⎪⎪⎨⎪⎪⎧−x(1)−−x(2)−...−x(N)−⎭⎪⎪⎬⎪⎪⎫=⎩⎪⎪⎪⎨⎪⎪⎪⎧x1(1)x1(2)...x1(N)x2(1)x2(2)...x2(N)............x9(1)x9(2)...x9(N)⎭⎪⎪⎪⎬⎪⎪⎪⎫
权重参数矢量化
- 我们将
w
1
w_1
w1至
w
9
w_9
w9权重参数也构建成列矢量 (9 x 1)
W = { w 1 w 2 . . . w 9 } W = \left\{\begin{matrix} w_1\\ w_2 \\ ...\\ w_9\end{matrix} \right\} W=⎩⎪⎪⎨⎪⎪⎧w1w2...w9⎭⎪⎪⎬⎪⎪⎫
样本标签矢量化
- 我们把输入样本的标签也构造成列矢量 (N x 1)
Y = { y ( 1 ) y ( 2 ) . . . y ( N ) } Y = \left\{ \begin{matrix} y^{(1)}\\ y^{(2)}\\ ...\\ y^{(N)}\end{matrix} \right\} Y=⎩⎪⎪⎨⎪⎪⎧y(1)y(2)...y(N)⎭⎪⎪⎬⎪⎪⎫
计算最优权重参数
如果我们把所有样本评估价格的方差加在一起,再除以样本个数,就可以求得该样本的平均方差。那我们矢量化后的均方差计算公式,则可表示如下。
a v g _ e r r o r avg\_error avg_error = E ( W ) = 1 N ( X ∗ W − Y ) 2 E(W) =\frac1N (X*W - Y)^2 E(W)=N1(X∗W−Y)2
我们要获得正确率最大,也就是要最小化这个均方差,我们可以用求极点的方法来获得,即对该计算公式求 W W W的导数,并令其为0。
d E d W = 2 N X T ∗ ( X ∗ W − Y ) = 0 \frac{dE}{dW}=\frac2NX^T*(X*W-Y)=0 dWdE=N2XT∗(X∗W−Y)=0
此处,我们发现 W W W可以通过简单的矩阵变化来得到。
X T ∗ X ∗ W = X ∗ Y X^T*X*W=X*Y XT∗X∗W=X∗Y
W = ( X T ∗ X ) − 1 ∗ X ∗ Y W=(X^{T} *X)^{-1}*X*Y W=(XT∗X)−1∗X∗Y
令 X + = ( X T ∗ X ) − 1 ∗ X X^+ = (X^{T} *X)^{-1}*X X+=(XT∗X)−1∗X
则 W = X + ∗ Y W = X^+ *Y W=X+∗Y
此处
X
+
X^+
X+被称为伪逆矩阵。我们知道逆矩阵的存在条件是比较苛刻的,但是线性代数的知识告诉我们任何矩阵必存在其相应的伪逆矩阵。
线性回归是一个非常简单朴素的算法,只要一步运算我们就可以得到我们需要的权重参数。
线性回归算法总结
- 构造输入参数矩阵
X
X
X 和 输入样本标签矢量
Y
Y
Y,
(
x
(
1
)
,
y
(
1
)
)
( x^{(1)},y^{(1)})
(x(1),y(1)) ,
(
x
(
2
)
,
y
(
2
)
)
( x^{(2)},y^{(2)})
(x(2),y(2)),…,
(
x
(
N
)
,
y
(
N
)
)
( x^{(N)},y^{(N)})
(x(N),y(N)) 如下:
输 入 矩 阵 X = { − x ( 1 ) − − x ( 2 ) − . . . − x ( N ) − } 输入矩阵 X = \left\{ \begin{matrix} -x^{(1)} -\\ -x^{(2)}- \\ ...\\ -x^{(N)}- \end{matrix} \right\} 输入矩阵X=⎩⎪⎪⎨⎪⎪⎧−x(1)−−x(2)−...−x(N)−⎭⎪⎪⎬⎪⎪⎫
样 本 标 签 矢 量 Y = { y ( 1 ) y ( 2 ) . . . y ( N ) } 样本标签矢量 Y = \left\{ \begin{matrix} y^{(1)}\\ y^{(2)}\\ ...\\ y^{(N)}\end{matrix} \right\} 样本标签矢量Y=⎩⎪⎪⎨⎪⎪⎧y(1)y(2)...y(N)⎭⎪⎪⎬⎪⎪⎫ - 计算伪逆矩阵 X + = ( X T ∗ X ) − 1 ∗ X X^+ = (X^{T} *X)^{-1}*X X+=(XT∗X)−1∗X
- 返回 W = X + ∗ Y W = X^+ *Y W=X+∗Y
线性回归作为一个简单而高效的算法,常常被用于一些复杂模型的一个学习单元,或者权重初始化。
github代码下载地址:
https://github.com/deechean/MachineLearningSample