模式识别 - 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> //定义一个缓存数组,存储已经计算出来 ...
随机推荐
- Android性能调优篇之探索JVM内存分配
开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...
- 刷新神经网络新深度:ImageNet计算机视觉挑战赛微软中国研究员夺冠
微软亚洲研究院首席研究员孙剑 世界上最好计算机视觉系统有多精确?就在美国东部时间12月10日上午9时,ImageNet计算机视觉识别挑战赛结果揭晓——微软亚洲研究院视觉计算组的研究员们凭借深层神经网络 ...
- 设计工具-MindManager(思维导图)
1,百度百科 http://baike.baidu.com/view/30054.htm?from_id=7153629&type=syn&fromtitle=MindManager& ...
- Linux使用GPT划分大于2T的分区
在Linux下磁盘分区大于2TB的时候我不能使用常用fdisk命令,这时我们就需要先把大容量的磁盘进行转换为GPT格式,然后试用parted命令来划分大于2T的分区. 方法:1.用parted命令分区 ...
- gcc static静态编译选项提示错误:/usr/lib/ld:cannot find -lc
在学习gcc静态库动态库编译的时候选用静态库编译时出错显示:/usr/lib/ld:cannot find -lc 百度:/usr/lib/ld:cannot find -lc多处给的解决方案为: 然 ...
- java源码阅读HashSet
1类签名与注解 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneabl ...
- 【Hadoop】HDFS源码解读
1.open流程 2.get DFS流程: 3.获取block信息流程
- css - 小程序样式
/* * @Author: WJ_LONG * @Date: 2018-09-15 17:25:37 * @Last Modified by: WJ_LONG * @Last Modified tim ...
- 破解 zip 压缩包程序
目录 项目文件结构 代码实现过程 演示效果 代码地址如下:http://www.demodashi.com/demo/12021.html 项目文件结构 在当前目录有三个文件: 3-zipCrack. ...
- 使用 Google 高级搜索的一些技巧
一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于 ...