在《机器学习笔记02》中已经讲了多变量的梯度下降法,以及其他的一些小技巧和注意事项。下面来讲一种更加数学化的方法,我们称之为Normal equation,网上也没找到什么标准的翻译,就暂且称其为矩阵方程法吧。
如下图所示,我们在进行梯度下降的时候,一般都会执行多次迭代,才能得出最佳的一组 θ 值。
先来看看单元变量的Normal equation方法:
1.当 θ∈R 时,误差函数为
我们来看个已经用烂了的例子:房价预测
假设我们有如下的训练数据(样本数量 m=4 ,特征数量 n=4 )
Size( feet2 ) | Number of bedrooms | Number of floors | Age of house(years) | Price( $ 1000) | |
---|---|---|---|---|---|
x0 | x1 | x2 | x3 | x4 | y |
1 | 2104 | 5 | 1 | 45 | 460 |
1 | 1416 | 3 | 2 | 40 | 232 |
1 | 1534 | 3 | 2 | 30 | 315 |
1 | 852 | 2 | 1 | 36 | 178 |
我们记
接着来看看对上面这个例子的一般性公式(formulas)。假设我们有 m 组训练数据: (x(1),y(1)),(x(2),y(2)),...,x(m),y(m) ;其中每组数据均有 n 个特征。我们记:
好了,那么 θ 为多少呢?结论是:
正如你看到的,Normal equation 在数学计算的意义上,能够一下子就把 θ 的值给算出来,但是让我们来考虑一下这样一个事实: 我们需要计算一个式子 θ=(XTX)−1XTy 的值,首先假设矩阵 X 是一个规模为 m×n 的矩阵,则仅仅计算 (XTX)−1 的时间复杂度就为 O(n3) (在计算转置的时候仅是取值,不在内存上做真正的转置,即计算 XTX 需要的时间为 O(n2) ;另外,在计算逆矩阵的时候,我们只考虑了其伴随矩 (XTX)∗ 阵直接乘以常数 1|XTX| 所需要的时间,而计算伴随矩阵和常数 1|XTX| (包括计算行列式的值)所需要的时间都未考虑,所以其计算花费是可想而知的)。
但是 Normal equation 也有一个好处就是不用对样本进行 Feature scaling(特征缩放:《见机器学习笔记02》),而特征缩放对于梯度下降(Gradient descent)来说是非常重要的。我们将梯度下降和Normal equation的区别总结如下:
Gradient descent | Normal equation |
---|---|
Needs to choose α (需要选取合适的 α ) | No need to choose α (不需要 α ) |
Needs many iterations (需要很多次的迭代计算) | No need to iterate (不需要迭代计算) |
Works well even when n is very large (在n很大时,能工作得很好) | Needs to calculate (XTX)−1 (需要计算 (XTX)−1 ,其时间复杂度为 O(n3) ) |
Slow if n is very large (当 n 非常大时,速度非常慢) |
我们如何来选择使用哪种方法么呢?这个就要跟着感觉走了。因为我们无法精确的得到选择Gradient descent还是Normal equation的阈值。一般如果 n 不超过 1000 的话,选用Normal equation还是挺好的,如果要是 n 超过 10000 的话,那么矩阵 X 的规模将是 10000×10000 ,这时候Gradient descent将是一个更好的选择。
另外,这里注意一点:如果矩阵 (XTX) 不可逆怎么办呢?原因有二:
1.存在冗余特征。
比如有两个特征
x1 | x2 | |
---|---|---|
meaning | size in feet2 | size in m2 |
因为 1m=3.28feet ,所以 x1=(3.28)2⋅x2 。我们知道线性代数中出现这种线性相关的情况,其行列式值为0,所以不可逆,我们只需确保不会出现冗余特征即可。
2.特征数量 n 过多,而训练样本数 m 过少。
解决方法为删除一部分特征,或者增加样本数量。