使用one-vs-all初始手写字母识别

数据特点

  • 每一个图片都是20 x 20的像素矩阵,但是在输入的样本中是一个1 x 400的向量,标签y在{0, 1, 2, ..., 9}之间取值
  • 共有5000个训练样本

可视化数据

  • 从5000个样本中随机的挑选出100个训练样本进行可视化
  • 得到的100个样本中,每一个样本都是一个向量,要想对其可视化,需要将其从向量还原为原始的矩阵
  • 首先确定矩阵的高和宽(单位是像素pixel)
  • 创建一个displayArray矩阵,用来保存100个样本转换为矩阵的像素数据,形象地讲,就是将100个图片放到一个大的面板上,这样才能做到可视化数据
  • 初始完毕displayArray矩阵之后,使用matlib中的imagesc函数将其显示出来
  • 代码如下:
  • myDisplayData.m
function [h, displayArray] = myDisplayData(X)

% 获取一张图片的高和宽
exampleHeight = round(sqrt(size(X(1, :), 2)));
exampleWidth = round(size(X(1, :), 2) / exampleHeight); % 计算整个面板的高和宽(但是是图片的个数)
[m, n] = size(X);
displayRows = round(sqrt(m));
displayCols = round(m / displayRows); % 先创建出displayRows * exampleHeight, displayCols * exampleWidth的面板
displayArray = ones(displayRows * exampleHeight, displayCols * exampleWidth); % 将图片放到面板对应的位置上
% 下面的式子就和数学有一些关系,如何确定现在填充的矩阵在displayArray中的位置
currExample = 1;
for i = 1:displayRows
for j = 1:displayCols
displayArray(...
(i - 1) * exampleWidth + 1:exampleWidth + (i - 1) * exampleWidth, ...
(j - 1) * exampleHeight + 1:exampleHeight + (j - 1) * exampleHeight ...
) = ...
reshape(X(currExample, :), ...
exampleHeight, exampleWidth);
currExample = currExample + 1;
end
end colormap(gray);
h = imagesc(display_array);
axis image off;
end

数据预处理

  • 为X添加bias(偏移量): X = [ones(m, 1), X]; % m表示样本的数量
  • m: 训练样本的数量
  • n: 特征的数量,不包括bias(偏移)特征
  • y: 标签,{0, 1, 2, ..., 9}
  • numLabel: y可以取的值的个数,这里为10

确定假设函数

  • 由题目可知,这是一个典型的Multi-Class Logistic Regression问题,因此使用逻辑回归模型
  • 模型函数: $$h(\theta)=g(\theta{T}x)={{1}\over{1+e{-\theta^{T}x}}}$$
  • 因为这个一个10分类的问题,所以需要拟合出10个假设函数才行,也就是要最小化出10个\(\theta\)向量,我们调用oneVsAll函数返回的参数应该是一个矩阵,每一个行向量是一个类别的假设函数的参数

计算损失函数(cost function)和梯度

  • 损失函数公式: $$J(\theta)={{1}\over{m}}\sum_{i=1}m(-y{(i)}log(h_{\theta}(x^{(i)})) - (1-y{(i)})log(1-h_{\theta}(x{(i)})))+{{\lambda}\over{2m}}\sum_{j=1}m{\theta_{j}2}$$其中\(\theta\), \(y^{(i)}\), \(x^{(i)}\)为向量或者矩阵,后一项是对非偏差项的正则化
  • 梯度公式: j >= 1 $${{\partial}\over{\partial}\theta_{j}}J(\theta)={{1}\over{m}}\sum_{i=1}m{(h_{\theta}(x{(i)})-y{(i)})x{(i)}} + {{\lambda}\over{m}}\theta_{j}$$ j = 0 $${{\partial}\over{\partial}\theta_{0}}J(\theta)={{1}\over{m}}\sum_{i=1}m{(h_{\theta}(x{(i)})-y{(i)})x{(i)}}$$
  • 注意,上面的\(h_{\theta}(x^{(i)})\)是sigmoid函数,自己在实现的时候总是将其写成线性回归函数

