1.多元分类
利用一对多逻辑回归以及神经网络识别手写数字(0--9)
1.1 数据集
ex3data1.mat文件中包含5000个手写数字的训练样本。mat格式文件意味着数据已经以矩阵形式被保存在matlab中,该文件可通过load命令将保存的数据载入。
这5000个样本中的每个样本都是20像素*20像素的灰度图像,每个像素由一个浮点数表示,指示该位置的灰度强度,20*20的像素网络被展为一400维向量。在矩阵X中,每个训练样本都是单独一行,这给了我们一个5000*400的矩阵X,其中每一行都是一个手写数字图像的样本。
?第二部分训练集是一个5000维的向量y,包含了所有训练样本的标签,其中数字“0”标记为10,其余正常标记对应数字。
1.2 数据可视化
首先对训练集中的子集进行可视化,ex3.m中part1将从X中随机挑选100行,将其传给displaydata函数。该函数将一并绘制这些数据的像素块图像
function [h, display_array] = displayData(X, example_width)
if ~exist('example_width', 'var') || isempty(example_width)
example_width = round(sqrt(size(X, 2)));
end
colormap(gray);
[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));
curr_ex = 1;
for j = 1:display_rows
for i = 1:display_cols
if curr_ex > m,
break;
end
% Copy the patch
% Get the max value of the patch
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;
curr_ex = curr_ex + 1;
end
if curr_ex > m,
break;
end
end
h = imagesc(display_array, [-1 1]);
axis image off
drawnow;
end
1.3 代价函数与梯度向量化
建立多元分类器,因为有十个分类,所以需要训练10个分离逻辑回归分类器。为了使训练有效,要确保代码向量化
代价函数如下:
?使用矩阵乘法可以快速计算h_θ,将X和θ定义为:
?计算X*θ得到:
a^T*b=b^T*a?
function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));
part1=-y'*log(sigmoid(X*theta));
part2=(1-y)'*log(1-sigmoid(X*theta));
reg=lambda*theta'*theta/(2*m);
J=(part1-part2)/m+reg;
grad=X'*(sigmoid(X*theta)-y')/m+lambda*theta/m;
grad = grad(:);
end
?1.4 一对多分类
|