线性回归

主要内容如下:

  1. 回归和分类的区别
  2. 线性回归
  3. 最小二乘法
  4. 梯度下降法

回归和分类

回归和分类一样,都是对变量进行预测

回归是对连续型变量进行预测,回归预测建模是指建立输入变量X映射到连续输出变量Y的映射函数f

分类是对离散型或连续型变量进行预测,分类预测建模是指建立输入变量X映射到离散输出变量Y的映射函数f

比如,预测天气温度是回归问题,预测天气是下雨还是晴天就是分类问题

线性回归

线性回归(linear regression)是以线性模型来建模自变量和因变量之间关系的方法

y=h(x;θ)

其中x是自变量,y是因变量,θ是模型参数

如果自变量x只有一个,那么这种问题称为单变量线性回归(或称为一元线性回归);如果自变量x表示多个,那么成为多变量线性回归(或称为多元线性回归)

单变量线性回归

单变量线性问题可转换为求解二维平面上的直线问题

模型计算公式如下:

y=w1x+w0

参数集合θ={w0,w1}

在学习过程中,需要判断参数w0w1是否满足要求,即是否和所有数据点接近。使用均方误差(mean square error,简称MSE)来评估预测值和实际数据点的接近程度,模型评估公式如下:

J(w0,w1)=1Ni=1N(h(xi;θ)yi)2

其中yi表示真实数据,h表示估计值,J表示损失值

多变量线性回归

多变量线性回归计算公式如下:

{y1=w0+w1x11+...+wnx1ny2=w0+w1x21+...+wnx2n...ym=w0+w1xm1+...+wnxmn

参数m表示有m个等式,参数n表示每一组变量有n个参数。设x0=1,计算公式如下:

{y1=w0x10+w1x11+...+wnx1ny2=w0x20+w1x21+...+wnx2n...ym=w0xm0+w1xm1+...+wnxmn

此时每组参数个数增加为n+1,其向量化公式如下:

Y=XW

其中

Ym×1=[y1y2...ym]

Xm×(n+1)=[x10x11...x1nx20x21...x2n............xm0xm1...xmn]=[1x11...x1n1x21...x2n............1xm1...xmn]

W(n+1)×1=[w0w1...wn]

同样使用均方误差作为损失函数

J(W)=1Ni=1N(h(xi;W)yi)2

最小二乘法

利用最小二乘法(least square method)计算线性回归问题的参数,它通过最小化误差的平方和来求取目标函数的最优值,这样进一步转换为求取损失函数J的最小值,当J得到最小值时,参数偏导数一定为0

loss=NJ=i=1N(h(xi:θ)yi)2

有两种方式进行最小二乘法的计算,使用几何方式计算单变量线性回归问题,使用矩阵方式计算多变量线性回归问题

几何计算

J得到最小值时,w0w1的偏导数一定为0,所以参数w0w1的计算公式如下:

φJφw0=φφw01Ni=1N(h(xi)yi)2=φφw01Ni=1N(w0+w1xiyi)2 =2Ni=1N(w0+w1xiyi)=2w0+2Ni=1N(w1xiyi)

φJφw0=0w0=1Ni=1N(w1xiyi)=1N(i=1Nyii=1Nw1xi)=y¯w1x¯

φJφw1=φφw11Ni=1N(h(xi)yi)2=φφw11Ni=1N(w0+w1xiyi)2 =2Ni=1N(w0+w1xiyi)xi=2w0Ni=1Nxi+2w1Ni=1Nxixi2Ni=1Nxiyi =2w0x¯+2w1x2¯2xy¯

φJφw1=0,w0=y¯w1x¯x¯y¯w1x¯2+w1x2¯xy¯=0w1=xy¯x¯y¯x2¯x¯2

最终得到的w0w1的计算公式如下:

w0=y¯w1x¯

w1=xy¯x¯y¯x2¯x¯2

  • 参数y¯表示真实结果的均值
  • 参数x¯表示输入变量的均值
  • 参数xy¯表示输入变量和真实结果的乘积的均值
  • 其他变量以此类推

矩阵计算

基本矩阵运算如下:

(X±Y)T=XT±YT

(XY)T=YTXT

(AT)T=A

|AT|=|A|

矩阵求导如下:

φ(θTX)φθ=X

φ(XTθ)φθ=X

φ(θTθ)φθ=θ

φ(θTCθ)φθ=2Cθ

对多变量线性线性回归问题进行计算,

J(W)=1Ni=1N(h(xi;W)yi)2=1N(XWY)T(XWY) =1N((XW)TYT)(XWY))=1N(WTXTYT)(XWY)) =1N(WTXTXWWTXTYYTXW+YTY)

