跟着Andrew Ng挑战Machine Learning(第二周):多元线性回归+特征缩放

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/credolhcw/article/details/70195965

注意:
  刚开始学习这个内容时请不要纠结于使用到底用哪一个编程语言的问题,不论你是否擅长于C++、JAVA、Python或者C#等等。如果有条件(有钱)的话用Matlab,没钱的童鞋可以和我一样选择Octave、R语言这类免费开源的专业的数值计算语言。
  
  这个系列中提到的算法,假如用JAVA(使用数值计算的包)实现的话需要100行代码,那么用Matlab或者Octave可能只需要1行,没错就是一行!!!这个建议目的是让我们把大部分的精力花在对算法的理解上,而不是花在码代码上。
  
安装Octave请参考:http://www.gnu.org/software/octave/

Octave文档:https://www.gnu.org/software/octave/doc/interpreter/

  建议有条件的童鞋去Coursera上学习,不仅免费还精心准备了很多联系帮助理解,以下是链接(看视频需要翻墙):
  https://www.coursera.org/learn/machine-learning/


相关概念及符号定义

x(i)j : 在第 ith 个训练实例中的第 j 个特征值。

x⃗ (i) : 第 ith 个训练实例,这是一个列向量。

m : 训练实例总数。

n : 特征个数。

X :训练集,每一行即为一个训练实例,是一个大小为 m×n 的举证。一般这种大写的符号都表示一个矩阵。

hθ(x⃗ )=θ0+θ1x1+θ2x2+θ3x3+...+θnxn ,为了书写形式的统一,或者说为了能够方便的用向量(Vector)的形势表示 hθ(x⃗ ) ,我们常令 x(i)0=1,i[1,2,3,...,m] ,因此有如下表示:

hθ(x⃗ )=θ0x0+θ1x1+θ2x2+θ3x3+...+θnxn

写成向量形势:
hθ(x⃗ )=[θ0θ1θ2θn]x0x1x2xn=θ⃗ Tx⃗ 


梯度下降在多元线性回归(Multivariate Linear Regression)中的应用

  梯度下降算法的形势与前一章所说的没有多大的区别,我们所要做的仅是直接拿来不做任何修改的使用。

  重复如下动作至收敛:{

θ0:=θ0α1mi=1m(hθ(x⃗ (i))y⃗ (i))x(i)0

θ1:=θ1α1mi=1m(hθ(x⃗ (i))y⃗ (i))x(i)1

θ2:=θ2α1mi=1m(hθ(x⃗ (i))y⃗ (i))x(i)2


θn:=θnα1mi=1m(hθ(x⃗ (i))y⃗ (i))x(i)n
  }

前文提到过另一种更加概括的方式:

θj:=θjα1mi=1m(hθ(x⃗ (i))y⃗ (i))x(i)j  for  j=1,2,,n


特征缩放

  当涉及到多个特征变量的时候,各个特征变量的变化范围不尽相同,比如 x0(300,2400) x1(1,1) x2(20,30) ,…… 但是,根据公式: θi:=θiαθiJ(θ⃗ ) ,可以看出对于所有特征系数 (θi) 来说,学习速率 α 是一致的。这就导致了各特征系数收敛速度的不一致,特征变量 xi 取值范围较小,其对应的系数 θi 收敛速度就会较快;反之,若 xj 的取值范围较大,其对应的系数 θj 的收敛速度就会较慢。

  可以通过将所有特征变量的取值范围缩放到同样的级数,从而加快整体的收敛速度。实现这个目的有两种技术(方法),分别是特征缩放(Feature Scaling)以及均值归一化(Mean Normalization)

为了说明更加简练,约定:

   range(xi) :表示特征变量 xi 取值范围的区间大小,例如前文的例子中 range(x0)=2400300=2100

   mean(xi) :表示特征变量 xi 的均值,其定义为 mean(xi)=1mmk=1x(k)i

   min(xi) :表示特征变量 xi 中的最小值。

特征缩放

公式:

x(k)i:=x(k)imin(xi)range(xi)

经特征缩放后,所有的特征变量的取值范围都在区间 [0,1] 之间。

均值归一化

公式:

x(k)i:=x(k)imean(xi)range(xi)

经特征缩放后,所有的特征变量的取值范围都在区间 [1,1] 之间。


调试: J(θ⃗ ) α 的关系

  以迭代次数(No. of Iteration)为 X 轴,代价函数 J(θ⃗ ) Y 轴,画坐标图,通过观察曲线的形状可以知道 α 取值是否合适。

J(θ⃗ ) 能够收敛的时候,曲线形状应如下图所示:

Cost Function and Alpha 001
 
α 取值过大时,如图:

Cost Function and Alpha 002
 
  总之,当 α 取值过小时,函数 J(θ⃗ ) 收敛所需要的迭代次数会非常大。当 α 取值过大时 J(θ⃗ ) 可能不会收敛甚至发散!!!


另一种方法:Normal Equation

  找了半天没找到统一的标准的翻译用“正规方程”也不是很确定,后文中就暂且用“NE”表示。

  NE法相对于梯度下降算法来说,其优点是不需要确定 α 也不需要迭代,只需要一步就可以求出 minJ(θ⃗ ) 对应的向量 θ⃗  。但是,当特征变量的个数“ n ”很大的时候NE法就很难胜任了,那么很大是多大呢?这就要看计算平台的性能了(等于没说)。

梯度下降算法NE法的对比如下表:

梯度下降算法 Normal Equation
需要确定 α 不需要确定 α
需要多次迭代 不迭代
O(kn2) O(n3) ,需要计算 (XTX)(1)
n 很大时,效率依然不错 n 很大时,表现很差

 
计算向量 θ⃗  的公式:

θ⃗ =(XTX)1XTy⃗ 

公式推导及注意:

  1. 前文已经提过,为了方便计算,我们令 x(i)0=1 ,所以矩阵 X 的大小应为 m×(n+1)

  2. Xθ⃗ =y⃗  ,参考“相关概念及符号定义”部分。

  3. 等式两边同乘 XT

    XTXθ⃗ =XTy⃗ 

  4. XTX 可逆,则等式两边同乘 (XTX)1

    θ⃗ =(XTX)1XTy⃗ 

重要!!!尤其要注意,只有当 XTX 可逆的情况下,才可以使用NE!!!

猜你喜欢

转载自blog.csdn.net/credolhcw/article/details/70195965