本人也是入门,主要是学习吴恩达的课程,网上学习和总结,数学上的解释无法深入,主要是将代码和公式对上号,从简单线性回归开始,场景是给出一堆点,要求找出一条线来,能最大程度的穿过最多的点,如下图
在老师的课程里面,有几个概念:假设函数Hypothesis,代价函数Cost Function,梯度下降Gradient Descent
1.假设函数 Hypothesis,就是我们先假设我们要求的这条线的公式是个啥样
简单的假设函数就是
,这里我们可以假想右边theta0其实还乘以了一个x0,不过x0的值永远为1,有助于理解多元时候的表达式当扩展到多元的时候,函数就变成了
这里表达式中间是代表两个(1 * n)的matrix的相乘,大家了解下矩阵转置和矩阵乘法就很容易理解该等式了。
2.代价函数Cost Function,即要求我们要找的那条线,集合中所有的点到它的直线距离和最小,所以采用了方差计算。
简单时公式是
扩展到多元是
其中
代表当时的theta向量,和对应的第i组x的向量和,即上面提到的假设函数,代表数据集中第i组x向量
3.梯度下降Gradient Descent,这个公式我自己也还没有完全理解数学含义,只是知道大概是利用求导,即变化的速率,当变化
速率达到0的时候,就趋近于局部最优。
简单时是
多元时是
主要的概念差不多就是上面的,然后来实现
1.这里X代表我们数据集,如果有m行数据,我们有n个向量,那么X就是一个m*n的matrix,别忘了我们的假设公式里面还有个x0,所以上面的n其实是代表的n+1,只是为了方便,省略为n
2.theta为1*n的matrix,所以X * theta.T将得到一个m*1的matrix
3.其中X代表数据集中的特性向量数据,y代表结果向量数据,theta即我们要求的参数
1.alpha和iters是设置参数,alpha代表下降的步长,iters代表迭代的次数,这里都将写死,但是这并不科学 ,后续研究
2.temp,用作theta集合计算过程中,记录theta中间值
3.parameters,记录特征向量数,即n+1,用于在下降过程中控制theta的所有元素的计算
4.cost,用于记录在不断迭代过程中,CostFunction返回的值
5.其中i控制的循环是我们设定的迭代次数,j控制的循环是梯度下降数学公式中的for循环
6.第52行现在看可能会有疑问,我们的theta0对应的x0从哪里来,别急,因为我们会要对原始数据集做处理
7.注意theta的计算,一定要完成一次全部特征计算后,才能更新到theta,所以54行一定到放到j循环的外面
最后就是进行执行计算了
1.第61行就是我们上面说的对数据集的加工,构造了我们上面说的x0,而且它的值全部为1
2.第67行,因为是一元线性回归,所以只要构造1*2的matrix就行了,需要根据具体的特征数进行调整
运行结果如下
可以看到方差值还是有明显改善
这只是一个简单例子,就像上面说的,本人对梯度下降数学含义也不十分清晰;alpha和iters的设定,应该是自适应调整的,即alpha刚开始应该较大,越往后越小;还有alpha和iters如何调整,应该用matplotlib画出相应的图,才能比较直观的看到下降的趋势,才能更好的进线调参。
记录下自己的又一次进步把。