精华内容
下载资源
问答
  • 使用libsvm 实现MNIST数据库手写数字识别,正确率98.14. 包含matlab程序,libsvm库,以及60000张训练数据10000张测试数据
  • 本资源集成了MINIST+SVM+MATLAB,可用来进行手写识别的训练和识别,并判断准确率,同时文档给出了使用说明和附带训练数据,happy hacking!
  • MATLAB手写数字识别

    千次阅读 多人点赞 2020-01-02 16:58:38
    MATLAB手写字体识别 使用svm进行手写字体识别 测试图片 处理图片,拿到数字区域并分割保存 clc,clear,close all; f=imread('num.jpg'); bw=~im2bw(f); se=strel('line',200,0); bw_dilate=imdilate(bw,...

    MATLAB基于svm的手写数字识别

    使用svm进行手写字体识别

    测试图片

    在这里插入图片描述

    处理图片,拿到数字区域并分割保存

    clc,clear,close all;
    f=imread('num.jpg');
    bw=~im2bw(f);
    
    se=strel('line',200,0);
    bw_dilate=imdilate(bw,se);
    
    
    bw_dilate_erode=imerode(bw_dilate,strel('line',1000,0));
    
    bw_re=imreconstruct(bw_dilate_erode,bw_dilate);
    
    result=imreconstruct(bw_re,bw);[r,c]=find(result);
    nextresult=result(min(r) :max(r),min(c):max(c));
    
    [h,w]=size(nextresult);
    hs=sum(nextresult);
    
    a=1;b=1;i=1;
    splitfs={};points=[];
    figure
    while(a<w)
        while(hs(a)==0&&a<w)
            a=a+1;
        end
        b=a;
        while(hs(b)>0&&b<w)
            b=b+1;
        end
        
        if(b-a>2)
            hresult=nextresult(:,a:b);
            [r,c]=find(hresult);
            result2=hresult(min(r):max(r),:);
            m=min(r);n=max(r);
            xi=hresult(m:n,:);
            splitfs{i}=xi;
            points=[points;m,n,a,b];
            subplot(3,6,i),imshow(result2);
            i=i+1;
        end
        a=b;
    end
    

    在这里插入图片描述

    格式化图片

    function x=picPretreatment(im)
    bw=im2bw(im);
    [r,c]=find(bw);
    x=bw(min(r):max(r),min(c):max(c));
    x=imresize(x,[16,16]);
    

    训练数据集,得到 mynet.mat

    clear,clc,close all;
    k=1;
    for m=0:9
        for n=1:15
            f=imread(strcat('nums\',int2str(m),'\',int2str(n),'.bmp'));
            f=picPretreatment(f);
            xx=double(f(:));
            P(k,:)=xx';
            T(k,1)=m;
            k=k+1;
        end
    end
    net=fitcecoc(P,T);
    save mynet net;
    
    

    结果

    注意将图片转化为double

    xs=[splitfs,points];
    fonts='0123456789';
    endresult='手写数字为:';
    load mynet;
    for m_18=1:size(xs,2)-1
        g=xs{m_18};
        g=double(picPretreatment(g));
        lastresult=predict(net,g(:)');
        endresult=strcat(endresult,string(lastresult));
    end
    endresult
    

    在这里插入图片描述

    项目源码

    链接:https://pan.baidu.com/s/1PcWrdyP41BGWuEu4TyWIvQ
    提取码:lnke

    展开全文
  • 使用matlab数字手写进行识别,有界面gui。 手写识别是常见的图像识别任务。计算机通过手写体图片来识别出图片中的字,与印刷字体...数字手写体识别由于其有限的类别(0~9共10个数字)成为了相对简单 的手写识别任务。
  • 手写数字识别】基于贝叶斯分类器实现手写数字识别matlab源码含GUI.md
  • 123 matlab手写数字识别,基于svm的MATLAB数字识别
  • 手写数字识别matlab实现,源代码附上。用到机器学习的方法
  • MATLAB语言,用svm实现手写数字识别,内有数字样例
  • 前言前两天利用kNN实现了手写数字识别...这两天把Mnist-image的手写数字数据down了下来,利用SVM进行识别一下。Mnist-image的手写数字数据有7万的图像数据(6万训练数据+1万测试数据),每个图像数据为 20px * 20px。

    前言

    前两天利用kNN实现了手写数字的识别,数据不是很多,训练数据1934个,测试数据946个。

    这两天把Mnist-image的手写数字数据down了下来,利用SVM进行识别一下。

    Mnist-image的手写数字数据有7万的图像数据(6万训练数据+1万测试数据),每个图像数据为 20px * 20px。

    数据长啥样?

    手写字体0的数据

    上面是手写数字‘0’的图像数据的一部分。

    0_1.png

    这是0_1.png放大的效果,20px * 20px。

    怎么搞?

    有了数据,我们怎么搞呢?

    1.把图像数据转换成向量

    用numpy向量来表示图像数据。
    首先将图像数据灰度化处理,然后将其存入在numpy数组中,此时每一个元素的取值范围为0~255。接着,我们对其进行灰度变换,将其映射到0~1的范围内,并对每个元素四舍五入,让取值为0或者1,最终化为二值矩阵。最后把20 * 20的二值矩阵转换为1 * 400的向量。

    # 将 20px * 20px 的图像数据转换成 1*400 的 numpy 向量
    # 参数:imgFile--图像名  如:0_1.png
    # 返回:1*400 的 numpy 向量
    def img2vector(imgFile):
        img = Image.open(imgFile).convert('L')
        img_arr = np.array(img, 'i') # 20px * 20px 灰度图像
        img_normlization = np.round(img_arr/255) # 对灰度值进行归一化
        img_arr2 = np.reshape(img_normlization, (1,-1)) # 1 * 400 矩阵
        return img_arr2

    2. 读取每个数字的所有实例,转换为矩阵

    接着我们需要把每个数字的所有实例都转换成1 * 400的向量,并将它们转换成N * 400(N为实例数量)的矩阵。

    # 读取一个类别的所有数据并转换成矩阵 
    # 参数:
    #    basePath: 图像数据所在的基本路径
    #       Mnist-image/train/
    #       Mnist-image/test/
    #    cla:类别名称
    #       0,1,2,...,9
    # 返回:某一类别的所有数据----[样本数量*(图像宽x图像高)] 矩阵和标签向量
    def read_and_convert(imgFileList):
        dataLabel = [] # 存放类标签
        dataNum = len(imgFileList)
        dataMat = np.zeros((dataNum, 400)) # dataNum * 400 的矩阵
        for i in range(dataNum):
            imgNameStr = imgFileList[i]
            imgName = get_img_name_str(imgNameStr)  # 得到 数字_实例编号.png
            #print("imgName: {}".format(imgName))
            classTag = imgName.split(".")[0].split("_")[0] # 得到 类标签(数字)
            #print("classTag: {}".format(classTag))
            dataLabel.append(classTag)
            dataMat[i,:] = img2vector(imgNameStr)
        return dataMat, dataLabel
    

    3. 整合训练数据

    读取所有数字的所有实例,整合成一个60000 * 400的超大矩阵(呵呵,其实没多大)。

    # 读取训练数据
    def read_all_data():
        cName = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
        train_data_path = "Mnist-image\\train\\0"
        flist = get_file_list(train_data_path)
        dataMat, dataLabel = read_and_convert(flist)
        for c in cName:
            train_data_path_ = "Mnist-image\\train\\" + c
            flist_ = get_file_list(train_data_path_)
            dataMat_, dataLabel_ = read_and_convert(flist_)
            dataMat = np.concatenate((dataMat, dataMat_), axis=0)
            dataLabel = np.concatenate((dataLabel, dataLabel_), axis=0)
        print(dataMat.shape)
        print(len(dataLabel))
        return dataMat, dataLabel

    此时我们的训练数据就准备好了。

    加载数据后,我们看看这个矩阵:

    训练数据矩阵

    上面的array是60000 * 400的训练数据,下面的array是1 * 60000的类标签数据。

    4. 构造SVM模型

    SVM既可以用来处理分类问题,也可以用来作回归任务。SVM不修改的话,只能用来进行处理二分类问题。

    手写数字字体识别,显然是个多类别分类问题。对于多分类问题,解决的基本思路是“拆分法”,即将多个二分类问题拆分为若干个十分类任务进行求解。具体来讲,先对问题进行拆分,然后为拆出的每个十分类任务训练一个分类器,在测试时,对这些二分类器的结果进行集成以获得最终的多分类结果。拆分的策略主要有以下几种:

    1. OvO(one-vs-one)
      这种解决方法的思路是:对于有N个类别的分类任任务,将这N个类别两两配对,从而产生N(N-1)/2个二分类任务。在测试阶段,新样本同时提交给所有分类器,这样可以得到N(N-1)/2个分类结果,最终的结果可以通过投票产生:即把预测的最多的类别作为最终的分类结果。
    2. OvR(one-vs-rest)
      这种解决方法的思路是:每次将一个类的样例作为正例,所有其他类的样例作为负例来训练N个分类器。在测试时,若仅有一个分类器预测为正类,则对应的类别标记为最终分类结果。

    两种策略对比:

    明显看出,OvR只需要训练N个分类器,而OvO需要训练N(N-1)/2个分类器,因此OvO的存储开销和测试时间开销通常比OvR更大。但在训练时,OvR的每个分类器均使用全部训练样例,而OvO的每个分类器仅用到两个类的样例。因此,在类别很多的时候,OvO的训练时间开销通常比OvR更小。至于性能,取决于具体的数据分布,多数情况下两者差不多。

    # create model
    def create_svm(dataMat, dataLabel, decision='ovr'):
        clf = svm.SVC(decision_function_shape=decision)
        clf.fit(dataMat, dataLabel)
        return clf

    SVC参数:

    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)

    5. 分类测试

    读取测试数据,整合成矩阵

    # 对10个数字进行分类测试
    def main():
        tbasePath = "Mnist-image\\test\\"
        tcName = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        tst = time.clock()
        allErrCount = 0
        allErrorRate = 0.0
        allScore = 0.0
        for tcn  in tcName:
            testPath = "Mnist-image\\test\\" + tcn
            #print("class " + tcn + " path is: {}.".format(testPath))
            tflist = get_file_list(testPath)
            #tflist
            tdataMat, tdataLabel = read_and_convert(tflist)
            print("test dataMat shape: {0}, test dataLabel len: {1} ".format(tdataMat.shape, len(tdataLabel)))
    
            #print("test dataLabel: {}".format(len(tdataLabel)))
            pre_st = time.clock()
            preResult = clf.predict(tdataMat)
            pre_et = time.clock()
            print("Recognition  " + tcn + " spent {:.4f}s.".format((pre_et-pre_st)))
            #print("predict result: {}".format(len(preResult)))
            errCount = len([x for x in preResult if x!=tcn])
            print("errorCount: {}.".format(errCount))
            allErrCount += errCount
            score_st = time.clock()
            score = clf.score(tdataMat, tdataLabel)
            score_et = time.clock()
            print("computing score spent {:.6f}s.".format(score_et-score_st))
            allScore += score
            print("score: {:.6f}.".format(score))
            print("error rate is {:.6f}.".format((1-score)))
            print("---------------------------------------------------------")
    
    
        tet = time.clock()
        print("Testing All class total spent {:.6f}s.".format(tet-tst))
        print("All error Count is: {}.".format(allErrCount))
        avgAccuracy = allScore/10.0
        print("Average accuracy is: {:.6f}.".format(avgAccuracy))
        print("Average error rate is: {:.6f}.".format(1-avgScore))
    

    分类结果:

    test dataMat shape: (980, 400), test dataLabel len: 980 
    Recognition  0 spent 9.5305s.
    errorCount: 11.
    computing score spent 9.693493s.
    score: 0.988776.
    error rate is 0.011224.
    ---------------------------------------------------------
    test dataMat shape: (1135, 400), test dataLabel len: 1135 
    Recognition  1 spent 10.7278s.
    errorCount: 11.
    computing score spent 10.832672s.
    score: 0.990308.
    error rate is 0.009692.
    ---------------------------------------------------------
    test dataMat shape: (1032, 400), test dataLabel len: 1032 
    Recognition  2 spent 9.7781s.
    errorCount: 57.
    computing score spent 9.973572s.
    score: 0.944767.
    error rate is 0.055233.
    ---------------------------------------------------------
    test dataMat shape: (1010, 400), test dataLabel len: 1010 
    Recognition  3 spent 9.6072s.
    errorCount: 55.
    computing score spent 10.072705s.
    score: 0.945545.
    error rate is 0.054455.
    ---------------------------------------------------------
    test dataMat shape: (982, 400), test dataLabel len: 982 
    Recognition  4 spent 9.4975s.
    errorCount: 44.
    computing score spent 9.271692s.
    score: 0.955193.
    error rate is 0.044807.
    ---------------------------------------------------------
    test dataMat shape: (892, 400), test dataLabel len: 892 
    Recognition  5 spent 8.4760s.
    errorCount: 70.
    computing score spent 8.578377s.
    score: 0.921525.
    error rate is 0.078475.
    ---------------------------------------------------------
    test dataMat shape: (958, 400), test dataLabel len: 958 
    Recognition  6 spent 9.0267s.
    errorCount: 27.
    computing score spent 9.043633s.
    score: 0.971816.
    error rate is 0.028184.
    ---------------------------------------------------------
    test dataMat shape: (1028, 400), test dataLabel len: 1028 
    Recognition  7 spent 9.8431s.
    errorCount: 66.
    computing score spent 9.765103s.
    score: 0.935798.
    error rate is 0.064202.
    ---------------------------------------------------------
    test dataMat shape: (974, 400), test dataLabel len: 974 
    Recognition  8 spent 9.3546s.
    errorCount: 75.
    computing score spent 9.849029s.
    score: 0.922998.
    error rate is 0.077002.
    ---------------------------------------------------------
    test dataMat shape: (1009, 400), test dataLabel len: 1009 
    Recognition  9 spent 9.6555s.
    errorCount: 79.
    computing score spent 9.595665s.
    score: 0.921705.
    error rate is 0.078295.
    ---------------------------------------------------------
    Testing All class total spent 196.587770s.
    All error Count is: 495.
    Average accuracy is: 0.949843.
    Average error rate is: 0.050157.

    6. 结果分析

    从以上结果可以看出,SVM对于手写数字字体识别的准确率还是相对较高的,94.9%。在本例中,对灰度值归一化的时候,截取了小数点后一位,对并其四舍五入,归一化为0或1,得到0-1的二值矩阵。如果采取不同的处理方式,得到不同的二值矩阵,即不同的特征矩阵,则分类结果会不相同。

    后续

    本篇文章简要介绍了利用机器学习中的SVM模型对手写数字字体识别,手写数字字体数据集是Mnist-image。下篇我们将利用深度学习框架TensorFlow来构建神经网络对该数据集进行识别。

    参考

    1. 《机器学习》,周志华
    2. 《Python计算机视觉编程》,Jan Erik Solem
    3. Mnist-image 数据,点击这里
    4. TensorFlow, 点击这里

    Standing on Shoulders of Giants.

    展开全文
  • 基于SVM手写数字识别,研究与应用 详细描述了如何识别手写数字
  • MATLABSVM方法识别MNIST数据

    千次阅读 2020-04-28 14:40:01
    1.实验主题: 实现 svm 分类器在手写数字识别中的应用 2.数据集: Mnist image数据库中的训练集训练模型,测试集评估模型。 3.实现工具 MATLAB 4.代码实现内容 (1)使用不同 kernel实现 (至少两种 如果是自己设计的 ...

    目录

    1、下载并配置开源库libsvm

    2、尝试使用libsvm

    3、下载MNIST数据集

    4、MATLAB读取MNIST数据

    图像读取程序

    标签读取程序

    5、SVM主程序

    6、简介使用参数

    模型训练:

    模型预测:


    近期,在学习机器学习课程,老师布置了一个小作业,如文章题目所示。要求:

    1.实验主题: 实现 svm 分类器在手写数字识别中的应用
    2.数据集: Mnist image数据库中的训练集训练模型,测试集评估模型。
    3.实现工具 MATLAB
    4.代码实现内容
    (1)使用不同 kernel实现 (至少两种 如果是自己设计的 kernel, 请注明,有额外加分 )。
    (2)显示 test图像(每个类别随机选择3张)。
    (3)计算识别准确率。

    1、下载并配置开源库libsvm

    下载地址:开源库libsvm,在download模块中下载zip文件,解压至matlab/toolbox/(其他位置也可,但在使用时一定要将matlab路径调至该软件包处)。由于使用的工具为matlab软件,因此将matlab路径调至toolbox\libsvm-3.24\matlab处,在该路径下使用工具包中的已有程序。

    在对该软件包进行设置时可参考如下两个博客:

    1.MATLAB libsvm 安装和使用

    2.MATLAB安装配置libsvm(附MinGW64配置)

     

    TDM-GCC的下载链接:https://jmeubank.github.io/tdm-gcc/download/

    2、尝试使用libsvm

    按照参考的第一个博客的内容尝试运用软件包,大致知道几个重要函数的运行机制,后面需要继续深入探究使用方法及参数设定。

    3、下载MNIST数据集

    下载链接:http://yann.lecun.com/exdb/mnist/

    前两个数据集为训练集的图像数据和标签,后两个为测试集的图像数据和标签。

    训练集中共有6万条数据,测试集中有1万条数据。每幅图像大小为28*28的。文件都是以二进制方式进行存储的,因此在读取文件数据时可以采用matlab中的fopen函数和fread函数,以相应的数据类型读取相应的数据值。读取数据后再进行相应的转换和整理即可。

    4、MATLAB读取MNIST数据

    可参考链接:

    【机器学习】MATLAB读取mnist数据库

    Matlab读取MNIST数据

    matlab 使用libsvm工具箱进行手写数字识别

    最终MNIST数据读取程序如下面所示:

    图像读取程序

    function images = LoadMNISTImages(filename)
    % 读取数据中的图像数据
    %   filename为图像数据集名称,images为返回的图像集,
    %   为 (28*28)*图像数目 的一个二维矩阵
    
    fp = fopen(filename,'rb');% 以二进制方式读取文件
    assert(fp~=-1,['Could not open',filename,'']);% 打开文件出错时,fp值为-1
    % assert函数,判定是否符合条件,不符合条件,报出错误信息
    
    magic = fread(fp,1,'int32',0,'ieee-be');% 从二进制文件中读取数据
    % 以int32(32位 整数型)的精度,从fp中读取以无符号字符型一个元素到magic中,
    % 待读取字节的排列方式为b,即'ieee-be',即低位字节排放在内存的高地址端,高位字节排放在内存的低地址端
    assert(magic==2051,['Bad magic number in',filename,'']);
    % 在MNIST图像数据集中,magic值为2051,不为2051的话报错
    
    numimages = fread(fp,1,'int32',0,'ieee-be');% 同magic的读取方式,获得图像数目
    numrows = fread(fp,1,'int32',0,'ieee-be');% 读取图像的行数
    numcols = fread(fp,1,'int32',0,'ieee-be');% 读取图像的列数
    
    images = fread(fp,inf,'unsigned char');
    % 以"unsigned char"的精度读取剩余的所有像素数据,并存入列向量images中
    images = reshape(images,numcols,numrows, numimages);
    % 像素值存储时是行优先存储的,而在matlab中,是列优先存储的,故将其重新整合成三维数组时,按照col,row,number的顺序
    images = permute(images,[2 1 3]);
    % 将之前的三维数组的维度重新整理,得到28*28*图像数目的所有图像数据构成的三维矩阵
    
    fclose(fp);% 关闭文件
    
    images = reshape(images,size(images,1)*size(images,2),size(images,3));
    % 转变成二维向量,每一列代表一个图像,以列优先的方式展开成向量,一个pixel*example数量的矩阵
    images = double(images/255);
    % convert to double and rescale to [0,1] 归一化
    
    end
    
    

    标签读取程序

    function labels = LoadMNISTLabels(filename)
    % 读取数据中的标记数据
    %   filename为标记label数据集名称,labels为返回的图像的标记值
    %   为 图像数目*1 的一个矩阵
    
    fp = fopen(filename,'rb');% 以二进制方式读取文件
    assert(fp~=-1,['Could not open',filename,'']);% 打开文件出错时,fp值为-1
    % assert函数,判定是否符合条件,不符合条件,报出错误信息
    
    magic = fread(fp,1,'int32',0,'ieee-be');% 从二进制文件中读取数据
    % 以int32(32位 整数型)的精度,从fp中读取一个元素到magic中,
    % 待读取字节的排列方式为b,即'ieee-be',即低位字节排放在内存的高地址端,高位字节排放在内存的低地址端
    assert(magic==2049,['Bad magic number in',filename,'']);
    % 在MNIST标签数据集中,magic值为2049,不为2049的话报错
    
    numlabels = fread(fp,1,'int32',0,'ieee-be');% 同magic的读取方式,获得标签数目
    
    labels = fread(fp,inf,'unsigned char');
    % 以"unsigned char"的精度读取剩余的所有标签数据,并存入列向量labels中
    
    assert(size(labels,1)==numlabels,'Mismatch in label count');
    % 判断读取出的标签个数是否与文件中保存的标签数目相同,不同则报错
    
    fclose(fp);% 关闭文件
    
    end
    
    

    5、SVM主程序

    % 加载数据集
    x_train=LoadMNISTImages('train-images.idx3-ubyte');
    x_test=LoadMNISTImages('t10k-images.idx3-ubyte');
    y_train=LoadMNISTLabels('train-labels.idx1-ubyte');
    y_test=LoadMNISTLabels('t10k-labels.idx1-ubyte');
    
    % transpose 转置后,每一行为一幅图像 变为一个number*pixel的矩阵
    x_train=x_train';
    x_train = sparse(x_train);% 转化为稀疏矩阵后,速度提升很多5.41/7.79大概速度
    x_test=x_test';
    x_test = sparse(x_test);
    
    % 参数寻优,这一步似乎电脑跑不出,暂时先作罢,以后继续研究
    % tic
    % [bestacc,bestc,bestg] = SVMcg(y_train(1:1000),x_train(1:1000,:));
    % toc
    
    % linear SVM
    tic;% 计时
    options='-t 2 -c 4 -g 0.015625 -q'; % 设置训练参数
    model=svmtrain(y_train(1:60000), x_train(1:60000,:), options); % 训练数据得到模型
    [y_predict,accuracy,prob_estimates]=svmpredict(y_test, x_test, model); % 利用模型进行预测
    fprintf('Time: %0.2f minutes. \n', toc/60); % 显示训练过程用时,单位分钟
    toc % 结束计时,自动显示所用时间,单位秒
    ThreePerClsShow(x_test, y_test, y_predict); 
    % 在测试集中挑选每个类别的三张图像进行显示,左下角为标签值,右下角为训练后的预测值
    
    function ThreePerClsShow(x_test, y_test, y_predict)
    % 在测试集中挑选每个类别的三张图像进行显示,左下角为标签值,右下角为训练后的预测值
    for i=0:9 
        index = find(y_test==i,3); % 寻找第i类别的三个实例,返回其所在位置
        figure(i+2);
        for j=1:3
            TImage = full(reshape(x_test(index(j),:),[28,28]));% 将稀疏矩阵转化为非稀疏矩阵
            subplot(1,3,j);
            imshow(TImage);
            text(2,26,num2str(y_test(index(j))),'Color','w');
            text(26,26,num2str(y_predict(index(j))),'Color','w');
        end
        suptitle(['手写数字',num2str(i),'的预测(左下方数据为标签值,右下方为预测值)']);
        set(gcf,'position',[200,300,600,300]);
    end
    end
    
    

    6、简介使用参数

    模型训练

    model=svmtrain(label, data,’libsvm_options’);

    options:

    -s SVM类型 : set type of SVM (default 0)

           0 -- C-SVC          (multi-class classification)

           1 -- nu-SVC        (multi-class classification)

           2 -- one-class SVM

           3 -- epsilon-SVR (regression)

           4 -- nu-SVR        (regression)

    -t 核函数类型 : set type of kernel function (default 2)

           0 -- linear: u'*v(线性核函数)

           1 -- polynomial: (gamma*u'*v + coef0)^degree(多项式核函数)

           2 -- radial basis function: exp(-gamma*|u-v|^2)(RBF核函数)

           3 -- sigmoid: tanh(gamma*u'*v + coef0)(sigmoid核函数)

           4 -- precomputed kernel (kernel values in training_set_file)(自定义核函数)

    u、v为数据集中的两个样本,核函数对应参数的阐述:

    1. 线性核函数,没有专门需要设置的参数
    2. 多项式核函数,有三个参数。 

    -d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3 。-g用来设置核函数中的gamma参数设置,也就是公式中的gamma,默认值是1/k(k是类别数)。

    -r用来设置核函数中的coef0,默认值是0。

    1. RBF核函数,有一个参数。

    -g用来设置核函数中的gamma参数设置,默认值是1/k(k是类别数)。

    1. sigmoid核函数,有两个参数。

    -g用来设置核函数中的gamma参数设置,默认值是1/k(k是类别数)。

    -r用来设置核函数中的coef0,默认值是0。

    -d degree : set degree in kernel function (default 3) 核函数中的degree设置,默认值为3

    -g gamma : set gamma in kernel function (default 1/num_features) 核函数中的函数设置(默认1/ k)

    -r coef0 : set coef0 in kernel function (default 0) 设置核函数中的coef0,默认值为0

    -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)(惩罚系数)设置C-SVC、e-SVR、n-SVR中从惩罚系数C,默认值为1

    -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5) 设置nu-SVC、one-class-SVM与nu-SVR中参数nu,默认值0.5

    -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1) 核宽,设置e-SVR的损失函数中的e,默认值为0.1

    -m cachesize : set cache memory size in MB (default 100) 设置cache内存大小,以MB为单位(默认100)

    -e epsilon : set tolerance of termination criterion (default 0.001)设置终止准则中的可容忍偏差,默认值为0.001

    -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)是否使用启发式,可选值为0或1,默认值为1

    -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)是否计算SVC或SVR的概率估计,可选值0或1,默认0

    -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)对各类样本的惩罚系数C加权,默认值为1

    -v n: n-fold cross validation mode   n折交叉验证模式

    -q : quiet mode (no outputs)   输出值安静模式

    option -v randomly splits the data into n parts and calculates cross validation accuracy/mean squared error on them.

     

    训练出的model中有几个比较重要的参数。model.nr_class表示有多少类别,这里是十分类;model.Label表示标签,这里是0、1;model.totalSV代表总共的支持向量的数目;model.nSV表示每类样本的支持向量的数目,与model.Label相对应。

     

    模型预测

    [predicted_label, accracy] = svmpredict(label_test, data_test, model, ’libsvm_options’);

    options:

    -b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); for one-class SVM only 0 is supported

    展开全文
  • 手写数字识别】基于支持向量机SVM实现手写数字识别matlab源码含GUI.md
  • 手写数字识别】基于支持向量机SVM实现手写数字识别matlab源码含GUI.zip
  • 本文代码用于对手写体进行识别,里面有数据也有代码,能够对图片进行预处理、特征提取、智能识别
  • 手写数字识别,通过模板匹配,还有欧氏距离来实现,识别正确率挺高的
  • 手写数字识别 matlab

    热门讨论 2010-07-19 22:40:45
    手写数字识别 matlab,运用神经网络中的技术,很好地实现了手写数字识别
  • 一套能够正确识别手写体的软件系统,使用matlab为开发平台。
  • 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。 1 数学部分 1.1 二维空间...

    一、 SVM简介

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
    1 数学部分
    1.1 二维空间
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2 算法部分
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、源代码

    function varargout = DigitClassifyUI(varargin)
    %  
    
    % DIGITCLASSIFYUI MATLAB code for DigitClassifyUI.fig
    %      DIGITCLASSIFYUI, by itself, creates a new DIGITCLASSIFYUI or raises the existing
    %      singleton*.
    %
    %      H = DIGITCLASSIFYUI returns the handle to a new DIGITCLASSIFYUI or the handle to
    %      the existing singleton*.
    %
    %      DIGITCLASSIFYUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in DIGITCLASSIFYUI.M with the given input arguments.
    %
    %      DIGITCLASSIFYUI('Property','Value',...) creates a new DIGITCLASSIFYUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before DigitClassifyUI_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to DigitClassifyUI_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help DigitClassifyUI
    
    % Last Modified by GUIDE v2.5 10-Feb-2021 18:44:08
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
        'gui_Singleton',  gui_Singleton, ...
        'gui_OpeningFcn', @DigitClassifyUI_OpeningFcn, ...
        'gui_OutputFcn',  @DigitClassifyUI_OutputFcn, ...
        'gui_LayoutFcn',  [] , ...
        'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before DigitClassifyUI is made visible.
    function DigitClassifyUI_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to DigitClassifyUI (see VARARGIN)
    
    % Choose default command line output for DigitClassifyUI
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes DigitClassifyUI wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    global FigHandle AxesHandle RectHandle;
    FigHandle = handles.output;
    AxesHandle = handles.axes_write;
    MouseDraw();
    axis(handles.axes_write,[1 400 1 400]);    % 设定图轴范围
    RectHandle = rectangle(handles.axes_write,'Position',[80,66,240,268],'LineStyle','--','EdgeColor','#a9a9a9');
    
    % --- Outputs from this function are returned to the command line.
    function varargout = DigitClassifyUI_OutputFcn(hObject, eventdata, handles)
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes on button press in pushbutton_loadImage.
    function pushbutton_loadImage_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_loadImage (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global RectHandle;
    cla(handles.axes_write, 'reset')
    set(handles.axes_write, 'Visible','off');
    
    set(handles.output, 'Pointer', 'arrow');
    axis(handles.axes_write,[1 400 1 400]);    % 设定图轴范围
    RectHandle = rectangle(handles.axes_write,'Position',[80,66,240,268],'LineStyle','--','EdgeColor','#a9a9a9');
    
    % 弹出文件选择框,选择一张图片
    [file,path] = uigetfile({'*.jpg;*.jpeg;*.png;*.bmp;*.tif',...
        '图片文件 (*.jpg,*.jpeg,*.png,*.bmp,*.tif)'},'选择一张图片');
    if isequal(file,0) % 若文件不存在
        set(handles.edit_imagePath, 'String','请选择一张图片');
    else
        fileName= fullfile(path, file); % 选择的图片绝对路径
        set(handles.edit_imagePath, 'String', fileName); % 显示选择的图片路径
        InputImage = imread(fileName);
        image(handles.axes_raw, InputImage);
        set(handles.axes_raw, 'Visible','off');
        
        set(gcf, 'Pointer', 'arrow');
        set(gcf, 'WindowButtonMotionFcn', '')
        set(gcf, 'WindowButtonUpFcn', '')
        
        
        % 开始执行预处理
        if numel(size(InputImage))==3
            InputImage = rgb2gray(InputImage);   % 灰度化图片
            axes(handles.axes_gray);
            imshow(InputImage);
        else
            axes(handles.axes_gray);
            imshow(InputImage);
        end
        % 二值化
        InputImage = imbinarize(InputImage);
        axes(handles.axes_binary);
        imshow(InputImage);
        
        % 特征提取
        InputImage = imresize(InputImage, [28, 28]);
        cellSize = [4 4];
        [~, vis4x4] = extractHOGFeatures(InputImage,'CellSize',[4 4]);
        axes(handles.axes_features);
        plot(vis4x4);
        
        load('trainedSvmModel.mat','classifier');
        features(1, :) = extractHOGFeatures(InputImage,'CellSize',cellSize);
        predictedLabel = predict(classifier, features);
        str = string(predictedLabel);
        set(handles.text_result, 'String', str);
    end
    axes(handles.axes_write);
    MouseDraw();
    % set(gcf, 'WindowButtonDownFcn', '');
    
    
    
    % --- Executes on button press in pushbutton_load.
    function pushbutton_load_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_load (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global RectHandle;
    axis(handles.axes_write,[1 400 1 400]);    % 设定图轴范围
    set(handles.edit_imagePath, 'String','请选择一张图片');
    delete(RectHandle);
    h=getframe(handles.axes_write);
    imwrite(h.cdata,'writedImage.jpg');
    
    InputImage = imread('writedImage.jpg');
    % InputImage = cat(3, InputImage,InputImage,InputImage);
    image(handles.axes_raw,InputImage);
    set(handles.axes_raw, 'Visible','off');
    axis(handles.axes_write,[1 400 1 400]);    % 设定图轴范围
    RectHandle = rectangle(handles.axes_write,'Position',[80,66,240,268],'LineStyle','--','EdgeColor','#a9a9a9');
    global FigHandle
    set(FigHandle, 'Pointer', 'arrow');
    set(FigHandle, 'WindowButtonMotionFcn', '')
    set(FigHandle, 'WindowButtonUpFcn', '')
    set(FigHandle, 'WindowButtonDownFcn', '');
    
    % 开始执行预处理
    if numel(size(InputImage))==3
        InputImage = rgb2gray(InputImage);   % 灰度化图片
        axes(handles.axes_gray);
        imshow(InputImage);
    else
        axes(handles.axes_gray);
        imshow(InputImage);
    end
    % 二值化
    InputImage = imbinarize(InputImage);
    axes(handles.axes_binary);
    imshow(InputImage);
    
    % 特征提取
    InputImage = imresize(InputImage, [28, 28]);
    cellSize = [4 4];
    [~, vis4x4] = extractHOGFeatures(InputImage,'CellSize',[4 4]);
    axes(handles.axes_features);
    plot(vis4x4);
    
    load('trainedSvmModel.mat','classifier');
    features(1, :) = extractHOGFeatures(InputImage,'CellSize',cellSize);
    predictedLabel = predict(classifier, features);
    str = string(predictedLabel);
    set(handles.text_result, 'String', str);
    MouseDraw();
    
    % --- Executes on button press in pushbutton_clear.
    function pushbutton_clear_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_clear (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global RectHandle;
    global FigHandle
    set(FigHandle, 'Pointer', 'arrow');
    set(FigHandle, 'WindowButtonMotionFcn', '')
    set(FigHandle, 'WindowButtonUpFcn', '')
    set(FigHandle, 'WindowButtonDownFcn', '');
    set(handles.edit_imagePath, 'String','请选择一张图片');
    set(handles.text_result, 'String', 'None');
    cla(handles.axes_write, 'reset')
    set(handles.axes_write, 'Visible','off');
    cla(handles.axes_raw, 'reset')
    set(handles.axes_raw, 'Visible','off');
    cla(handles.axes_gray, 'reset')
    set(handles.axes_gray, 'Visible','off');
    cla(handles.axes_binary, 'reset')
    set(handles.axes_binary, 'Visible','off');
    cla(handles.axes_features, 'reset')
    set(handles.axes_features, 'Visible','off');
    set(handles.output, 'Pointer', 'arrow');
    
    axis(handles.axes_write,[1 400 1 400]);    % 设定图轴范围
    RectHandle = rectangle(handles.axes_write,'Position',[80,66,240,268],'LineStyle','--','EdgeColor','#a9a9a9');
    MouseDraw();
    

    三、运行结果

    在这里插入图片描述

    四、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
    [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
    [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
    [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

    展开全文
  • 文章在matlab软件的基础上,利用BP神经网络算法完成手写数字识别。 机器学习是一门多领域交叉学科,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织己有的知识结构,使之不断改善...
  • SVM手写识别matlab程序,附带数据源,安装limSVM后可直接运行
  • 源代码 syntheticDir = fullfile(toolboxdir('vision'), 'visiondata','digits','synthetic'); handwrittenDir = fullfile(toolboxdir('vision'), 'visiondata','digits','handwritten'); % |imageDatastore| ...
  • 一、基于支持向量机SVM实现手写数字识别 ​ 模型参考这里。​ ​ ​ 二、源代码 function varargout = DigitClassifyUI(varargin) ​ % ​ ​ % DIGITCLASSIFYUI MATLAB code for DigitClassifyUI.fig ​ % ...
  • Matlab深度学习-手写数字识别

    千次阅读 2020-12-30 16:59:59
    LeNet52-0 LeNet5的网络架构2-1 实现方式1-通过Matlab GUI 拖拽界面2-2 实现方式2-直接写框架代码三、代码3-0 机器学习与深度学习对比3-1 SVM分类手写数字3-2 ANN分类手写数字3-3 深度学习LetNet5总结 ...
  • 运用matlab读取手写数字识别数据集,对其分别进行传统机器学习建模和迁移学习建模。对比分析两者性能差异。 工作计划: 准备数据集,进行前期的数据清洗工作,使其转化成机器学习算法能够输入的数据结构。 用传统...
  • 摘要:本文详细介绍如何利用MATLAB实现手写数字识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST手写数字数据集,...
  • 使用分类器的手写数字识别的任务非常重要,其用途包括–在平板电脑上进行在线手写识别,识别邮件中的邮政编码以进行邮政分拣,处理银行支票金额,手工填写的表格(例如-税单)中的数字条目等。 尝试解决此问题时面临...
  • 手写数字识别、nn算法、svm算法matlab实现
  • Matlab实现手写数字识别(PCA+KNN)

    万次阅读 2016-06-18 17:14:33
    </pre><pre name="code" class="plain">clear; addpath('../data/'); % images_train = ...另外我将之前LBP+SVM的过程用PCA代替LBP,发现准确率由68%上升到87%,果然之前想的没错,特征提取很关键。
  • 基于LIBSVM工具箱和LIBSVM-FarutoUitimate工具箱matlab手写数字图片识别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 963
精华内容 385
关键字:

matlab手写数字识别svm

matlab 订阅