手写数字识别实现

本文主要实现手写数字识别,利用多类逻辑回归与神经网络两种方法实现

Multi-class Classification

数据源
There are 5000 training examples in ex3data1.mat, where each training example is a 20 pixel by 20 pixel grayscale image of the digit. Each pixel is represented by a floating point number indicating the grayscale intensity at that location. The 20 by 20 grid of pixels is “unrolled” into a 400-dimensional vector. Each of these training examples becomes a single row in our data matrix X. This gives us a 5000 by 400 matrix X where every row is a training example for a handwritten digit image.

The second part of the training set is a 5000-dimensional vector y that contains labels for the training set. To make things more compatible with Octave/MATLAB indexing, where there is no zero index, we have mapped the digit zero to the value ten. Therefore, a “0” digit is labeled as “10”, while the digits “1” to “9” are labeled as “1” to “9” in their natural order.

数据可视化
通过displaydata函数可以察看数据

function [h, display_array] = displayData(X, example_width)
%DISPLAYDATA Display 2D data in a nice grid
%   [h, display_array] = DISPLAYDATA(X, example_width) displays 2D data
%   stored in X in a nice grid. It returns the figure handle h and the 
%   displayed array if requested.% Set example_width automatically if not passed in
if ~exist('example_width', 'var') || isempty(example_width) example_width = round(sqrt(size(X, 2)));
end% Gray Image
colormap(gray);% Compute rows, cols
[m n] = size(X);
example_height = (n / example_width);% Compute number of items to display
display_rows = floor(sqrt(m));
display_cols = ceil(m / display_rows);% Between images padding
pad = 1;% Setup blank display
display_array = - ones(pad + display_rows * (example_height + pad), ...pad + display_cols * (example_width + pad));% Copy each example into a patch on the display array
curr_ex = 1;
for j = 1:display_rowsfor i = 1:display_colsif curr_ex > m, break; end% Copy the patch% Get the max value of the patchmax_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;endif curr_ex > m, break; end
end% Display Image
h = imagesc(display_array, [-1 1]);% Do not show axis
axis image offdrawnow;end

向量化逻辑回归

由于数据较多,使用向量化可以使训练更加高效,提高速度。

代价函数的向量化
代价函数为

Let us define X and θ as

gradient向量化


小技巧

Debugging Tip: Vectorizing code can sometimes be tricky. One com- mon strategy for debugging is to print out the sizes of the matrices you are working with using the size function. For example, given a data ma- trix X of size 100 × 20 (100 examples, 20 features) and θ, a vector with dimensions 20×1, you can observe that Xθ is a valid multiplication oper- ation, while θX is not. Furthermore, if you have a non-vectorized version of your code, you can compare the output of your vectorized code and non-vectorized code to make sure that they produce the same outputs.

综上,可以写出lrCostFunction

function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y); % number of training examples% You need to return the following variables correctly 
J = 0;
grad = zeros(size(theta));
temp=[0;theta(2:end)];    % 先把theta(1)拿掉,不参与正则化
J= -1 * sum( y .* log( sigmoid(X*theta) ) + (1 - y ) .* log( (1 - sigmoid(X*theta)) ) ) / m  + lambda/(2*m) * temp' * temp ;
grad = ( X' * (sigmoid(X*theta) - y ) )/ m + lambda/m * temp ;grad = grad(:);end

一对多分类
在这个问题中,需要分成10份

小技巧

Octave/MATLAB Tip: Logical arrays in Octave/MATLAB are arrays which contain binary (0 or 1) elements. In Octave/MATLAB, evaluating the expression a == b for a vector a (of size m×1) and scalar b will return a vector of the same size as a with ones at positions where the elements of a are equal to b and zeroes where they are different. To see how this works for yourself, try the following code in Octave/MATLAB:a = 1:10; % Create a and bb = 3;a == b    % You should try different values of b here

由上可得oneVsAll function

function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1);
n = size(X, 2);
X = [ones(m, 1) X];options = optimset('GradObj', 'on', 'MaxIter', 50);initial_theta = zeros(n + 1, 1);for c = 1:num_labelsall_theta(c,:) = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...initial_theta, options);
endend

