精华内容
下载资源
问答
  • 向量

    2012-01-01 14:19:57
    向量:就是一个数字列表,对程序员而言则是另一种相似的概念--数组。数学上,一个向量就是一个数组。 向量与标量:数学上区分向量和标量。标量是对我们平时所用数字的技术的称谓。使用该术语时,是强调数量值。 ...

    向量:就是一个数字列表,对程序员而言则是另一种相似的概念--数组。数学上,一个向量就是一个数组。

    向量与标量:数学上区分向量和标量。标量是对我们平时所用数字的技术的称谓。使用该术语时,是强调数量值。

    向量的维度:向量的维度就是向量包含的“数”的数目。向量可以有任意正数维,当然也包括一维。事实上,标量可以认为是一维向量。

    向量分为“:行向量和列向量

    位置与位移:位移、速度与距离、速率是完全不同的两种定义。位移和速度是向量,包含方向,而距离和速率是标量,不指明任何方向。

    数学中专门研究向量的分支称作线性代数

    符号约定:

      标量:用斜体的小写罗马或希腊字母表示:如a,b,x,y,z,

      向量:用小写黑粗体字母表示:如 a,b,u ,v,q,r,

      矩阵:用大写黑粗体表示,如A,B,M,R.

    零向量:任何集合,都存在加性单位元X,对集合中任意元素Y,满是Y+X=Y.

    零向量是唯一一个没有方向的向量

    3D的零向量是[0,0,0]

    负向量:对于任意集合,元素X的加性逆元为-X,其与X相加等于加性单元。简单的说就是X+(-X)=0,.

    向量大小(长度或模):向量大小也称长度或模

    标准化向量:对于许多向量,我们只关心它的方向而不关心其大小。如:“我面向的时什么方向?“,在这样的情况下,使用单位向量将非常方便。单位向量就是大小为1的向量,单位向量经常也被称作标准化向量或跟简单地成为”法线“

     向量点乘:向量和标量可以相乘,两个向量也可以相乘,有两种不同类型的向量乘法,第一种为点乘,也称作:内积

    另一种向量乘法称作叉乘或叉积。仅可应用 与3D,和点乘不一样,点乘得到一个标量并满足交换律,向量叉乘得到一个向量并且不满足交换律。

    a.b=b.a         点乘的交换律

    a*b=-(b*a)    叉乘交换律

    a*a=0            任意向量与自身的叉乘等于零向量

    a*b=(-a)*(-b)  叉乘的操作同时变负得到相同的结果

    a*(b+c)=a*b+a*c   叉乘对向量加法的分配率

    a*(a*b)=0  叉乘与另一向量的叉乘再点乘该向量本身等于零

    3D向量类:

    类接口:

       存取向量的各分量(X,Y,Z)

       向量间的赋值操作

       比较两向量是否相同

    对向量的操作

        将向量置为零向量

        向量求负

        求向量的模

        向量与标量的乘除法

        向量的标准化

        向量的加减法

         计算两点(点用向量表示)间距离

         向量点乘

         向量叉乘







    展开全文
  • 阅读文献时,经常看到各种范数,机器...1、向量的范数 向量的1-范数: ;各个元素的绝对值之和; 向量的2-范数:;每个元素的平方和再开平方根; 向量的无穷范数: p-范数:,其中正整数p≥1,并且有 例:...

       阅读文献时,经常看到各种范数,机器学习中的稀疏模型等,也有各种范数,其名称往往容易混淆,例如:L1范数也常称为“1-范数”,但又和真正的1-范数又有很大区别。下面将依次介绍各种范数。

    1、向量的范数

      向量的1-范数: {\left\| X \right\|_1} = \sum\limits_{i = 1}^n {\left| {{x_i}} \right|} ; 各个元素的绝对值之和;

      向量的2-范数:{\left\| X \right\|_2} = {\left( {\sum\limits_{i = 1}^n {{x_i}^2} } \right)^{\frac{1}{2}}} = \sqrt {\sum\limits_{i = 1}^n {{x_i}^2} };每个元素的平方和再开平方根;

      向量的无穷范数:{\left\| X \right\|_\infty } = \mathop {\max }\limits_{1 \le i \le n} \left| {{x_i}} \right|

      p-范数:{\left\| X \right\|_p} = {\left( {\sum\limits_{i = 1}^n {{{\left| {{x_i}} \right|}^p}} } \right)^{\frac{1}{p}}},其中正整数p≥1,并且有\mathop {\lim }\limits_{p \to \infty } {\left\| X \right\|_p} = \mathop {\max }\limits_{1 \le i \le n} \left| {{x_i}} \right|

     

    例:向量X=[2, 3, -5, -7] ,求向量的1-范数,2-范数和无穷范数。

    向量的1-范数:各个元素的绝对值之和;{\left\| X \right\|_1}=2+3+5+7=17;

    Matlab代码:X=[2, 3, -5, -7]; XLfs1=norm(X,1);

     

    向量的2-范数:每个元素的平方和再开平方根;{\left\| X \right\|_2} = {\left( {{\rm{2}} \times {\rm{2}} + {\rm{3}} \times {\rm{3}} + {\rm{5}} \times {\rm{5}} + {\rm{7}} \times {\rm{7}}} \right)^{\frac{1}{2}}} = 9.3274

    Matlab代码:X=[2, 3, -5, -7]; XLfs2=norm(X,2);

     

    向量的无穷范数:

    (1)正无穷范数:向量的所有元素的绝对值中最大的;即X的正无穷范数为:7;

    Matlab代码:X=[2, 3, -5, -7]; XLfsz=norm(X,inf);

     

    (2)负无穷范数:向量的所有元素的绝对值中最小的;即X的负无穷范数为:2;

              Matlab代码:X=[2, 3, -5, -7]; XLfsf=norm(X,-inf);

     

    2、矩阵的范数

    设:向量X \in {R^n},矩阵A \in {R^{n \times n}},例如矩阵A为:

    A=[2, 3, -5, -7;

       4, 6,  8, -4;

       6, -11, -3, 16];

    (1)矩阵的1-范数(列模):{\left\| A \right\|_1} = \mathop {\max }\limits_{X \ne 0} \frac{{{{\left\| {AX} \right\|}_1}}}{{{{\left\| X \right\|}_1}}} = \mathop {\max }\limits_{1 \le j \le n} \sum\limits_{i = 1}^n {\left| {{a_{ij}}} \right|};矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列和最大);即矩阵A的1-范数为:27

              Matlab代码:fs1=norm(A,1);

     

    (2)矩阵的2-范数(谱模):{\left\| A \right\|_2} = \mathop {\max }\limits_{X \ne 0} \frac{{{{\left\| {AX} \right\|}_2}}}{{{{\left\| X \right\|}_2}}} = \sqrt {{\lambda _{\max }}({A^T}A)} = \sqrt {\mathop {\max }\limits_{1 \le i \le n} \left| {{\lambda _i}} \right|},其中   {\lambda _i}{A^T}A的特征值;矩阵的最大特征值开平方根。

              Matlab代码:fs2=norm(A,2);

     

    (3)矩阵的无穷范数(行模):{\left\| A \right\|_\infty } = \mathop {\max }\limits_{X \ne 0} \frac{{{{\left\| {AX} \right\|}_\infty }}}{{{{\left\| X \right\|}_\infty }}} = \mathop {\max }\limits_{1 \le {\rm{i}} \le n} \sum\limits_{j = 1}^n {\left| {{a_{ij}}} \right|};矩阵的每一行上的元素绝对值先求和,再从中取个最大的,(行和最大)

             Matlab代码:fswq=norm(A,inf);

     

      下面要介绍关于机器学习中稀疏表示等一些地方用到的范数,一般有核范数,L0范数,L1范数(有时很多人也叫1范数,这就让初学者很容易混淆),L21范数(有时也叫2范数),F范数等,这些范数都是为了解决实际问题中的困难而提出的新的范数定义,不同于前面矩阵的范数。

    关于核范数,L0范数,L1范数等解释见博客:

    http://www.cnblogs.com/MengYan-LongYou/p/4050862.html

    https://blog.csdn.net/u013066730/article/details/51145889

    http://blog.sina.com.cn/s/blog_7103b28a0102w73g.html

     

    (4)矩阵的核范数:矩阵的奇异值(将矩阵svd分解)之和,这个范数可以用来低秩表示(因为最小化核范数,相当于最小化矩阵的秩——低秩);

             Matlab代码:JZhfs=sum(svd(A));

     

    (5)矩阵的L0范数:矩阵的非0元素的个数,通常用它来表示稀疏,L0范数越小0元素越多,也就越稀疏。

     

    (6)矩阵的L1范数:矩阵中的每个元素绝对值之和,它是L0范数的最优凸近似,因此它也可以近似表示稀疏;

             Matlab代码:JZL1fs=sum(sum(abs(A)));

     

    (7)矩阵的F范数:矩阵的各个元素平方之和再开平方根,它通常也叫做矩阵的L2范数,它的有点在它是一个凸函数,可以求导求解,易于计算;

             Matlab代码:JZFfs=norm(A,'fro');

     

    (8)矩阵的L21范数:矩阵先以每一列为单位,求每一列的F范数(也可认为是向量的2范数),然后再将得到的结果求L1范数(也可认为是向量的1范数),很容易看出它是介于L1和L2之间的一种范数

              Matlab代码:JZL21fs=norm(A(:,1),2) + norm(A(:,2),2) + norm(A(:,3),2)++ norm(A(:,4),2);

     

    Matlab代码

    clear all;clc;
    
    %% 求向量的范数
    X=[2, 3, -5, -7];   %初始化向量X
    XLfs1=norm(X,1);    %向量的1-范数
    XLfs2=norm(X,2);    %向量的2-范数
    XLfsz=norm(X,inf);  %向量的正无穷范数
    XLfsf=norm(X,-inf); %向量的负无穷范数
    
    %% 求矩阵的范数
    A=[2, 3, -5, -7;
       4, 6,  8, -4;
       6, -11, -3, 16];     %初始化矩阵A
    
    JZfs1=norm(A,1);        %矩阵的1-范数
    JZfs2=norm(A,2);        %矩阵的2-范数
    JZfswq=norm(A,inf);     %矩阵的无穷范数
    JZhfs=sum(svd(A));      %矩阵的核范数
    JZL1fs=sum(sum(abs(A)));% 矩阵的L1范数
    JZFfs=norm(A,'fro');    %矩阵的F范数
    JZL21fs=norm(A(:,1),2) + norm(A(:,2),2) + norm(A(:,3),2)++ norm(A(:,4),2);% 矩阵的L21范数

     

    参考资料

    [1] https://blog.csdn.net/Michael__Corleone/article/details/75213123

    [2] https://wenku.baidu.com/view/dc9e6e3753d380eb6294dd88d0d233d4b04e3f48.html

    [3] http://www.cnblogs.com/MengYan-LongYou/p/4050862.html

    [4] https://blog.csdn.net/u013066730/article/details/51145889

    [5] http://blog.sina.com.cn/s/blog_7103b28a0102w73g.html

     


    如果觉得内容还不错的话,欢迎点赞、转发、收藏,还可以关注微信公众号、CSDN博客、知乎。
     

    1. 微信公众号:

    2. CSDN博客:https://xiongyiming.blog.csdn.net/

    3. 知乎:https://www.zhihu.com/people/xiongyiming

     

    展开全文
  • 基于支持向量机的图像分类(下篇:MATLAB实现)

    万次阅读 多人点赞 2018-04-11 00:19:20
    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。后续章节将介绍的主要部分有: 图片数据集整理 特征提取 SVM训练与测试 分类结果...

    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。更多相关资源详解也可参考博主最新博文基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)。本文后续章节将介绍的主要部分有:

    • 图片数据集整理
    • 特征提取
    • SVM训练与测试
    • 分类结果评价
    • 结果显示

    点我下载:SVM图像分类的MATLAB完整程序及图片集文件


    1. 前言

    机器学习是人工智能研究发展到一定阶段的必然产物。二十世纪八十年代是机器学习成为一个独立学科的学科领域、各种机器学习技术百花绽放的时期。支持向量机于1995年正式发表[Cortes and Vapnik,1995],由于在文本分类任务中的卓越性能[Joachims,1998],很快成为机器学习的主流技术,并直接掀起了“统计学习”(statistical learning)在2000年前后的高潮。——《机器学习》 周志华

    2010年前后,随着计算能力的迅猛提升和大数据的涌现,神经网络研究在“深度学习”的名义下又重新崛起,并迎来又一次发展高潮。近年研究SVM的论文少了很多,SVM的风头很多时候确实已被强势崛起的深度学习浪潮所淹没,95年的SVM比我们年龄还大,有点仿佛英雄迟暮的感觉。不过在我看来,实现简单而且非常强大的分类算法SVM仍然有其研究价值,与神经网络相比SVM亦有过人之处,如特征维数多于样本数的情况,而小样本学习至今仍是深度学习的一大难题。

    当浅层神经网络效果不佳时,人们将目光转向支持向量机,而支持向量机亦不负众望,以不错的成绩让人们对机器学习重拾信心。感谢支持向量机,感谢在神经网络几经起落的时候,支持向量机继往开来、自成一脉,填补了机器学习的一段空窗期,让这条曲折向上的研究之路绵延至今迎来了现在人工智能百花齐放的时代!

    接下来就通过简单的图片分类问题,通过MATLAB程序理解认识一下这一简单而强大的分类算法——支持向量机.


    2. 图片数据集整理

    首先需要准备好分类的数据集,数据的整理是机器学习中的重要一环。这里我们自行整理一个用于分类的图片集,图片集有四类图片,分别为车、猫、花、鱼。从百度上下载这四种图片,并分别存放在四个文件夹中,如下图所示

    70

    四类图片每类分别下载100张左右的图片,这四百张图片作为分类的数据集,以7:3的比例将其分为训练图片集和测试图片集,分别放到picturestestPictures两个文件夹中。这两个文件夹下同上图一样都有car、cat、flw、fsh四个文件夹,值得注意的是测试样本的图片应可能不出现在训练集图片库中。做好以上工作,用于分类的图片集就准备完毕了。

    (当然用于分类的图片集常用的是cafir10图片集,这个数据集是写论文或研究时普遍用到的,可能会在后面的文章中介绍其用法,这里就暂时不使用cafir了。)

    为了便于后面的特征提取等对每张图片进行的操作,这里在程序中有必要将图片文件的存储位置、数量、类别等信息整理到一个数据结构中,新建一个m文件,程序代码如下

    dir=('D:\pictures');
    testdir=('D:\testPictures\test');
    trainingSet = imageSet(dir,'recursive');
    testSet = imageSet(testdir,'recursive');
    

    以上代码中用到imageSet( )函数是一个图片集整理的函数(MATLAB R2016b及以上版本支持),返回的是dir文件路径下文件夹内的文件信息。例如得到的trainingSet为一个1*4的imageSet变量,每个imageSet变量由Description、ImageLocation、Count三个属性组成,分别代表对子文件的描述、文件存储位置和图片数量。如下图所示是testSet(1)内部情况

    70

    3. 主要步骤

    和深度学习的算法相比,传统的机器学习在进行图片分类时输入的不是原始图片而是先进行一个特征提取的步骤。在上篇中已经介绍了特征提取的相关内容,这里用的是方向梯度直方图(HOG)以及灰度共生矩阵(GLCM)。

    70

    3.1 GLCM提取

    MATLAB中灰度共生矩阵的提取可以调用graycomatrix( )函数,不过这里为了取不同方向(0、45、90、135度)的灰度共生矩阵,通过循环计算各个方向的灰度共生矩阵并进行归一化处理(计算对比度、逆差距、熵、自相关),然后取平均值和方差作为最终提取的特征。

    新建一个m文件并命名为getGLCMFeatures,输入以下代码

    function [features] = getGLCMFeatures(image)
    features_all  = [];
    for i = 1:10
        glcm = graycomatrix(image, 'Offset', [0,i]);
        stats = graycoprops(glcm);
        
        glcm45 = graycomatrix(image, 'Offset', [-i,i]);
        stats45 = graycoprops(glcm45);
        
        glcm90 = graycomatrix(image, 'Offset', [-i,0]);
        stats90 = graycoprops(glcm90);
        
        glcm135 = graycomatrix(image, 'Offset', [-i,-i]);
        stats135 = graycoprops(glcm135);
        
        stats7x4 = [stats.Contrast stats.Correlation stats.Energy stats.Homogeneity;
            stats45.Contrast stats45.Correlation stats45.Energy stats45.Homogeneity;
            stats90.Contrast stats90.Correlation stats90.Energy stats90.Homogeneity;
            stats135.Contrast stats135.Correlation stats135.Energy stats135.Homogeneity];
        features_all = [features_all mean(stats7x4,1) std(stats7x4,0,1)];
    end
    features = features_all;
    

    新建的getGLCMFeatures函数输入为彩色图像转换后的灰度图像矩阵,输出为提取后的灰度共生矩阵特征。

    3.2 合并特征

    自己编写一个提取特征的函数命名为extractFeature,这个函数输入为整理过的训练集和测试集,输出为训练集的特征、标签和测试集的特征、标签。这个函数的功能是将HOG特征和前面提取的GLCM特征合并。

    代码第2到13行是为了确定每张图片提取特征后得到的矩阵大小,以方便后面的操作同时也是为了预分配空间以提高代码效率。首先取第一张图片进行灰度化以及阈值分割,将图片大小调整在256*256的范围(统一大小)分别进行HOG和GLCM的特征提取,分别得到两种特征向量,取两个向量的长度之和就是一张图片特征提取后的总长度了。

    function [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet)
    %% 确定特征向量尺寸
    img = read(trainingSet(1), 1);
    %转化为灰度图像
    img=rgb2gray(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    img=imresize(img,[256 256]);
    cellSize = [4 4];
    [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
    glcm_feature = getGLCMFeatures(img);
    SizeOfFeature = length(hog_feature)+ length(glcm_feature);
    
    %% 构建训练样本特征向量和训练样本标签
    trainingFeatures = [];
    trainingLabels   = [];
    for digit = 1:numel(trainingSet)       
        numImages = trainingSet(digit).Count;
        features  = zeros(numImages, SizeOfFeature, 'single');%初始化特征向量
        % 遍历每张图片
        for i = 1:numImages
            img = read(trainingSet(digit), i);% 取出第i张图片
            
            img=rgb2gray(img);                % 转化为灰度图像
            glcm_feature = getGLCMFeatures(img);  % 提取GLCM特征
           
            lvl = graythresh(img);            % 阈值化
            img = im2bw(img, lvl);            % 转化为2值图像
            img=imresize(img,[256 256]);
            % 提取HOG特征
            [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
            % 合并两个特征
            features(i, :) = [hog_feature glcm_feature];
        end
        % 使用图像描述作为训练标签
        labels = repmat(trainingSet(digit).Description, numImages, 1);  
        % 逐个添加每张训练图片的特征和标签
        trainingFeatures = [trainingFeatures; features];
        trainingLabels   = [trainingLabels; labels];       
    end
    
    
    %% 提取测试图片集的特征向量
    testFeatures = [];
    testLabels   = [];
    for digit = 1:numel(testSet)
               
        numImages = testSet(digit).Count;
        %初始化特征向量
        features  = zeros(numImages, SizeOfFeature, 'single');
        
        for i = 1:numImages
            
            img = read(testSet(digit), i);
            %转化为灰度图像
            img=rgb2gray(img);
            glcm_feature = getGLCMFeatures(img);
            %转化为2值图像
            lvl = graythresh(img);
            img = im2bw(img, lvl);
            img=imresize(img,[256 256]);
            [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',cellSize);
            features(i, :) = [hog_4x4 glcm_feature];
        end
        
        % 使用图像描述作为训练标签
        labels = repmat(testSet(digit).Description, numImages, 1);
            
        testFeatures = [testFeatures; features];
        testLabels=[testLabels; labels];
            
    end
    end
    

    代码18-41行是构建训练样本特征向量和训练样本标签,与前面步骤相似,只不过现在是遍历训练集每一张图片,对其进行灰度化、阈值化、调整大小,然后进行特征提取,将HOG特征和GLCM特征合并成一个向量作为特征矩阵的一行即一张图片的特征向量。样本的标签构建则将每张图片所处的文件夹的名字作为该图片的标签,并与特征向量顺序相对应。

    第47-73行是构建测试样本特征向量和训练样本标签,这里将图片集换成了测试集,而步骤与训练集是一致的。

    3.3 SVM训练与测试

    调用前面的特征提取函数得到训练和测试用的特征向量与对应的标签,便可以进行SVM的训练和测试。MATLAB自带的训练svm函数可以用fitcecoc函数,测试可以用predict函数预测结果,训练和测试的代码如下

    % 训练一个svm分类器
    % fitcecoc 使用11的方案
    classifier = fitcecoc(trainingFeatures, trainingLabels);
    save classifier.mat classifier;
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabels = predict(classifier, testFeatures);
    

    代码中classifier为训练得到的SVM分类器,利用该分类器以及测试集特征向量预测测试集的标签predictLabels。后面可以将predictLabels与实际的测试标签进行对比即可评估分类好坏。

    3.4 分类结果评价

    在上一篇文章中提到过了,为了评价分类的好坏可以通过混淆矩阵,通过计算混淆矩阵对角线上的值占每行总数的比值得出分类正确率,其实现代码如下

    %% 评估分类器
    % 使用没有标签的图像数据进行测试,生成一个混淆矩阵表明分类效果
    confMat=confusionmat(testLabels, predictedLabels)
    accuracy=(confMat(1,1)/sum(confMat(1,:))+confMat(2,2)/sum(confMat(2,:))+...
        confMat(3,3)/sum(confMat(3,:))+confMat(4,4)/sum(confMat(4,:)))/4
    

    其结果如下图所示

    70

    3.5 结果显示

    尽管以上代码能得到分类正确率,但我们希望更直观的看到输入一张图片后SVM分类器的分类结果,这里编写一个函数通过图形窗口显示预测结果。新建一个m文件命名为Predict,输入如下代码

    function [] = Predict(imageurl)
    load classifier.mat;
    figure;
    img = imread(imageurl);
    imshow(img);
    
    %提取图像的特征向量
    %转化为灰度图像
    img=rgb2gray(img);
    glcm_feature = getGLCMFeatures(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    
    % imshow(img);
    % figure
    img=imresize(img,[256 256]);
    [hog_4x4, ~] = extractHOGFeatures(img,'CellSize',[4 4]);
    testFeature = [hog_4x4 glcm_feature];
    
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabel = predict(classifier, testFeature);
    
    str = ['分类结果:' predictedLabel];
    dim = [0.25 0.0004 0.2 0.2];
    annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
    

    函数输入为图片的存储路径,调用函数则会通过图形窗口显示图片及分类结果,如在命令窗口输入如下代码

    Predict('D:\testPictures\test\car\car9.jpg');
    

    输出结果如下图

    70

    4. 完整代码

    为了方便使用这里贴出完整代码

    主函数:

    clear;
    dir=('D:\pictures');
    testdir=('D:\testPictures\test');
    trainingSet = imageSet(dir,'recursive');
    testSet = imageSet(testdir,'recursive');
    
    [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet);
    %% 
    %训练一个svm分类器
    %fitcecoc 使用11的方案
    classifier = fitcecoc(trainingFeatures, trainingLabels);
    save classifier.mat classifier;
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabels = predict(classifier, testFeatures);
    
    %% 评估分类器
    %使用没有标签的图像数据进行测试,生成一个混淆矩阵表明分类效果
    confMat=confusionmat(testLabels, predictedLabels)
    accuracy=(confMat(1,1)/sum(confMat(1,:))+confMat(2,2)/sum(confMat(2,:))+...
        confMat(3,3)/sum(confMat(3,:))+confMat(4,4)/sum(confMat(4,:)))/4
    
    Predict('D:\testPictures\test\car\car9.jpg');
    

    getGLCMFeatures.m:

    function [features] = getGLCMFeatures(image)
    features_all  = [];
    for i = 1:10
        glcm = graycomatrix(image, 'Offset', [0,i]);
        stats = graycoprops(glcm);
        
        glcm45 = graycomatrix(image, 'Offset', [-i,i]);
        stats45 = graycoprops(glcm45);
        
        glcm90 = graycomatrix(image, 'Offset', [-i,0]);
        stats90 = graycoprops(glcm90);
        
        glcm135 = graycomatrix(image, 'Offset', [-i,-i]);
        stats135 = graycoprops(glcm135);
        
        stats7x4 = [stats.Contrast stats.Correlation stats.Energy stats.Homogeneity;
            stats45.Contrast stats45.Correlation stats45.Energy stats45.Homogeneity;
            stats90.Contrast stats90.Correlation stats90.Energy stats90.Homogeneity;
            stats135.Contrast stats135.Correlation stats135.Energy stats135.Homogeneity];
        features_all = [features_all mean(stats7x4,1) std(stats7x4,0,1)];
    end
    features = features_all;
    

    extractFeature.m:

    function [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet)
    %% 确定特征向量尺寸
    img = read(trainingSet(1), 1);
    %转化为灰度图像
    img=rgb2gray(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    img=imresize(img,[256 256]);
    cellSize = [4 4];
    [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
    glcm_feature = getGLCMFeatures(img);
    SizeOfFeature = length(hog_feature)+ length(glcm_feature);
    
    %% 构建训练样本特征向量和训练样本标签
    trainingFeatures = [];
    trainingLabels   = [];
    for digit = 1:numel(trainingSet)       
        numImages = trainingSet(digit).Count;
        features  = zeros(numImages, SizeOfFeature, 'single');%初始化特征向量
        % 遍历每张图片
        for i = 1:numImages
            img = read(trainingSet(digit), i);% 取出第i张图片
            
            img=rgb2gray(img);                % 转化为灰度图像
            glcm_feature = getGLCMFeatures(img);  % 提取GLCM特征
           
            lvl = graythresh(img);            % 阈值化
            img = im2bw(img, lvl);            % 转化为2值图像
            img=imresize(img,[256 256]);
            % 提取HOG特征
            [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
            % 合并两个特征
            features(i, :) = [hog_feature glcm_feature];
        end
        % 使用图像描述作为训练标签
        labels = repmat(trainingSet(digit).Description, numImages, 1);  
        % 逐个添加每张训练图片的特征和标签
        trainingFeatures = [trainingFeatures; features];
        trainingLabels   = [trainingLabels; labels];       
    end
    
    
    %% 提取测试图片集的特征向量
    testFeatures = [];
    testLabels   = [];
    for digit = 1:numel(testSet)
               
        numImages = testSet(digit).Count;
        %初始化特征向量
        features  = zeros(numImages, SizeOfFeature, 'single');
        
        for i = 1:numImages
            
            img = read(testSet(digit), i);
            %转化为灰度图像
            img=rgb2gray(img);
            glcm_feature = getGLCMFeatures(img);
            %转化为2值图像
            lvl = graythresh(img);
            img = im2bw(img, lvl);
            img=imresize(img,[256 256]);
            [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',cellSize);
            features(i, :) = [hog_4x4 glcm_feature];
        end
        
        % 使用图像描述作为训练标签
        labels = repmat(testSet(digit).Description, numImages, 1);
            
        testFeatures = [testFeatures; features];
        testLabels=[testLabels; labels];
            
    end
    end
    

    Predict.m:

    function [] = Predict(imageurl)
    load classifier.mat;
    figure;
    img = imread(imageurl);
    imshow(img);
    
    %提取图像的特征向量
    %转化为灰度图像
    img=rgb2gray(img);
    glcm_feature = getGLCMFeatures(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    
    % imshow(img);
    % figure
    img=imresize(img,[256 256]);
    [hog_4x4, ~] = extractHOGFeatures(img,'CellSize',[4 4]);
    testFeature = [hog_4x4 glcm_feature];
    
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabel = predict(classifier, testFeature);
    
    str = ['分类结果:' predictedLabel];
    dim = [0.25 0.0004 0.2 0.2];
    annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
    

    5. 结束语

    本博文的完整MATLAB程序文件与图片集文件已经上传,下载即可运行(注意根据实际修改程序中的图片路径哦)下载地址如下

    点我下载:SVM的图像分类MATLAB完整程序及图片集文件

    更多相关资源详解也可参考博主最新博文基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)

    公众号获取
        本人微信公众号已创建,扫描以下二维码并关注公众号“AI技术研究与分享”,后台回复“SV20180411”即可获取全部资源文件信息。

    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyODkyMzgz,size_16,color_FFFFFF,t_70

    由于编者能力有限,代码即使经过了多次校对,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

    展开全文
  • 向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组; 向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。 ...


    向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组;


    向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量


    点乘公式


    对于向量a和向量b:


                                                               


    a和b的点积公式为:



    要求一维向量a和向量b的行列数相同。


    点乘几何意义


    点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影,有公式:




    推导过程如下,首先看一下向量组成:





    定义向量:




    根据三角形余弦定理有:




    根据关系c=a-b(a、b、c均为向量)有:




    即:



    向量a,b的长度都是可以计算的已知量,从而有a和b间的夹角θ:




    根据这个公式就可以计算向量a和向量b之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是垂直)等方向关系,具体对应关系为:


         a·b>0    方向基本相同,夹角在0°到90°之间

         a·b=0    正交,相互垂直  

         a·b<0    方向基本相反,夹角在90°到180°之间 


    叉乘公式


    两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。


    对于向量a和向量b:




    a和b的叉乘公式为:




    其中:




    根据i、j、k间关系,有:




    叉乘几何意义


    在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。


    在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示: 



    在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积。


    展开全文
  • 使用python求解特征值与特征向量

    万次阅读 多人点赞 2016-10-25 19:04:05
    使用python求解特征值与特征向量 实例介绍
  • 向量向量空间

    千次阅读 2017-12-29 10:08:28
    本章介绍线性代数的基本概念,主要内容包括向量向量组、向量空间等。
  • 支持向量机SVM、支持向量回归SVR详细推导

    万次阅读 多人点赞 2019-06-30 09:31:52
    文章详细介绍了支持向量机SVM及其拓展,支持向量回归SVR.并从线性分类和非线性分类的角度出发,详细推导了硬间隔、软间隔和核函数的支持向量机。
  • 支持向量机(SVM)

    万次阅读 多人点赞 2017-07-05 13:13:01
    支持向量机(Support Vector Machine)是一种十分常见的分类器,曾经火爆十余年,分类能力强于NN,整体实力比肩LR与RF。核心思路是通过构造分割面将数据进行分离。本文主要阐述SVM的基本工作原理和简单应用。 1....
  • 向量点乘与叉乘

    万次阅读 多人点赞 2019-02-25 14:06:01
    向量点乘与叉乘 向量(Vector)  在几乎所有的几何问题中,向量(有时也称矢量)是一个基本点。向量的定义包含方向和一个数(长度)。在二维空间中,一个向量可以用一对x和y来表示。例如由点(1,3)到(5,1的向量...
  • 支持向量机(SVM)入门理解与推导

    万次阅读 多人点赞 2018-03-28 17:03:05
    支持向量机(support vector machines)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。由简至繁的模型包括: 当训练样本线性可...
  • 本文介绍一种计算句向量和文章向量的方法及参考代码,自然语言处理的第一步即是要进行文本的向量化,包括获得词向量,句向量或者文章向量,以便输入各种机器学习模型或者深度学习模型。 词向量 可以笼统的认为词向量...
  • ChineseEmbedding Chinese Embedding ...中文自然语言处理向量合集,包括字向量,拼音向量,词向量,词性向量,依存关系向量.共5种类型的向量. 项目地址:https://github.com/liuhuanyong 项目简介 目前不同于on...
  • 矩阵特征值和特征向量详细计算过程(转载)

    万次阅读 多人点赞 2018-09-02 09:43:47
    1.矩阵特征值和特征向量定义&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A为n阶矩阵,若数λ和n维非0列向量x满足Ax=λx,那么数λ称为A的特征值,x称为A的对应于特...
  • 向量和行向量看待矩阵乘法

    万次阅读 多人点赞 2017-07-24 19:19:14
    前言: 主要是引入一个新的看待矩阵乘法的角度觉得这个挺重要的,故做记录列向量角度,矩阵左乘AB = C 结合上图,我们可以知道,结果矩阵C中的第 j 列完全可以表示为矩阵A中列向量的线性组合,具体怎样的线性组合...
  • 多元函数的切向量和法向量

    万次阅读 多人点赞 2017-12-13 11:25:33
    有一个很有启发性的说法:考虑描述曲面的隐...(F'x,F'y,F'z)是曲线的法向量,(dx,dy,dz)则是曲线的切向量。 1 对曲面而言,求各变量在某一点的偏导数,即为这一点的法向量。 切向量我们假设以x为变...
  • 向量个数,向量维数,向量空间维数

    万次阅读 多人点赞 2018-09-18 17:39:23
    关于向量个数和向量位数,我贴一张图大家就明白了  向量空间维数的定义 下面是线性空间的定义,元素a与基V。从定义中可知向量空间的维数就是求存在多少个元素a线性无关。 向量空间的维数是不是就是对应...
  • 向量范数

    万次阅读 多人点赞 2019-06-04 11:03:05
    声明: 仅个人小记 效果展示 绘制∥v⃗∥p=1\left \| \vec{v}\right \|_p = 1∥v∥p​=1的图像如下 当 p = 0 ...向量范数定义 总体定义 ∥v⃗∥p=(∣v1∣p+∣v2∣p+...+∣vn∣p)1p\left \| \vec{v}\righ...
  • 数学基础 —— 向量运算(叉乘)

    万次阅读 2016-08-05 17:17:57
    向量的叉乘,求通知垂直两个向量向量,即c垂直于a,同时c垂直于b(a与c的夹角为90°,b与cc的夹角为90°) c = a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x*b.z , a.x*b.y-b.x*a.y) 以上图为例a(1,0,0),b(0,1,0),...
  • 标准化向量/单位向量

    千次阅读 2019-10-30 22:24:29
    在很多情况下,我们只关心向量的方向儿不关心其大小,比如,在计算关照模型时,我们往往需要得到顶点的法线方向和光源方向,此时我们不关心这些向量有多长。在这些情况下,我们就需要计算标准化向量 标准化向量指的...
  • 矩阵特征值和特征向量详细计算过程

    万次阅读 多人点赞 2018-05-07 12:22:13
    1.矩阵特征值和特征向量定义 A为n阶矩阵,若数λ和n维非0列向量x满足Ax=λx,那么数λ称为A的特征值,x称为A的对应于特征值λ的特征向量。式Ax=λx也可写成( A-λE)x=0,并且|λE-A|叫做A 的特征多项式。当特征...
  • 向量投影与向量投影矩阵

    千次阅读 2018-12-03 21:03:11
    向量投影与向量投影矩阵 向量投影 以下是向量a在向量b上的投影,θ 为两向量的夹角。 其中a = a||+a⊥,a||则是a在b上的投影。 所以投影公式如下: 向量投影矩阵 将以上投影公式写成矩阵形式,...
  • 图解Matlab向量向量运算

    千次阅读 2020-04-12 11:13:13
    创建向量xl1, xl2;可以使用空格或者逗号分隔; 创建列向量lxl1,使用分号分隔; xl1(3),获取向量xl1的第三个值; (:),列出向量的所有组件; xl1(1:3),取第1到3个值; 向量xl1和xl2相加,得到向量xla; ...
  • 稀疏向量和密集向量

    千次阅读 2018-09-21 11:47:59
    稀疏向量和密集向量都是向量的表示方法 密集向量和稀疏向量的区别: 密集向量的值就是一个普通的Double数组 而稀疏向量由两个并列的 数组indices和values组成 例如:向量(1.0,0.0,1.0,3.0)用密集格式表示为[1.0,0.0...
  • 段落向量与句子向量表达

    万次阅读 热门讨论 2017-05-20 17:08:27
    这是Tomas Mikolov的一篇关于段落向量和句子向量的论文。本文是我翻译加自我理解的结果,如需要更详细的介绍,请看英文文献。摘要许多机器翻译的算法都需要使用固定长度的词向量特征。在到达文本层面时,我我们最...
  • 向量 向量加法 向量数乘 向量 物理 在物理中,向量是直线加箭头。 其中的直线代表长度,箭头代表方向。 只要长度和方向相同,那么空间中任意的两个向量也相同。 计算机 在计算机学科中,...
  • 方向向量和法向量

    千次阅读 2018-11-30 17:53:00
    方向向量和法向量,待编辑。 直线的方向向量和法平面 斜截式 \(y=kx+b\),方向向量\(\overrightarrow{s}=(1,k)\),或\(\overrightarrow{s}=(1,-\cfrac{A}{B})\),或\(\overrightarrow{s}=(B,-A)\),或\(\...
  • 中断向量 每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,803
精华内容 56,721
关键字:

向量