在oneVsAll.m文件中实现\(minimize_{\theta}J(\theta)\)

  • 每一个类都进行梯度下降,计算出这一类的参数,也就是写一个循环,在每一个循环中都有可以得到最终的这个类别对应的参数,循环的次数为numLabels

  • 核心代码

    for index = 1:numLabels
    initialTheta = zeros(n + 1, 1);
    options = optimset('GradObj', 'on', 'MaxIter', 50);
    % fmincg会自动选择最优的学习率alpha
    allTheta(index, :) = fmincg(@(t)(lrCostFunction(t, X, (y == index), lambda)), ...
    initialTheta, options);

end


## 预测 + 输入的一个样本,需要为其添加bias值,在将样本分别输入到10个假设函数中,计算出最大的值,那个值对应的就是类别。
+ 核心代码 ```matlib
tmp = zeros(m, num_labels);
for i = 1:num_labels
tmp(:, i) = sigmoid(X * allTheta(i, :)');
end
[val, p] = max(tmp, [], 2);

one-vs-all案例的更多相关文章

  1. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  2. SQL Server内存遭遇操作系统进程压榨案例

    场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的 ...

  3. solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...

  4. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  5. 了不起的 nodejs-TwitterWeb 案例 bug 解决

    了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...

  6. 一个表缺失索引发的CPU资源瓶颈案例

    背景 近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常.后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶 ...

  7. 【Machine Learning】决策树案例:基于python的商品购买能力预测系统

    决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...

  8. Redis简单案例(二) 网站最近的访问用户

    我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...

  9. springmvc+bootstrap+jquerymobile完整搭建案例(提供下载地址)

    用一张简单的截图说明下,然后提供一个下载地址. bootstrap的大部分样式官方都是写好的,所以只需要class="官方样式即可",具体可以看官方的案例,下面来个地址 http: ...

  10. RabbitMQ + PHP (三)案例演示

    今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...

随机推荐

  1. Socket网络通讯

    网络编程 使用C#进行网络编程时,通常都需要用到System.Net命名空间.System.Net.Sockets命名空间和System.Net.Mail命名空间: 1. System.Net命名空间 ...

  2. 网站Seo纲领

    1:准备工作和内容来源 2:域名注册 3:网站设计越简单越好 4:内容长度 5:四处一词 6:站内定向锚文本 7:内容编辑标准 8:外链建设 9:日志分析能力 10:更新频率和高质量的内容 1:准备工 ...

  3. #首行输入数n,接下来输入n行数,以空格隔开

    #首行输入数n,接下来输入n行数,以空格隔开 n = int(raw_input())# print nL = []for i in range(n): L.append([int(x) for x ...

  4. python中文件路径的问题

    慎用中文路径!慎重中文路径!!慎用中文路径!!! good = np.loadtxt(u'D:/feiq/feiq/Recv Files/Recv Files/LOS 数据集/good_user2', ...

  5. underscore里面的debounce与throttle

    throttle 策略的电梯.保证如果电梯第一个人进来后,15秒后准时运送一次,不等待.如果没有人,则待机. debounce 策略的电梯.如果电梯里有人进来,等待15秒.如果又人进来,15秒等待重新 ...

  6. 《Andrew Ng深度学习》笔记1

    深度学习概论 1.什么是神经网络? 2.用神经网络来监督学习 3.为什么神经网络会火起来? 1.什么是神经网络? 深度学习指的是训练神经网络.通俗的话,就是通过对数据的分析与计算发现自变量与因变量的映 ...

  7. springcloud微服务 总结一

    一 什么是微服务 译文: 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机 ...

  8. chrome 相关设置.

    1. 使用chrome 添加道桌面的快捷方式,自动打开两个 tab 解决方法: chrome://apps/ 右击 你的应用图标..勾选在新窗口打开.

  9. php 其他格式数据与数组互转

    class otherArr { private $char="UTF-8"; private $cvs_fege=","; // cvs 分割符 /**数组 ...

  10. 洛谷 P3267 [JLOI2016/SHOI2016]侦察守卫(树形dp)

    题面 luogu 题解 树形\(dp\) \(f[x][y]表示x的y层以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价.\) \(g[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上 ...