吴恩达ML笔记-ex.3-神经网络

mac2024-11-05  15

吴恩达ML笔记-ex.3-神经网络

Exercise 3.1: One-vs-all任务列表具体实现1. Vectorize Logistic Regression (lrCostFunction.m)2. One-vs-All Training (oneVsAll.m)3. Predict for One-Vs-All (predictOneVsAll.m) Exercise 3.2: Neural Networks任务列表具体实现predict.m

Exercise 3.1: One-vs-all

任务列表

Part 1: Vectorize Logistic Regression Part 2: One-vs-All Training Part 3: Predict for One-Vs-All

具体实现

1. Vectorize Logistic Regression (lrCostFunction.m)

这里需要求的是正则化和向量化的逻辑回归,由于之前的练习一直是用向量化去做的,而且正则化表达式在之前也使用过,所以这个比较好理解:

a = ones(m,1); J = sum(-y.*log(sigmoid(X*theta))-(a-y).*log(1-sigmoid(X*theta)))/m... +(lambda/(2*m))*sum([0;theta(2:end)].^2); grad = sum((sigmoid(X*theta)-y).*X(:,:))/m+([0;theta(2:end)]*lambda/m)';

2. One-vs-All Training (oneVsAll.m)

这个同样比较简单,用的是matlab的内置函数fmincg,而且给出了示例程序,只需要按示例写好循环即可:

initial_theta = zeros(n + 1, 1); options = optimset('GradObj', 'on', 'MaxIter', 50); for c = 1:num_labels fprintf('******** No.%0.0f ********\n', c); [all_theta(c,:)] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options); end

这里需要说明的是,使用octave进行这个迭代运算的话,可能需要一两分钟,我在matlab上试了一下,大概十秒就算出来了,所以从这就转了matlab了; 两者的语言没有区别,唯一值得一提的是octave的for循环第一行结尾有逗号,默认循环结尾是endfor,在matlab中只认没有逗号以及循环结尾end,会报错,改过来就好了。

3. Predict for One-Vs-All (predictOneVsAll.m)

由于这个是用迭代逻辑回归的思想去做的一对多分类,计算到最后的theta是10*401的矩阵,我们需要做的就是求出这些theta与每个X元素求假设函数,对应到10个手写数字上去,找到最大的数的索引,该索引即为预测值,做法如下:

[M,I] = max(all_theta*X'); p = I';

注:max函数如果只有一个输出,例如 a = max(b);,就会输出b中的最大值到a,如果像上面一样有两个输出,就会把最大值输出到M,最大值的索引输出到I,而要把索引转置一下再赋值给p是因为y是列向量,需要把输出的行向量I转置才能进行比较。

Exercise 3.2: Neural Networks

任务列表

Implement Predict

具体实现

predict.m

这个练习涉及的神经网络不需要训练,训练好的theta值是给定的,我们要做的就是从两组训练好的theta值构建一个简单的神经网络,了解这个神经网络数据的传递方式,以及训练的方式,实现如下:

input_go = Theta1 * [ones(m,1),X]'; kx = sigmoid(input_go); outp = Theta2 * [ones(1,m);kx]; [a,b] = max(outp); p = b';

我在理解这个的时候,依照着上课时出现的神经网络的模型图,配合给定的Theta1和Theta2值,手绘了另一个模型图方便理解,如下所示(涉及的乘法均表示矩阵的规模):

以上,就是机器学习ex3-神经网络的全部内容。

最新回复(0)