One-vs-all Prediction
根据上面得到了训练后的θ ,根据训练的结果,得到各个分类的可能性,取最大的一个,即是结果

function p = predictOneVsAll(all_theta, X)
[a,p] = max(sigmoid( X * all_theta'),[],2) ;    % 返回每行最大值的索引位置,也就是预测的数字
end
pred = predictOneVsAll(all_theta, X);fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);

可得准确率为95%

SourceCode:machine-learning-ex3

神经网络实现

神经网络实现主要步骤如下:

  • 初始化与导入数据
  • Compute Cost (Feedforward)
  • Implement Regularization
  • 随机初始化参数
  • Implement Backpropagation
  • 梯度检验
  • 训练神经网络
  • 预测

反向传播算法的具体实现

function [J grad] = nnCostFunction(nn_params, ...input_layer_size, ...hidden_layer_size, ...num_labels, ...X, y, lambda)Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...hidden_layer_size, (input_layer_size + 1));Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...num_labels, (hidden_layer_size + 1));% Setup some useful variables
m = size(X, 1);% You need to return the following variables correctly 
J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));%% 对y进行处理 Y(find(y==3))= [0 0 1 0 0 0 0 0 0 0]; 用于 Feedforward cost function 12   
Y=[];
E = eye(num_labels);    % 要满足K可以是任意,则不能写eye(10)!!
for i=1:num_labelsY0 = find(y==i);    % 找到等于y=i的序列号,替换向量Y(Y0,:) = repmat(E(i,:),size(Y0,1),1);
end%% regularized Feedforward cost function lambda=1
% 计算前向传输 Add ones to the X data matrix  -jin
X = [ones(m, 1) X];
a2 = sigmoid(X * Theta1');   % 第二层激活函数输出
a2 = [ones(m, 1) a2];        % 第二层加入b
a3 = sigmoid(a2 * Theta2'); temp1 = [zeros(size(Theta1,1),1) Theta1(:,2:end)];   % 先把theta(1)拿掉,不参与正则化
temp2 = [zeros(size(Theta2,1),1) Theta2(:,2:end)];
temp1 = sum(temp1 .^2);     % 计算每个参数的平方,再就求和
temp2 = sum(temp2 .^2);cost = Y .* log(a3) + (1 - Y ) .* log( (1 - a3));  % cost是m*K(5000*10)的结果矩阵  sum(cost(:))全部求和
J= -1 / m * sum(cost(:)) + lambda/(2*m) * ( sum(temp1(:))+ sum(temp2(:)) );  %% 计算 Gradient 
delta_1 = zeros(size(Theta1));
delta_2 = zeros(size(Theta2));for t = 1:m% step 1a_1 = X(t,:)';          
%        a_1 = [1 ; a_1];z_2 = Theta1 * a_1;   a_2 = sigmoid(z_2);  a_2 = [1 ; a_2];z_3 = Theta2 * a_2;a_3 = sigmoid(z_3);% step 2err_3 = zeros(num_labels,1);for k = 1:num_labels     err_3(k) = a_3(k) - (y(t) == k);end% step 3err_2 = Theta2' * err_3;                % err_2有26行!!!err_2 = err_2(2:end) .* sigmoidGradient(z_2);   % 去掉第一个误差值,减少为25. sigmoidGradient(z_2)只有25行!!!% step 4delta_2 = delta_2 + err_3 * a_2';delta_1 = delta_1 + err_2 * a_1';
end% step 5
Theta1_temp = [zeros(size(Theta1,1),1) Theta1(:,2:end)];
Theta2_temp = [zeros(size(Theta2,1),1) Theta2(:,2:end)];
Theta1_grad = 1 / m * delta_1 + lambda/m * Theta1_temp;
Theta2_grad = 1 / m * delta_2 + lambda/m * Theta2_temp ;% Unroll gradients
grad = [Theta1_grad(:) ; Theta2_grad(:)];end

训练神经网络代码

options = optimset('MaxIter', 50);%  You should also try different values of lambda
lambda = 1;% Create "short hand" for the cost function to be minimized
costFunction = @(p) nnCostFunction(p, ...input_layer_size, ...hidden_layer_size, ...num_labels, X, y, lambda);% Now, costFunction is a function that takes in only one argument (the
% neural network parameters)
[nn_params, cost] = fmincg(costFunction, initial_nn_params, options);

预测结果代码

function p = predict(Theta1, Theta2, X)
%PREDICT Predict the label of an input given a trained neural network
%   p = PREDICT(Theta1, Theta2, X) outputs the predicted label of X given the
%   trained weights of a neural network (Theta1, Theta2)% Useful values
m = size(X, 1);
num_labels = size(Theta2, 1);% You need to return the following variables correctly 
p = zeros(size(X, 1), 1);h1 = sigmoid([ones(m, 1) X] * Theta1');
h2 = sigmoid([ones(m, 1) h1] * Theta2');
[dummy, p] = max(h2, [], 2);% =========================================================================end

准确率大概95%左右,根据随机初始化的参数会有1%左右的误差
SourceCode:machine-learning-ex4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Science:若DTC基因检测达2%成年人群,几乎所有人的身份或将无所遁形

来源:测序中国摘要:直接面向消费者(DTC)的基因检测不仅仅是有趣那么简单,它的有用性随着样本数据库的积累,会逐渐显露出来。消费级基因检测,即直接面向消费者(DTC)的基因…

降维算法学习

降维的动机 首先,让我们谈论降维是什么。作为一种生动的例子,我们收集的数据集,有许多, 许多特征,我绘制两个在这里。 假设我们未知两个的特征 x1:长度:用厘米表示;X2,是用英寸表示同一物体的长度。 所以,这给了我们高度冗余表示,也许不是两个分开的特征 x1 和 X2,这两个…

年龄大了学Java是爱好还是转型?

年龄大了学Java是爱好还是转型? 一、前言 35岁,好像年龄也不小了,工作也有十年多了,一直搞编程,也已经做过几年研发管理。较多使用的是Delphi语言,对这门语言曾经一度的情有独钟。那是我十年前的一…

人类为什么更聪明 | 人脑神经元关键结构差异被揭示

来源:DeepTech深科技人脑中,数以千计的神经元间电信号交替传送不断,而长短不一的树突(神经元胞体延伸)在神经元信息整合中起到了关键作用,由此我们的大脑细胞才能正常反应运作。而这次,MIT 的神…

机器学习之异常检测

问题的动机 什么是异常检测呢?为了解释这个概念,让我举一个例子吧: 假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行 QA (质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎 运转时产生的热量,或者引擎的振动等等。…

美国《科技与未来城市报告》对中国智慧城市建设的启示

作者:王波、甄峰、卢佩莹来源:科技导报在全球范围内,美国一直引领信息通信技术等科技领域的发展。2008 年全球金融危机后,美国IBM 公司在《智慧地球:下一代领导人议程》主题报告中首次提出“智慧地球”理念&#xff0c…

SVM实现邮件分类

首先学习一下svm分类的使用。 主要有以下步骤: Loading and Visualizing DatajTraining Linear SVM Implementing Gaussian KernelTraining SVM with RBF Kernel 选择最优的C, sigma参数 画出边界线 线性keneral实现 C 1; model svmTrain(X, y, C, linear…

机器学习之推荐系统

我们从一个例子开始定义推荐系统的问题。 假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。 基于内容的推荐系统 在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这 些数据是有关这些东西的特征。 在我们的例子…

低潮过后,未来医疗可穿戴市场将如何发展?

来源:资本实验室在过去几年中,以智能手表为代表的可穿戴设备市场从快速爆发,并吸引全球厂商趋之若鹜;到如今平缓发展,众多厂商黯然离场,经历了一轮过山车般的炒作周期。但可穿戴设备市场难道只是看上去很美…

大规模机器学习

如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好的结果。我们应 该怎样应对一个有 100 万条记录的训练集? 以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和, 如果我们的学习算法需要有 20 次迭代,这便已经是非常大的计算代价。 …

中国半导体:存储器能否打破海外垄断?

来源:中金公司摘要:根据WSTS的统计,全球存储器行业营收2017年达到1319亿美元,占半导体行业收入的30.1%,过去五年(2012-2017)年复合增长率高达37%。▌全球市场概览:千亿美金市场,寡头竞争,IDM模式…

hdu 4588 Count The Carries

思路:容易发现二进制表示的数的最低位规律是01010101……;接着是001100110011……;接着是:0000111100001111…… 这样我们发现每一位的循环节是2^(i1),前2^i是0,后面的是1.这样就可以算出每一位1出现的次数…

数字图像处理入门

图像是指能在人的视觉系统中产生视觉印象的客观对象,包括自然景物、拍摄到的图片、用数学方法描述的图形.图像的要素有儿何要素〈刻画对象的轮廓、 形状等〉和非几何要素(刻画对象的颜色、 材质等〉。 什么是数字图像 简单地说, 数字图像就…

马化腾六年后知乎再提问:未来十年哪些基础科学突破会影响互联网科技产业?...

来源:量子位“未来十年哪些基础科学突破会影响互联网科技产业?产业互联网和消费互联网融合创新,会带来哪些改变?”昨天午夜时分,一个新问题出现在知乎。略微不同之处在于,这个问题的提出者ID是ponyma&#…

2018 中国开源年度报告发布,阿里系独占鳌头

来源:网络大数据摘要:指南针团队使用网络爬虫与 GitHub 数据 API 获取开源代码库的数据如原代码、项目信息、项目的静态信息如项目名称、起始日期等、与动态信息如fork数、客户给与的星数等众多项目相关的信息储存在本地数据结构中。第二篇 数据篇2.1 指…

图像处理中的matlab使用

图像的矩阵表示 类和图像类型 虽然使用的是整数坐标, 但 MATLAB 中的像素值(亮度)并未限制为整数。 表 1-1 列出了 MATLAB 和图像处理工具箱为描述像素值而支持的各种类。 表中的前 8 项是数值型的数据类,第 9 项称为字符类&…

AI洞观 | 一文读懂2018安博会四大趋势

来源: 网易智能10月23-26日,2018年安博会在北京顺义举行。这是全球规模最大,最具影响力的安防展会之一,据安博会官方介绍,本次展会总面积超过10万平方米,展位数突破5000个,云集了国内外上千家安…

图像的点运算

对于一个数字图像处理系统来说, 一般可以将处理流程分为3个阶段。在获取原始图像 后, 首先是图像预处理阶段, 其次是特征抽取阶段,最后才是识别分析阶段。预处理阶段尤 为重要, 这个阶段处理不好则直接导致后面的工作…

量子计算技术发展迅猛,商业潜力初现!如何把握量子计算时代的新机遇?

来源:蓝驰创投编译:全球君摘要:通用量子计算机一旦实现,将对通信安全、导航、成像以及人工智能、生物制药、新材料研发等诸多领域产生颠覆性影响,带来国家安全和社会经济发展的极大变革。通用量子计算机一旦实现&#…

分段线性变换与直方图修正

本文主要包括以下内容 分段线性变换两种实用的直方图修正技术:直方图均衡化和直方图规定化本章的典型案例分析 基于直方图均衡化的图像灰度归一化直方图匹配 分段线性变换 分段线性变换有很多种, 包括灰度拉伸、 灰度窗口变换等, 本节仅讲述最为常用…