其中,WTXTYYTXW的转置,计算结果均为1×1的标量,所以大小相等,上式计算如下:

J(W)=1N(WTXTXW2WTXTY+YTY)

求解φJ(W)φW=0

φJ(W)φW=1NXTXW1NXTY=0

XTXW=XTY

W=(XTX)1XTY

XTX必须是非奇异矩阵,满足|XTX|0,才能保证可逆

对于矩阵的秩,有以下定理

  1. 对于n阶矩阵A,当且仅当|A|0时,R(An)=n,称A为满秩矩阵
  2. R(AT)=R(A)
  3. R(AB)min{R(A),R(B)}
  4. Am×n矩阵,则0(A)min{m,n}

所以矩阵X的秩R(X)需要为n+1(通常样本数量m大于变量数量n+1)时,才能保证能够使用最小二乘法的矩阵方式求解线性回归问题

示例

单边量线性回归测试数据参考[线性回归最小二乘法和梯度下降法]的瑞典汽车保险数据集

多变量线性回归测试数据参考courseraex1data2.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# -*- coding: utf-8 -*-

# @Time : 19-4-16 上午10:04
# @Author : zj

"""
最小二乘法计算线性回归问题
"""

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np


def load_sweden_data():
"""
加载单变量数据
"""
path = '../data/sweden.txt'
res = None
with open(path, 'r') as f:
line = f.readline()
res = np.array(line.strip().split(' ')).reshape((-1, 2))
# print(res)
x = []
y = []
for i, item in enumerate(res, 0):
item[1] = str(item[1]).replace(',', '.')
# print('%d %.3f' % (int(item[0]), float(item[1])))
x.append(int(item[0]))
y.append(float(item[1]))
return np.array(x), np.array(y)


def load_ex1_multi_data():
"""
加载多变量数据
"""
path = '../data/coursera2.txt'
datas = []
with open(path, 'r') as f:
lines = f.readlines()
for line in lines:
datas.append(line.strip().split(','))
data_arr = np.array(datas)
data_arr = data_arr.astype(np.float)

X = data_arr[:, :2]
Y = data_arr[:, 2]
return X, Y


def least_square_loss_v1(x, y):
"""
最小二乘法,几何运算
"""
X = np.array(x)
Y = np.array(y)
muX = np.mean(X)
muY = np.mean(Y)
muXY = np.mean(X * Y)
muXX = np.mean(X * X)

w1 = (muXY - muX * muY) / (muXX - muX ** 2)
w0 = muY - w1 * muX
return w0, w1


def least_square_loss_v2(x, y):
"""
最小二乘法,矩阵运算
"""
extend_x = np.insert(x, 0, values=np.ones(x.shape[0]), axis=1)
w = np.linalg.inv(extend_x.T.dot(extend_x)).dot(extend_x.T).dot(y)
return w


def compute_single_variable_linear_regression():
x, y = load_sweden_data()
w0, w1 = least_square_loss_v1(x, y)

y2 = w1 * x + w0

plt.scatter(x, y)
plt.plot(x, y2)

plt.show()


def compute_multi_variable_linear_regression():
x, y = load_ex1_multi_data()
# 计算权重
w = least_square_loss_v2(x, y)
print(w)


if __name__ == '__main__':
# compute_single_variable_linear_regression()
compute_multi_variable_linear_regression()

适用范围

最小二乘法直接进行计算就能求出解,操作简洁,最适用于计算单变量线性回归问题

而对于多变量线性回归问题,使用最小二乘法计算需要考虑计算效率,因为XTX的逆矩阵计算代价很大,同时需要考虑可逆问题,所以更推荐梯度下降算法来解决多变量线性回归问题

小结

本文学习了线性回归模型,利用最小二乘法(最小化误差的平方和)实现单边量/多变量线性数据的训练和预测

在训练过程中,线性回归模型使用线性映射进行前向计算,利用均方误差方法进行损失值的计算

  • 对于单变量线性回归问题,适用于最小二乘法的几何计算
  • 对于多变量线性回归问题,如果变量维数不大同时满足|XTX|0R(X)=n+1的情况,使用最小二乘法的矩阵计算;否则,利用梯度下降方式进行权重更新

线性回归模型更适用于回归问题,可以使用逻辑回归模型进行分类

相关阅读