ex3_Logistic多元回归-神经网络feedforward
2019-04-06 本文已影响0人
孟圆的笔记
Logistic多元回归
1.加载数据
>> load('ex3data1.mat');
>> whos
Name Size Type
X 5000x400 double
y 5000x1 double
X是5000条数据,y是5000个标签。
X的每一行都有400个元素。这400个元素代表20*20的矩阵。
每个20*20的矩阵,是一个灰度图片。
2.可视化数据
close all;clc;clear;
load('ex3data1.mat');
%X的Size
[m,n] = size(X);
%把1到m这些数字随机打乱,得到的一个1*m数字序列。
rands = randperm(m);
X = X(rands(1:100), :); %随机选了100行,是100个小图片。
for d = 1:100
%这100个小图片可以10*10排列。
subplot(10,10, d);
%初始化img
img = zeros(sqrt(n),n/sqrt(n));
%一个img的行和列
row = size(img,1);
col = size(img,2);
for i = 1:row
for j = 1:col
img(i,j) = X(d, (i-1)*col+j);
end
end
imshow(img', [-1 1]), colormap gray;
title(y(rands(d)));
end

3.二元分类的代价函数
function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta)); % (n+1)*1
H = sigmoid(X * theta); % 1*m
theta_reg = [0; theta(2:end, :)]; % (n+1)*1
J = (-1/m)*(y'*log(H)+(1-y)'*log(1-H)) + (lambda/(2*m))*(theta_reg'*theta_reg);
grad = (1/m)*X'*(H-y) + (lambda/m).*theta_reg; % (n+1)*1
end
4.一对多优化,得到10组模型参数theta
function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1); % 5000
n = size(X, 2); % 400
all_theta = zeros(num_labels, n + 1); % 10*(n+1)
X = [ones(m, 1) X];
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
% Run fmincg to obtain the optimal theta
% This function will return theta and the cost
for c = 1:10
[theta] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
initial_theta, options);
all_theta(c,:) = theta';
end
end
5.一对多,预测,选择预测值最大的
function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1); % 10
% You need to return the following variables correctly
p = zeros(size(X, 1), 1); % m*1
% Add ones to the X data matrix
X = [ones(m, 1) X];
A = sigmoid(X * all_theta'); % m*10,每一行数据,用10列参数theta,均有10个预测值。
[M,p] = max(A, [], 2); % 每一行求最大值
% M,是每行最大值,维数m*1;
% p,是每行最大值的列号,维数m*1。
end
最终准确率是 94.96%
这部分用Logistic回归实现了多元分类问题,但是在特征变量多的时候,手动构造非线性边界太复杂,所以引出神经网络。
神经网络
这个章节,将使用已经训练好的参数,做前向传播,去预测。
下个章节将实现后向传播,去训练参数。
1.加载参数
>> load('ex3weights.mat');
>> whos
Name Size
Theta1 25x401
Theta2 10x26
此模型只有三层:
1个输入层、1个隐藏层、1个输出层。
输入层有400个神经元、隐藏层有25个神经元、输出层有10个神经元。
2.利用已经给出的模型参数,编写前向传播代码,进行预测:
function [p] = predict(Theta1, Theta2, X)
m = size(X, 1); % 5000
num_labels = size(Theta2, 1); % 10
% You need to return the following variables correctly
p = zeros(size(X, 1), 1); % 5000*1
% 输入层
X = [ones(m,1) X];
% 隐藏层
% 25*1 = 25*401 * 401*1
A = sigmoid(Theta1 * X'); % 25*5000
A = [ones(m,1) A']; % 5000*26
% 输出层
% 10*1 = 10*26 * 26*1
H = sigmoid(Theta2 * A'); % 10*5000
H = H'; % 5000*10
[M,p] = max(H, [], 2); %选出每一行中最大的那个
% M,维数m*1,是每行最大值;
% p,维数m*1,是每行最大值的列号
end