吴恩达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-神经网络的全部内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值