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分类代码

[cpp] view plain copy
  1. #include <opencv2/core.hpp>
  2. #include <opencv2/imgproc.hpp>
  3. #include "opencv2/imgcodecs.hpp"
  4. #include <opencv2/highgui.hpp>
  5. #include <opencv2/ml.hpp>
  6. using namespace std;
  7. using namespace cv;
  8. using namespace cv::ml;
  9. int main(int, char**)
  10. {
  11. // Data for visual representation
  12. int width = 512, height = 512;
  13. Mat image = Mat::zeros(height, width, CV_8UC3);
  14. // Set up training data
  15. //! [setup1]
  16. int labels[4] = { 1, -1, -1, 1 };
  17. float trainingData[4][2] = { { 1, 2 }, { -1, -10 }, { 1, -2 }, { 2, 1 } };
  18. //! [setup1]
  19. //! [setup2]
  20. Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
  21. Mat labelsMat(4, 1, CV_32SC1, labels);
  22. //! [setup2]
  23. // Train the SVM
  24. //! [init]
  25. Ptr<SVM> svm = SVM::create();
  26. svm->setType(SVM::C_SVC);
  27. svm->setKernel(SVM::LINEAR);
  28. svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
  29. //! [init]
  30. //! [train]
  31. svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);
  32. //! [train]
  33. // Show the decision regions given by the SVM
  34. //! [show]
  35. Vec3b green(0, 255, 0), blue(255, 0, 0);
  36. for (int i = 0; i < image.rows; ++i)
  37. for (int j = 0; j < image.cols; ++j)
  38. {
  39. Mat sampleMat = (Mat_<float>(1, 2) << j, i);
  40. float response = svm->predict(sampleMat);
  41. if (response == 1)
  42. image.at<Vec3b>(i, j) = green;
  43. else if (response == -1)
  44. image.at<Vec3b>(i, j) = blue;
  45. }
  46. //! [show]
  47. // Show the training data
  48. //! [show_data]
  49. int thickness = -1;
  50. int lineType = 8;
  51. circle(image, Point(1, 2), 5, Scalar(0, 0, 0), thickness, lineType);
  52. circle(image, Point(-1, -10), 5, Scalar(255, 255, 255), thickness, lineType);
  53. circle(image, Point(1, -2), 5, Scalar(255, 255, 255), thickness, lineType);
  54. circle(image, Point(2, 1), 5, Scalar(255, 255, 255), thickness, lineType);
  55. //! [show_data]
  56. // Show support vectors
  57. //! [show_vectors]
  58. thickness = 2;
  59. lineType = 8;
  60. Mat sv = svm->getSupportVectors();
  61. for (int i = 0; i < sv.rows; ++i)
  62. {
  63. const float* v = sv.ptr<float>(i);
  64. circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thickness, lineType);
  65. }
  66. //! [show_vectors]
  67. Mat res;
  68. float teatData[1][2] = { { 1, -11 } };
  69. Mat query(1, 2, CV_32FC1, teatData);
  70. svm->predict(query, res);
  71. cout << res;
  72. imwrite("result.png", image);     // save the image
  73. imshow("SVM Simple Example", image);   // show it to the user
  74. waitKey(0);
  75. }

需要说明的是:在OpenCV中,SVM多分类方式被隐藏参数,在调用函数svm->train() 时,定义函数参数时候,直接输入多类别样本以及其标签即可

