模式识别 - libsvm的函数调用方法 具体解释
libsvm的函数调用方法 具体解释
本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173
须要载入(load)SVM的模型, 然后将结点转换为SVM的格式, 即索引(index)+数据(value)的形式;
释放SVM的model有专用的函数: svm_free_and_destroy_model, 否则easy内存泄露;
能够预測数据的概率, 则须要模型是概率模型, 返回的是一个类别数组(2分类, 则为2个值的数组), 即各个标签的概率值;
注意: 标签即概率值较大的部分, 所以在训练时, 应注意正负样本的顺序,
正样本在前, 下标0, 为正样本的概率, 下标1, 为负样本的概率; 反之亦然.
代码:
- /*! @file
- ********************************************************************************
- <PRE>
- 模块名 : 分类器
- 文件名称 : SvmClassifier.cpp
- 相关文件 : SvmClassifier.h
- 文件实现功能 : SVM分类器类实现
- 作者 : C.L.Wang
- Email: morndragon@126.com
- 版本号 : 1.0
- --------------------------------------------------------------------------------
- 多线程安全性 : 是
- 异常时安全性 : 是
- --------------------------------------------------------------------------------
- 备注 : 无
- --------------------------------------------------------------------------------
- 改动记录 :
- 日 期 版本号 改动人 改动内容
- 2014/03/27 1.0 C.L.Wang Create
- </PRE>
- ********************************************************************************
- * 版权全部(c) C.L.Wang, 保留全部权利
- *******************************************************************************/
- #include "stdafx.h"
- #include "SvmClassifier.h"
- #include <opencv.hpp>
- using namespace std;
- using namespace cv;
- using namespace vd;
- const std::string SvmClassifier::NORM_NAME = "normalization.xml"; //归一化模型
- const std::string SvmClassifier::SVM_MODEL_NAME = "hvd.model"; //Svm模型
- bool SvmClassifier::m_mutex = true; //相互排斥锁
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : SvmClassifier
- 功能 : 參数构造函数
- 參数 :
- const Mat& _videoFeature, 视频特征;
- const string& _modelPath, 模型路径;
- 返回值 : 无
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : SvmClassifier iSF(_videoFeature, _modelPath);
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- SvmClassifier::SvmClassifier (
- const cv::Mat& _videoFeature, /*特征*/
- const std::string& _modelPath /*模型路径*/
- ) :
- Classifier(_videoFeature, _modelPath),
- m_model(nullptr),
- m_node(nullptr)
- {
- return;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : ~SvmClassifier
- 功能 : 析构函数
- 參数 : void
- 返回值 : 无
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : iSC.~SvmClassifier();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- SvmClassifier::~SvmClassifier (void)
- {
- if (m_model != nullptr) {
- svm_free_and_destroy_model(&m_model);
- }
- if (m_node != nullptr) {
- delete[] m_node;
- m_node = nullptr;
- }
- return;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : calculateResult
- 功能 : 计算分类结果
- 參数 : void
- 返回值 : const double, 分类结果
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : result = iSC.calculateResult();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- const double SvmClassifier::calculateResult (void)
- {
- double result(0.0);
- while(1) {
- if (m_mutex == true)
- {
- m_mutex = false;
- _initModel();
- result = _predictValue();
- if (m_model != nullptr) {
- svm_free_and_destroy_model(&m_model);
- }
- if (m_node != nullptr) {
- delete[] m_node;
- m_node = nullptr;
- }
- m_mutex = true;
- break;
- }
- }
- return result;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : _predictValue
- 功能 : 预測值
- 參数 : void
- 返回值 : const double, 预測值;
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : result = _predictValue();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- const double SvmClassifier::_predictValue (void) const
- {
- double label (0.0);
- double prop (0.0);
- const int nr_class (2);
- double* prob_estimates = (double *) malloc(nr_class*sizeof(double));
- label = svm_predict_probability(m_model, m_node, prob_estimates);
- prop = prob_estimates[0]; //返回预測概率值
- delete[] prob_estimates;
- return prop;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : _initModel
- 功能 : 初始化模型
- 參数 : void
- 返回值 : void
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : _initModel();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- void SvmClassifier::_initModel (void)
- {
- /*完整路径*/
- std::string modelName (m_modelPath); //模型名称
- std::string normName (m_modelPath); //归一化名称
- const std::string slash("/");
- modelName.append(slash);
- modelName.append(SVM_MODEL_NAME);
- normName.append(slash);
- normName.append(NORM_NAME);
- std::ifstream ifs;
- ifs.open(modelName, ios::in);
- if (ifs.fail()) {
- __printLog(std::cerr, "Failed to open the model file!");
- }
- ifs.close();
- ifs.open(normName, ios::in);
- if (ifs.fail()) {
- __printLog(std::cerr, "Failed to open the model file!");
- }
- ifs.close();
- if (m_model != nullptr) {
- svm_free_and_destroy_model(&m_model);
- }
- m_model = svm_load_model(modelName.c_str());
- __transSvmNode(normName);
- return;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : __transSvmNode
- 功能 : 转换Svm结点
- 參数 : const string& normName, 归一化模型路径
- 返回值 : void
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : __transSvmNode(normName);
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- void SvmClassifier::__transSvmNode (const std::string& _normName)
- {
- cv::FileStorage fs(_normName, FileStorage::READ);
- cv::Mat maxNorm;
- fs["normalization"] >> maxNorm;
- fs.release();
- /*归一化视频特征*/
- cv::Mat normFeature =
- cv::Mat::zeros(1, maxNorm.cols-2, CV_64FC1);
- for (int j=2; j<m_videoFeature.cols; ++j) {
- for(int i=0; i<m_videoFeature.rows; ++i) {
- normFeature.at<double>(0, j-2) += m_videoFeature.at<double>(i, j);
- }
- }
- for (int j=0; j<normFeature.cols; ++j)
- {
- normFeature.at<double>(0, j) /= m_videoFeature.rows;
- if (maxNorm.at<double>(0, j+2) > 0.0001)
- normFeature.at<double>(0, j) /= maxNorm.at<double>(0, j+2);
- }
- normFeature.at<double>(0,0) = 0.0;
- if (m_node != nullptr) {
- delete[] m_node;
- m_node = nullptr;
- }
- m_node = new svm_node[normFeature.cols];
- for (int j=1; j < normFeature.cols; ++j) {
- m_node[j-1].index = j;
- m_node[j-1].value = normFeature.at<double>(0, j);
- }
- m_node[normFeature.cols-1].index = -1;
- m_node[normFeature.cols-1].value = 0;
- return;
- }
模式识别 - libsvm的函数调用方法 具体解释的更多相关文章
- MATLAB安装libsvm工具箱的方法
支持向量机(support vector machine,SVM)是机器学习中一种流行的学习算法,在分类与回归分析中发挥着重要作用.基于SVM算法开发的工具箱有很多种,下面我们要安装的是十分受欢迎的l ...
- 第44篇-为native方法设置解释执行入口
对于Java中的native方法来说,实际上调用的是C/C++实现的本地函数,由于可能会在Java解释执行过程中调用native方法,或在本地函数的实现过程中调用Java方法,所以当两者相互调用时,必 ...
- 第48篇-native方法调用解释执行的Java方法
举一个native方法调用解释执行的Java方法的实例,如下: public class TestJNI { static { System.load("/media/mazhi/sourc ...
- Js apply 方法 具体解释
Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...
- Format类及其子类功能和使用方法具体解释
Format类及其子类功能和使用方法具体解释 1. Format类结构: · java.lang.Object · java.text.Format · ...
- hbase-0.94安装方法具体解释
先决条件: 1)java环境,须要安装java1.6以上版本号 2)hadoop环境.因为HBase架构是基于其它文件存储系统的,因此在分布式模式下安装Hadoop是必须的,可是,假设 ...
- ZooKeeper安装方法具体解释
ZooKeeper安装方式分为两种,一种为单机模式.一个为集群模式,集群模式须要事先正确配置hadoop集群,安装方法參考hadoop-1.2.1安装方法具体解释 单机模式安装: 1.上传并解压zoo ...
- 函数调用方法之__cdecl与_stdcall
在debug VS c工程文件时,碰到cannot convert from 'int (__cdecl *)(char *)' to 'xxx'这个问题,发现问题在于typedef函数指针类型时,将 ...
- JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法
缓存 cache 作用就是将一些常用的数据存储起来 提升性能 cdn //-----------------分析解决递归斐波那契数列<script> //定义一个缓存数组,存储已经计算出来 ...
随机推荐
- HDU 4606 Occupy Cities (计算几何+最短路+二分+最小路径覆盖)
Occupy Cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 扩展gridview轻松实现冻结行和列
在实际的项目中,由于项目的需要,数据量比较大,同时显示栏位也比较多,要做gridview里显示完整,并做到用户体验比较好,这就需要冻结表头和关键列.由于用到的地方比较多,我们可以护展一个gridvie ...
- 现在就可以使用的5个 ES6 特性
小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...
- getopt使用
参考: http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html http://en.wikipedia.org ...
- Bootstrap响应式折叠导航
浏览器宽度缩小到一定值时,导航显示为 <nav class="navbar navbar-inverse navbar-fixed-top" role="navig ...
- 构建高性能web站点-1
以下为阅读<构建高性能web站点>郭欣 著 这本书的适合读者: 1.编写web程序.关心站点性能,并且希望自己做的更加出色的开发人员 2.关心性能和可用性的web架构师 3.希望构建高性能 ...
- REOBJECT structure
REOBJECT structure 包含丰富编辑控件中的OLE或图像对象的信息. Syntax 语法 typedef struct _reobject { DWORD cbStruct; LON ...
- Mac机装Win7后 启动只见鼠标怎么办
我有一台Mac机,用Bootcamp的方式装了Win7,昨天一按开机键发现只有鼠标没有别的. 当时按热启动无效,把笔记本盖子合上一会再开也无效,按关机键关掉再开也无效(这时是短按). 当时想是不是Ma ...
- 网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000
The C10K problem翻译 (C10K = connection 10 kilo 问题).k 表示 kilo,即 1000 比如:kilometer(千米), kilogram(千克). 如 ...
- Django——如何在Django模板中注入全局变量?——part1
问题:TEMPLATE_CONTEXT_PROCESSORS代表着什么? 问题描述:无法在项目的settings.py文件中找到TEMPLATE_CONTEXT_PROCESSORS. ——————— ...