当前位置:首页 > 代码 > 正文

svm算法c源代码(svm算法原理详解)

admin 发布:2022-12-19 18:04 277


今天给各位分享svm算法c源代码的知识,其中也会对svm算法原理详解进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

有没有用c或c++实现svm算法

林智仁 的libsvm 就是C实现的SVM算法代码,回答不能带链接,你去搜一下libsvm就能找到了.你可以找到他的主页,上面还会有算法的具体介绍,和libsvm的使用. 这个估计是使用最广泛的求解svm的工具包. 里面的代码都是可以看的.

理论的话,july写的一篇文章很经典, 搜索 支持向量机通俗导论(理解SVM的三层境界) 就能找到.

另外看楼主是想学习人工智能算法的, 附加一个学习神经网络的网络, 神经网络之家 nnetinfo ,专讲神经网络的,还有相关视频.

都是本人学习过程了解到的干货, 望采纳.

SVM算法-推导

第一部分:从几何意义到数学表达

第三部分:SMO

求解第二部分最后推导出的最小化问题,每次固定两个lambda,由于有最后一个条件限制:lambdai*yi + lambdaj yj = const,labmdai可以用lambdaj表达出来,最小化函数是一个抛物线,开口朝上,求导,令导数为0,获得没有限制的最优化问题,由于lambdai = 0(第1个限制条件),做一个clipping,获得在限制条件下的lambdai最优解,然后也能求得lambdaj,就完成了一次lambdai和lambdaj的更新迭代。

一般取最违反KKT条件的lambdai和lambdaj来做更新。

svm软间隔

svm的核函数选择

一般选择高斯核函数,线性核函数是高斯核函数的一个特例;在特定的参数下,sigmoid核函数和高斯核函数具有类似的作用;相比于多项式核函数,高斯核函数的参数更少,更好调,当然,如果能把多项式核函数的参数调好,有可能会获得更好的效果。对于特征数量非常大的情况,会更倾向于使用线性核函数。

为什么要转化为对偶问题?

高斯核函数无限维的理解

怎么把matlab训练的svm模型用在c++

将libsvm的C++源代码 svm.h 和 svm.cpp 加入你的C++项目

#include "svm.h"

然后用

svm_load_model(const char *model_file_name);

来载入一个保存的model,

svm_predict(const struct svm_model *model, const struct svm_node *x);

来使用model做决策

svm的输入和输出问题

你好,LIBSVM简介 [.v5o#Vd

sH:Luo+]

支持向量机所涉及到的数学知识对一般的化学研究者来说是比较难的,自己编程实现该算法难度就更大了。但是现在的网络资源非常发达,而且国际上的科学研究者把他们的研究成果已经放在网络上,免费提供给用于研究目的,这样方便大多数的研究者,不必要花费大量的时间理解SVM算法的深奥数学原理和计算机程序设计。目前有关SVM计算的相关软件有很多,如LIBSVM、mySVM、SVMLight等,这些软件大部分的免费下载地址和简单介绍都可以在[url]

[/url]上获得。 pq2j j.XL7m4B

LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件还有一个特点,就是对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数就可以解决很多问题;并且提供了交互检验(Cross Validation)的功能。该软件包可以在[url]

[/url]免费获得。该软件可以解决C-SVM分类、-SVM分类、-SVM回归和-SVM回归等问题,包括基于一对一算法的多类模式识别问题。在第2章中我们也介绍了该软件的一些优点,因此通过综合考虑,我们决定采用该软件作为工作软件。SVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,目前国际上还没有形成一个统一的模式,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优。

4lE qC iC mt'j?)FN"b

LIBSVM使用方法 p-t8\q9P!e(jVL6e

1XP6S+YzWZ LibSVM是以源代码和可执行文件两种方式给出的。如果是Windows系列操作系统,可以直接使用软件包提供的程序,也可以进行修改编译;如果是Unix类系统,必须自己编译,软件包中提供了编译格式文件,我们在SGI工作站(操作系统IRIX6.5)上,使用免费编译器GNU C++3.3编译通过。 |U4E P})T/u

8rur3[8U.zeQ9VX

LIBSVM使用的数据格式 W2}p]lU

该软件使用的训练数据和检验数据文件格式如下: x4Vy\ G1y6g\3~

label index1:value1 index2:value2 ...