SVM 多分类 -SVM分类opencv3.0源代码相关推荐

  1. 基于SVM的点云分类(树木,建筑两类)

    西南某高校遥感专业在读生(个人网站:YhQIAO)这学期选了院里张老师的<三维扫描技术>选修课,干货满满,期末有个大作业svm点云分类,正好前段时间对机器学习比较感兴趣,了解了点算法,但是 ...

  2. SVM学习(一)SVM模型训练与分类

    SVM模型训练与分类 支持向量机(SVM): 一个能够将不同类样本在样本空间分隔的超平面.换句话说,给定一些标记好的训练本(监督式学习),SVM算法输出一个最优化的超分隔平面.本次利用VS2015+O ...

  3. Matlab 基于svm的图像物体分类

    matlab 图像分类 本周工作日志,老师布置了一个小作业,让我们使用matlab实现图像物体分类 目录 文章目录 matlab 图像分类 目录 1分类原理 2程序流程 补充 1分类原理 基于一个很朴 ...

  4. 机器学习(二十一)——Optimizer, 单分类SVM多分类SVM, 时间序列分析

    http://antkillerfarm.github.io/ Optimizer 在<机器学习(一)>中,我们已经指出梯度下降是解决凸优化问题的一般方法.而如何更有效率的梯度下降,就是本 ...

  5. sklearn svm如何选择核函数_文本挖掘篇|利用SVM进行短文本分类

    何为数据挖掘,顾名思义就是从大量数据中挖掘或抽取出知识.在实际中,进行数据挖掘的数据不仅仅有数值型数据,还有图片型数据,文本型数据等.而所谓文本挖掘,就是从大量文本数据中,提取出对信息使用者有价值的信 ...

  6. matlab图像分类器,Matlab 基于svm的图像物体分类

    Matlab 基于svm的图像物体分类 发布时间:2018-05-16 20:27, 浏览次数:1623 , 标签: Matlab svm 本周工作日志,老师布置了一个小作业,让我们使用matlab实 ...

  7. 对鸢尾花数据集和月亮数据集,分别采用线性LDA、k-means和SVM算法进行二分类可视化分析

    一.支持向量机 支持向量机是一个功能强大并且全面的机器学习模型,它可以执行线性或者非线性分类,回归甚至异常检测任务.其主要分为三类:线性SVM分类.软间隔分类.非线性SVM分类. 本篇博客将重点深入S ...

  8. 基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)

    基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类) 一.数据集说明 训练样本来自于github上的EasyPR的c++版本,包含一万三千多张数字及大写字母的图片以及三千多张中 ...

  9. Opencv3.0 手写数字识别(Hog特征+SVM分类器)

    配置:VS2013+Opencv3.0 参考: http://blog.csdn.net/iamzhangzhuping/article/details/51254567 http://blog.cs ...

  10. 使用SVM分类器做颜色分类走过的坑

    1.保存与调用训练模型,通常训练一个模型需要很长时间,如果我们每一次想使用这个模型都需要重新训练的话,会浪费大量时间,所以我们需要用到模型的保存与调用,用到了sklearn库中的joblib模块,具体 ...

最新文章

  1. 【工具】PC端调试手机端 Html 页面的工具
  2. python if else格式_Python if else条件语句详解
  3. PHP服务器端语言是什么意思,PHP作为服务器端语言,有哪些优点?
  4. 最新M1芯片的MacBook Pro打开软件闪退解决方法
  5. matlab教程课后答案肖汉光,MATLAB大学教程
  6. 计算机文化基础(高职高专版 第十一版)第七章 答案
  7. 东北大学大物实验思考题答案解析
  8. Hadoop去掉格,换行符,制表符,回车符,换页符【好吧,其实用正则表达式一下子就搞定了】
  9. 当女生说没衣服穿时。。。。
  10. Matlab获取tif各格点经纬度
  11. MATLAB读视频报错 Unable to initialize the video obtain properties (videoreader in Matlab)
  12. python jit_Pypy Python的JIT实现
  13. 倍福PLC在NC轴报错代码18000原因分析
  14. Teradata语法树——insert
  15. 2017计算机及应用自考试题及答案,2018年考研管理类联考试题及参考答案
  16. 抖音取图小程序,同款抖音壁纸,表情包小程序搭建
  17. 关于嵌套结构体大小的计算
  18. 工程制图计算机考试题库,2017年CAD期末考试复习题库「附答案」
  19. 软件案例分析:商业音乐软件还是开源音乐软件?
  20. Mybatis动态传入order by

热门文章

  1. 金庸群侠传修改器链接服务器,金庸群侠传全能修改器
  2. 项目实习(三)操作系统设计
  3. Word文档编号工具,Word标题,图、表手动编号工具
  4. python简易学生信息管理系统
  5. 固高运动控制卡学习1--运动模式介绍(1)--点位,Gear,Jog,插补
  6. 7-4 散列表查找(PTA程序设计)
  7. IP地址资源的分配和管理
  8. 收银系统 mysql数据库_解决哗啦啦收银系统数据库备份问题
  9. PCIE协议(原版) 免费分享
  10. python网址规律_数列规律寻找 - python 爬虫 OEIS (2020.10.6更新)