吴恩达ML笔记-ex.3-神经网络
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-神经网络的全部内容。