引言
例子:房价预测
属于有监督学习
- 从给定输入和输出的训练即中学习输入和输出之间的映射函数,然后利用该映射函数预测出测试样本的输出值,其中训练集中的每个样本都由输入和对应的输出(也称之为label)组成(labeld data)
- 回归(Regression)——预测的目标值是数值型,连续变量
- 分类(Classification)——预测的目标值是离散的
01 回归与线性回归(Linear Regression Overview)
1.回归
- 根据自变量
x
1
,
x
2
,
.
.
.
,
x
n
x_1,x_2,...,x_n
x1,x2,...,xn以及因变量y的观测样本,去估计两者之间近似的函数关系
f
f
f
- 通常,假设函数 f f f的数学形式是已知的,但其中的若干个参数未知
- 通过自变量和因变量的观测样本去估计未知的参数值—— 参 数 回 归 \color{yellow}{参数回归} 参数回归
2.线性回归
- 函数 f f f是线性函数
- 机器学习中最简单的模型之一
- 线性回归方程的一般形式
y
=
w
0
+
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
x
n
y=w_0+w_1x_1+w_2x_2+...+w_nx_n
y=w0+w1x1+w2x2+...+wnxn,
其中W=[
w
0
w
1
w
2
.
.
.
w
n
w_0w_1w_2...w_n
w0w1w2...wn]为回归系数
一元回归
- 一个自变量,n=1
多元回归
- 有两个或两个以上的自变量,n>1
回归
- 求回归系数的过程
例——房价预测
- 目标值Price
- 一元回归问题
- 计算公式
-
P
r
i
c
e
=
0.2
∗
S
i
z
e
\color{yellow}{Price=0.2*Size}
Price=0.2∗Size
- 回归方程
- 0.2称为 回 归 系 数 \color{yellow}{回归系数} 回归系数
-
P
r
i
c
e
=
0.2
∗
S
i
z
e
\color{yellow}{Price=0.2*Size}
Price=0.2∗Size
多项式回归可转换为多元线性回归
-
一元m次多项式回归方程
y = w 0 + w 1 x + w 2 x 2 + . . . + w m x m y=w_0+w_1x+w_2x^2+...+w_mx^m y=w0+w1x+w2x2+...+wmxm
可转换为m元线性回归方程
y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w m x m y=w_0+w_1x_1+w_2x_2+...+w_mx_m y=w0+w1x1+w2x2+...+wmxm
其中 x i = x i x_i=x^i xi=xi -
二元二次多项式回归方程
y = a 0 + a 1 x 1 2 + a 2 x 2 2 + a 3 x 1 x 2 + a 4 x 1 + a 5 x 2 y=a_0+a_1x_{1}^{2}+a_2x_{2}^{2}+a_3x_{1}x_{2}+a_4x_1+a_5x_2 y=a0+a1x12+a2x22+a3x1x2+a4x1+a5x2
可转换为5元线性回归方程
y = w 0 + w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5 y=w_0+w_1z_1+w_2z_2+w_3z_3+w_4z_4+w_5z_5 y=w0+w1z1+w2z2+w3z3+w4z4+w5z5
其中 z 1 = x 1 2 , z 2 = x 2 2 , z 3 = x 1 x 2 , z 4 = x 1 , z 5 = x 2 z_1=x_{1}^{2},z_2=x_{2}^{2},z_3=x_{1}x_{2},z_4=x_1,z_5=x_2 z1=x12,z2=x22,z3=x1x2,z4=x1,z5=x2
线性回归的一般方法
收集数据,采集训练样本,每个训练样本包括特征向量及其对应的期望输出
-
假设有n个已标记的样本数据, X i X_i Xi为第i个样本, y i y_i yi是该样本给定的期望输出
- 其中 X i = [ x 0 = 1 , x 1 , x 2 , . . . , x m ] X_i=[x_0=1,x_1,x_2,...,x_m] Xi=[x0=1,x1,x2,...,xm]
- 回归系数W=[w_0,w_1,…,w_m]
- 预测值 y i ′ = X i W y_i'=X_iW yi′=XiW
-
设 计 训 练 算 法 找 到 回 归 系 数 \color{yellow}{设计训练算法找到回归系数} 设计训练算法找到回归系数
- 显然,直观的方法,希望输出的期望值与测试值误差最小
线性回归的损失函数(Cost function)
( x 1 , y 1 ) 与 ( x 1 , y 1 ′ ) 的 距 离 (x_1,y_1)与(x_1,y_1')的距离 (x1,y1)与(x1,y1′)的距离:
d 1 = ( x 1 − x 1 ) 2 + ( y 1 − y 1 ′ ) 2 = ∣ y 1 − y 1 ′ ∣ = ∣ y 1 − X 1 W ∣ d_1=\sqrt {(x_1-x_1)^2+(y_1-y_1')^2}=|y_1-y_1'|=|y_1-X_1W| d1=(x1−x1)2+(y1−y1′)2=∣y1−y1′∣=∣y1−X1W∣
其中
W = [ w 0 w 1 ] , X 1 = [ 1 x 1 ] W=\begin{bmatrix} w_0 \\ w_1 \\ \end{bmatrix},X_1=\begin{bmatrix} 1 & x_1 \end{bmatrix} W=[w0w1],X1=[1x1]
为消除正负值的影响,取 d i 2 d_{i}^{2} di2
损 失 函 数 : \color{yellow}{损失函数}: 损失函数:
f ( W ) = ∑ i = 1 n d i 2 = ∑ i = 1 n ( y i − y i ′ ) 2 f(W)=\sum_{i=1}{n}d_{i}^{2}=\sum_{i=1}{n}(y_i-y_i')^2 f(W)=∑i=1ndi2=∑i=1n(yi−yi′)2
∑ i = 1 n ( y i − X 1 W ) 2 \sum_{i=1}^{n}(y_i-X_1W)^2 ∑i=1n(yi−X1W)2
n为样本的数量
02 普通线性回归(OLR,Ordinary Linear Regression)
正则方程(Normal Equation)
- 对第i个训练样本,期望输出 y i y_i yi,预测输出 y i ′ y_i' yi′
- 构造损失函数
f ( W ) = ∑ i = 1 n ( y i − y i ′ ) 2 = ∑ i = 1 n ( y i − X i W ) 2 f(W)=\sum_{i=1}^{n}(y_i-y_i')^2=\sum_{i=1}^{n}(y_i-X_iW)^2 f(W)=∑i=1n(yi−yi′)2=∑i=1n(yi−XiW)2- 目的:
m
i
n
f
(
W
)
min f(W)
minf(W)
- 最小二乘法
- 又称最小平方法,是一种数学优化技术
- 通过最小化误差的平方和寻找数据的最佳函数匹配
- 如何求函数的最小值
- 对W求导(即对每一个w_i球偏导),令导数等于0,求出W的最优估计
- 目的:
m
i
n
f
(
W
)
min f(W)
minf(W)
损失函数的矩阵表示
f
(
W
)
=
{
f
(
w
)
=
(
Y
−
X
W
)
T
(
Y
−
X
W
)
=
Y
T
Y
−
Y
T
X
W
−
W
T
X
T
Y
+
W
T
X
T
X
W
f(W)=\left\{ \begin{aligned} f(w)&=(Y-XW)^T(Y-XW) \\ & = Y^TY-Y^TXW-W^TX^TY+W^TX^TXW\\ \end{aligned} \right.
f(W)={f(w)=(Y−XW)T(Y−XW)=YTY−YTXW−WTXTY+WTXTXW
其中,
Y
=
[
y
1
,
y
2
,
.
.
.
y
n
]
T
Y=[y_1,y_2,...y_n]^T
Y=[y1,y2,...yn]T,
W
=
[
w
0
,
w
1
,
.
.
.
w
m
]
T
W=[w_0,w_1,...w_m]^T
W=[w0,w1,...wm]T
X
=
[
X
1
,
X
2
,
.
.
.
X
n
]
T
X=[X_1,X_2,...X_n]^T
X=[X1,X2,...Xn]T
X
i
=
[
X
i
0
,
X
i
1
,
.
.
.
X
n
m
]
T
X_i=[X_{i0},X_{i1},...X_{nm}]^T
Xi=[Xi0,Xi1,...Xnm]T
即
X
=
[
x
10
x
11
.
.
.
x
1
m
x
20
x
21
.
.
.
x
2
m
x
n
0
x
n
1
.
.
.
x
n
m
]
即X=\begin{bmatrix} x_{10}&x_{11}&...x_{1m}\\ x_{20}&x_{21}&...x_{2m}\\ x_{n0}&x_{n1}&...x_{nm} \end{bmatrix}
即X=⎣⎡x10x20xn0x11x21xn1...x1m...x2m...xnm⎦⎤
W
T
X
T
Y
=
(
Y
T
X
W
)
T
为
一
个
一
元
矩
阵
\color{green}{W^TX^TY=(Y^TXW)^T为一个一元矩阵}
WTXTY=(YTXW)T为一个一元矩阵
W
T
X
T
Y
=
Y
T
X
W
\color{green}{W^TX^TY=Y^TXW}
WTXTY=YTXW
所以我们可以得到
f ( W ) = { f ( w ) = Y T Y − Y T X W − W T X T Y + W T X T X W = Y T Y − 2 W T X T Y + W T X T X W f(W)=\left\{ \begin{aligned} f(w)&=Y^TY-Y^TXW-W^TX^TY+W^TX^TXW \\ & = Y^TY-2W^TX^TY+W^TX^TXW\\ \end{aligned} \right. f(W)={f(w)=YTY−YTXW−WTXTY+WTXTXW=YTY−2WTXTY+WTXTXW
∂ W T X T X W ∂ W \frac{\partial W^TX^TXW}{\partial W} ∂W∂WTXTXW
= ( X T X + ( X T X ) T W =(X^TX+(X^TX)^TW =(XTX+(XTX)TW
= 2 X T X W =2X^TXW =2XTXW
对W求导
f
(
W
)
′
=
2
X
T
X
W
−
2
X
T
Y
f(W)'=2X^TXW-2X^TY
f(W)′=2XTXW−2XTY
令
X
T
X
W
−
X
T
Y
=
0
,
求
出
W
^
=
(
X
T
X
)
−
1
X
T
Y
公
式
(
1
)
X^TXW-X^TY=0,求出\hat W\ =(X^TX)^{-1}X^TY \ 公式(1)
XTXW−XTY=0,求出W^ =(XTX)−1XTY 公式(1)
逆 矩 阵 存 在 的 条 件 ∣ X T X ∣ ≠ 0 \color{green}{逆矩阵存在的条件|X^TX|≠0} 逆矩阵存在的条件∣XTX∣=0
行 列 式 ≠ 0 行列式≠0 行列式=0
练习
对上图的散点图给出最佳拟合直线
对应数据文件——ex0.txt
- 编程思想
- 读入数据文件中的数据
- 建立输入、输出矩阵
- 根据公式(1)计算回归系数
1.000000 0.067732 3.176513
1.000000 0.427810 3.816464
1.000000 0.995731 4.550095
1.000000 0.738336 4.256571
1.000000 0.981083 4.560815
1.000000 0.526171 3.929515
1.000000 0.378887 3.526170
1.000000 0.033859 3.156393
1.000000 0.132791 3.110301
1.000000 0.138306 3.149813
1.000000 0.247809 3.476346
1.000000 0.648270 4.119688
1.000000 0.731209 4.282233
1.000000 0.236833 3.486582
1.000000 0.969788 4.655492
1.000000 0.607492 3.965162
1.000000 0.358622 3.514900
1.000000 0.147846 3.125947
1.000000 0.637820 4.094115
1.000000 0.230372 3.476039
1.000000 0.070237 3.210610
1.000000 0.067154 3.190612
1.000000 0.925577 4.631504
1.000000 0.717733 4.295890
1.000000 0.015371 3.085028
1.000000 0.335070 3.448080
1.000000 0.040486 3.167440
1.000000 0.212575 3.364266
1.000000 0.617218 3.993482
1.000000 0.541196 3.891471
1.000000 0.045353 3.143259
1.000000 0.126762 3.114204
1.000000 0.556486 3.851484
1.000000 0.901144 4.621899
1.000000 0.958476 4.580768
1.000000 0.274561 3.620992
1.000000 0.394396 3.580501
1.000000 0.872480 4.618706
1.000000 0.409932 3.676867
1.000000 0.908969 4.641845
1.000000 0.166819 3.175939
1.000000 0.665016 4.264980
1.000000 0.263727 3.558448
1.000000 0.231214 3.436632
1.000000 0.552928 3.831052
1.000000 0.047744 3.182853
1.000000 0.365746 3.498906
1.000000 0.495002 3.946833
1.000000 0.493466 3.900583
1.000000 0.792101 4.238522
1.000000 0.769660 4.233080
1.000000 0.251821 3.521557
1.000000 0.181951 3.203344
1.000000 0.808177 4.278105
1.000000 0.334116 3.555705
1.000000 0.338630 3.502661
1.000000 0.452584 3.859776
1.000000 0.694770 4.275956
1.000000 0.590902 3.916191
1.000000 0.307928 3.587961
1.000000 0.148364 3.183004
1.000000 0.702180 4.225236
1.000000 0.721544 4.231083
1.000000 0.666886 4.240544
1.000000 0.124931 3.222372
1.000000 0.618286 4.021445
1.000000 0.381086 3.567479
1.000000 0.385643 3.562580
1.000000 0.777175 4.262059
1.000000 0.116089 3.208813
1.000000 0.115487 3.169825
1.000000 0.663510 4.193949
1.000000 0.254884 3.491678
1.000000 0.993888 4.533306
1.000000 0.295434 3.550108
1.000000 0.952523 4.636427
1.000000 0.307047 3.557078
1.000000 0.277261 3.552874
1.000000 0.279101 3.494159
1.000000 0.175724 3.206828
1.000000 0.156383 3.195266
1.000000 0.733165 4.221292
1.000000 0.848142 4.413372
1.000000 0.771184 4.184347
1.000000 0.429492 3.742878
1.000000 0.162176 3.201878
1.000000 0.917064 4.648964
1.000000 0.315044 3.510117
1.000000 0.201473 3.274434
1.000000 0.297038 3.579622
1.000000 0.336647 3.489244
1.000000 0.666109 4.237386
1.000000 0.583888 3.913749
1.000000 0.085031 3.228990
1.000000 0.687006 4.286286
1.000000 0.949655 4.628614
1.000000 0.189912 3.239536
1.000000 0.844027 4.457997
1.000000 0.333288 3.513384
1.000000 0.427035 3.729674
1.000000 0.466369 3.834274
1.000000 0.550659 3.811155
1.000000 0.278213 3.598316
1.000000 0.918769 4.692514
1.000000 0.886555 4.604859
1.000000 0.569488 3.864912
1.000000 0.066379 3.184236
1.000000 0.335751 3.500796
1.000000 0.426863 3.743365
1.000000 0.395746 3.622905
1.000000 0.694221 4.310796
1.000000 0.272760 3.583357
1.000000 0.503495 3.901852
1.000000 0.067119 3.233521
1.000000 0.038326 3.105266
1.000000 0.599122 3.865544
1.000000 0.947054 4.628625
1.000000 0.671279 4.231213
1.000000 0.434811 3.791149
1.000000 0.509381 3.968271
1.000000 0.749442 4.253910
1.000000 0.058014 3.194710
1.000000 0.482978 3.996503
1.000000 0.466776 3.904358
1.000000 0.357767 3.503976
1.000000 0.949123 4.557545
1.000000 0.417320 3.699876
1.000000 0.920461 4.613614
1.000000 0.156433 3.140401
1.000000 0.656662 4.206717
1.000000 0.616418 3.969524
1.000000 0.853428 4.476096
1.000000 0.133295 3.136528
1.000000 0.693007 4.279071
1.000000 0.178449 3.200603
1.000000 0.199526 3.299012
1.000000 0.073224 3.209873
1.000000 0.286515 3.632942
1.000000 0.182026 3.248361
1.000000 0.621523 3.995783
1.000000 0.344584 3.563262
1.000000 0.398556 3.649712
1.000000 0.480369 3.951845
1.000000 0.153350 3.145031
1.000000 0.171846 3.181577
1.000000 0.867082 4.637087
1.000000 0.223855 3.404964
1.000000 0.528301 3.873188
1.000000 0.890192 4.633648
1.000000 0.106352 3.154768
1.000000 0.917886 4.623637
1.000000 0.014855 3.078132
1.000000 0.567682 3.913596
1.000000 0.068854 3.221817
1.000000 0.603535 3.938071
1.000000 0.532050 3.880822
1.000000 0.651362 4.176436
1.000000 0.901225 4.648161
1.000000 0.204337 3.332312
1.000000 0.696081 4.240614
1.000000 0.963924 4.532224
1.000000 0.981390 4.557105
1.000000 0.987911 4.610072
1.000000 0.990947 4.636569
1.000000 0.736021 4.229813
1.000000 0.253574 3.500860
1.000000 0.674722 4.245514
1.000000 0.939368 4.605182
1.000000 0.235419 3.454340
1.000000 0.110521 3.180775
1.000000 0.218023 3.380820
1.000000 0.869778 4.565020
1.000000 0.196830 3.279973
1.000000 0.958178 4.554241
1.000000 0.972673 4.633520
1.000000 0.745797 4.281037
1.000000 0.445674 3.844426
1.000000 0.470557 3.891601
1.000000 0.549236 3.849728
1.000000 0.335691 3.492215
1.000000 0.884739 4.592374
1.000000 0.918916 4.632025
1.000000 0.441815 3.756750
1.000000 0.116598 3.133555
1.000000 0.359274 3.567919
1.000000 0.814811 4.363382
1.000000 0.387125 3.560165
1.000000 0.982243 4.564305
1.000000 0.780880 4.215055
1.000000 0.652565 4.174999
1.000000 0.870030 4.586640
1.000000 0.604755 3.960008
1.000000 0.255212 3.529963
1.000000 0.730546 4.213412
1.000000 0.493829 3.908685
1.000000 0.257017 3.585821
1.000000 0.833735 4.374394
1.000000 0.070095 3.213817
1.000000 0.527070 3.952681
1.000000 0.116163 3.129283
# -*- coding:utf-8 -*-
from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
import numpy as np
def loadDataSet(fileName):
"""
函数说明:加载数据
Parameters:
fileName - 文件名
Returns:
xArr - x数据集
yArr - y数据集
"""
numFeat = len(open(fileName).readline().split('\t')) - 1
xArr = []; yArr = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
xArr.append(lineArr)
yArr.append(float(curLine[-1]))
return xArr, yArr
def standRegres(xArr,yArr):
"""
函数说明:计算回归系数w
Parameters:
xArr - x数据集
yArr - y数据集
Returns:
ws - 回归系数
"""
xMat = np.mat(xArr); yMat = np.mat(yArr).T
xTx = xMat.T * xMat #根据文中推导的公示计算回归系数
if np.linalg.det(xTx) == 0.0:
print("矩阵为奇异矩阵,不能求逆")
return
ws = xTx.I * (xMat.T*yMat)
return ws
def plotDataSet():
"""
函数说明:绘制数据集
Parameters:
无
Returns:
无
"""
xArr, yArr = loadDataSet('ex0.txt') #加载数据集
n = len(xArr) #数据个数
xcord = []; ycord = [] #样本点
for i in range(n):
xcord.append(xArr[i][1]); ycord.append(yArr[i]) #样本点
fig = plt.figure()
ax = fig.add_subplot(111) #添加subplot
ax.scatter(xcord, ycord, s = 20, c = 'blue',alpha = .5) #绘制样本点
plt.title('DataSet') #绘制title
plt.xlabel('X')
plt.show()
def plotRegression():
"""
函数说明:绘制回归曲线和数据点
Parameters:
无
Returns:
无
"""
xArr, yArr = loadDataSet('ex0.txt') #加载数据集
ws = standRegres(xArr, yArr) #计算回归系数
xMat = np.mat(xArr) #创建xMat矩阵
yMat = np.mat(yArr) #创建yMat矩阵
xCopy = xMat.copy() #深拷贝xMat矩阵
xCopy.sort(0) #对数据进行排序
yHat = xCopy * ws #计算对应的y值
fig = plt.figure()
ax = fig.add_subplot(111) #添加subplot
ax.plot(xCopy[:, 1], yHat, c = 'red') #绘制回归曲线
ax.scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue',alpha = .5) #绘制样本点,使用flatten()展平数据
plt.title('DataSet') #绘制title
plt.xlabel('X')
plt.show()
def plotlwlrRegression():
"""
函数说明:绘制多条局部加权回归曲线
Parameters:
无
Returns:
无
"""
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
xArr, yArr = loadDataSet('ex0.txt') #加载数据集
yHat_1 = lwlrTest(xArr, xArr, yArr, 1.0) #根据局部加权线性回归计算yHat
yHat_2 = lwlrTest(xArr, xArr, yArr, 0.01) #根据局部加权线性回归计算yHat
yHat_3 = lwlrTest(xArr, xArr, yArr, 0.003) #根据局部加权线性回归计算yHat
xMat = np.mat(xArr) #创建xMat矩阵
yMat = np.mat(yArr) #创建yMat矩阵
srtInd = xMat[:, 1].argsort(0) #排序,返回索引值
xSort = xMat[srtInd][:,0,:]
fig, axs = plt.subplots(nrows=3, ncols=1,sharex=False, sharey=False, figsize=(10,8))
axs[0].plot(xSort[:, 1], yHat_1[srtInd], c = 'red') #绘制回归曲线
axs[1].plot(xSort[:, 1], yHat_2[srtInd], c = 'red') #绘制回归曲线
axs[2].plot(xSort[:, 1], yHat_3[srtInd], c = 'red') #绘制回归曲线
axs[0].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue', alpha = .5) #绘制样本点
axs[1].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue', alpha = .5) #绘制样本点
axs[2].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue', alpha = .5) #绘制样本点
#设置标题,x轴label,y轴label
axs0_title_text = axs[0].set_title(u'局部加权回归曲线,k=1.0',FontProperties=font)
axs1_title_text = axs[1].set_title(u'局部加权回归曲线,k=0.01',FontProperties=font)
axs2_title_text = axs[2].set_title(u'局部加权回归曲线,k=0.003',FontProperties=font)
plt.setp(axs0_title_text, size=8, weight='bold', color='red')
plt.setp(axs1_title_text, size=8, weight='bold', color='red')
plt.setp(axs2_title_text, size=8, weight='bold', color='red')
plt.xlabel('X')
plt.show()
def lwlr(testPoint, xArr, yArr, k = 1.0):
"""
函数说明:使用局部加权线性回归计算回归系数w
Parameters:
testPoint - 测试样本点
xArr - x数据集
yArr - y数据集
k - 高斯核的k,自定义参数
Returns:
ws - 回归系数
"""
xMat = np.mat(xArr); yMat = np.mat(yArr).T
m = np.shape(xMat)[0]
weights = np.mat(np.eye((m))) #创建权重对角矩阵
for j in range(m): #遍历数据集计算每个样本的权重
diffMat = testPoint - xMat[j, :]
weights[j, j] = np.exp(diffMat * diffMat.T/(-2.0 * k**2))
xTx = xMat.T * (weights * xMat)
if np.linalg.det(xTx) == 0.0:
print("矩阵为奇异矩阵,不能求逆")
return
ws = xTx.I * (xMat.T * (weights * yMat)) #计算回归系数
return testPoint * ws
def lwlrTest(testArr, xArr, yArr, k=1.0):
"""
函数说明:局部加权线性回归测试
Parameters:
testArr - 测试数据集
xArr - x数据集
yArr - y数据集
k - 高斯核的k,自定义参数
Returns:
ws - 回归系数
"""
m = np.shape(testArr)[0] #计算测试数据集大小
yHat = np.zeros(m)
for i in range(m): #对每个样本点进行预测
yHat[i] = lwlr(testArr[i],xArr,yArr,k)
return yHat
if __name__ == '__main__':
plotlwlrRegression()
相关系数分析
如何判断模型的优劣?
- 右边两组数据集得到完全相同的回归系数(0,2.0)
- 通过预测值和真实值得匹配程度判断优劣
- 相关系数
r ( X , Y ) = c o v ( X , Y ) D ( x ) D ( Y ) r(X,Y)=\frac{cov(X,Y)}{\sqrt{D(x)}\sqrt{D(Y)}} r(X,Y)=D(x)D(Y)cov(X,Y)
其中cov(X,Y)是协方差, D ( X ) \sqrt {D(X)} D(X)是方差
- 显然r(X,X)=1
NumPy库中相关系数计算方法
- corrcoef(yHat.T,yMat)
- 请分析根据ex0.txt数据集得到的结果的相关系数
- 0.98647356
OLR存在的问题及改进
- 欠拟合现象常见
- 若出现欠拟合则不能取得最好的预测效果
- 显然红线的拟合效果更好
- 改进
- 原算法所有输入输出对(x,y)采用同样的回归系数,画出一条直线
- 若每个(x,y)有自己的回归系数则会出现一条折线
* 预测点附近的点有更高的权重参与回归分析
03 基于梯度下降的线性回归(Gradient Descent)
正则方程问题
- OLR使用正则方程来求解回归系数
W ^ = ( X T X ) − 1 X T Y \hat W\ =(X^TX)^{-1}X^TY W^ =(XTX)−1XTY - 若X^TX不可逆,则无法求解
- 且若参数维度非常大,解析解计算量过大,显然也不适用
- 特征数量不超过100000时可用正则方程求解
- 另一种求解回归系数的方法
- 梯度下降
梯度下降
- 一种迭代寻优的算法
- 要找到某函数的最小值,总是沿着其下降最快的方向搜索
- 梯度上升
若损失函数图像如下:
回到损失函数
- 梯度上升
- f ( W ) = ∑ i = 1 n ( y i − y i ′ ) 2 = ∑ i = 1 n ( y i − X i W ) 2 f(W)=\sum_{i=1}^{n}(y_i-y_i')^2=\sum_{i=1}^{n}(y_i-X_iW)^2 f(W)=∑i=1n(yi−yi′)2=∑i=1n(yi−XiW)2
- 稍加修改
f ( W ) = 1 2 ∑ i = 1 n ( y i − X i W ) 2 f(W)=\frac{1}{2}\sum_{i=1}^{n}(y_i-X_iW)^2 f(W)=21i=1∑n(yi−XiW)2 - 梯度
Δ = ∂ f ( W ) ∂ W = 1 2 ∂ ∑ i = 1 n ( y i − X i W ) 2 ∂ W = − ∑ i = 1 n ( y i − X i W ) \begin{matrix} \Delta=\frac{\partial f(W)}{\partial W}=\frac{1}{2}\frac{\partial \sum_{i=1}^{n}(y_i-X_iW)^2}{\partial W}\\ =- \sum_{i=1}^{n}(y_i-X_iW) \end{matrix} Δ=∂W∂f(W)=21∂W∂∑i=1n(yi−XiW)2=−∑i=1n(yi−XiW)
梯度确定搜索方向
还需确定搜索的步长 - 记为 α \alpha α
- 回归系数更新公式
W ^ = W ^ − α Δ = W ^ + α ∑ i = 1 n X i ( y i − X i W ) \hat W\ =\hat W-\alpha\Delta=\hat W+\alpha \sum_{i=1}{n}X_i(y_i-X_iW) W^ =W^−αΔ=W^+α∑i=1nXi(yi−XiW)
确定步长 α \alpha α
- 取值取决于数据样本
- 步长太大,会导致迭代过快,甚至有可能会错过最优解
- 步长太小,迭代速度太慢,收敛速度慢
终止条件 - 最大终止代数
- 误差小于给定的小值
算法参数的初始值选择 - 初始值不同,获得的最小值也有可能不同,
梯度下降求得的只是局部最小值 - 如果损失函数是凸函数则一定是最优解
二次求导f(x)’’<0,证明为凸
1.凸优化和非凸优化
梯度下降的一些注意事项
数据归一化
- 由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化
常用归一化公式
-
x
=
x
−
μ
σ
x=\frac{x-μ}{\sigma}
x=σx−μ
其中,μ为均值, σ \sigma σ为均方差,x为特征
2. x = x − x m i n x m a x − x m i n x=\frac{x-x_{min}}{x_{max}-x_{min}} x=xmax−xminx−xmin
按第二种归一化方法
梯度下降伪代码
每个回归系数初始化为1
LOOP
计算整个数据集的梯度
Δ = ∑ i = 1 n X i ( y i − X i W ) \Delta=\sum_{i=1}^{n}X_i(y_i-X_iW) Δ=i=1∑nXi(yi−XiW)
更新回归系数
W ^ = W ^ − α Δ \hat W=\hat W-\alpha\Delta W^=W^−αΔ
ENDLOOP
梯度下降实战
- 修改线性回归
的代码,加入
gradDscent(xAr
r, yArr)函数 - 结果相比较
- 解析解
[[ 3.00774324]
[ 1.69532264]] - 梯度下降
[[ 3.00758726]
[ 1.69562035]]
- 解析解
梯度下降存在的问题
需要确定的参数比较多
每次更新回归系数时要遍历整个数据集
Δ = − σ𝑖=1 𝑛 𝑋𝑖(𝑦𝑖 − 𝑋𝑖𝑊)
数据集数据量大时计算代价太高
- 改进
►仅在新样本来时对回归系数进行增量式更新
►每次只用一个样本点来更新回归系数
►随机梯度下降
► Δ = − X i ( y i − X i W ) \Delta = -X_i(y_i-X_iW) Δ=−Xi(yi−XiW)
随机梯度下降(Stochastic Gradient Descent)
算法步骤
- BEGIN
- 所有回归系数初始化为1
- 对数据集中每个样本
- 计算该样本的梯度
- 更新回归系数值 - 返回回归系数值
- END
实验结果
► 随机梯度下降的回归系数
[1.4159566 1.21208609]
► 梯度下降的回归系数
[[ 3.00758726] [ 1.69562035]]
GD VS. SGD
实验结果分析
►修改代码
- 增加步长,加快调整
步伐 - 让SGD针对所有样本
迭代200次 - 第二种修改实验结果
- SGD
[ 2.99841277 1.7135262 ] - GD
[[ 3.00758726] [ 1.69562035]]
随机梯度下降的改进
步长决定了每一次回归系数调整的幅度
- 大的步长能加快收敛速度,但有可能错过最优值
- 小的步长收敛速度慢,但有助于找到最优值
改进 - 步长
α
=
f
(
i
t
e
r
)
\alpha=f(iter)
α=f(iter)
- iter为迭代的代数
- 即令步长等于当前迭代树的函数
- 一般为线性函数
- 随iter增加减少
数据集中的点不一定都能拟合到直线上
- 原算法中依次取样本数据中的点,很可能造成回归系数的震荡
- ex0.txt和ex1.txt的数据简单,没有这种现象
改进
- ex0.txt和ex1.txt的数据简单,没有这种现象
- 每次随机取一个样本点计算回归系数的增量
练习 2
►分别采用梯度下降和随机梯度下降算法对
ex0.txt,ex1.txt数据集进行分析
►改进SGD,设计一个步长的调整函数,尝
试不同的参数,与未改进的SGD进行比较
►将GD,SGD,ASGD的结果画在一张图
上,用不同颜色表示,并给出最后的回归
系数
►分析OLR,GD,SGD和改进的SGD的结
果,计算相关系数,并自行设计表格,列
表比较
04 正则化(Regularization)
误差(Error)
Error=Bias+Variance
- 偏差(Bias)反映的是模型在样本上的输出与真实值之间的差,即模型本身的精准度
- 方差(Variance)反映的是模型每一次输出结果与模型输出期之间的误差,即模型的稳定性
训练误差
- 学习到的模型的预测值与真实值(标签)在训练数据集上的平均误差
- 本质上不重要,仅对判断给定问题是否为容易学习的问题由意义
测试误差
- 预测值与真实值在测试数据集上的平均误差
- 反映了学习方法对未知测试数据的预测能力,是重要指标
- 通常将学习方法对未知数据的预测能力称为泛化能力
过拟合
通常发生在变量(特征)过多的时候
训练数据上误差逐渐减小时,测试数据上误差反而增大,模型泛化能力弱
- 泛化——一个假设模型能够应用到新样本的能力
原因:
数据量小
数据噪音大
模型任务本身很复杂
模型搜索空间太大
假设模型包括二项式、三项式…1024项式…,最后选择的最优模型时最高次项的模型
防止过拟合的方法
获取更多数据
权值衰减
减少特征的数量
正则化
正则化:
- 对模型参数添加先验知识,使得模型复杂度较小
- 过拟合的时候,拟合函数的系数往往非常大,正则化减小参数
- 数值的大小,从而减小特征变量的数量级
原来的损失函数只考虑了经验风险
f
(
W
)
=
∑
i
=
1
n
(
y
i
−
X
i
W
)
2
=
(
Y
−
X
W
)
T
(
Y
−
X
W
)
\begin{matrix} f(W)=\sum_{i=1}^{n}(y_i-X_iW)^2\\ =(Y-XW)^T(Y-XW) \end{matrix}
f(W)=∑i=1n(yi−XiW)2=(Y−XW)T(Y−XW)
►加入正则项共同构成结构风险
f
(
W
)
=
(
Y
−
X
W
)
T
(
Y
−
X
W
)
+
λ
R
(
W
)
f(W)=(Y-XW)^T(Y-XW)+\lambda R(W)
f(W)=(Y−XW)T(Y−XW)+λR(W)
其中𝜆是参数,不同的值有不同的正则化效果
𝑅(𝑊)为正则项,一般取L1或L2范数
L0,L1与L2范数
L0范数
- 向量中非0的元素的个数,用 ∣ ∣ W ∣ ∣ 0 ||W||_0 ∣∣W∣∣0表示
- 例:W=[0.4 -0.7 0.3], ∣ ∣ W ∣ ∣ 0 = 3 ||W||_0=3 ∣∣W∣∣0=3
- 使用L0范数的目的
- 希望W的大部分元素都是0
- 实现W的稀疏化
- 减少特征
L1范数
- 向量中各个元素绝对值之和,也称“稀疏规则算”,用 ∣ ∣ W ∣ ∣ 1 ||W||_1 ∣∣W∣∣1表示
- 例:W=[0.4 -0.7 0.3], ∣ ∣ W ∣ ∣ 1 = 1.4 ||W||_1=1.4 ∣∣W∣∣1=1.4
- 使用L1范数的目的
- 与L0相同,两者在一定条件下等价
- L0范数很难优化求解
- L1具有更好的优化求解特性被广泛应用
L2范数
-
向量各元素的平方和的平方根,用 ∣ ∣ W ∣ ∣ 2 ||W||_2 ∣∣W∣∣2表示
-
例:W=[0.4 -0.7 0.3], ∣ ∣ W ∣ ∣ 2 = 0. 4 2 + 0 2 + ( − 0.7 ) 2 + 0. 3 2 ||W||_2=\sqrt{0.4^2+0^2+(-0.7)^2+0.3^2} ∣∣W∣∣2=0.42+02+(−0.7)2+0.32
-
使用L2范数的目的
- 使得W的每个元素都很小,都接近于0
- 与L1范数不同,它不会让W的元素等于0,而是接近于0
- 越小的参数说明模型越简单
- 越简单的模型则越不容易产生过拟合现象
加入正则项的线性回归
岭回归(Ridge Regression)
- 加入L2范数的线性回归
- 正则项为L2范数的平方
- 缩减(shrinkage)
- 损失函数
f ( W ) = ( Y − X W ) T ( Y − X W ) + λ R ∣ ∣ W ∣ ∣ 2 2 = ( Y − X W ) T ( Y − X W ) + λ W T W \begin{matrix} f(W)=(Y-XW)^T(Y-XW)+\lambda R||W||_{2}^{2}\\ =(Y-XW)^T(Y-XW)+\lambda W^TW \end{matrix} f(W)=(Y−XW)T(Y−XW)+λR∣∣W∣∣22=(Y−XW)T(Y−XW)+λWTW
f ( W ) ′ = 2 X T X W − 2 X T Y + 2 λ W = ( X T X + λ I ) W − 2 X T Y \begin{matrix} f(W)'=2X^TXW-2X^TY+2\lambda W\\ =(X^TX+\lambda I)W-2X^TY \end{matrix} f(W)′=2XTXW−2XTY+2λW=(XTX+λI)W−2XTY
令 f ( W ) ′ = 0 , 则 W = ( X T X + λ I ) − 1 X T Y f(W)'=0,则W=(X^TX+\lambda I)^{-1}X^TY f(W)′=0,则W=(XTX+λI)−1XTY
若 X T X 为 奇 异 矩 阵 , 普 通 线 性 回 归 无 法 求 解 析 解 X^TX为奇异矩阵,普通线性回归无法求解析解 XTX为奇异矩阵,普通线性回归无法求解析解 - 岭回归加入 λ I 扰 动 , 使 得 矩 阵 非 奇 异 \lambda I扰动,使得矩阵非奇异 λI扰动,使得矩阵非奇异
Lasso回归(Lasso Regression)
- 加入L1范数的线性回归
- 损失函数
f ( W ) = ( Y − X W ) T ( Y − X W ) + λ R ∣ ∣ W ∣ ∣ 1 f(W)=(Y-XW)^T(Y-XW)+\lambda R||W||_{1} f(W)=(Y−XW)T(Y−XW)+λR∣∣W∣∣1
则 f ( W ) ′ = 2 X T X W − 2 X T Y + λ s g n ( W ) 则f(W)'=2X^TXW-2X^TY+\lambda sgn(W) 则f(W)′=2XTXW−2XTY+λsgn(W) - 计算复杂度高
- 需使用二次规划算法
Scikit-learn中的线性回归
►Scikit-learn是一个用于机器学习的功能强大
的python包 ►在数据量不是过大的情况下,可以解决大部
分问题
►Scikit-learn中线性回归模块均包含在linear_model 中
►引入包:from sklearn import linear_model
►普通线性回归LinearRegression()
►岭回归Ridge()
► Lasso回归Lasso ( )
项目1——鲍鱼年龄预测
►实验数据来自UCI数据集
► 鲍鱼年龄可从鲍鱼壳上的年轮推算
► 共4177条数据,8个特征,1个标签,无缺失数据
项目2——波士顿房价预测
►波士顿房价数据集
► 包含对房价的预测,以千美元计,给定的条件是房屋及其相邻
房屋的详细信息
► 共有 506 个样本,13 个特征和1个标签
实验要求
在代码中加入预测误差的计算,用该误差来衡量预测的准确度
- 误差计算公式
r s s E r r o r = ∑ i = 1 n ( y i − y i ′ ) 2 rssError=\sum_{i=1}^{n}(y_i-y_i')^2 rssError=∑i=1n(yi−yi′)2 - 从数据集中分出两部分,一部分作为训练集,一部分作为测试集
- 分别采用OLR,k=0.1,1,10的LWLR,梯度下降和采用步长参数的随机梯度下降进行回归分析,得到预测模型
- 计算每个模型在训练集上的误差,列表比较
- 计算每个模型在测试集上的误差,列表比较
- 分析上述实验结果,你得到什么启发?
- 对所有数据进行实验,用所有数据的前面70%做训练集,剩下的做测试集进行交叉验证,可分工测试不同的参数,比比看谁的结果最优?