1 从方程说起
我这里先不谈线性回归,就面对一个简简单单的方程,看你能不能解吧。
(1)
我们也知道答案是:
但是,如何用计算机将其解出?这就是个理论问题了。下面请看我如何展开题目,让诸位举一反三地认知这个问题。
假定任意给出一组近似的解:
。 将其带入等式(1)立即得到近似结果,可以写成:
,进一步写出其残差方程:
(2)
显然,如果:,那么上边的 就一定是方程(1)精确解!
因此,解方程(1)的问题转化成“如何让”的问题。
以上内容核心点:该问题是否可以从一个非精确解开始,自动迭代地慢跑到精确解附近。
2 凸函数如何求极值的问题
对于凸连续函数,求出它的极值点坐标还是容易的。这是因为,图函数的极值点只有一个,如果不是凸函数,极值点有多个,那就无法得到唯一解。
举个例子:
函数:的极值点是(0,0,0)这个点,其算法是先求f的梯度,令梯度等于0,解出x,y,z:
拓展你的思路:将上述函数换成,只要是令梯度等于0。就可以得出: 极值点,同时解出:,这就是方程(1)最后解。
3 梯度下降法计算极值
将改写成:
按照以下步骤求解:
1)给出一组任意值作为方程(1)的近似解
2) 求出梯度的表达式
(是个较为复杂的式子,暂时不展开)
将带入,得到此点(就是当前近似解)对应梯度:
,这是一个具体的数值向量。
3)修改近似解:将近似解移动一个微小位移;具体就是顺梯度反方向移动0.001倍个长度:
4)返回到1)再次迭代。
5)迭代N遍后停止,得到(1)方程的数字解。
注:上文中的f就是所谓的代价函数。
4 以上方程的程序实现
import numpy as np
cs = np.array([[23],[23],[26]])
ix = np.array([[0.001],[0.002],[0.003]])
IA = np.array([[2.,3.,5.],
[4, 5, 3],
[6, 7, 2] ])
for i in range(6000000):
grd = np.dot( IA.T,np.dot( IA, ix) - cs) # 我估计百分之九十的同学,看不出这步如何得到!!
# 那就继续努力吧
ix = ix - 0.0001*grd
print(ix)
在没有任何优化的前提,迭代了六百万次,高效得到结果:
《从函数逼近论看回归问题》《非线性的回归,乃至任意的回归问题》[[1.06834998]
[1.93894111]
[3.00954498]]
是不是和精确结果
很类似呢?列位不妨将代码粘下去跑跑。好了,如果能理解上述所讲,下面解释线性回归就毫无难度了。
后记:
以上只是回归问题的冰山之一角,后面还有更奇葩的东西,那就是:《从函数逼近论看回归问题》《非线性的回归,乃至任意的回归问题》《机器学习2:回归问题之一览众山小【2】》此两篇主要介绍更一般的理论,可以推广到回归问题、神经网络、协同过滤等一些列问题,通过学习后,保证你看明白yolo,gan、rnn等一些列难懂的东西,竟然就是点数学玩具而已。