您的位置:新葡亰496net > 奥门新萄京娱乐场 > libsvm的使用方法,使用小结

libsvm的使用方法,使用小结

发布时间:2019-10-05 12:44编辑:奥门新萄京娱乐场浏览(181)

    【百度百科】

    LibSVM之C# Wrapper,

    【百度健全】

      LIBSVM是福建高校林智仁(Lin Chih-Jen)教师等开垦设计的二个简易、易于使用和高效有效的SVM形式识别与回归的软件包,他不止提供了编写翻译好的可在Windows种类系统的进行文书,还提供了源代码,方便革新、修改以及在别的操作系统上利用;该软件对SVM所涉嫌的参数调解相对比比较少,提供了相当多的暗许参数,利用那几个默认参数可以解决相当多标题;并提供了互相核算(CrossValidation)的意义。该软件能够消除C-SVM、ν-SVM、ε-SV凯雷德和ν-SV奇骏等主题材料,满含基于一对一算法的多类形式识别难题……

      要是你对libsvm还相当不够了然,提出先浏览下百度百科等对libsvm的介绍~

    【C# Wrapper 动机】

      参加过多个门类,使用IDE是VS winform,工具包为EmguCV 2.4.10。我们精通OpenCV第22中学的svm部分是依靠libsvm-2.6编纂的,该版本的libsvm已经能够estimate预测可能率了(libsvm首页的change log中有详细表达),然而OpenCV却遗弃了predictProbability。在现实的花色中,假若能够得到预测可能率消息,那将对增高识别性有非常的大的补助。可是,opencv2遗弃了识别几率,包蕴opencv3,小编看源代码的svm部分也是基于libsvm-2.6修改的,也从没引入predictProbability。

      因此,在EmguCV的ML满足不断的情景下,萌生了多少个主张:

        一是修改OpenCV代码,然后再度CMake获得cvextern.dll;

        二是一直找另外的svm库。

      首先尝试CMake。像OpenCV那样的大种类,CMake起来着实不便于,更而且是从零上马学CMake。在时光不允许的条件下,只得走第二条路。找到libsvmSharp后,小编如获珍宝。不过,相当的慢作者又重新失望了,因为实时性供给满意不断(EmguCV自带SVM能够在5ms内完成辨认预测,而libsvmSharp必要500ms)。

      那是为何?

      同样是C#对C 的wrapper,同样都是基于libsvm,一样是对C 所编写翻译的dll的援用,作用竟相差百倍!本着一颗学习的心,笔者调控一探究竟……

    【现有libsvm的C#/.Net版本】

      目前,LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、昂科拉、Perl、Common LISP、Labview等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编译的工具)的版本。

      首先大家看张libsvm官方网址首页上的截图:

    新葡亰496net 1

      上边,大家看看以往libsvm有啥样C#版本:

      1、SVM.NET by Matthewa Johnson

      二零零六年,复旦大学的马特hewa Johnson学士将SVM.NET更新到了V2.89,也正是现行反革命的最新版本。无语以往不FQ竟已经找不到SVM.NET的原生版了。那份神秘感使自个儿感觉,这么些C#本子的libsvm应该是品质最高的。

      后人有在V2.89的根基上做一些退换,提出了:SVM.NET with Parallel Optimization。相关描述为:When finding parameters, C and Gamma, in Grid-search algorithm using ParameterSelection.PGrid instead of the original ParameterSelection.Grid will increase the calculation speed.

      2、NSVM by Joannes

        3年岁月,却独有2下载量,何其惨淡……好啊,或然你也像本身同一主观臆断了。

    3、KMLib(Kernel Machine Library with GPU SVM solver in .Net) by Krzysztof Sopyła

      Key Features

      • .Net implementation
      • Parallel kernel implementation
      • SVM CUDA acceleration – kernels and solver
      • CUDA SVM with sparse data formats: CSR, Ellpack-R, Sliced-Ellpack
      • For non commercial and academic use: Free MIT license when use please cite: Bibtex CUDA SVM CSR

      别的,还会有某个亟需重申的是,它是基于libsvm的java版本变换过来的。也正因如此,小编认为用起来只怕会稍稍麻烦,故未有选取。

    4、libsvmSharp by ccerhan

      选择它的说辞很轻易,有确定的下载量(从众心思又开头惹事了!)下载方便,用VS的Nuget package,通过命令“PM> Install-Package LibSVMsharp”即下载到本地。

    5、libsvm-net by Nicolas Panel

      下载起来一样十一分便利: NuGet package : PM> Install-Package libsvm.net,比起libsvmSharp有越来越高的人气。

    【分析libsvmSharp】

      为啥libsvm夏普.dll如此低效?

      在反编写翻译后的源代码中(稍后将介绍如何反编写翻译C#编写翻译出来的dll文件),大家得以看到libsvmSharp所用的数据结构有:

        1、struct:svm_node、svm_model、svm_problem、svm_parameter;

        2、calss:SVMNode、SVMModel、SVMProblem、SVMParameter。

    实在,结构体能做的事体,类完全也能做,仿佛结构体未有存在的须求。

      何况,能够见到各个的完毕中,有为数不菲“结构体=>类”、“指针=>结构体”、“类=>指针”等那样的类型调换。大家了然,C#要引用C 所编写翻译的dll,用得最多的正是IntPtr这么些数据结构。而libsvm夏普低效的从头到尾的经过,也正在于对指针的拍卖政策选用不当,它只在急需传指针的时候,硬生生地用马尔斯hal类重新在内部存款和储蓄器中开荒当前数据结构大小的区域,并回到指针,美其名曰convert到指针。这种办法,无论是在时光上还是空间上,都有太多没须要的稀疏。

      这里大家用libsvm中的svm_predict作为例子来说学。

      在libsvm.dll(该dll由C 编写翻译得到)中,函数为:

     double svm_predict(const svm_model *model, const svm_node *x)
    

      在libsvmSharp.dll(该dll由C#编译获得)中,大家这么申明它:

     [DllImport("libsvm.dll", CallingConvention = CallingConvention.Cdecl)]
     public static extern double svm_predict(IntPtr model, IntPtr x);
    

      DllImport时,越来越多关于C 数据结构到C#数据结构的音讯请读者查阅资料取得。由上可知,IntPtr是个很注重的数据结构,由它证明的变量实际上是多个指针值(即内部存款和储蓄器地址值)。第二个参数IntPtr model,供给传入model所在内部存款和储蓄器区域的地址,第三个参数IntPtr x,要求传入特征节点数组所在内部存款和储蓄器区域的地点。上边,大家看看libsvmSharp是怎么使用这么些函数的:

     1         public static double Predict(SVMModel model, SVMNode[] x)
     2         {
     3             if (model == null)
     4             {
     5                 throw new ArgumentNullException("model");
     6             }
     7             if (x == null)
     8             {
     9                 throw new ArgumentNullException("x");
    10             }
    11             IntPtr intPtr = SVMModel.Allocate(model);
    12             double result = SVM.Predict(intPtr, x);
    13             SVMModel.Free(intPtr);
    14             return result;
    15         }
    16 
    17         public static double Predict(IntPtr ptr_model, SVMNode[] x)
    18         {
    19             if (ptr_model == IntPtr.Zero)
    20             {
    21                 throw new ArgumentNullException("ptr_model");
    22             }
    23             if (x == null)
    24             {
    25                 throw new ArgumentNullException("x");
    26             }
    27             List<SVMNode> list = (from a in x
    28             select a.Clone()).ToList<SVMNode>();
    29             list.Add(new SVMNode(-1, 0.0));
    30             IntPtr intPtr = SVMNode.Allocate(list.ToArray());
    31             double result = libsvm.svm_predict(ptr_model, intPtr);
    32             SVMNode.Free(intPtr);
    33             return result;
    34         }
    

      留心的你有未有察觉什么难点?看不懂?终究作者是一孔之见。可是,请看第11行,每一次调用都要重复给model分配内部存款和储蓄器哦!再如,第27、28、29、30行,在熟稔C 的人看来,that's what?参数字传送进来的可不是数组名吗,干嘛如此思前想后?内部存储器不会被玩坏吗?

      一切都以因为C#有指针,但不是非凡我们所明白的指针。C#未有像Java一样完全废除指针,但为了代码安全思考而减少指针。C#是面向对象的语言,里面别的一种数据结构都未有指针这一性情,除非您自身在定义数据结构时,将指针作为成员变量。大家所熟识的EmguCV就是那般完成对OpenCV的wrapper的。

    【开始libsvm的C# Wrapper之旅】

      很好,大家可以进去正题了。小编将以wrapper libsvm为例,分步骤解说整个经过。读者能够融会贯通,希望本文能够扶助你加深你对跨语言编制程序的知晓。

      1.wrapper第一步(准备)

      获取你要wrapper的dll(由C 编译获得),最棒有源代码,当然有参谋手册也足以,但是借使除去dll的名字,对该dll一窍不通,那只怕就不能了。

      安装C#的dll反编写翻译工具,这里推荐ILSpy。为何要设置?比起本人漆黑中搜索,要是有能够参见借鉴的能源,不以为奇是何等缺憾的一件事呀。EmguCV真的称得上wrapper中的精湛。

    1. wrapper第二步(DllImport)

      首先,VS新建C#工程,项目连串选项类库,这样结尾生成施工方案后,便得以在bin/Debug目录下得到实用的dll文件了。笔者将项目命名称叫libsvm夏普Cyc。

      其次,加多要求wrapper的C dll文件。右键单击技术方案财富管理器中的libsvmSharpCyc,然后增添现成项,把libsvm.dll增添进项目。

      接着,新建类,用于DllImport。小编建的是LsInvoke.cs,能够像下图所示那样,把想要使用的函数方法给Import进来:

    libsvm的使用方法,使用小结。  该进程中,DllImport要什么样运用,感兴趣的读者可自动学习,这里须要注意的是C 函数中的数据结构到C#中的数据结构是有绚烂关系的,上边附上一张dll援用常用转化表:

                C              C#
            =====================================
            WORD              ushort
            DWORD             uint
            UCHAR             int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
            UCHAR*            string/IntPtr
            unsigned char*    [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
            char*             string
            LPCTSTR           string
            LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
            long              int
            ulong             uint
            Handle            IntPtr
            HWND              IntPtr
            void*             IntPtr
            int               int
            int*              ref int
            *int              IntPtr
            unsigned int      uint
            COLORREF          uint
    

    3、wrapper第三步(数据结构)

      这一步是最为重大的一步,在C#中新建数据结构,必得求与C 中的数据结构相平等,不然遭受不恐怕预料的问题。

      前文已经轻易地介绍过libsvm的数据结构了。这里再一次一下:

     1 struct svm_node
     2 {
     3     int index;
     4     double value;
     5 };
     6 
     7 struct svm_problem
     8 {
     9     int l;
    10     double *y;
    11     struct svm_node **x;
    12 };
    13 
    14 enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };    /* svm_type */
    15 enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
    16 
    17 struct svm_parameter
    18 {
    19     int svm_type;
    20     int kernel_type;
    21     int degree;    /* for poly */
    22     double gamma;    /* for poly/rbf/sigmoid */
    23     double coef0;    /* for poly/sigmoid */
    24 
    25     /* these are for training only */
    26     double cache_size; /* in MB */
    27     double eps;    /* stopping criteria */
    28     double C;    /* for C_SVC, EPSILON_SVR and NU_SVR */
    29     int nr_weight;        /* for C_SVC */
    30     int *weight_label;    /* for C_SVC */
    31     double* weight;        /* for C_SVC */
    32     double nu;    /* for NU_SVC, ONE_CLASS, and NU_SVR */
    33     double p;    /* for EPSILON_SVR */
    34     int shrinking;    /* use the shrinking heuristics */
    35     int probability; /* do probability estimates */
    36 };
    37 
    38 //
    39 // svm_model
    40 // 
    41 struct svm_model
    42 {
    43     struct svm_parameter param;    /* parameter */
    44     int nr_class;        /* number of classes, = 2 in regression/one class svm */
    45     int l;            /* total #SV */
    46     struct svm_node **SV;        /* SVs (SV[l]) */
    47     double **sv_coef;    /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
    48     double *rho;        /* constants in decision functions (rho[k*(k-1)/2]) */
    49     double *probA;        /* pariwise probability information */
    50     double *probB;
    51     int *sv_indices;        /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
    52 
    53     /* for classification only */
    54 
    55     int *label;        /* label of each class (label[k]) */
    56     int *nSV;        /* number of SVs for each class (nSV[k]) */
    57                 /* nSV[0]   nSV[1]   ...   nSV[k-1] = l */
    58     /* XXX */
    59     int free_sv;        /* 1 if svm_model is created by svm_load_model*/
    60                 /* 0 if svm_model is created by svm_train */
    61 };
    

      对应地,我们在C#中国建工业总集结团立数据结构:

        public struct svm_node
        {
            /// <summary>
            /// 索引
            /// </summary>
            public int index;
    
            /// <summary>
            /// 值
            /// </summary>
            public double value;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="i"></param>
            /// <param name="v"></param>
            public svm_node(int i,double v)
            {
                this.index = i;
                this.value = v;
            }
            public bool Equals(svm_node x)
            {
                return this.index.Equals(x.index) && this.value.Equals(x.value);
            }
        }
        public struct svm_problem
        {
            /// <summary>
            /// 支持向量个数
            /// </summary>
            public int l;
    
            /// <summary>
            /// 标签值
            /// </summary>
            public IntPtr y;
    
            /// <summary>
            /// 节点情况
            /// </summary>
            public IntPtr x;
        }
        ……
    

      或者有读者会问,结构体你加构造函数和其他函数干嘛?那实际是为了以往好简化代码。不然,每一遍对象创立于赋值分开操作有一点点麻烦。

      实行到前天,大家只是达成了数据结构搭建的一小部分,下边是从EmguCV中学习到的精髓部分!将要下篇作介绍~

    Wrapper, 【百度百科】 LIBSVM是安徽大学林智仁(Lin Chih-Jen)教师等开辟设计的一个粗略、易于使用和急忙有效的SVM情势识别与回归的...

    Python 之 LIBSVM 使用小结

    1)从python官方网址上下载windows下的装置包python-2.7.3.msi并设置

    2)打开IDLE(python GUI),输入
    >>>import sys
    >>>sys.version
    libsvm的使用方法,使用小结。假如您的python是叁十个人,将面世如下字符:
    ‘2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]’
    其不日常候LIBSVM的python接口设置将特别简单。在libsvm-3.16文件夹下的windows文件夹中找到动态链接库libsvm.dll,将其增加到系统目录,如`C:WINDOWSsystem32’,即可在python中使用libsvm

    3)倘令你的python是陆10位的,也便是说展开IDLE(python GUI),输入
    >>>import sys
    >>>sys.version
    并发如下字符:
    '2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)]'
    那会儿你须要首先本身编译60人的动态链接库libsvm.dll。方法如下:
    在程种类表中的Microsoft Visual Studio 贰零零捌/Visual Studio Tools下找到Visual Studio x64 Win64 Command Prompt(贰零零捌),注意必须借使六拾位的command prompt
    cd到LIBSVM所在文件夹libsvm-3.16
    输入nmake -f Makefile.win clean all
    那会儿libsvm-3.16的windows目录下将调换61人的动态链接库。将新生成的libsvm.dll复制到系统目录(比如`C:WINDOWSsystem32')即可。

    新葡亰496net 2

     

    =============================================================================
    ================================牛逼闪闪的分水线================================

    =============================================================================

    4)简单SVM操作直接照此步骤达成。
    打开IDLE
    >>>import os
    >>>os.chdir(‘C:Program Fileslibsvm-3.16python’)
    >>>from svmutil import *
    >>> y, x = svm_read_problem(‘../heart_scale’)
    >>> m = svm_train(y[:200], x[:200], ‘-c 4’)
    >>> p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

    5)python接口的求证
    在libsvm-3.16的python文件夹下主要回顾了七个文本svm.py和svmutil.py。
    svmutil.py接口首要总结了high-level的函数,这几个函数的运用和LIBSVM的MATLAB接口大意类似
    svmutil中器重包蕴了以下多少个函数:
    svm_train() : train an SVM model
    svm_predict() : predict testing data
    svm_read_problem() : read the data from a LIBSVM-format file.
    svm_load_model() : load a LIBSVM model.
    svm_save_model() : save model to a file.
    evaluations() : evaluate prediction results.
    svm.py接口主要包蕴了部分low-level的运用。在svm.py中央银行使了python内置的ctypes库,因而python能够直接访谈svm.h中定义的C结商谈接口函数。svm.py紧要行使了多少个数据结构svm_node, svm_problem, svm_parameter和svm_model。

     

    之 LIBSVM 使用小结 1)从python官英特网下载windows下的设置包python-2.7.3.msi并设置 2)展开IDLE(python GUI),输入 import sys sys.version 假使你的py...

    本文讲使用新疆高校林智仁(Lin Chih-Jen)教师等开垦设计开荒设计的贰个轻易易行、易用的SVM方式识别与回归的软件包,本文将使用svmlib在python下的版本对其选择格局开展总括:

      LIBSVM是河北学院林智仁(Lin Chih-Jen)助教等开荒设计的一个轻松易行、易于使用和便捷有效的SVM情势识别与回归的软件包,他不光提供了编写翻译好的可在Windows类别系统的奉行文书,还提供了源代码,方便革新、修改以及在别的操作系统上选拔;该软件对SVM所提到的参数调度相对很少,提供了非常多的私下认可参数,利用那么些私下认可参数能够缓慢解决比很多难题;并提供了交互核实(CrossValidation)的功效。该软件能够化解C-SVM、ν-SVM、ε-SV传祺和ν-SV兰德酷路泽等主题材料,满含基于一对一算法的多类方式识别难题……

    libsvm下载地址:

      假设你对libsvm还非常不足通晓,提出先浏览下百度百科等对libsvm的牵线~

    透过上一篇博文转发了python下载libsvm的教程,在python30位境遇下选用libsvm

    【C# Wrapper 动机】

    libsvm在python版本提供了几个模块,svmutil.py为高档次版本,svm.py为低档次版本

      出席过三个项目,使用IDE是VS winform,工具包为EmguCV 2.4.10。大家驾驭OpenCV第22中学的svm部分是基于libsvm-2.6编写制定的,该版本的libsvm已经能够estimate预测可能率了(libsvm首页的change log中有详尽表明),不过OpenCV却抛弃了predictProbability。在切实的项目中,如若得以博得预测概率音信,那将对拉长识别性有非常的大的扶植。不过,opencv2抛弃了甄别可能率,包蕴opencv3,小编看源代码的svm部分也是基于libsvm-2.6修改的,也从不引入predictProbability。

    在低档案的次序版本svm.py中,未有对python内置库ctypes类型进行李包裹装,而svmutil.py则提供了归纳易用的函数能够一贯利用

      由此,在EmguCV的ML满意不断的情状下,萌生了三个主见:

    libsvm使用的手续为:

        一是修改OpenCV代码,然后再一次CMake获得cvextern.dll;

    1)将数据转载为libsvm工具使用的格式,

        二是直接找其余的svm库。

    <label1> <index1>:<value1> <index2>:<value2>     .....  <index L>:<valueL>

    <label2> ......................

      首先尝试CMake。像OpenCV那样的大种类,CMake起来确实不轻便,更并且是从零开端学CMake。在岁月差别意的尺码下,只得走第二条路。找到libsvmSharp后,小编如获珍宝。不过,一点也不慢作者又重新失望了,因为实时性要求知足不断(EmguCV自带SVM能够在5ms内产生辨认预测,而libsvm夏普须要500ms)。

    label可以为int或double类型

      那是干吗?

    2)进行多少变化,常用的数据变化为归一化,同期将training data 和 test data通过放缩在[-1,1]区间

      同样是C#对C 的wrapper,同样都以基于libsvm,一样是对C 所编写翻译的dll的援引,效用竟相差百倍!本着一颗学习的心,小编调控一探终究……

    【待定】

    【现有libsvm的C#/.Net版本】

    3)选择核函数:优先思量采纳RBF核函数

      目前,LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、Odyssey、Perl、Common LISP、Labview等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编写翻译的工具)的本子。

    4)用cross-validation(交叉验证)和grid-search获得最优的c和g

      首先我们看张libsvm官方网址首页上的截图:

    情势一:cross-validation(交叉验证):

    新葡亰496net 3

    m = svm_train(y, x, '-v 2')

    假设option参数-v为确切值,则svm_train重临model为四个数值,若是是svm分类则赶回交叉验证的正确率,-v 的值要大于等于2,日常采纳5.若为svm回归则赶回结果与真实值的差别值平均方差

      下边,大家看看未来libsvm有哪些C#版本:

    方法二:grid-search:

      1、SVM.NET by Matthewa Johnson

    libsvm提供了多少个小工具包,个中囊括了tools中的grid.py,能够火速选用最优参数c和g

      二〇〇三年,加州伯克利分校高校的马特hewa Johnson大学生将SVM.NET更新到了V2.89,约等于后天的风靡版本。无可奈何未来不FQ竟已经找不到SVM.NET的原生版了。那份神秘感使笔者觉着,那一个C#本子的libsvm应该是品质最高的。

    $ python grid.py svmguide1.scale

    2.0 2.0 96.8922

    (Best C=2.0, γ=2.0 with five-fold cross-validation rate=96.8922%)

      后人有在V2.89的底蕴上做一些退换,提议了:SVM.NET with Parallel Optimization。相关描述为:When finding parameters, C and Gamma, in Grid-search algorithm using ParameterSelection.PGrid instead of the original ParameterSelection.Grid will increase the calculation speed.

    5)使用最优参数C和g去磨练training set

      2、NSVM by Joannes

    6)测试:

    新葡亰496net 4

    在svmutil.py,可采用函数svm_predict得到分类正确率

        3年时间,却独有2下载量,何其惨淡……好啊,也许你也像自个儿同样主观臆断了。

    p_label, p_acc, p_val = svm_predict(y, , m)

    3、KMLib(Kernel Machine Library with GPU SVM solver in .Net) by Krzysztof Sopyła

    #p_labels: a list of predicted labels,预测类别

      Key Features

    #p_acc: a tuple including accuracy (for classification), mean squared error, and squared correlation coefficient (forregression),正确率,相对误差的均方差,和相关周密平方

      • .Net implementation
      • Parallel kernel implementation
      • SVM CUDA acceleration – kernels and solver
      • CUDA SVM with sparse data formats: CSR, Ellpack-R, Sliced-Ellpack
      • For non commercial and academic use: Free MIT license when use please cite: Bibtex CUDA SVM CSR

    #p_val:a list of decision values or probability estimates

      其余,还会有少数索要强调的是,它是基于libsvm的java版本转变过来的。也正因如此,小编感到到用起来恐怕会稍为辛劳,故并未有选拔。

    上面介绍一下livsvm在python中的具体选用办法:

    4、libsvmSharp by ccerhan

    重视介绍svmutil.py函数使用

      选拔它的理由很简短,有一定的下载量(从众心情又起来惹事了!)下载方便,用VS的Nuget package,通过命令“PM> Install-Package LibSVMsharp”即下载到当地。

    >>>from svmutil import *

    #读取LIBSVM数据,分别存入y,x列表,当中y为品种,x为陶冶样本

    >>>y, x = svm_read_problem(r'E:ProjectsPythonsvmlibheart_scale')

    #采纳前200个数据进行演习,svm_train重返的是model类,表示通过磨练产生的model

    >>>m =  svm_train(y[:200], x[:200], '-c 4' )

    #应用后陆十四个数据对教练的model m进行考查

    >>>p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

    #能够将操练发生的model保留成为文件

    >>> svm_save_model('heart_scale.model', m)

    #读取保存的model

    >>> m = svm_load_model('heart_scale.model')

    >>> p_新葡亰496net,label, p_acc, p_val = svm_predict(y, x, m, '-b 1')

    #获取操练核算结果

    >>> ACC, MSE, SCC = evaluations(y, p_label)

    5、libsvm-net by Nicolas Panel

    svmtuil.py中蕴藏下列首要函数

      下载起来同样丰裕平价: NuGet package : PM> Install-Package libsvm.net,比起libsvmSharp有更加高的人气。

    svm_train()        : 训练SVM模型

    【分析libsvmSharp】

    svm_predict()      : 预测测验数据结果

      为啥libsvmSharp.dll如此低效?

    svm_read_problem() : 读取数据.

      在反编写翻译后的源代码中(稍后将介绍如何反编译C#编写翻译出来的dll文件),大家能够观察libsvmSharp所用的数据结构有:

    svm_load_model()  : 加载SVM模型

        1、struct:svm_node、svm_model、svm_problem、svm_parameter;

    svm_save_model()  :保存SVM模型.

        2、calss:SVMNode、SVMModel、SVMProblem、SVMParameter。

    evaluations()      : 查验预测结果.

    实在,结构体能做的政工,类完全也能做,就如结构体未有存在的必得。

     还恐怕有下列函数

      何况,能够见见各个的兑现中,有过多“结构体=>类”、“指针=>结构体”、“类=>指针”等那样的类型调换。大家驾驭,C#要援引C 所编写翻译的dll,用得最多的就是IntPtr那几个数据结构。而libsvmSharp低效的因由,也正在于对指针的管理政策选拔不当,它只在须求传指针的时候,硬生生地用马尔斯hal类重新在内部存款和储蓄器中开拓当前数据结构大小的区域,并回到指针,美其名曰convert到指针。这种办法,无论是在岁月上依然空间上,都有太多没须求的浪费。

    svm_problem(y, x):重回叁个problem类,效用一样记录y,x列表

      这里咱们用libsvm中的svm_predict作为例子来讲学。

    svm_parameter('training_options'):重回二个parameter类,效率是记录参数选取

      在libsvm.dll(该dll由C 编写翻译获得)中,函数为:

    下边介绍下采纳进程中提到到的片段参数函数:

     double svm_predict(const svm_model *model, const svm_node *x)
    

    Options:可用的选项即意味着的涵义如下

      在libsvmSharp.dll(该dll由C#编写翻译拿到)中,大家如此申明它:

    -s   svm类型:SVM设置类型(默许0)

     [DllImport("libsvm.dll", CallingConvention = CallingConvention.Cdecl)]
     public static extern double svm_predict(IntPtr model, IntPtr x);
    

    0 -- C-SVC

      DllImport时,更加的多关于C 数据结构到C#数据结构的音信请读者查阅资料取得。由上可知,IntPtr是个很关键的数据结构,由它注明的变量实际上是三个指针值(即内部存款和储蓄器地址值)。第一个参数IntPtr model,须求传入model所在内部存款和储蓄器区域的地点,第三个参数IntPtr x,必要传入特征节点数组所在内部存款和储蓄器区域的地方。下边,大家看看libsvmSharp是怎么利用这么些函数的:

    1 -- v-SVC

     1         public static double Predict(SVMModel model, SVMNode[] x)
     2         {
     3             if (model == null)
     4             {
     5                 throw new ArgumentNullException("model");
     6             }
     7             if (x == null)
     8             {
     9                 throw new ArgumentNullException("x");
    10             }
    11             IntPtr intPtr = SVMModel.Allocate(model);
    12             double result = SVM.Predict(intPtr, x);
    13             SVMModel.Free(intPtr);
    14             return result;
    15         }
    16 
    17         public static double Predict(IntPtr ptr_model, SVMNode[] x)
    18         {
    19             if (ptr_model == IntPtr.Zero)
    20             {
    21                 throw new ArgumentNullException("ptr_model");
    22             }
    23             if (x == null)
    24             {
    25                 throw new ArgumentNullException("x");
    26             }
    27             List<SVMNode> list = (from a in x
    28             select a.Clone()).ToList<SVMNode>();
    29             list.Add(new SVMNode(-1, 0.0));
    30             IntPtr intPtr = SVMNode.Allocate(list.ToArray());
    31             double result = libsvm.svm_predict(ptr_model, intPtr);
    32             SVMNode.Free(intPtr);
    33             return result;
    34         }
    

    2–一类SVM

      留心的您有未有开掘什么样难点?看不懂?终究本人是以文害辞。可是,请看第11行,每一趟调用都要双重给model分配内部存储器哦!再如,第27、28、29、30行,在熟稔C 的人看来,that's what?参数字传送进来的可不是数组名吗,干嘛如此大费周折?内部存款和储蓄器不会被玩坏吗?

    3 -- e -SVR

      一切都以因为C#有指针,但不是非常我们所耳熟能详的指针。C#尚无像Java同样完全抛弃指针,但为了代码安全考虑而减弱指针。C#是面向对象的言语,里面其余一种数据结构都不曾指针这一属性,除非你和谐在定义数据结构时,将指针作为成员变量。大家所熟稔的EmguCV就是那样完成对OpenCV的wrapper的。

    4 -- v-SVR

    【开始libsvm的C# Wrapper之旅】

    -t   核函数类型:核函数设置类型(暗许2)

      很好,我们能够踏入正题了。作者将以wrapper libsvm为例,分步骤批注整个进度。读者能够举一个例子就类推其余的,希望本文能够辅助您加深你对跨语言编制程序的通晓。

    0–线性:u'v

      1.wrapper第一步(准备)

    1–多项式:(r*u'v coef0)^degree

      获取你要wrapper的dll(由C 编写翻译得到),最佳有源代码,当然有参谋手册也能够,但是若是除去dll的名字,对该dll一窍不通,这也许就不可能了。

    2–RBF函数:exp(-gamma|u-v|^2)

      安装C#的dll反编写翻译工具,这里推荐ILSpy。为啥要安装?比起谐和乌黑中检索,假使有能够参照他事他说加以考察借鉴的财富,数见不鲜是多么可惜的一件事呀。EmguCV真的可以称作wrapper中的精粹。

    3–sigmoid:tanh(r*u'v coef0)

    1. wrapper第二步(DllImport)

    -d  degree:核函数中的degree设置(针对多项式核函数)(私下认可3)

      首先,VS新建C#工程,项目项目选项类库,那样结尾生成应用方案后,便得以在bin/Debug目录下得到实用的dll文件了。作者将品种命名称为libsvmSharpCyc。

    -g  r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(私下认可1/ k)

      其次,增加必要wrapper的C dll文件。右键单击应用方案财富管理器中的libsvmSharpCyc,然后加多现成项,把libsvm.dll增多进项目。

    -r   coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((暗许0)

      接着,新建类,用于DllImport。小编建的是LsInvoke.cs,能够像下图所示这样,把想要使用的函数方法给Import进来:

    -c cost:设置C-SVC,e -SVEscort和v-SVEvoque的参数(损失函数)(私下认可1)

    新葡亰496net 5

    -n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)

      该进程中,DllImport要怎么运用,感兴趣的读者可自行学习,这里须求注意的是C 函数中的数据结构到C#中的数据结构是有炫丽关系的,上面附上一张dll引用常用转化表:

    -p p:设置e -SV智跑中损失函数p的值(暗许0.1)

                C              C#
            =====================================
            WORD              ushort
            DWORD             uint
            UCHAR             int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
            UCHAR*            string/IntPtr
            unsigned char*    [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
            char*             string
            LPCTSTR           string
            LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
            long              int
            ulong             uint
            Handle            IntPtr
            HWND              IntPtr
            void*             IntPtr
            int               int
            int*              ref int
            *int              IntPtr
            unsigned int      uint
            COLORREF          uint
    

    -m cachesize:设置cache内部存款和储蓄器大小,以MB为单位(默许40)

    3、wrapper第三步(数据结构)

    -e eps:设置允许的终止判据(暗中同意0.001)

      这一步是极其重大的一步,在C#中新建数据结构,必必要与C 中的数据结构相平等,不然蒙受不能够预想的主题素材。

    -h shrinking:是还是不是使用启发式,0或1(暗中同意1)

      前文已经简单地介绍过libsvm的数据结构了。这里再一次一下:

    -wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)

     1 struct svm_node
     2 {
     3     int index;
     4     double value;
     5 };
     6 
     7 struct svm_problem
     8 {
     9     int l;
    10     double *y;
    11     struct svm_node **x;
    12 };
    13 
    14 enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };    /* svm_type */
    15 enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
    16 
    17 struct svm_parameter
    18 {
    19     int svm_type;
    20     int kernel_type;
    21     int degree;    /* for poly */
    22     double gamma;    /* for poly/rbf/sigmoid */
    23     double coef0;    /* for poly/sigmoid */
    24 
    25     /* these are for training only */
    26     double cache_size; /* in MB */
    27     double eps;    /* stopping criteria */
    28     double C;    /* for C_SVC, EPSILON_SVR and NU_SVR */
    29     int nr_weight;        /* for C_SVC */
    30     int *weight_label;    /* for C_SVC */
    31     double* weight;        /* for C_SVC */
    32     double nu;    /* for NU_SVC, ONE_CLASS, and NU_SVR */
    33     double p;    /* for EPSILON_SVR */
    34     int shrinking;    /* use the shrinking heuristics */
    35     int probability; /* do probability estimates */
    36 };
    37 
    38 //
    39 // svm_model
    40 // 
    41 struct svm_model
    42 {
    43     struct svm_parameter param;    /* parameter */
    44     int nr_class;        /* number of classes, = 2 in regression/one class svm */
    45     int l;            /* total #SV */
    46     struct svm_node **SV;        /* SVs (SV[l]) */
    47     double **sv_coef;    /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
    48     double *rho;        /* constants in decision functions (rho[k*(k-1)/2]) */
    49     double *probA;        /* pariwise probability information */
    50     double *probB;
    51     int *sv_indices;        /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
    52 
    53     /* for classification only */
    54 
    55     int *label;        /* label of each class (label[k]) */
    56     int *nSV;        /* number of SVs for each class (nSV[k]) */
    57                 /* nSV[0]   nSV[1]   ...   nSV[k-1] = l */
    58     /* XXX */
    59     int free_sv;        /* 1 if svm_model is created by svm_load_model*/
    60                 /* 0 if svm_model is created by svm_train */
    61 };
    

    -v n: n-fold交互核准格局,n为fold的个数,必得超过等于2

      对应地,我们在C#中确立数据结构:

    其间-g选项中的k是指输入数据中的属性数。option -v随机地将数据剖分为n部

        public struct svm_node
        {
            /// <summary>
            /// 索引
            /// </summary>
            public int index;
    
            /// <summary>
            /// 值
            /// </summary>
            public double value;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="i"></param>
            /// <param name="v"></param>
            public svm_node(int i,double v)
            {
                this.index = i;
                this.value = v;
            }
            public bool Equals(svm_node x)
            {
                return this.index.Equals(x.index) && this.value.Equals(x.value);
            }
        }
        public struct svm_problem
        {
            /// <summary>
            /// 支持向量个数
            /// </summary>
            public int l;
    
            /// <summary>
            /// 标签值
            /// </summary>
            public IntPtr y;
    
            /// <summary>
            /// 节点情况
            /// </summary>
            public IntPtr x;
        }
        ……
    

    1)假设你要输出类的概率,必要求有-b参数

      只怕有读者会问,结构体你加构造函数和任何函数干嘛?那实质上是为了未来好简化代码。不然,每一次对象创设于赋值分开操作有一点点勤奋。

    2)C平日能够选择为:10^t , t=- 4..4正是0.0001到10000

      实行到前几天,大家只是完毕了数据结构搭建的一小部分,下面是从EmguCV中学习到的精髓部分!就要下篇作介绍~

    采纳的越大,表示对错误例惩罚程度越大,恐怕会产生模型过拟合

    在LIBSVM中-t用来钦命核函数类型(暗中同意值是2)。

    3)与核函数相对应的libsvm参数:

    (1)对于线性核函数,未有特意要求安装的参数

    (2))对于多项式核函数,有八个参数。-d用来安装多项式核函数的参天此项目和次数数,约等于公式中的d,暗许值是3。-g用来安装核函数中的gamma参数设置,也便是公式中的第三个r(gamma),暗中认可值是1/k(k是种类数)。-r用来安装核函数中的coef0,也正是公式中的第4个r,私下认可值是0。

    (3)对于RBF核函数,有三个参数。-g用来安装核函数中的gamma参数设置,也正是公式中的首个r(gamma),暗中同意值是1/k(k是连串数)。

    (4)对于sigmoid核函数,有多个参数。-g用来设置核函数中的gamma参数设置,也正是公式中的第一个r(gamma),暗中认可值是1/k(k是连串数)。-r用来安装核函数中的coef0,也正是公式中的第四个r,暗中认可值是0。

    运作结果中突显的多少个参数含义为:

    rho 为宣判函数的常数项b#iter为迭代次数,nu 与前方的操作参数-n n 一样,obj为SVM文件调换为的二次规划求解获得的细微值,nSV 为补助向量个数,nBSV为界线上的辅助向量个数,Total nSV为支撑向量总个数。

    下边介绍下LIBSVM提供的多少个工具包

    svm-scale:

    这是能够放缩输入数据的工具

    grid.py:

    放缩后的数目开展最优参数选取

    subset.py

    机关选取子集减弱锻炼量

    checkdata.py

    自己争执是不是顺应LIBSVM格式

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:libsvm的使用方法,使用小结

    关键词: