精华内容
下载资源
问答
  • 对手数字采用支持向量机算法进行识别分类,并能进行参数调优等功能
  • 矩阵和向量手写表示

    千次阅读 2020-09-30 09:05:56
    手写向量: 矩阵:

    手写体

    向量:
    在这里插入图片描述
    矩阵:
    在这里插入图片描述

    展开全文
  • NULL 博文链接:https://924389979.iteye.com/blog/2064532
  • 摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST手写数字数据集,...

    演示动图

    摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST手写数字数据集,博主为SVM设置了合适的核函数,最终的测试准确率达99%的较高水平。根据训练得到的模型,利用MATLAB GUI工具设计了可以手写输入或读取图片进行识别的系统界面,同时可视化图片处理过程及识别结果。本套代码集成了众多机器学习的基础技术,适用性极强(用户可修改图片文件夹实现自定义数据集训练),相信会是一个非常好的学习Demo。本博文目录如下:

    ➷点击跳转至文末所有涉及的完整代码文件下载页☇

    代码介绍及演示视频链接:https://space.bilibili.com/456667721/(正在更新中,欢迎关注博主B站视频)


    前言

        机器学习中支持向量机(SVM)算法可谓是个超级经典,也许很多人倾向于使用深度神经网络解决问题,但在博主看来选择何种算法应该取决于具体的机器学习任务,对于复杂程度不高、数据量较少的任务,也许经典的机器学习算法能够更好地解决问题。手写数字识别这一任务要求正确分类出0-9的手写数字图片,最常用的数据集是MNIST,该数据集也是众多论文中经常用来测试对比算法的对象。博主想说的是其实SVM也可以很好地解决这一问题,本文介绍的代码就可以实现99%的测试准确率,所以想借此为大家提供一个学习的Demo共同交流。

        博主之前也曾写过两篇利用SVM进行分类的博文:基于支持向量机的图像分类(上篇)基于支持向量机的图像分类(下篇:MATLAB实现),详细介绍了特征提取的基本技术和支持向量机的原理,亦可供大家参考。本文给出了MATLAB实现的完整代码供大家参考,有基础的读者可按照文中的介绍复现出完整程序;对于想获取全部数据集及程序文件的朋友,可以点击提供的下载链接获取可直接运行的代码,原创不易,还请多多支持了。如本文对您有所帮助,敬请点赞、收藏、关注!


    1. 效果演示

        找资料的大伙时间宝贵,为了方便大家了解项目,我们老规矩先上效果演示,GUI界面有几个主要功能:通过手写板写入数字进行识别;利用文件浏览器选取一张手写数字的图片进行识别;同步可视化处理过程中的图像,显示最终识别结果。GUI界面如下:

    GUI界面展示图
        在手写板中写入数字后可点击下方保存按钮保存为图片文件,手写输入及读图输入及保存功能的演示动图如下图所示。右侧为图像原图、灰度化处理、二值化处理及特征提取后的图像,方便了解识别的处理过程:

    动图演示
        本项目所有功能均已在MATLAB R2020b中测试通过,更多演示细节敬请前往博主B站观看演示视频,视频具体演示程序运行效果并介绍如何使用代码,欢迎关注!


    2. MNIST数据集

        MNIST数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology, NIST)。训练集 (Training Set) 由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局的工作人员;测试集(Test Set) 也是同样比例的手写数字数据。

    MNIST数据集
        MNIST数据集可在 http://yann.lecun.com/exdb/mnist/获取,但由于访问外网下载速度很慢,博主已将该数据集打包上传至百度网盘,大家可以通过博主前面发布的博文:深度学习常用数据集介绍与下载(附网盘链接)进行下载。MNIST数据集包含了四个部分:

    • Training set images:train-images-idx3-ubyte.gz (9.9MB,解压后47MB,包含60000个样本)
    • Training set labels:train-labels-idx1-ubyte.gz(29KB,解压后60KB,包含60000个标签)
    • Test set images:t10k-images-idx3-ubyte.gz (1.6MB,解压后7.8MB,包含10000个样本)
    • Test set labels: t10k-labels-idx1-ubyte.gz(5KB,解压后10KB,包含10000个标签)

        将下载后的数据集文件放在一个文件夹下,用于后续处理,MNIST数据集文件如下图所示:

    数据集文件
        由于MNIST的原始文件并非常见的图片格式,因此为了方便后续处理,我们先将这几个文件转化为mat文件,然后逐个读取转换为图像矩阵并保存为图片文件。值得注意的是,我们需按照每条样本数据的标签将其分别放置在不同的文件夹中,如下方式在train文件夹中创建0-9的文件夹用来存放要写入的对应标签的图片:

    子文件夹
        这里写一个小脚本将数据集图片按标签存入对应文件夹中,其中的mat文件为读取原始数据并转存后的数据集,MNIST每张图片的尺寸均为28×28,所以可以先通过reshape恢复数据尺寸,然后利用imwrite函数写入文件中(路径为对应标签的子文件夹),该部分代码如下:

    clear
    clc
    % P = loadMNISTImages('mnist/train-images.idx3-ubyte');
    % T = loadMNISTLabels('mnist/train-labels.idx1-ubyte');
    load('test_data.mat', 'test_X')
    load('test_label.mat', 'test_Y')
    load('train_data.mat', 'train_X')
    load('train_label.mat', 'train_Y')
    load('validation_data.mat', 'validation_X')
    load('validation_label.mat', 'validation_Y')
    % 遍历每张图片
    disp('现在将训练数据保存为图片文件格式')
    for i = 1:length(train_X)
        img = reshape(train_X(i, :), 28, 28); % 转换成28*28的图片
        img = img';
        imwrite(img, ['./mnist/train/', int2str(train_Y(i)), '/', int2str(i), '.jpg']);
        disp(i);
    end
    % 遍历每张图片
    disp('现在将测试数据保存为图片文件格式')
    for i = 1:length(test_X)
        img = reshape(test_X(i, :), 28, 28); % 转换成28*28的图片
        img = img';
        imwrite(img, ['./mnist/test/', int2str(test_Y(i)), '/', int2str(i), '.jpg']);
        disp(i);
    end
    

        处理后的子文件夹中将存放对应的图片文件,其中两个子文件夹的截图如下图所示:

    子文件夹详情
        数据集准备完毕,现在可以通过文件夹读取图片了。在MATLAB中可使用imageDatastore函数方便地批量读取图片集,它通过递归扫描文件夹目录,将每个文件夹名称自动作为图像的标签,该部分代码如下:

    % 给出训练和测试数据路径,利用imageDatastore载入数据集
    syntheticDir   = fullfile('data','mnist', 'train');
    handwrittenDir = fullfile('data','mnist', 'test');
    
    % imageDatastore递归扫描目录,将每个文件夹名称自动作为图像的标签
    trainSet = imageDatastore(syntheticDir,   'IncludeSubfolders', true, 'LabelSource', 'foldernames');
    testSet  = imageDatastore(handwrittenDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
    

        至此训练和测试数据集分别被存放在trainSettestSet变量中,可以简单查看训练和测试集每类标签的样本个数,显示代码如下:

    trainSetDetail = countEachLabel(trainSet) % 训练数据
    testSetDetail = countEachLabel(testSet) % 测试数据
    

        执行以上代码运行结果如下:

    查看各类文件个数
        下面读取几张训练和测试集的图片,显示原始图片帮助我们清楚该数据集的实际情况,按照两行显示:第一行为训练图片,第二行为测试图片,该部分代码如下:

    figure;
    % 显示训练、测试图片(第一行是训练图片、第二行是测试图片)
    subplot(2,5,1);imshow(trainSet.Files{4417});
    subplot(2,5,2);imshow(trainSet.Files{23696});
    subplot(2,5,3);imshow(trainSet.Files{31739});
    subplot(2,5,4);imshow(trainSet.Files{46740});
    subplot(2,5,5);imshow(trainSet.Files{54784});
    subplot(2,5,6);imshow(testSet.Files{53});
    subplot(2,5,7);imshow(testSet.Files{4572});
    subplot(2,5,8);imshow(testSet.Files{5163});
    subplot(2,5,9);imshow(testSet.Files{8381});
    subplot(2,5,10);imshow(testSet.Files{9549});
    

        执行该代码可以看到如下的运行结果:

    数据集显示
        在提取特征前我们对图片进行一些必要的预处理操作,首先读取图片后进行灰度化,然后进行二值化处理,以方便后续的特征提取。这里我们将原始图片和二值化后的图像显示在一个窗口中,其代码如下:

    exampleImage = readimage(trainSet, 31739);
    if numel(size(exampleImage))==3
            exampleImage = rgb2gray(exampleImage);   % 灰度化图片
    end
    
    processedImage = imbinarize(exampleImage);
    
    figure;
    subplot(1,2,1)
    imshow(exampleImage)
    title('原始图像')
    
    subplot(1,2,2)
    imshow(processedImage)
    title('二值化后图像')
    

        执行该代码可以看到如下的原始图像与二值化后的对比结果:
    二值化对比结果


    3. HOG特征提取

        真正用于训练分类器的数据并不是原始图片数据,而是先经过特征提取后得到的特征向量,这里使用的特征类型是HOG,也就是方向梯度直方图。所以这里重要的一点是正确提取出HOG特征,extractHOGFeaturesMATLAB自带的HOG特征提取函数,该函数不仅可以有效提取特征,还可以返回特征的可视化结果以方便展示。这里通过调整每个细胞单元的尺寸大小实现不同尺寸的特征提取,可以通过可视化的结果看到细胞单元的尺寸对图像的形状信息量的影响:

    img = readimage(trainSet, 31739);
    
    % 提取HOG特征,并进行HOG可视化
    [hog_2x2, vis2x2] = extractHOGFeatures(img,'CellSize',[2 2]);
    [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',[4 4]);
    [hog_8x8, vis8x8] = extractHOGFeatures(img,'CellSize',[8 8]);
    
    % 显示原始图片
    figure; 
    subplot(2,3,1:3); imshow(img);
    title('原始图片');
    
    % 可视化HOG特征
    subplot(2,3,4);  
    plot(vis2x2); 
    title({'CellSize = [2 2]'; ['Length = ' num2str(length(hog_2x2))]});
    
    subplot(2,3,5);
    plot(vis4x4); 
    title({'CellSize = [4 4]'; ['Length = ' num2str(length(hog_4x4))]});
    
    subplot(2,3,6);
    plot(vis8x8); 
    title({'CellSize = [8 8]'; ['Length = ' num2str(length(hog_8x8))]});
    

        通过以上代码我们分别提取了2×24×48×8三种尺寸的HOG特征,其运行的可视化结果如下:
    不同尺寸HOG特征
        从以上结果可以看出2×2的细胞尺寸会编码更多的形状信息,这会显著增加HOG特征向量的维数,相反8×8的细胞尺寸得到的特征量最少。这其实是一个需要调试的参数,一方面应该对足够的空间信息进行编码,另一方面需要减少HOG特征向量的维数,为此可以选择4×4的细胞大小。当然读者还可以通过反复根据分类器训练和测试的效果来调整HOG特征的相关参数,以实现最佳参数设置。


    3. 训练和评估SVM分类器

        下面我们使用以上提取的HOG特征训练支持向量机,以上的代码只是提取了一张图片的特征,训练前我们对整个训练数据集提取HOG特征并组合,为了方便后面的性能评估,这里对测试数据集也进行特征提取:

    cellSize = [4 4];
    hogFeatureSize = length(hog_4x4);
    
    % 提取HOG特征
    tStart = tic; 
    [trainFeatures, trainLabels] = extractHogFromImageSet(trainSet, hogFeatureSize, cellSize); % 训练集特征提取
    [testFeatures, testLabels] = extractHogFromImageSet(testSet, hogFeatureSize, cellSize);    % 测试集特征提取
    
    tEnd = toc(tStart);
    fprintf('提取特征所用时间:%.2f秒\n', tEnd);
    

        由于图片数量众多,提取特征过程尚需一定时间,这里对训练集、测试集提取过程进行计时,因计算机算力不同,执行时间可能会不一致。以下代码中extractHogFromImageSet函数为自定义函数,封装了前面所提到的图像灰度化、二值化和HOG特征提取的代码,可以方便我们复用代码,使得程序更加简洁。

    cellSize = [4 4];
    hogFeatureSize = length(hog_4x4);
    
    % 提取HOG特征
    tStart = tic; 
    [trainFeatures, trainLabels] = extractHogFromImageSet(trainSet, hogFeatureSize, cellSize); % 训练集特征提取
    [testFeatures, testLabels] = extractHogFromImageSet(testSet, hogFeatureSize, cellSize);    % 测试集特征提取
    
    tEnd = toc(tStart);
    fprintf('提取特征所用时间:%.2f秒\n', tEnd);
    

        运行以上代码结果如下:

    提取特征所用时间:181.59秒
    

        构建支持向量机模型,利用提取的训练集特征进行训练。首先利用templateSVM函数构建支持向量机模板参数,选择polynomial核函数,执行标准化处理数据,显示训练过程;利用fitcecoc函数执行训练过程,其代码如下:

    % 训练支持向量机
    
    t = templateSVM('SaveSupportVectors',true, 'Standardize', true, 'KernelFunction','polynomial', ...
        'KernelScale', 'auto','Verbose', 1);      % 利用polynomial核函数, 标准化处理数据,显示训练过程(verbose取0时取消显示)
    
    tStart = tic; % 计时开始
    classifier = fitcecoc(trainFeatures, trainLabels, 'Learner', t); % 训练SVM模型
    tEnd = toc(tStart);
    fprintf('训练模型所用时间:%.2f秒\n', tEnd);
    

        以上代码开启了训练过程信息显示,训练过程中显示信息如下:

    训练过程展示

    训练模型所用时间:104.96秒
    

        等待训练完成,我们可以使用训练好的分类器进行预测,这里先利用测试集评估模型并计算分类评价指标,对测试集进行预测的代码如下:

    tStart = tic;
    
    % 对测试数据集进行预测
    predictedLabels = predict(classifier, testFeatures);
    
    tEnd = toc(tStart);
    fprintf('模型对测试集进行预测所用时间:%.2f秒\n', tEnd);
    

        运行结果如下:

    模型对测试集进行预测所用时间:5.18秒
    

        得到了预测结果,可以使用混淆矩阵评估结果,以下代码首先计算混淆矩阵结果,然后将结果打印出来:

    % 使用混淆矩阵评估结果
    confMat = confusionmat(testLabels, predictedLabels);
    dispConfusionMatrix(confMat); % 显示混淆矩阵
    

        运行结果如下:

    混淆矩阵打印结果
        以上代码显示了混淆矩阵的结果,但可能还不够直观,下面绘制混淆矩阵图帮助更好了解模型性能:

    % 绘制混淆矩阵图
    plotconfusion(testLabels, predictedLabels);
    

        运行代码后显示混淆矩阵图如下图所示,每行对角线上的网格(绿色网格)处显示了某类样本预测正确的数目及其占比。右下角网格表示分类的准确率,可以看出该分类器具有98.9%的总体分类准确率。
    混淆矩阵图
        分类准确率还可以通过以下代码进行计算:

    accuracy = sum(predictedLabels == testLabels) / numel(testLabels);
    fprintf('模型在测试集上的准确率:%.0f%%\n', accuracy*100);
    

        同样可以计算出预测的准确率,这里四舍五入取整可得以下结果:

    模型在测试集上的准确率:99%
    

        通过测试集评估结果,可以看出采用核函数的支持向量机准确率为99%,其性能已逼近深度卷积神经网络。得到了一个性能优良的分类器,接下来便可以利用模型设计一些有意思的东西了。为此我将该模型用于实际的手写数字识别中,以下是在MATLAB GUI工具中设计的界面,如若读者反响热烈,后期将很快更GUI的设计介绍,还请关注了!

    GUI界面


    下载链接

        若您想获得博文中涉及的实现完整全部程序文件(包括数据集,m, UI文件等,如下图),这里已打包上传至博主的面包多平台和CSDN下载资源。本资源已上传至面包多网站和CSDN下载资源频道,可以点击以下链接获取,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

    文件夹详情

    注意:本资源已经过调试通过,下载后可通过MATLAB R2020b运行;训练主程序为main_showData.mlxDigitClassify_HOG_SVM.m文件,测试程序可运行testImage.mlx,要使用GUI界面请运行DigitClassifyUI.m文件(脚本文件可直接运行);其它程序文件大部分为函数而非可直接运行的脚本,使用时请勿直接点击运行!➷➷➷

    完整资源下载链接1博主在面包多网站上的完整资源下载页

    完整资源下载链接2https://mianbaoduo.com/o/bread/YZeUkplu

    注:以上两个链接为面包多平台下载链接,CSDN下载资源频道下载链接稍后上传。

    代码使用介绍及演示视频链接:https://space.bilibili.com/456667721/(尚在更新中,欢迎关注博主B站视频)


    结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。如果本博文反响较好,其界面部分也将在下篇博文中介绍,所有涉及的GUI界面程序也会作细致讲解,敬请期待!

    展开全文
  • 支持向量手写数字识别I have been sitting around on the MNIST data set for a while now. MNIST databaseis a large database of handwritten digits and these are provided in the Kaggle Knowledge ...

    支持向量机手写数字识别

    I have been sitting around on the MNIST data set for a while now. MNIST database is a large database of handwritten digits and these are provided in the Kaggle Knowledge Competition Digit Recognizer. I have been sitting on this data set for so long in fact, that the last thing I have written for it was last August. I wrote a Python script, that took the training data and created bmp image files of each data point. So you would end up with a folder with 42000 28 by 28 pixel images (about 74.5 MB of memory).  I have uploaded it as a Gist here for those interested.

    我已经坐了一段时间的MNIST数据集。 MNIST数据库是一个庞大的手写数字数据库,在Kaggle知识竞赛数字识别器中提供 。 实际上,我一直坐在这个数据集上已经有很长时间了,以至于我为此写的最后一本书是去年8月。 我编写了一个Python脚本,该脚本获取了训练数据并创建了每个数据点的bmp图像文件。 因此,您最终将得到一个包含42000 28 x 28像素图像(大约74.5 MB内存)的文件夹。 我已将其作为要点上传给了那些有兴趣的人。

     

    Digits from MNIST data set

    Digits from MNIST data set

    MNIST数据集中的数字

    But what I have done this weekend, was using the Linear Support Vector Classification implemented in the scikit-learn module to create a simple model, that determines the digit according to the given pixel data with an accuracy of 84% on the test data in the Kaggle Competition. My implementation is based on this example on using a SVM to recognize hand written digits.

    但是,我本周末所做的工作是使用scikit-learn模块中实现的线性支持向量分类来创建一个简单的模型,该模型根据给定的像素数据确定位数,其准确度是测试数据的84%。 Kaggle比赛。 我的实现基于使用SVM识别手写数字的示例

    What I will present you isn’t the script I have used for the Kaggle submission, but the one I have used on the training data to measure the accuracy of the model. The advantage of using only the training data is, that I have all the correct labels of each data point and can therefore display a confusion matrix and other metrics for evaluating the quality of the model.

    我要介绍的不是我用于Kaggle提交的脚本,而是我在训练数据上用来测量模型准确性的脚本。 仅使用训练数据的优点是,我拥有每个数据点的所有正确标签,因此可以显示混淆矩阵和其他用于评估模型质量的指标。

    Linear Support Vector Machines try to find a hyperplane that separates the training data into two classes with a maximum margin. In our case the class of a data point is the digit it represents. We want to maximize the margin between the hyperplane and the two classes to minimize the error of incorrectly recognizing a digit. The hyperplane then divides the data, so that everything above the hyperplane belongs to one class and everything below the hyperplane belongs to the other class. Each pixel value of the 28 by 28 image is represented in its own dimension, meaning that a image is a point in a space with 28 * 28 = 784 dimensions. And the hyperplane divides the data points into two classes in this 784 dimensional space.

    线性支持向量机试图找到一个超平面,该平面将训练数据分为两类,并且具有最大的余量。 在我们的例子中,数据点的类别是它代表的数字。 我们希望最大化超平面和这两个类之间的余量,以最小化错误识别数字的错误。 然后,超平面划分数据,以便超平面上方的所有内容都属于一个类,而超平面下方的所有内容都属于另一类。 28 x 28图像的每个像素值均以其自己的尺寸表示,这意味着图像是28 * 28 = 784尺寸的空间中的一个点。 超平面在这个784维空间中将数据点分为两类。

    An additional aspect to consider is, that dividing images into digits between 0 and 9 is a multiclass classification problem. My definition from the previous paragraph on how Support Vector Machines work only contains one hyperplane, that can divide into only two classes. And this truly is a problem, when we have more than two classes like in this case. The solution to this is to train multiple Support Vector Machines, that solve problems stated in this format: “Is this digit a 3 or not a 3?”. Now we are solving a binary classification again with the two classes “is a 3” and “is not a 3”. In our case we have one Support Vector Machine for each digit, giving us a total of ten. We consider the solution with the highest confidence score as the right digit.

    要考虑的另一个方面是,将图像分为0到9之间的数字是多类分类问题。 我在上一段中关于支持向量机如何工作的定义仅包含一个超平面,该超平面只能分为两类。 当我们有超过两个这样的类时,这确实是一个问题。 解决方案是训练多台支持向量机,以解决以下格式的问题:“此数字是3还是3?”。 现在,我们再次使用“是3”和“不是3”这两个类来求解二进制分类。 在我们的例子中,每个数字都有一个支持向量机,总共有十个。 我们将置信度最高的解决方案视为正确的数字。

    So here is how the “train.csv” looked like to make sense of the indexing in the code:

    因此,这就是“ train.csv”看起来如何理解代码中的索引的方式:

    label,pixel0,pixel1,pixel3,...,pixel783
    1 , 0 , 0 , 0 , ... , 0
    4 , 0 , 0 , 0 , ... , 0
    ⋮ , ⋮ , ⋮ , ⋮ , ⋮ , ⋮  
    
    

    The pixel data can take values have in the range [0,255], where 255 is black and 0 is white.

    像素数据的取值范围为[0,255],其中255为黑色,0为白色。

    And this is how my code looks like:

    这就是我的代码的样子:

    import csv
    from sklearn import svm, metrics
    from numpy import genfromtxt
    import numpy as np
    
    dataset = genfromtxt('train.csv', delimiter=",", dtype=np.dtype('>i4'))[1:]
    labels = [x[0] for x in dataset]
    data = [x[1:] for x in dataset]
    
    n_samples = len(labels)
    n_features = len(data[0])
    
    print("Number of samples: " + str(n_samples) + ", number of features: "+ str(n_features))
    
    # a support vector classifier
    classifier = svm.LinearSVC()
    
    split_point = int(n_samples * 0.66)
    
    # using two thirds for training
    # ans one third for testing
    
    labels_learn = labels[:split_point]
    data_learn = data[:split_point]
    
    labels_test = labels[split_point:]
    data_test = data[split_point:]
    
    print("Training: " + str(len(labels_learn)) + " Test: " + str(len(labels_test)))
    
    # Learning Phase
    classifier.fit(data_learn, labels_learn)
    
    # Predict Test Set
    predicted = classifier.predict(data_test)
    
    # classification report
    print("Classification report for classifier %s:n%sn" % (classifier, metrics.classification_report(labels_test, predicted)))
    
    # confusion matrix
    print("Confusion matrix:n%s" % metrics.confusion_matrix(labels_test, predicted))
    
    

    The cool thing about metrics is, that you can easily print this as output to judge how well your model is performing:

    关于指标的最酷的事情是,您可以轻松地将其作为输出打印,以判断模型的性能如何:

    Number of samples: 42000, number of features: 784
    Training: 27720 Test: 14280
    Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=Tr
    ue, fit_intercept=True,
         intercept_scaling=1, loss='squared_hinge', max_iter=1000,
         multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
         verbose=0):
                 precision    recall  f1-score   support
    
              0       0.96      0.93      0.94      1442
              1       0.93      0.97      0.95      1613
              2       0.92      0.79      0.85      1376
              3       0.88      0.86      0.87      1468
              4       0.84      0.92      0.88      1339
              5       0.67      0.84      0.75      1296
              6       0.84      0.96      0.90      1388
              7       0.94      0.85      0.89      1504
              8       0.81      0.73      0.77      1401
              9       0.87      0.78      0.82      1453
    
    avg / total       0.87      0.86      0.86     14280
    
    
    Confusion matrix:
    [[1334    0    8    9    2   36   44    1    8    0]
     [   0 1570    5    4    2    9    2    2   18    1]
     [   8   25 1087   33   14   58   77   17   52    5]
     [   4   14   27 1260    2   89   20   11   32    9]
     [   4   12    9    2 1230   13   23    2   21   23]
     [  13    6    5   50   23 1083   48    1   54   13]
     [   7    5    7    0    5   23 1336    0    4    1]
     [   6    6   11   10   33   34    2 1274   23  105]
     [   5   44   12   30   16  213   30    6 1027   18]
     [   7   10    8   32  138   52    2   41   32 1131]]
    
    

    The most interesting analysis metric for our digit recognition is probably the confusion matrix. Each row represents one digit and each column entry also represents one digit. A entry in the matrix resembles the number of times a given digit was recognized as the digit represented in the column. So the very first entry 1334 says that 1334 times a digit 0 was recognized as a digit 0. The number 8 two columns to the right means, that 8 times a 0 digit in the training data was recognized as a 2 from our SVM and so on and so fourth. Naturally it makes sense, that for a well working prediction model the entries in the diagonal should be substantially larger than the other values in the given row, which is the case with this linear SVM.

    对于我们的数字识别而言,最有趣的分析指标可能是混淆矩阵。 每行代表一位,每列条目也代表一位。 矩阵中的条目类似于将给定数字识别为该列中表示的数字的次数。 因此,第一个条目1334表示将1334次数字0识别为数字0。数字8右边两列表示,从我们的SVM中将训练数据中0位数的8倍识别为2,因此等等。 自然地,对于一个运行良好的预测模型来说,对角线中的项应该比给定行中的其他值大得多,这就是线性SVM的情况。

    将SVM应用于我自己的数字 (Applying the SVM to my own digits)

    Now since I have a accurate working model for the MNIST handwritten digits, I would also like to see how well the model works for my own digits. So I created a few BMP images using paint.

    现在,由于我有一个适用于MNIST手写数字的准确工作模型,因此我也想看看该模型对我自己的数字的工作情况。 因此,我使用绘画创建了一些BMP图像。

    number_collage

    My digits made in Paint

    我的数字用油漆制成

    I extract the grey values for each pixel from each BMP image and feed this as test data to predict for my SVM. I use joblib to load my previously saved classifier, so I don’t have to train my model from scratch every time. Here is the script I have used:

    我从每个BMP图像中提取每个像素的灰度值,并将其作为测试数据输入以预测我的SVM。 我使用joblib加载以前保存的分类器,因此不必每次都从头开始训练模型。 这是我使用的脚本:

    from PIL import Image
    import numpy as np
    import sys
    from sklearn.externals import joblib
    
    # argv[1] - path to input image
    if len(sys.argv) != 2:
        print("Incorrect number of arguments, add a BMP file as cmd line argument.n")
        sys.exit()
    
    # loading the grey values from the image
    custom_IM = Image.open(sys.argv[1])
    custom_pixels = list(custom_IM.getdata())
    corr_pixels = []
    
    # convert pixel data to fit training data format (swap grey values)
    for row in custom_pixels:
        new_row = 255 - row[0]
        corr_pixels.append(new_row)
    
    if len(corr_pixels) != 784:
        print("Incorrect Image Dimensions (needs to be 784)n")
        sys.exit()
    
    # convert to numpy array
    test_set = np.array(corr_pixels)
    
    classifier = joblib.load("../classifier/kaggle_digit_recognizer.pkl")
    
    # Predict Test Set
    predicted = classifier.predict(test_set)
    
    # prints the predicted number
    print(predicted)
    
    

    I have only created one image for each digit and here are my results:

    我只为每个数字创建一个图像,这是我的结果:

    label, prediction
    0, 3
    1, 1
    2, 7
    3, 3
    4, 1
    5, 8
    6, 4
    7, 2
    8, 8
    9, 8
    Accuracy: 40%
    
    

    So these aren’t very good results at all for my self made images. Since my model performed way better on the actual test set, I guess that the circumstances under which the digits are made play a great matter. It could be, that the brushes I used in Paint don’t resemble the same type of writing for the original data set.

    因此,对于我自己制作的图像而言,这些效果根本不是很好。 由于我的模型在实际测试集上的表现要好得多,因此我猜想,制作数字的环境起着至关重要的作用。 我在Paint中使用的画笔可能与原始数据集的书写方式不同。

    Overall, support vector machines are a powerful method of prediction and is a widely used machine learning algorithm. But you can also see how bad these simple models perform on differently created images.

    总体而言,支持向量机是一种强大的预测方法,并且是一种广泛使用的机器学习算法。 但是,您还可以看到这些简单模型在不同创建的图像上的表现有多么糟糕。

    As always, please comment on corrections and suggestions on how to easily improve the code and in this case also the prediction model.

    与往常一样,请评论有关如何轻松改进代码的更正和建议,在这种情况下还请提供预测模型。

    翻译自: https://www.pybloggers.com/2016/02/using-support-vector-machines-for-digit-recognition/

    支持向量机手写数字识别

    展开全文
  • 手写数字识别】基于支持向量机SVM实现手写数字识别matlab源码含GUI.md
  • 是我的毕业设计 基于python SVM实现对手数字的识别 代码完整 注解详细,适合新手学习参考。有可视化的手写框 下载后如果需要帮助,可以联系我。
  • SVM的手写体识别matlab程序,附带数据源,安装limSVM后可直接运行
  • svm支持向量机对手写字符进行分类
  • 李永乐线性代数手写笔记-向量

    千次阅读 2020-07-22 22:21:46
    概览请移步李永乐线性代数2020年基础课手写笔记汇总 文章目录 一 基本概念和运算 二 线性表示 三 相关和无关 四 向量组和矩阵的秩 一 基本概念和运算 二 线性表示 三 相关和无关 四 向量组和矩阵的秩

    李永乐线性代数基础知识,整理放在博客上面,方便自己复习查看。

    概览请移步李永乐线性代数2020年基础课手写笔记汇总

    一 基本概念和运算

    在这里插入图片描述

    在这里插入图片描述

    二 线性表示

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三 相关和无关

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四 向量组和矩阵的秩

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • from sklearn.datasets import load_digits #导入手写字数据集 from sklearn.model_selection import train_test_split #训练/测试数据切分模块 from sklearn.preprocessing import StandardScaler #数据归一化模块 ...
  • 主要为大家详细介绍了python实现基于SVM手写数字识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • SVM手写数字识别,使用scikit-learn库的数据库
  • 主要为大家详细介绍了机器学习python实战之手写数字识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 一、基于支持向量机SVM实现手写数字识别 ​ 模型参考这里。​ ​ ​ 二、源代码 function varargout = DigitClassifyUI(varargin) ​ % ​ ​ % DIGITCLASSIFYUI MATLAB code for DigitClassifyUI.fig ​ % ...
  • 基于MATLAB的SVM支持向量手写识别算法.rar
  • SVM 实现MNIST手写数字图像识别的数据集 来源于网络,大家可以自行下载
  • 基于MATLAB的SVM支持向量手写识别算法.pdf
  • 支持向量机-手写数字识别

    万次阅读 2017-08-17 14:08:41
    支持向量机分类器: 决定分类直线位置的样本并不是所有的训练数据,而是其中对两个空间间隔最小的两个不同类别的数据点,把这种可以用来真正帮助...使用支持向量机分类器处理sklearn内部集成的手写字体数字图片数据集。
  • 本文代码以支持向量手写数字识别的问题为例来绘制该模型的学习曲线,相关阅读有: 使用Python预处理机器学习需要的手写体数字图像文件数据集 Python+sklearn使用支持向量机算法实现数字图片分类 Python+sklearn...
  • 由于学习向量量化是依据ground truth的得到的一组原型向量,是有监督的学习,因此计算其精度没有意义,在函数里就没有计算精度和NMI,只打印出了原型向量 函数运行时会有warning,不用在意,手写的函数没有优化,...
  • python实实现现基基于于SVM手手写写数数字字识识别别功功能能 这篇文章主要为大家详细介绍了python实现基于SVM手写数字识别功能文中示例代码介绍的非常详细具有一 定的参考 值感兴趣的小伙伴们可以参考一下 本文实例...
  • 支持向量机的相关经典案例,里面包含线性核函数和非线性核函数,另外还有实例:支持向量手写数字识别;内含测试集训练集、代码源文件及注释,可直接运行(需安装numpy和matplotlib)
  • 直接附上代码,代码中有注释 ...from sklearn.datasets import load_digits # 加载手写数字识别数据 import pylab as pl from sklearn.model_selection import train_test_split # 训练测试数据分割 from sklea...
  • 改程序简单易懂,非常适合刚接触机器学习的人。通过手写数字的录入,让机器可自行识别输入的数学并通过文本显示。 结构清晰易懂,上手快。
  • 手写数字图片,一共5000张,像素28*28,数字0-9,每个各500张; 可用于神经网络的图像分类的样本等,
  • 由于学习向量量化是依据ground truth的得到的一组原型向量,是有监督的学习,因此计算其精度没有意义,在函数里就没有计算精度和NMI,只打印出了原型向量 函数运行时会有warning,不用在意,手写的函数没有优化,...
  • SVM实现手写数字识别

    2018-03-30 15:08:43
    基于opencv-SVM算法实现手写数字识别,使用Qt做UI实现手写板,可以实时测试,资源包含源代码和可执行程序(release文件夹下的exe文件可以直接运行测试)
  • 使用Python基于TensorFlow 卷积神经网络设计手写数字识别算法,并编程实现GUI 界面,构建手写数字识别系统。本系统界面设计友好,功能完善。通过测试,本识别系统对于较规范的手写体数字的识别达到了很好的识别效果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,140
精华内容 10,456
关键字:

向量手写怎么写