3 线性回归
3.1 最小二乘法
试图找到一条直线,使所有样本到直线上的欧式距离之和最小
3.2 代价函数
cost function,往往令其最小化
单变量线性回归假设函数
(3.1)
h
(
θ
)
=
θ
0
+
θ
1
x
h(\theta)=\theta_0+\theta_1x\tag{3.1}
h(θ)=θ0+θ1x(3.1)
3.2.1 梯度下降法
不停进行 θ \theta θ迭代计算使代价函数J最小化
- α \alpha α过小,代价函数需要很多步才能到达全局最低点
- α \alpha α过大,代价函数可能会越过最低点,导致不收敛甚至发散
- 正常选取 α \alpha α后,下降过程中接近局部最低点时,因为局部最低点导数为0,因为斜率变小,梯度下降的幅度也会越来越小,因此无需担心 α \alpha α过大导致不收敛
- 如果代价函数已经到达局部最优点,下次参数数值便不会更新
(a)Batch梯度下降法
每次梯度下降均使用整个训练集的数据
3.2.2 代价函数-平方误差函数
(3.2) J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x i ) − y i ) 2 J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x_i)-y_i)^2\tag{3.2} J(θ)=2m1i=1∑m(hθ(xi)−yi)2(3.2)
3.3 多元线性回归
多元即多个未知数
x
x
x,多个参数
θ
\theta
θ,其中
x
0
=
1
x_0=1
x0=1
(3.3)
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
=
θ
T
x
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n=\theta^Tx\tag{3.3}
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn=θTx(3.3)
x = [ x 0 x 1 x 2 ⋮ x n ] θ = [ θ 0 θ 1 θ 2 ⋮ θ n ] x=\left[\begin{matrix}x_0\\x_1\\x_2\\\vdots\\x_n\end{matrix}\right] \theta=\left[\begin{matrix}\theta_0\\\theta_1\\\theta_2\\\vdots\\\theta_n\end{matrix}\right] x=⎣⎢⎢⎢⎢⎢⎡x0x1x2⋮xn⎦⎥⎥⎥⎥⎥⎤θ=⎣⎢⎢⎢⎢⎢⎡θ0θ1θ2⋮θn⎦⎥⎥⎥⎥⎥⎤
3.3.1 多元梯度下降法
增快梯度下降速度的技巧
- 特征缩放,接近[-3 3],过大过小都需要改变
- 每个特征值减去总特征值的平均
- 即 x 1 ← x 1 − μ 1 S 1 x_1\leftarrow\frac{x_1-\mu_1}{S_1} x1←S1x1−μ1, S 1 S_1 S1为特征值范围
确保代价函数下降正确方法
- 降低学习率 α \alpha α:eg:0.003 0.03 0.3尽可能大
- 画出 J ( θ ) J(\theta) J(θ)-迭代次数的曲线,确保其随着次数增加函数减小
可依据经验选择不同特征进行线性回归
3.3.2 正规方程
无需进行多次迭代运算即可得到合适的参数
θ
\theta
θ值使代价函数下降到最小
(3.4)
θ
=
(
X
T
X
)
−
1
X
T
y
\theta=(X^TX)^{-1}X^Ty\tag{3.4}
θ=(XTX)−1XTy(3.4)
X为特征矩阵,y为特征计算的真实值
3.3.3 梯度下降法和正规方程的优缺点
梯度下降法 | 正规方程 | |
---|---|---|
缺点 | 1.需要选择学习率
α
\alpha
α 2.需要多次迭代计算 | 1. ( X T X ) − 1 (X^TX)^{-1} (XTX)−1计算复杂 |
优点 | 计算速度受特征变量维度影响小 | 1.无需考虑学习率 2.无需进行迭代计算 |
- 特征变量<10000可采用正规方程,再大则选取梯度下降法
3.4 编程tips
3.4.1 matlab
有关代码风格
- %%一段结束后空一行阅读容易
- 作梯度下降时,进行代价函数偏导计算记得给求和后矩阵转置,令参数量与参数改变量对应
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 x j ( i ) \theta_j:=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2x_j^{(i)} θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))2xj(i)
-
matlab中,inv(A)*B速度比A\B慢,\代表求解线性方程组Ax=B
i n v ( X ′ X ) X = = ( X ′ X ) ∖ X inv(X'X)X==(X'X)\setminus{X} inv(X′X)X==(X′X)∖X -
进行对应列运算时,可采用bsxfun(fun,A,B)实现,速度更快
-
多元变量情况下,采用向量化计算更快
J ( θ ) = 1 2 m ( X θ − y → ) T ( X θ − y → ) J(\theta)=\frac{1}{2m}(X\theta-\stackrel{\rightarrow}{y})^T(X\theta-\stackrel{\rightarrow}{y}) J(θ)=2m1(Xθ−y→)T(Xθ−y→) -
针对多元变量的线性回归,预测新数据时需要把新数据标准化后再将矩阵右侧加一列
-
实际上无需编些 J ( θ ) J(\theta) J(θ)只需编写其偏导数,但为了监控 J ( θ ) J(\theta) J(θ)的值确保梯度下降法正确工作,需要记录代价函数每次更新的量
-
opptions=optimset('Gradobj','On','MaxIter','100'); initialTheta=zeros(2,1); [jVal,gradient]=costFunction(theta);%gradient表示梯度,即代价函数对各个参数的偏导 [optTheta,functionval,exitFlag]=fminunc(@costFunction,initialTheta,options);%@表示地址,fminunc可使代价函数最小化 %该函数要求参数至少为二维 %利用设定的高级函数计算代价函数最小化时的参数值
-
%反向传播 thetaVec=[Theta1(:) ; Theta2(:) ; Theta3(:)]; DVec=[D1(:) ; D2(:) ; D3(:)]; Theta1=reshape(thetaVec(1:110),10,11); Theta2=reshape(thetaVec(111:220),10,11); Theta1=reshape(thetaVec(221:231),1,11);
-
maltab中sum(A.^2)与A*A’的值有略微不同
-
编程时注意使用矩阵,使函数满足不同维数的情况
-
SVM程序包一般会自动加上偏置量 x 0 = 1 x_0=1 x0=1,因此无需额外添加
-
使用svmTrain时记得应用训练集而不是交叉验证集