在之前的线性拟合和逻辑拟合的基础上,当n的规模变得很大,计算问题的代价将会变得很大,并且此时问题会过于复杂,很可能会导致欠拟合,所以需要神经网络来解决这个问题。
Neural Networks Model Representation I一个简单的三层神经网络模型可以分为:input layer、hidden layer、output layer
其中input layer相当于之前的X,output layer相当于y,hidden layer可以有多个层级。
Model Representation II
hidden layer每个元素的计算表达式为:
右上角的角标:代表变量属于第i层layer
右下角的第一个角标:代表第i层layer中第j个结点(第i层中的第j个feature)
右下角的第二个角标:代表第i-1层layer中第k个结点(对应第i-1层的第k个feature)
显然易见的规模为第i层特征个数j*第i-1层特征个数k。
此处的g和之前的sigmoid函数是同一含义,通过多层神经网络能够实现对X中任意元素的逻辑表达式的组合运算。
通过把g的一行自变量简写为z向量,可以简化为以下表达形式:
注意,在通过计算得到第i层的结点后,需要补上一列=1向量作为下一层的输入结点。所以可以推得用来计算第j+1层的第j层的系数: 其元素个数如左式,Sj是j层的节点个数,Sj加上一是上文提到的为1的特征。
Applications Examples and Intuitions I一层layer可以用来模拟and、or
计算g(z)可以参考下图作为近似的结果:
Examples and Intuitions II通过两层可以得到XNOR
ex-3 示例代码%%% 一些示例代码:
%% ex3.m:
% 根据输入的常数or矩阵的第一个数字m,生成一个随机序列,即是1,2,3,...,m的序列乱序
sel = randperm(size(X, 1));
sel = sel(1:100);
% 计算正确率:pred == y 返回的是大小为m*1的logical类型向量、double类型转换、mean计算平均值
mean(double(pred == y)) * 100;
%% sigmoid.m:
% 计算sigmoid
% help exp :Compute 'e^x' for each element of X. 可以直接把矩阵每个元素都算一遍,很快捷
g = 1.0 ./ (1.0 + exp(-z));
% 第三个参数为2时,得到矩阵tmp_y的每一行最大值;为1时,得到矩阵每一列最大值
% 单个返回值只返回最大的value,两个返回值返回value和下标
[value, p] = max(tmp_y, [], 2);
%% lrCostFunction.m
% 用end指代z的末尾行,非常好用
sum(z(2:end).^2;
%% displayData.m:
% exist (NAME, TYPE) var检查参数
if ~exist('example_width', 'var') || isempty(example_width)
example_width = round(sqrt(size(X, 2)));
end
% 图像拼接逻辑:todo
遇到问题
- 在ex3_nn模块得到的predict准确率远远低于one-vs-all逻辑拟合,并且在debug过程中已经看到了部分数据范围超过了[0, 1],但当时并未在意。 解决:写预测函数时,忘记套上上sigmoid部分,导致数据计算错误。
- 对于ex3模块,featureNormalize和iter、是否选用fmincg对数据的影响:
- 如下图所示,为使用fmincg时采用范围为[25, 200]的MaxIter得到的图像,显然取maxiter为50最为合适
- 当取MaxIter为50时,下图为采用featureNormalize(红色)和不采用(蓝色)得到的图形和精确度:
虽然课程指引并无提到,但是可以看出经过featureNormalize的数据精确度有所提升
-
在本次作业featureNormalize时遇到输出矩阵包含#NAN的情况,有一整个列值都相等导致其除数std为0,我在这里把含有nan的列置为原来的值处理,感觉应该有更好的处理方式。
- octave ctrl+r 快捷键段落注释,ctrl+shift+r解除注释
-
fmincg函数构成



