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该函数的调用方法 详细说明的更多相关文章

  1. jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

    jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

  2. js中使用function定义类、实例化,函数的调用方法

    function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...

  3. phpcms 的实用相关接口,函数,调用方法

    常用函数 , 打开include/global.func.php,下面存放一些公共函数view plaincopy to clipboardprint? strip_tags() 调用内容过滤html ...

  4. Phpcms v9系统类库与函数库调用方法

    在分享了n多phpcms的教程后,cmsyou继续分享关于phpcms v9系统类库与函数库的调用方法. 系统类库位于系统的 /libs/functions目录下面,函数库文件名为*.func.php ...

  5. sort函数简单调用方法

    向量调用sort函数排序,一般有三个参数,即为sort(v.begin(),v.end(),cmp),第三个传入的是比较函数的地址(函数名),决定你比较的性质,运用灵活 #include<ios ...

  6. Pytorch中torch.autograd ---backward函数的使用方法详细解析,具体例子分析

    backward函数 官方定义: torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph ...

  7. KingbaseES OUT 类型参数过程与函数的调用方法

    对于含有 out 类型参数的过程或者函数,只能通过块方式调用,这是因为,ksql 还不支持类似 Oracle 那样通过 var 定义变量. 一.带OUT的procedure 调用 创建过程: crea ...

  8. php学习笔记:自定义函数的调用

    PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰. ...

  9. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

随机推荐

  1. oracle转mysql总结(转)

    ares-sdk初始开发测试使用的是oracle数据库,由于宁波通商的特殊需要,必须把数据库环境从oracle转向mysql. 现对转换过程中出现的问题及经验总结如下: 主键生成策略 创建一个专门记录 ...

  2. OGG-01008 Extract displays Discarding bad record (discard recs=1) when using filter or where clause

    因为在extract參数文件里使用了where语句,而where后面的的条件列又不是主键,没有为update.delete操作记录日志,因此会报1008错误. Applies to: Oracle G ...

  3. UVA 674 (入门DP, 14.07.09)

     Coin Change  Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We ...

  4. Silverlight之 xaml布局

    目标:在两周内完成一个界面的功能 第1阶段:完成xaml的布局 准备:视频4-14节 第2阶段: 完成环状图 柱状图 TreeView样式 准备: 矢量绘图  telerik 自定义控件  自定义控件 ...

  5. CC2530存储空间——Code

    硬件平台:CC2530-F256 开发环境:IAR 8051(版本号 8.10) 參考: .<CC2530 User's Guide.pdf>(swru191c) .<IAR C/C ...

  6. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第7章节--打包并部署SP2013 Apps 打包并公布App

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第7章节--打包并部署SP2013 Apps 打包并公布App         如今既然你理解了一个app的四个主要部分, ...

  7. 如何区分MNO和MVNO

    MVNO(Mobile Virtaul Network Operator)虚拟网络运营商,没有自己的物理网络,租用MNO(Mobile Network Operator)网络提供的网络服务. 我们知道 ...

  8. C日常语言实践中小(四)——勇者斗恶龙

    勇者斗恶龙 愿你的国有n龙的头,你想聘请骑士杀死它(全部的头). 村里有m个骑士能够雇佣,一个能力值为x的骑士能够砍掉恶龙一个致敬不超过x的头,且须要支付x个金币. 怎样雇佣骑士才干砍掉恶龙的全部头, ...

  9. VC POST表单——登录验证新浪邮箱

    1.本机环境: Windows XP SP3.ADSL 2.开发工具: WildPackets OmniPeek V5.1.4 Visual C++ 6.0 IE6.0 FlexEdit V2.3.1 ...

  10. Swift学习笔记7:关闭

    闭包 捕 引用和将其存储在任意常量和变量的上下文. Swift 你会管理 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包採取例如以下三种形式之中的一个: ...