1.假设
一个房屋的出售价格y
(千元/平方米)由:
(1)房屋距市中心的距离(km) x1
(2)房屋的大小(平方米)x2
(3)房屋所拥有的房间数x3
(4)房屋的已使用时间x4
这四个因素决定,那么根据训练集确定五个变量θ1
θ2
θ3
θ4
θ0
,使得任一房屋的价格可由 y= θ0 + θ1*x1 + θ2*x2 + θ3*x3 + θ4*x4
预测。
2.分析:
要预测房屋价格,实际上是要对五个变量分别使用梯度下降,来找到使得误差函数J(θ)
最小的θ1
θ2
θ3
θ4
θ0
的组合。
这篇文章承接自我的上一篇有关梯度下降的文章:[初识:梯度下降算法 (Gradient Descent)]
在这篇博客中我通过对 x1
x2
(在这里应当对应的是 θ0
θ1
)两个变量进行梯度下降从而得到散点的最优直线拟合。在这里只是问题稍微复杂了一些,需要对五个变量进行梯度下降的处理,来得到最优的房价预测方程。
承接上篇博客,这里直接给出五个变量的梯度下降式子:
那么只需要根据这五个式子,就可以利用梯度下降算法得到最优的拟合方程。
然而,我在用代码实现了算法之后,却发现θ1
θ2
θ3
θ4
θ0
无法收敛,每次都运行到我指定的for循环最大次数后才退出。其时间消耗少则五分钟,多更至十多分钟,有时甚至根本无法得到结果(结果显示 not a number)。
但是,经过长时间的探索,终于发现问题竟出在了α
的取值上。α
又称学习速率,决定了每一次θ1
θ2
θ3
θ4
θ0
改变幅度的大小,受之前那个拟合散点程序的影响,我这次开始的时候将α
设置的较大(0.1或0.01),或许是因此导致了θ1
θ2
θ3
θ4
θ0
中一部分变量的发散,从而导致循环跳出条件无法满足。
将α
值调为0.0001后,五个变量得以迅速收敛,循环次数也由千万级别骤降至四百余次。
可以看到,过小的α
有时会导致计算次数增多,增加消耗,有时却能拯救一个无法收敛的程序。可见,对于不同的训练集,α
的取值相当灵活。
3.代码实现:
原理与上篇博客中的拟合散点大致相同
(1)给出训练集,学习速率,及有关变量
由于训练集数据过少,而且数据是自己编的,结论应该和实际没什么关系 :(
int Judge ; //用于判断收敛
//自己脑补了15组数字 :)
double Train_set_x1[15] =