机器学习:手写数字识别(Hand-written digits recognition)小项目

该项目的所有代码在我的github上,欢迎有兴趣的同学与我探讨研究~

地址:Machine-Learning/machine-learning-ex3/


1. Introduction

  • 手写数字识别(Hand-written digits recognition),顾名思义,就是将带有手写数字的图片输入到已经训练过的机器,且机器能够很快识别图片中的手写数字,并将之作为输出打印出来。

  • 实现原理:

    • 现以我个人的理解,来描述一下手写数字识别的实现原理。

    • 首先,要实现机器学习,前提是要有充足的数据。对于本实验,要有充足的手写数字图片作为训练集进行模型的训练;

    • 其次,要能够提取手写数字图片的特征,这就涉及到了数字图像处理。对于本实验,我使用的是已经提取好图片特征的训练集。每张手写数字图片的分辨率20x20,将其特征值以一维的形式存在文件中,即训练集中每个example 有400个features。我使用的训练集一共有5000行,即有5000个手写图片。

    • 接着,就是本次实验的核心了— 模型的训练。本实验我分别使用两个模型实现了手写数字识别:一个是正规化后的逻辑回归模型,另一个是神经网络模型。但是,只有逻辑回归模型我实现了完整的过程,即包括模型的训练。对于神经网络模型,我直接使用的是训练好的参数。对于神经网络的训练,我在下一篇博文中会实现。

    • 对于模型的训练,可以通过梯度下降法或者其它优化函数来训练。当Cost Function接近0时,得到训练后的参数。

    • 完成模型的训练后,要进行预测准确率的计算。将训练集中的图片feature作为特征值输入目标函数,得到预测的结果。然后将预测的结果与训练集中图片feature对应的真实结果进行比较,计算预测的准确率。

    • 对于手写数字的预测,涉及到的是一个multi-outcomes的逻辑回归函数,使用的是oneVsAll的方法,即定义多个逻辑回归分类器,每个逻辑回归分类器只有两个结果:1和0。0~9都有对应的分类器,使得它们在分类器中的输出为1。所以,每输入一张图片的features,都会得到10个分类器的值,而这10个分类器中拥有最高值的,其对应的数字便是图片中的数字,因为只有在对应分类器中才能得到较高的评分。

    • 当准确率达到一个较高值时,就可以进行手写数字识别了。

    • 以上便是手写数字识别的实现原理

  • 对于two-outcomes的逻辑回归问题, 只需要训练一个逻辑回归分类器;

  • 对于multi-outcomes的逻辑回归问题,需要使用oneVsAll的方法,即同时训练多个逻辑回归分类器。

  • 而神经网络模型,对解决Non-linear Hypotheses非常有效。

  • 对于该模型,以下几点值得关注:

  • 神经网络能够构造复杂的Non-linear Hypotheses的原因(层数越多,函数构造越复杂);

    Adding all these intermediate layers in neural works allows us to more elegantly produce interesting and more complex non-linear hypotheses.

  • 神经网络的分层:输入层、隐藏层(一层或多层)、输出层;

  • 神经网络层与层的关系也是基于Sigmoid函数,称为Sigmoid activation function;

  • 神经网络层与层之间的参数theta,尤其是它的规格mxn;

  • 神经网络中的“bias unit”一般设置为1;

  • 神经网络的呈现:一般化表示和向量化表示;

2. 逻辑回归模型实现手写数字识别

主函数:

%% Initialization
clear ; close all; clc

%% Setup the parameters you will use for this part of the exercise
input_layer_size  = 400;  % 20x20 Input Images of Digits
num_labels = 10;          % 10 labels, from 1 to 10
                          % (note that we have mapped "0" to label 10)

%% =========== Part 1: Loading and Visualizing Data ============
% Load Training Data
fprintf('Loading and Visualizing Data ...\n')

% 该数据文件里存储了Matrix X(5000x400), 向量y。其中X的每一行代表一张20x20的图片
% 即X包含5000张图片的数据
load('ex3data1.mat'); % training data stored in arrays X, y
m = size(X, 1);

% Randomly select 100 data points to display
% 把1到m这些数随机打乱得到的一个数字序列,是一个行向量。
% 在数列中取100个数据,即取X100行数据,也就是10020x20的图
rand_indices = randperm(m);
sel = X(rand_indices(1:100), :);

displayData(sel);

fprintf('Program paused. Press enter to continue.\n');
pause;

%% ============ Part 2a: Vectorize Logistic Regression ===========
% Test case for lrCostFunction
fprintf('\nTesting lrCostFunction() with regularization');

theta_t = [-2; -1; 1; 2];
X_t = [ones(5,1) reshape(1:15,5,3)/10];
y_t = ([1;0;1;0;1] >= 0.5);
lambda_t = 3;
[J grad] = lrCostFunction(theta_t, 
  • 11
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值