6a X)Ix9l@4cU {2q 其中label 是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意实数。index 是以1开始的整数,可以是不连续的;value为实数,也就是我们常说的自变量。检验数据文件中的label只用于计算准确度或误差,如果它是未知的,只需用一个数填写这一栏,也可以空着不填。在程序包中,还包括有一个训练数据实例:heart_scale,方便参考数据文件格式以及练习使用软件。

H'?-]1a%HC Us 可以编写小程序,将自己常用的数据格式转换成这种格式

"pm2M;L7E{~5t

mLf \*?8n"x9A Svmtrain和Svmpredict的用法

g Ddk2C-Cd LIBSVM软件提供的各种功能都是DOS命令执行方式。我们主要用到两个程序,svmtrain(训练建模)和svmpredict(使用已有的模型进行预测),下面分别对这两个程序的使用方法、各参数的意义以及设置方法做一个简单介绍:

8x*l/L/E0b Svmtrain的用法:svmtrain [options] training_set_file [model_file] U1NjN e f%W}0R

Options:可用的选项即表示的涵义如下

'fH*{2_5u -s svm类型:SVM设置类型(默认0)

_`"JB+i@9~ 0 -- C-SVC O)Z5y$E$c#Cy

1 --v-SVC

MQL(d;t 2 – 一类SVM

$E(@D ShN 3 -- e -SVR

] K ]V~b+t0}2Gl 4 -- v-SVR

J0j5|rJ[ -t 核函数类型:核函数设置类型(默认2)

,pvvLy O 0 – 线性:u'v Cj-AB;jn8Cbk

1 – 多项式:(r*u'v + coef0)^degree 7nq{|q*] @1{3T

2 – RBF函数:exp(-r|u-v|^2) o4S JB-zV2P%?,C

3 –sigmoid:tanh(r*u'v + coef0) \"m w._)u|,Bu4C

-d degree:核函数中的degree设置(默认3) K0?8R!fR;g+W2k

-g r(gama):核函数中的函数设置(默认1/ k) :u6r%p*o$QG

-r coef0:核函数中的coef0设置(默认0) xOLjbX(y

-c cost:设置C-SVC, -SVR和-SVR的参数(默认1) Y:N.Jv8v

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

;r:h%XN2HH6Bf -p e:设置 -SVR 中损失函数的值(默认0.1) sW'o.m-R7]

-m cachesize:设置cache内存大小,以MB为单位(默认40)

:K ^*y[BE7]\7U -e :设置允许的终止判据(默认0.001) )rI#@C7F5Q Rw,J R']Vz{

-h shrinking:是否使用启发式,0或1(默认1) "|g6wfu

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

4Rf W-~|oY] -v n: n-fold交互检验模式 Js}7een\{c

其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,文件中包括支持向量样本数、支持向量样本以及lagrange系数等必须的参数;该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。 E M%WTF

Svmpredict的用法:svmpredict test_file model_file output_file 1bv R [?d

model_file是由svmtrain产生的模型文件;test_file是要进行预测的数据文件;Output_file是svmpredict的输出文件。svm-predict没有其它的选项。 FOiJEO4vsVo#Q

Sx$^O+K7I@-V;z(M svmtrain -s 0 -c 1000 -t 1 -g 1 -r 1 -d 3 data_file VAHQ!cm+b*Q)t U

训练一个由多项式核(u'v+1)^3和C=1000组成的分类器。 u:p+jD5q"Pr

svmtrain -s 1 -n 0.1 -t 2 -g 0.5 -e 0.00001 data_file

JxJA.J8n t/D*[+Kd 在RBF核函数exp(-0.5|u-v|^2)和终止允许限0.00001的条件下,训练一个-SVM ( = 0.1)分类器。

9P |4Q'xM}7mo[K!T svmtrain -s 3 -p 0.1 -t 0 -c 10 data_file

1| A {;}9R{+qI 以线性核函数u'v和C=10及损失函数= 0.1求解SVM回归。;^ 27118希望对你有帮助!

手撕SVM(公式推导+代码实现)(三)

前面我们进行了很多的理论性研究,下面我们开始用代码进行实现。

这个数据集显然线性可分。

[-1.0,

-1.0,

1.0,

-1.0,

1.0,

1.0,

1.0,

-1.0,

-1.0,

-1.0,

-1.0,

-1.0,

-1.0,

1.0,

-1.0,

1.0,

1.0,

-1.0,

1.0,

-1.0,

-1.0,

-1.0,

1.0,

-1.0,

-1.0,

1.0,

1.0,

-1.0,

-1.0,

-1.0,

-1.0,

1.0,

1.0,

1.0,

1.0,

-1.0,

1.0,

-1.0,

-1.0,

1.0,

-1.0,

-1.0,

-1.0,

-1.0,

1.0,

1.0,

1.0,

1.0,

1.0,

-1.0,

1.0,

1.0,

-1.0,

-1.0,

1.0,

1.0,

-1.0,

1.0,

-1.0,

-1.0,

-1.0,

-1.0,

1.0,

-1.0,

1.0,

-1.0,

-1.0,

1.0,

1.0,

1.0,

-1.0,

1.0,

1.0,

-1.0,

-1.0,

1.0,

-1.0,

1.0,

1.0,

1.0,

1.0,

1.0,

1.0,

1.0,

-1.0,

-1.0,

-1.0,

-1.0,

1.0,

-1.0,

1.0,

1.0,

1.0,

-1.0,

-1.0,

-1.0,

-1.0,

-1.0,

-1.0,

-1.0]

可以看出来,这里使用的类别标签是-1和1

SMO算法的伪代码:

L==H

第0次迭代 样本:1, alpha优化次数:1

第0次迭代 样本:3, alpha优化次数:2

第0次迭代 样本:5, alpha优化次数:3

L==H

第0次迭代 样本:8, alpha优化次数:4

L==H

j not moving enough

j not moving enough

L==H

L==H

j not moving enough

L==H

第0次迭代 样本:30, alpha优化次数:5

第0次迭代 样本:31, alpha优化次数:6

L==H

L==H

第0次迭代 样本:54, alpha优化次数:7

L==H

L==H

第0次迭代 样本:71, alpha优化次数:8

L==H

L==H

L==H

第0次迭代 样本:79, alpha优化次数:9

L==H

第0次迭代 样本:92, alpha优化次数:10

j not moving enough

L==H

迭代次数:0

第0次迭代 样本:1, alpha优化次数:1

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

L==H

L==H

j not moving enough

j not moving enough

j not moving enough

j not moving enough

L==H

j not moving enough

L==H

L==H

j not moving enough

j not moving enough

第0次迭代 样本:37, alpha优化次数:2

第0次迭代 样本:39, alpha优化次数:3

第0次迭代 样本:52, alpha优化次数:4

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

第0次迭代 样本:71, alpha优化次数:5

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

迭代次数:0

j not moving enough

j not moving enough

j not moving enough

第0次迭代 样本:8, alpha优化次数:1

L==H

j not moving enough

第0次迭代 样本:23, alpha优化次数:2

L==H

j not moving enough

j not moving enough

L==H

j not moving enough

j not moving enough

j not moving enough

第0次迭代 样本:39, alpha优化次数:3

L==H

j not moving enough

第0次迭代 样本:52, alpha优化次数:4

j not moving enough

第0次迭代 样本:55, alpha优化次数:5

L==H

L==H

L==H

L==H

L==H

j not moving enough

第0次迭代 样本:79, alpha优化次数:6

第0次迭代 样本:92, alpha优化次数:7

迭代次数:0

j not moving enough

L==H

j not moving enough

j not moving enough

L==H

j not moving enough

第0次迭代 样本:23, alpha优化次数:1

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

L==H

L==H

第0次迭代 样本:51, alpha优化次数:2

j not moving enough

j not moving enough

j not moving enough

j not moving enough

L==H

第0次迭代 样本:69, alpha优化次数:3

L==H

j not moving enough

第0次迭代 样本:94, alpha优化次数:4

j not moving enough

j not moving enough

迭代次数:0

j not moving enough

j not moving enough

j not moving enough

j not moving enough

j not moving enough

...

迭代次数:497

j not moving enough

j not moving enough

j not moving enough

迭代次数:498

j not moving enough

j not moving enough

j not moving enough

迭代次数:499

j not moving enough

j not moving enough

j not moving enough

迭代次数:500

opencv svm怎么把特征转成svm中train函数需要的Mat类型

OpenCV开发SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(Lin Chih-Jen)等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。用OpenCV使用SVM算法的大概流程是1)设置训练样本集需要两组数据,一组是数据的类别,一组是数据的向量信息。2)设置SVM参数利用CvSVMParams类实现类内的成员变量svm_type表示SVM类型:CvSVM::C_SVC C-SVCCvSVM::NU_SVC v-SVCCvSVM::ONE_CLASS 一类SVMCvSVM::EPS_SVR e-SVRCvSVM::NU_SVR v-SVR成员变量kernel_type表示核函数的类型:CvSVM::LINEAR 线性:u‘vCvSVM::POLY 多项式:(r*u'v + coef0)^degreeCvSVM::RBF RBF函数:exp(-r|u-v|^2)CvSVM::SIGMOID sigmoid函数:tanh(r*u'v + coef0)成员变量degree针对多项式核函数degree的设置,gamma针对多项式/rbf/sigmoid核函数的设置,coef0针对多项式/sigmoid核函数的设置,Cvalue为损失函数,在C-SVC、e-SVR、v-SVR中有效,nu设置v-SVC、一类SVM和v-SVR参数,p为设置e-SVR中损失函数的值,class_weightsC_SVC的权重,term_crit为SVM训练过程的终止条件。其中默认值degree = 0,gamma = 1,coef0 = 0,Cvalue = 1,nu = 0,p = 0,class_weights = 03)训练SVM调用CvSVM::train函数建立SVM模型,第一个参数为训练数据,第二个参数为分类结果,最后一个参数即CvSVMParams4)用这个SVM进行分类调用函数CvSVM::predict实现分类5)获得支持向量除了分类,也可以得到SVM的支持向量,调用函数CvSVM::get_support_vector_count获得支持向量的个数,CvSVM::get_support_vector获得对应的索引编号的支持向量。实现代码如下:view plain// step 1: float labels[4] = {1.0, -1.0, -1.0, -1.0}; Mat labelsMat(3, 1, CV_32FC1, labels); float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} }; Mat trainingDataMat(3, 2, CV_32FC1, trainingData); // step 2: CvSVMParams params; params.svm_type = CvSVM::C_SVC; params.kernel_type = CvSVM::LINEAR; params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); // step 3: CvSVM SVM; SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params); // step 4: Vec3b green(0, 255, 0), blue(255, 0, 0); for (int i=0; iimage.rows; i++) { for (int j=0; jimage.cols; j++) { Mat sampleMat = (Mat_float(1,2) i,j); float response = SVM.predict(sampleMat); if (fabs(response-1.0) 0.0001) { image.atVec3b(j, i) = green; } else if (fabs(response+1.0) 0.001) { image.atVec3b(j, i) = blue; } } } // step 5: int c = SVM.get_support_vector_count(); for (int i=0; i i++) { const float* v = SVM.get_support_vector(i); } OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。注意,新版本的C++接口除了Haar特征以外也可以使用LBP特征。先介绍一下相关的结构,级联分类器的计算特征值的基础类FeatureEvaluator,功能包括读操作read、复制clone、获得特征类型getFeatureType,分配图片分配窗口的操作setImage、setWindow,计算有序特征calcOrd,计算绝对特征calcCat,创建分类器特征的结构create函数。级联分类器类CascadeClassifier。目标级联矩形的分组函数groupRectangles。接下来,我尝试使用CascadeClassifier这个级联分类器类检测视频流中的目标(haar支持的目标有人脸、人眼、嘴、鼻、身体。这里尝试比较成熟的人脸和眼镜)。用load函数加载XML分类器文件(目前提供的分类器包括Haar分类器和LBP分类器(LBP分类器数据较少))具体步骤如下:1)加载级联分类器调用CascadeClassifier类成员函数load实现,代码为:view plainCascadeClassifier face_cascade; face_cascade.load("haarcascade_frontalface_alt.xml"); 2)读取视频流这部分比较基础啦~~从文件中读取图像序列,读取视频文件,读取摄像头视频流看过我之前的文章,这3种方法应该了然于心。3)对每一帧使用该分类器这里先将图像变成灰度图,对它应用直方图均衡化,做一些预处理的工作。接下来检测人脸,调用detectMultiScale函数,该函数在输入图像的不同尺度中检测物体,参数image为输入的灰度图像,objects为得到被检测物体的矩形框向量组,scaleFactor为每一个图像尺度中的尺度参数,默认值为1.1,minNeighbors参数为每一个级联矩形应该保留的邻近个数(没能理解这个参数,-_-|||),默认为3,flags对于新的分类器没有用(但目前的haar分类器都是旧版的,CV_HAAR_DO_CANNY_PRUNING利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域,CV_HAAR_SCALE_IMAGE就是按比例正常检测,CV_HAAR_FIND_BIGGEST_OBJECT只检测最大的物体,CV_HAAR_DO_ROUGH_SEARCH只做初略检测),默认为0.minSize和maxSize用来限制得到的目标区域的范围。这里调用的代码如下:view plainface_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); 4)显示目标这个也比较简单,调用ellips函数将刚才得到的faces矩形框都显示出来更进一步,也可以在得到的每一幅人脸中得到人眼的位置,调用的分类器文件为haarcascade_eye_tree_eyeglasses.xml,先将脸部区域选为兴趣区域ROI,重复上诉步骤即可,这里就不详细介绍了。当然,感兴趣的朋友也可以试试其他的xml文件作为分类器玩一下啊,感觉LBP特征虽然xml文件的大小很小,但效果还可以,不过我没有做过多的测试。光说不练假把式,最后贴上效果图和源代码的下载地址代码下载地址:配套的教程Tutorials对于Video的部分,没有实例进行说明,我只能摸石头过河啦,之前试过一个camShift做目标检测,这次试一试光流法做运动估计。这里使用的光流法是比较常用的 Lucas-Kanade方法。对于光流法的原理,我就不过多介绍了,主要讲使用OpenCV如何实现。首先利用goodFeaturesToTrack函数得到图像中的强边界作为跟踪的特征点,接下来要调用calcOpticalFlowPyrLK函数,输入两幅连续的图像,并在第一幅图像里选择一组特征点,输出为这组点在下一幅图像中的位置。再把得到的跟踪结果过滤一下,去掉不好的特征点。再把特征点的跟踪路径标示出来。说着好简单哦~~程序的效果和代码下载视频捕捉的对象中,背景通常保持不变。一般分析中关注移动的前景物体,威力提取出前景物体,需要建立背景的模型,将模型和当前帧进行比对检测前景物体。前景提取应用非常广泛,特别是在智能监控领域中。如果有不含前景物体的背景图片,提取前景的工作相对容易,只需要比对当前帧和背景图片的不同,调用函数absdiff实现。但是大多数情况,获得背景图片是不可能的,比如在复杂的场景下,或者有光线条件的变化。因此,就需要动态的变换背景。一种简单的办法是对所观察到的图片取平均,但这样做也有很多弊端,首先,这种办法在计算背景图片的前需要输入大量的图片,其次我们进行取平均的过程中不能有前景物体进入。所以一种相对好的办法是动态建立背景图片并实时更新。具体的实现过程主要分为两部分:一部分是调用absdiff函数找出当前图片和背景图片的区别,这之中使用了threshold函数去除为前景,当前图片像素与背景图片像素变化超过一定阈值的时候才认定其为前景;另一个工作是更新背景图片,调用函数accumulateWeighted,根据权重参数可以调整背景更新的速度,将当前图片更新到背景中,这里巧妙利用得到的前景提取结果作为mask,在更新背景图片的过程中避免了前景的干扰。程序效果如图,代码下载地址为虽然可以调整阈值参数和权重更新速度调节前景提取的结果,但从测试视频可以发现,树叶的运动对结果的干扰还是不小的,特别对于第一帧出现前景的情况,由于后续更新背景都是对前景mask后对背景进行更新的,所以第一帧的前景部分对背景的影响因子很难被更新掉。这里提出一种改进的办法——混合高斯模型。可以使一个像素具有更多的信息,这样可以有效的减少类似树叶的不停飘动,水波的不停荡漾这种对前景的干扰。这个精密的算法比之前我所介绍的简单方法要复杂很多,不易实现。还好,OpenCV已经为我们做好了相关工作,将其封装在类BackgroundSubtractorMOG,使用起来非常方便。实现代码如下:view plainMat frame; Mat foreground; // 前景图片 namedWindow("Extracted Foreground"); // 混合高斯物体 BackgroundSubtractorMOG mog; bool stop(false); while (!stop) { if (!capture.read(frame)) { break; } // 更新背景图片并且输出前景 mog(frame, foreground, 0.01); // 输出的前景图片并不是2值图片,要处理一下显示 threshold(foreground, foreground, 128, 255, THRESH_BINARY_INV);

关于svm算法c源代码和svm算法原理详解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/16610.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载