热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

逻辑回归_手写数字识别_OneVsAll

github地址:https:github.comlawlite19MachineLearning_Python逻辑回归具体的内容请参考上篇博客1、随机显示100个数字我没有使
  • github地址:https://github.com/lawlite19/MachineLearning_Python
  • 逻辑回归具体的内容请参考上篇博客

1、随机显示100个数字


  • 我没有使用scikit-learn中的数据集,像素是20*20px,彩色图如下 
    ![enter description here][9] 
    灰度图: 
    ![enter description here][10]
  • 实现代码:

# 显示100个数字
def display_data(imgData):sum = 0'''显示100个数(若是一个一个绘制将会非常慢,可以将要画的数字整理好,放到一个矩阵中,显示这个矩阵即可)- 初始化一个二维数组- 将每行的数据调整成图像的矩阵,放进二维数组- 显示即可'''pad = 1display_array = -np.ones((pad+10*(20+pad),pad+10*(20+pad)))for i in range(10):for j in range(10):display_array[pad+i*(20+pad):pad+i*(20+pad)+20,pad+j*(20+pad):pad+j*(20+pad)+20] = (imgData[sum,:].reshape(20,20,order="F")) # order=F指定以列优先,在matlab中是这样的,python中需要指定,默认以行sum += 1plt.imshow(display_array,cmap='gray') #显示灰度图像plt.axis('off')plt.show()

2、OneVsAll


  • 如何利用逻辑回归解决多分类的问题,OneVsAll就是把当前某一类看成一类,其他所有类别看作一类,这样有成了二分类的问题了
  • 如下图,把途中的数据分成三类,先把红色的看成一类,把其他的看作另外一类,进行逻辑回归,然后把蓝色的看成一类,其他的再看成一类,以此类推… 
    ![enter description here][11]
  • 可以看出大于2类的情况下,有多少类就要进行多少次的逻辑回归分类

3、手写数字识别


  • 共有0-9,10个数字,需要10次分类
  • 由于数据集y给出的是0,1,2...9的数字,而进行逻辑回归需要0/1的label标记,所以需要对y处理
  • 说一下数据集,前500个是0,500-10001,...,所以如下图,处理后的y,前500行的第一列是1,其余都是0,500-1000行第二列是1,其余都是0…. 
    ![enter description here][12]
  • 然后调用梯度下降算法求解theta
  • 实现代码:

# 求每个分类的theta,最后返回所有的all_theta
def oneVsAll(X,y,num_labels,Lambda):# 初始化变量m,n = X.shapeall_theta = np.zeros((n+1,num_labels)) # 每一列对应相应分类的theta,共10列X = np.hstack((np.ones((m,1)),X)) # X前补上一列1的偏置biasclass_y = np.zeros((m,num_labels)) # 数据的y对应0-9,需要映射为0/1的关系initial_theta = np.zeros((n+1,1)) # 初始化一个分类的theta# 映射yfor i in range(num_labels):class_y[:,i] = np.int32(y==i).reshape(1,-1) # 注意reshape(1,-1)才可以赋值#np.savetxt("class_y.csv", class_y[0:600,:], delimiter=',') '''遍历每个分类,计算对应的theta值'''for i in range(num_labels):result = optimize.fmin_bfgs(costFunction, initial_theta, fprime=gradient, args=(X,class_y[:,i],Lambda)) # 调用梯度下降的优化方法all_theta[:,i] = result.reshape(1,-1) # 放入all_theta中all_theta = np.transpose(all_theta) return all_theta

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

4、预测


  • 之前说过,预测的结果是一个概率值,利用学习出来的theta代入预测的S型函数中,每行的最大值就是是某个数字的最大概率,所在的列号就是预测的数字的真实值,因为在分类时,所有为0的将y映射在第一列,为1的映射在第二列,依次类推
  • 实现代码:

# 预测
def predict_oneVsAll(all_theta,X):m = X.shape[0]num_labels = all_theta.shape[0]p = np.zeros((m,1))X = np.hstack((np.ones((m,1)),X)) #在X最前面加一列1h = sigmoid(np.dot(X,np.transpose(all_theta))) #预测'''返回h中每一行最大值所在的列号- np.max(h, axis=1)返回h中每一行的最大值(是某个数字的最大概率)- 最后where找到的最大概率所在的列号(列号即是对应的数字)'''p = np.array(np.where(h[0,:] == np.max(h, axis=1)[0])) for i in np.arange(1, m):t = np.array(np.where(h[i,:] == np.max(h, axis=1)[i]))p = np.vstack((p,t))return p

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

5、运行结果


  • 10次分类,在训练集上的准确度: 
    ![enter description here][13]

6、使用scikit-learn库中的逻辑回归模型实现


  • 1、导入包

from scipy import io as spio
import numpy as np
from sklearn import svm
from sklearn.linear_model import LogisticRegression

  • 1
  • 2
  • 3
  • 4

  • 2、加载数据

data = loadmat_data("data_digits.mat") X = data['X'] # 获取X数据,每一行对应一个数字20x20pxy = data['y'] # 这里读取mat文件y的shape=(5000, 1)y = np.ravel(y) # 调用sklearn需要转化成一维的(5000,)

  • 1
  • 2
  • 3
  • 4

  • 3、拟合模型

model = LogisticRegression()model.fit(X, y) # 拟合

  • 1
  • 2

  • 4、预测

predict = model.predict(X) #预测print u"预测准确度为:%f%%"%np.mean(np.float64(predict == y)*100)

  • 1
  • 2
  • 3

  • 5、输出结果(在训练集上的准确度) 
    ![enter description here][14]

推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • pythonMatplotlib(二)
    Matplotlib+pandas作图一、对csv文件进行提取ruixi.csv对上述表格进行提取并做图画出图像二、对.xlsx进行提取:rui ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • 简介数组、CSV、表格、东西将一个数组转化为逗号为支解符的字符串(CSV)即表格数据。该源码来自于https:30secondsofcode.orgconstarrayToCSV( ... [详细]
  • 用pandas库修改excel文件里的内容,并把excel文件格式存为csv格式,再将csv格式改为html格式
    假设有Excel文件data.xlsx,其中内容为:     ID age height    sex weight张三  1  39    181 female     85李四  2  40    180   male     80王五  3  38    178 female     78赵六  4  59    1 ... [详细]
  • 机器学习之数据均衡算法种类大全+Python代码一文详解
    目录前言一、为什么要做数据均衡?二、数据场景1.大数据分布不均衡2.小数据分布不均衡三、均衡算法类型1.过采样2.欠采样3.组合采样四、算法具体种类1 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
author-avatar
l佳恒_756
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有