SVM 多分类 -SVM分类opencv3.0源代码
SVM的理论知识见 SVM的一些总结与认识 --入门级
之前一直以为,用SVM做多分类,不就是用多个SVM分类么,请形状类似于一个二叉树,如下:
即,将所有样本当作输入,其中在训练第一个分类器SVM_1的时候,其正样本为属于类别1的样本,其负样本为剩余的其他所有样本,这就称为 一对其余法,这样做虽然训练的时间从道理上来讲是相对较快的,但是它会带来一系列的问题:
1. 有可能有一个样本在部分分类器 (多于一个,比如2个SVM中,或者更加极端的情况是在所有分类器) 中将其分为正(负)样本,简单的说,就是有不止一个分类器声称它 属于自己,那么便出现错误。相反,如果说,没有一个分类器声称它属于某一个分类器,那么同样出现误分类,
2.一经误分类,则结果误分类。
3.数据集倾斜。这个问题是最影响训练出来的分类器性能的情况,就是说,在训练其中一个训练器的时候,只有某一类作为正样本,其余类别作为负样本,那么导致正 负样本数量出现严重不平衡情况。
其优点明显弱于确定,所以这种情形在实际应用中是不可取的。
第二种方法:一对一
实际应用中,第一种方法得到的模型精度不高,训练时间也同样不占优势。那么这一对一的方法又是怎么回事儿呢?顾名思义:训练多个二分类SVM,也就是任意两个类别训练一个SVM,这样会有一个问题,比如:我有4类样本,按照这种方法多分类的话,需要训练6个SVM,推广到k 个类别则需要k(k-1)/2 个分类器。但他是怎么分类的呢?
简单的说,投票!所有分类器都对这个样本做一个分类(预测),得到的分类结果最多,那么就将这个样本分到这一类。这样做的好处就是,样本怎么样都会有一个预测值,而不会出现无类别的预测结果。目前流行的SVM工具包 LIBSVM--台湾大学.Chih-Chung Chung and Chih-Jen Lin 就是用的这种方法作为SVM多分类的方法。
第三种方法:DAG SVM
其结构形状如下:
这样分类时,我们可以先问分类器 1v5 (意思是它能回答“是第1类还是第5类”) ,如果回答是5,即往左走,再问“是2还是5”,这样一直问下去,这样做的好处其实是,我们在分类的时候,实际上只是调用了4个分类器。耗时更短,同样不会出现分类重叠或不可分类现象。
现在DAG方法根节点的选取(也就是如何选第一个参与分类的分类器),也有一些方法可以改善整体效果,我们总希望根节点少犯错误为好,因此参与第一次分类的两个类别,最好是差别特别特别大,大到以至于不太可能把他们分错;或者我们就总取在两类分类中正确率最高的那个分类器作根节点,或者我们让两类分类器在分类的时候,不光输出类别的标签,还输出一个类似“置信度”的东东,当它对自己的结果不太自信的时候,我们就不光按照它的输出走,把它旁边的那条路也走一走,等等。
---------------------- OpenCV3.0 SVM分类代码 -------------
下面是在OpenCV3.0+Vs2013的平台上(其配置方法见本人另一博文 win7平台下vs2013配置OpenCV3.0 )的SVM分类代码
- #include <opencv2/core.hpp>
- #include <opencv2/imgproc.hpp>
- #include "opencv2/imgcodecs.hpp"
- #include <opencv2/highgui.hpp>
- #include <opencv2/ml.hpp>
- using namespace std;
- using namespace cv;
- using namespace cv::ml;
- int main(int, char**)
- {
- // Data for visual representation
- int width = 512, height = 512;
- Mat image = Mat::zeros(height, width, CV_8UC3);
- // Set up training data
- //! [setup1]
- int labels[4] = { 1, -1, -1, 1 };
- float trainingData[4][2] = { { 1, 2 }, { -1, -10 }, { 1, -2 }, { 2, 1 } };
- //! [setup1]
- //! [setup2]
- Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
- Mat labelsMat(4, 1, CV_32SC1, labels);
- //! [setup2]
- // Train the SVM
- //! [init]
- Ptr<SVM> svm = SVM::create();
- svm->setType(SVM::C_SVC);
- svm->setKernel(SVM::LINEAR);
- svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
- //! [init]
- //! [train]
- svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);
- //! [train]
- // Show the decision regions given by the SVM
- //! [show]
- Vec3b green(0, 255, 0), blue(255, 0, 0);
- for (int i = 0; i < image.rows; ++i)
- for (int j = 0; j < image.cols; ++j)
- {
- Mat sampleMat = (Mat_<float>(1, 2) << j, i);
- float response = svm->predict(sampleMat);
- if (response == 1)
- image.at<Vec3b>(i, j) = green;
- else if (response == -1)
- image.at<Vec3b>(i, j) = blue;
- }
- //! [show]
- // Show the training data
- //! [show_data]
- int thickness = -1;
- int lineType = 8;
- circle(image, Point(1, 2), 5, Scalar(0, 0, 0), thickness, lineType);
- circle(image, Point(-1, -10), 5, Scalar(255, 255, 255), thickness, lineType);
- circle(image, Point(1, -2), 5, Scalar(255, 255, 255), thickness, lineType);
- circle(image, Point(2, 1), 5, Scalar(255, 255, 255), thickness, lineType);
- //! [show_data]
- // Show support vectors
- //! [show_vectors]
- thickness = 2;
- lineType = 8;
- Mat sv = svm->getSupportVectors();
- for (int i = 0; i < sv.rows; ++i)
- {
- const float* v = sv.ptr<float>(i);
- circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thickness, lineType);
- }
- //! [show_vectors]
- Mat res;
- float teatData[1][2] = { { 1, -11 } };
- Mat query(1, 2, CV_32FC1, teatData);
- svm->predict(query, res);
- cout << res;
- imwrite("result.png", image); // save the image
- imshow("SVM Simple Example", image); // show it to the user
- waitKey(0);
- }
需要说明的是:在OpenCV中,SVM多分类方式被隐藏参数,在调用函数svm->train() 时,定义函数参数时候,直接输入多类别样本以及其标签即可
SVM 多分类 -SVM分类opencv3.0源代码相关推荐
- 基于SVM的点云分类(树木,建筑两类)
西南某高校遥感专业在读生(个人网站:YhQIAO)这学期选了院里张老师的<三维扫描技术>选修课,干货满满,期末有个大作业svm点云分类,正好前段时间对机器学习比较感兴趣,了解了点算法,但是 ...
- SVM学习(一)SVM模型训练与分类
SVM模型训练与分类 支持向量机(SVM): 一个能够将不同类样本在样本空间分隔的超平面.换句话说,给定一些标记好的训练本(监督式学习),SVM算法输出一个最优化的超分隔平面.本次利用VS2015+O ...
- Matlab 基于svm的图像物体分类
matlab 图像分类 本周工作日志,老师布置了一个小作业,让我们使用matlab实现图像物体分类 目录 文章目录 matlab 图像分类 目录 1分类原理 2程序流程 补充 1分类原理 基于一个很朴 ...
- 机器学习(二十一)——Optimizer, 单分类SVM多分类SVM, 时间序列分析
http://antkillerfarm.github.io/ Optimizer 在<机器学习(一)>中,我们已经指出梯度下降是解决凸优化问题的一般方法.而如何更有效率的梯度下降,就是本 ...
- sklearn svm如何选择核函数_文本挖掘篇|利用SVM进行短文本分类
何为数据挖掘,顾名思义就是从大量数据中挖掘或抽取出知识.在实际中,进行数据挖掘的数据不仅仅有数值型数据,还有图片型数据,文本型数据等.而所谓文本挖掘,就是从大量文本数据中,提取出对信息使用者有价值的信 ...
- matlab图像分类器,Matlab 基于svm的图像物体分类
Matlab 基于svm的图像物体分类 发布时间:2018-05-16 20:27, 浏览次数:1623 , 标签: Matlab svm 本周工作日志,老师布置了一个小作业,让我们使用matlab实 ...
- 对鸢尾花数据集和月亮数据集,分别采用线性LDA、k-means和SVM算法进行二分类可视化分析
一.支持向量机 支持向量机是一个功能强大并且全面的机器学习模型,它可以执行线性或者非线性分类,回归甚至异常检测任务.其主要分为三类:线性SVM分类.软间隔分类.非线性SVM分类. 本篇博客将重点深入S ...
- 基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)
基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类) 一.数据集说明 训练样本来自于github上的EasyPR的c++版本,包含一万三千多张数字及大写字母的图片以及三千多张中 ...
- Opencv3.0 手写数字识别(Hog特征+SVM分类器)
配置:VS2013+Opencv3.0 参考: http://blog.csdn.net/iamzhangzhuping/article/details/51254567 http://blog.cs ...
- 使用SVM分类器做颜色分类走过的坑
1.保存与调用训练模型,通常训练一个模型需要很长时间,如果我们每一次想使用这个模型都需要重新训练的话,会浪费大量时间,所以我们需要用到模型的保存与调用,用到了sklearn库中的joblib模块,具体 ...
最新文章
- 【工具】PC端调试手机端 Html 页面的工具
- python if else格式_Python if else条件语句详解
- PHP服务器端语言是什么意思,PHP作为服务器端语言,有哪些优点?
- 最新M1芯片的MacBook Pro打开软件闪退解决方法
- matlab教程课后答案肖汉光,MATLAB大学教程
- 计算机文化基础(高职高专版 第十一版)第七章 答案
- 东北大学大物实验思考题答案解析
- Hadoop去掉格,换行符,制表符,回车符,换页符【好吧,其实用正则表达式一下子就搞定了】
- 当女生说没衣服穿时。。。。
- Matlab获取tif各格点经纬度
- MATLAB读视频报错 Unable to initialize the video obtain properties (videoreader in Matlab)
- python jit_Pypy Python的JIT实现
- 倍福PLC在NC轴报错代码18000原因分析
- Teradata语法树——insert
- 2017计算机及应用自考试题及答案,2018年考研管理类联考试题及参考答案
- 抖音取图小程序,同款抖音壁纸,表情包小程序搭建
- 关于嵌套结构体大小的计算
- 工程制图计算机考试题库,2017年CAD期末考试复习题库「附答案」
- 软件案例分析:商业音乐软件还是开源音乐软件?
- Mybatis动态传入order by
热门文章
- 金庸群侠传修改器链接服务器,金庸群侠传全能修改器
- 项目实习(三)操作系统设计
- Word文档编号工具,Word标题,图、表手动编号工具
- python简易学生信息管理系统
- 固高运动控制卡学习1--运动模式介绍(1)--点位,Gear,Jog,插补
- 7-4 散列表查找(PTA程序设计)
- IP地址资源的分配和管理
- 收银系统 mysql数据库_解决哗啦啦收银系统数据库备份问题
- PCIE协议(原版) 免费分享
- python网址规律_数列规律寻找 - python 爬虫 OEIS (2020.10.6更新)