中国mooc北京理工大学机器学习第二周(三):手写数字识别

利用sklearn中的神经网络进行数字识别。

先简单搬运占坑,暂时用不到。

    import numpy as np     #导入numpy工具包
    from os import listdir #使用listdir模块,用于访问本地文件
    from sklearn.neural_network import MLPClassifier 

    def img2vector(fileName):
        retMat = np.zeros([1024],int) #定义返回的矩阵,大小为1*1024
        fr = open(fileName)           #打开包含32*32大小的数字文件
        lines = fr.readlines()        #读取文件的所有行
        for i in range(32):           #遍历文件所有行
            for j in range(32):       #并将01数字存放在retMat中
                retMat[i*32+j] = lines[i][j]
        return retMat

    def readDataSet(path):
        fileList = listdir(path)    #获取文件夹下的所有文件
        numFiles = len(fileList)    #统计需要读取的文件的数目
        dataSet = np.zeros([numFiles,1024],int) #用于存放所有的数字文件
        hwLabels = np.zeros([numFiles,10])      #用于存放对应的one-hot标签
        for i in range(numFiles):   #遍历所有的文件
            filePath = fileList[i]  #获取文件名称/路径
            digit = int(filePath.split(‘_‘)[0])  #通过文件名获取标签
            hwLabels[i][digit] = 1.0        #将对应的one-hot标签置1
            dataSet[i] = img2vector(path +‘/‘+filePath) #读取文件内容
        return dataSet,hwLabels

    #read dataSet
    train_dataSet, train_hwLabels = readDataSet(‘trainingDigits‘)

    clf = MLPClassifier(hidden_layer_sizes=(100,),
                        activation=‘logistic‘, solver=‘adam‘,
                        learning_rate_init = 0.0001, max_iter=2000)
    print(clf)
    clf.fit(train_dataSet,train_hwLabels)

    #read  testing dataSet
    dataSet,hwLabels = readDataSet(‘testDigits‘)
    res = clf.predict(dataSet)   #对测试集进行预测
    error_num = 0                #统计预测错误的数目
    num = len(dataSet)           #测试集的数目
    for i in range(num):         #遍历预测结果
        #比较长度为10的数组,返回包含01的数组,0为不同,1为相同
        #若预测结果与真实结果相同,则10个数字全为1,否则不全为1
        if np.sum(res[i] == hwLabels[i]) < 10:
            error_num += 1
    print("Total num:",num," Wrong num:",           error_num,"  WrongRate:",error_num / float(num))

如果使用knn算法

    import numpy as np     #导入numpy工具包
    from os import listdir #使用listdir模块,用于访问本地文件
    from sklearn import neighbors

    def img2vector(fileName):
        retMat = np.zeros([1024],int) #定义返回的矩阵,大小为1*1024
        fr = open(fileName)           #打开包含32*32大小的数字文件
        lines = fr.readlines()        #读取文件的所有行
        for i in range(32):           #遍历文件所有行
            for j in range(32):       #并将01数字存放在retMat中
                retMat[i*32+j] = lines[i][j]
        return retMat

    def readDataSet(path):
        fileList = listdir(path)    #获取文件夹下的所有文件
        numFiles = len(fileList)    #统计需要读取的文件的数目
        dataSet = np.zeros([numFiles,1024],int)    #用于存放所有的数字文件
        hwLabels = np.zeros([numFiles])#用于存放对应的标签(与神经网络的不同)
        for i in range(numFiles):      #遍历所有的文件
            filePath = fileList[i]     #获取文件名称/路径
            digit = int(filePath.split(‘_‘)[0])   #通过文件名获取标签
            hwLabels[i] = digit        #直接存放数字,并非one-hot向量
            dataSet[i] = img2vector(path +‘/‘+filePath)    #读取文件内容
        return dataSet,hwLabels

    #read dataSet
    train_dataSet, train_hwLabels = readDataSet(‘trainingDigits‘)
    knn = neighbors.KNeighborsClassifier(algorithm=‘kd_tree‘, n_neighbors=3)
    knn.fit(train_dataSet, train_hwLabels)

    #read  testing dataSet
    dataSet,hwLabels = readDataSet(‘testDigits‘)

    res = knn.predict(dataSet)  #对测试集进行预测
    error_num = np.sum(res != hwLabels) #统计分类错误的数目
    num = len(dataSet)          #测试集的数目
    print("Total num:",num," Wrong num:",           error_num,"  WrongRate:",error_num / float(num))

以后填。

:)

时间: 2024-11-10 06:34:40

中国mooc北京理工大学机器学习第二周(三):手写数字识别的相关文章

中国mooc北京理工大学机器学习第二周(一):分类

