Coursera_机器学习_week4&5_神经网络

时间:2022-12-25 15:30:48

神经网络的表示

52nlp的笔记
52nlp的笔记2

对于有大量特征的分类问题,除了逻辑回归,还可以选择神经网络算法,它对于复杂的假设空间和复杂的非线性问题有很好的学习能力。

Model representation 模型

用Logistic unit来模拟大脑中的神经元
Coursera_机器学习_week4&5_神经网络
其中 x0 为偏置单元(bias unit), hθ(x) 称为激活函数(activation function),一般采取的形式为

g(z)=11+ez

e.g.一个三层的神经网络
Coursera_机器学习_week4&5_神经网络
第一层称为输入层,第二层是隐藏层,第三层是输出层,其中
aji = j层第i个单元的激活函数
Θj = 从第j层映射到第j+1层的控制函数的权重矩阵
Coursera_机器学习_week4&5_神经网络
如果神经网络在第j层有sj个单元,在第j+1层有sj+1个单元,那么权重矩阵Θ(j)的纬度是sj+1×(sj+1)

Note
1)任何的布尔函数都可以由两层单元的网络准确表示,但是所需的隐藏层神经元的数量随网络输入数量呈指数级增长;
2)任意连续函数都可由一个两层的网络以任意精度逼近。这里的两层网络是指隐藏层使用sigmoid单元、输出层使用非阈值的线性单元;
3)任意函数都可由一个三层的网络以任意精度逼近。其两层隐藏层使用sigmoid单元、输出层使用非阈值的线性单元。

Cost function(代价函数)

如果是一个二类分类(Binary classification),那么y = 0 或1,在神经网络的输出层上只有一个输出单元;如果是一个多类分类(Multi-class classification), 那么在神经网络的输出层上有K个输出单元。代价函数表述为
Coursera_机器学习_week4&5_神经网络

Backpropagation algorithm(BP算法/反向传播算法)

其实就是链式法则求导
Coursera_机器学习_week4&5_神经网络

Gradient checking(梯度下降算法的验证)

在实现过程中,可以用改点的近似斜率来验证梯度下降算法计算结果的正确性,在真正的算法训练阶段注意关闭验证

Random initialization(随机初始化)

如果神经网络的参数全部初始化为0,那么会导致同一层的各个单元参数相同,无法训练出可以输出多个分类结果的网络了,这个问题也成为对称的权重问题,需要通过对参数随机初始化来化解,通常可以在[-u,+u]区间随机取值。

编程练习

课程提供了数据集.mat格式的文件5000*400,是手写数字
20*20灰度图像 5000个样本 灰度用浮点表示
数据集的第二部分是维度5000的y向量
0 被标记为10 1~9标记1~9
直接用load命令就可以导入octave/matlab
随机选择100行画图

    load('ex3data1.mat');
m = size(X,1);
rand_indices = randperm(m);
sel = X(rand_indices(1:100),:);
displayData(sel);

以下是display函数定义:

function [h, display_array] = displayData(X, example_width)
if ~exist('example_width', 'var') || isempty(example_width)
example_width = round(sqrt(size(X, 2)));
colormap(gray);%返回线性灰度色图
example_width = round(sqrt(size(X, 2)));%计算图片像素矩阵宽
[m n] = size(X);
example_height = (n / example_width);%计算图片像素矩阵高
display_rows = floor(sqrt(m));%样本个数开根号向下取整
display_cols = ceil(m / display_rows);%向上取整
pad = 1;% 图片之间的空隙
display_array = - ones(pad + display_rows * (example_height + pad), ...
pad + display_cols * (example_width + pad));
%ones 产生全1数组,这里产生全-1数组 在灰度图像里面相当于黑布
curr_ex = 1;
for j = 1:display_rows
for i = 1:display_cols
if curr_ex > m,
break;
end
max_val = max(abs(X(curr_ex, :)));%记录一张图的像素值最大值,用来归一化
display_array(pad + (j - 1) * (example_height + pad) + (1:example_height), ...
pad + (i - 1) * (example_width + pad) + (1:example_width)) = ...
reshape(X(curr_ex, :), example_height, example_width) / max_val;
% 把x的像素值归一化,向量变矩阵后,复制给disaplay_array
curr_ex = curr_ex + 1;
end
if curr_ex > m,
break;
end
end
% 画图
h = imagesc(display_array, [-1 1]);
axis image off
drawnow; % 可以理解为把当前需要画的东西都画到屏幕上。一般用于循环内,显示动画效果
end

接下来完成多分类的逻辑回归问题
回忆一下正规化以后的代价函数
Coursera_机器学习_week4&5_神经网络
这里需要自己完成,主函数调用代码为

lambda = 0.1 正规化参数
[all_theta] = oneVsAll(X, y, num_labels, lambda);

这里oneVsAll函数是需要自己定义的,输入的参数num_labels表示标签的个数,也就是逻辑回归分类器的个数,这里返回的矩阵all_theta的第i行表示对标签i的分类
代码如下:

function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1);%x的行数,样本个数
n = size(X, 2);%x的列数,特征个数
all_theta = zeros(num_labels, n + 1);返回num_labels个代价函数的参数
X = [ones(m, 1) X];% 增加x0
%使用fmincg来最优化代价函数
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
for c = 1: num labels
theta = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
all_theta(c,:) = theta';
%这里样本数据里面的y是根据1~9对应的1~9 ,0对应的10
% 所以y==c 就是把y的取值 从1~10 直接抹成 1或者 0
end
end

其中lrCostFunction的定义和之前的一样


q1:根据max函数用法推断
theta = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
这么写就只返回theta
[theta,cost]= fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta
这么写就返回两个值
q2:第二句我一开始写的
all_theta(c,:) = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options); submit的时候也没有报错
在command line实验了一下确实不会出错
猜测是默认会进行一下转置
q3:theta(:)把矩阵变成一列 这个功能没有用上啊? 为什么要出现在hint里面?


接下来进行使用多分类逻辑回归函数进行预测
说明不需要使用循环,提示使用max函数,代码如下:

function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1);
p = zeros(size(X, 1), 1);
c = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
[c,p] = max(sigmoid(X*all_theta'),[],2);%得到每一行最大值的行号和列号

接下来使用已经训练好的参数,用神经网络进行预测
这个神经网络有3层,隐藏层有25个单元
所以Theta1是25×401,Theta2是10×26
在计算 a(2) 的时候记得给 x(i) 加上 x0
求出的应该是 hθ(x) k个元素中的最大值的下标
代码如下:

a1 = [ones(m, 1) X];
a2 = sigmoid(Theta1*a1');
a2 = [ones(1,m);a2];
a3= (sigmoid(Theta2*a2))';
[c, p] = max(a3,[],2);

另一个版本:

a1 = X; %5*400
a1 = [ones(size(X,1), 1),X];
a2 = sigmoid(a1*Theta1');
a2 = [ones(size(a2,1),1),a2];
a3 = sigmoid(a2*Theta2');
[tmp,p] = max(a3,[],2);

q1:matlab计算矩阵转置 计算复杂度和消耗大吗?
我的电脑貌似连ex3的display都带不动

octave 函数

colormap功能简介
设定和获取当前的色图。
使用方法
色图是一个m*3的实数矩阵,实数的大小在0到1.0之间,每一行是定义一种颜色的一个RGB向量。颜色图的第k行定义第k种颜色,其中 map(k,:)=[r(k) g(k) b(k)]定义为红、绿、蓝亮度。 Matlab中文论坛
1.colormap(map)
设置颜色图为矩阵map。如果map中的任何值在区间[0,1]之外,MATLAB返回错误:Colormap must have values in [0,1]。
2.colormap(‘default’)
将当前的颜色图设置为默认的颜色图。
3.cmap=colormap
返回当前的颜色图。返回的值都在区间[0,1]内。
指定色图
在color目录中的M文件产生多种色图。每一个M文件将颜色图的大小作为一个变量。例如:
colormap(hsv(128))
创建一个hsv颜色图,具有128种颜色。如果用户不指定大小,MATLAB创建与当前色图大小相同的色图。
支持的色图
下面将举例描述MATLAB内建的色图。用户除了可以编程指定MATLAB内建的色图,还可以使用Plot Tools图形用具界面的Figure Properties面板中的Colormap菜单来选择一种色图。

.autumn 从红色平滑变化到橙色,然后到黄色;
.bone 具有较高的蓝色成分的灰度色图。该色图用于对灰度图添加电子的视图。
.colorcube 尽可能多地包含在RGB颜色空间中的正常空间的颜色,试图提供更多级别的灰色、纯红色、纯绿色和纯蓝色。 《Simulink与信号处理》
.cool 包含青绿色和品红色的阴影色。从青绿色平滑变化到品红色。
.copper 从黑色平滑过渡到亮铜色。
.flag 包含红色、白色、绿色和黑色。
.gray 返回线性灰度色图。
.hot 从黑色平滑过度到红色、橙色和黄色的背景色,然后到白色。 book.iLoveMatlab.cn
.hsv 从红色,变化到黄色、绿色、青绿色、品红色,返回到红色。
.jet 从蓝色到红色,中间经过青绿色、黄色和橙色。
.line 产生由坐标轴的ColorOrder属性产生的颜色以及灰色的背景色的色图。 .pink 柔和的桃红色。
.prism 重复这六种颜色:红色、橙色、黄色、绿色、蓝色和紫色。
.spring 包含品红色和黄色的阴影颜色。
.summer 包含绿色和黄色的阴影颜色。
.white 全白的单色色图。 Matlab中文论坛
.winter 包含蓝色和绿色的阴影色。

drawnow 功能简介
在matlab的help中可以看到,flush pending graphics events, 这就是说,将还未处理完的图像实时的显示出来,可以理解为立即执行的plot,变化的plot。当代码执行时间长,需要反复执行plot时,Matlab程序不会马上把图像画到figure上,这时,要想实时看到图像的每一步变化情况,需要使用这个语句。

MAX函数
当A是一个列向量时候,返回一个最大值,在此不在赘述。

当Amxn是一个矩阵的时候,有以下几种情况:

① C = max(max(A)),返回矩阵最大值

② D = max(A,[],1),每一列的最值,得到行向量

③ E = max(A,[],2),每一行的最值,得到列向量
* [U V] = max(A,[],2),返回两个列向量,行最大元素本身与列号*
etc