视频地址:http://v.163.com/movie/2008/1/B/O/M6SGF6VB4_M6SGHJ9BO.html
机器学习课程的所有讲义及课后作业:http://pan.baidu.com/s/1i3xcljJ
视频前半部分讲了梯度下降算法的迭代过程求的局部最小值,后半部分介绍了利用数学方法给出参数向量的解析表达式,从而求出参数的值,也就是一种无需迭代的方法。
由于PC上编辑不太方便,以下推导过程我会尽可能详细地呈现在草稿纸上,其实视频中AndrewNg已经讲解的很详细了,其实我也只是在看了推导过程之后,自己完全独立地推导了一遍,毕竟自己亲自有动笔了,印象自然深刻。如有不对之处,请指正。
我觉得,当我们表示出J(θ)的表达式后,就已经可以把问题转化为多元函数的极值问题了,因此,也就出现了下面中要求偏导数,以及要设偏导数为0的步骤。而这里之所以会涉及到线代的知识,是因为线代可以用来简化运算,矩阵的表示的优雅。
1、定义新符号;
2、给出5个定理;
3、把问题转化为数学计算;
说明:m代表数据量(即有多少行数据);n代表特征个数(从x0~xn,其中x0恒等于1)
1、定义新符号:
2、给出5个定理;
3、把问题转化为数学计算;
noIteration.java(导入jama包)
1 package noIteration; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import Jama.Matrix; 7 8 public class noIteration{ 9 10 public static List<Data> DS; 11 public static int m; 12 13 public static double[][] initX(){ 14 double[][] x =new double[m][2]; 15 int m=DS.size(); 16 for(int i=0;i<m;i++){ 17 x[i][0]=DS.get(i).x[0]; 18 x[i][1]=DS.get(i).x[1]; 19 } 20 return x; 21 } 22 23 public static double[][] initY(){ 24 double[][] y = new double[m][1]; 25 int m=DS.size(); 26 for(int i=0;i<m;i++){ 27 y[i][0]=DS.get(i).y; 28 } 29 return y; 30 } 31 32 public static void main(String[] args) throws IOException{ 33 34 DS=new DataSet().ds; 35 m=DS.size(); 36 37 double[][] x=initX(); 38 double[][] y=initY(); 39 Matrix mtx=new Matrix(x); 40 Matrix mty=new Matrix(y); 41 Matrix mtxT=mtx.transpose(); 42 Matrix ans=(mtxT.times(mtx)).inverse().times(mtxT).times(mty); 43 for(int i=0;i<2;i++){ 44 System.out.print(" theta ["+i+"] : "+ans.get(i, 0)); 45 } 46 } 47 }
总结:这个算式,简直美丽极了!