一.K近邻方法(KNeighborsClassifier) 使用方法同kmeans方法,先构造分类器,再进行拟合.区别是Kmeans聚类是无监督学习,KNN是监督学习,因此需要划分出训练集和测试集. 直接贴代码. X=[0,1,2,3]#样本 Y=[0,0,1,1]#标签 from sklearn.neighbors import KNeighborsClassifier neigh = KNeighborsClassifier(n_neighbors=3)#选择周围的三个点作为近邻分析 nei

中国mooc北京理工大学机器学习第二周(二):回归

一.线性回归(Liner Regression) 利用数理统计中的回归分析,来确定两种或两种以上变量间相互依赖的定量关系的统计方法. 线性回归是用最小平方函数对一个或多个自变量和因变量之间进行建模. 导入和使用比较简单. from sklearn import linear_model linear = linear_model.LinearRegression() linear.fit(datasets_X, datasets_Y) 预测房屋价格. import matplotlib.pypl

中国mooc北京理工大学机器学习第一周(三)

三.基于聚类的整图分割 需要利用PIL进行图片处理,在anaconda安装的时候提示PIL只能用在py26,搜索知,可以conda install pillow 即可. def loadData(filePath): f = open(filePath,'rb') data = [] img = image.open(f) m,n = img.size for i in range(m): for j in range(n): x,y,z = img.getpixel((i,j)) #getpi

中国mooc北京理工大学机器学习第一周(二)

---恢复内容开始--- 今天学习第一周的第二课时:降维. 一.PCA主成分分析 主成分分析(Principal Component Analysis,PCA),是一种统计方法,直观来讲是把数据按照weights来筛选出主成分消除(或者隐蔽)不太重要的方面,使得高纬度数据投射到低维度. 直观来讲是应用了统计学上方差和协方差的知识,若协方差越接近1则表示A,B越接近:反之,若等于零则无关. 这里可以理解在一个高纬度角度(n维空间)去找一个角度使得从你这个角度看过去很多cov(A,B)很小的数值为零

中国mooc北京理工大学机器学习第一周(一)

从今天开始跟着北理工的老师走一遍sklearn,在这里做笔记. 一.聚类 1.K-Means方法 先贴代码,所有数据的下载地址:http://pan.baidu.com/s/1hrO5NW4 import numpy as np from sklearn.cluster import KMeans def loadData(filePath):#def一个读取数据的loadData fr = open(filePath,'r+') lines = fr.readlines() retData =

中国mooc北京理工大学机器学习第三周(一):强化学习基础

强化学习是程序或者智能体通过与环境不断地进行交互学习一个从环境到动作的映射,学习的目标使累计回报最大化. 强化学习是一种试错学习,在各种状态选需要尽量尝试所有可以选择的动作,通过环境的反馈来判断动作的优劣,最终获得环境和最优动作的映射关系. (马尔可夫)MDP通常来描述一个强化学习问题,智能体根据当前环境的观察采取动作获得反馈,并使环境改变. 在现实的强化学习任务中,很多条件不能获得,若学习不再依赖环境,则称为免疫模型学习,蒙特卡洛强化学习. Q-learning结合了动态规划和蒙特卡洛强化学习

机器学习(二)-kNN手写数字识别

一.kNN算法 1.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 2,距离可以是欧式距离,夹角余弦距离等等. 3,k值不能选择太大或太小,k值含义,是最后选取距离最近的前k个参照点的类标,统计次数最多的记为待测点类标. 4,欧式距离公式: 二.关于kNN实现手写数字识别 1,手写数字训练集测试集的数据格式,本篇文章说明的是<机器学习实战>书提供的文件,将所有数字已经转化成32*32灰度矩阵. 三.代码结构构成

机器学习初探(手写数字识别)matlab读取数据集

手写数字识别是机器学习里面的一个经典问题,今天就这一段时间学习的机器学习,花一个下午茶的时间,试试机器学习. 首先数据库是在MNIST(http://yann.lecun.com/exdb/mnist/)下载下来的.下载下来的数据如下图所示.官方有给出数据怎么读取,我自己没有仔细看,因为我看到网上有人公布代码如何读取. 可以看到前四个是测试数据,后四个是训练数据. 这里我用matlab尝试读取这些数据. 首先看两个function. loadMNISTImages.m function imag

第二节,TensorFlow 使用前馈神经网络实现手写数字识别

一 感知器      感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695      感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1.这种算法的局限性很大: 只能将数据分为 2 类 数据必须是线性可分的 虽然有这些局限,但是感知器是 ANN 和 SVM 的基础,理解了感知器的原理,对学习ANN 和 SVM 会有帮助,所以还是值得花些时间的. 感知器可以表示为