LIBSVM使用

LibSvm使用说明 综述SVM支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。总得来说,SVM就是通过训练得到一个超平面 ,将样本分类,保证被分类的样本中离超平面近的一些点距离超平面距离(几何间隔)最大,这些离超平面近的点叫作支持向量(之所以叫支持向量而不叫支持样本是因为每个样本均认为是一个向量,每个特征是向量的一个元素)。LibSvm 阅读详情

最近在研究支持向量机,这里转载几篇由ChenLee_1大神写的LIBSVM的使用方法。

原文请见:

http://blog.youkuaiyun.com/carson2005/article/details/6527055

http://blog.youkuaiyun.com/carson2005/article/details/6539192

http://blog.youkuaiyun.com/carson2005/article/details/6539218


开源SVM库libSVM介绍

   libSVM是台湾大学林智仁教授等研究人员开发的一个用于支持向量机分类,回归分析及分布估计的c/c++开源库。另外,它也可以用于解决多类分类问题。 libSVM最新的版本是2011年4月发布的3.1版。林智仁教授设计开发该SVM库的目的是为了让其它非专业人士可以更加方便快捷的使用SVM这个统计学习工具。libSVM提供了一些简单易用的接口,从而使得用户可以方便的使用,而不必关心其内部复杂的数学模型和运算过程。libSVM的主要特点有:

(1)各种SVM的表达公式;

(2)有效的多类分类能力;

(3)交叉验证功能;

(4)各种核函数,包括预先计算得到的核矩阵;

(5)用于非平衡数据的加权svm;

(6)提供c++和java源代码;

(7)用于演示SVM分类与回归能力的GUI界面;

.....

很多初学者往往按照以下的步骤使用libSVM:

(1)将数据转换到libSVM指定的格式;

(2)随机选择一个核函数和一些参数;

(3)测试;

这种方法虽然可行,但却不一定能很快达到好的效果。为此,林智仁教授推荐按照以下的步骤来使用libSVM:

(1)将数据转换到libSVM指定的格式;

(2)对数据进行尺度操作(一般指数据的归一化);

(3)考虑RBF(径向基)核函数;

(4)利用交叉验证来得到最好的参数C和r;

(5)用最好的C和r来训练所有训练集合;

(6)测试;

之所以推荐首选径向基核函数,是由于该核可以将数据非线性地映射到高维空间,而且,它还能处理那种特征(数据)及其属性之间呈现非线性关系的情况,而线性核函数只是径向基核函数的一个特例。另外,相比而言,多项式核函数在高维空间有着更多的参数,从而使得模型更加复杂。同时,需要提醒的是,径向基核函数并非万能的,尤其当特征数据的数值本身比较大的时候,线性核函数要更实用一些。

任何人可以在http://www.csie.ntu.edu.tw/~cjlin/libsvm 来下载libSVM开源库。不过,按照开发者的要求,在使用之前,请务必阅读其copyright,并按照其要求进行相应的引用和说明。另外,在使用之前,强烈推荐大家阅读libSVM.zip里面的readme文件。该文件详细描述了libSVM的使用方法及注意事项。


libSVM介绍(二)

    鉴于libSVM中的readme文件有点长,而且,都是采用英文书写,这里,我把其中重要的内容提炼出来,并给出相应的例子来说明其用法,大家可以直接参考我的代码来调用libSVM库。

第一部分,利用libSVM自带的简易工具来演示SVM的两类分类过程。(以下内容只是利用libSVM自带的一个简易的工具供大家更好的理解SVM,如果你对SVM已经有了一定的了解,可以直接跳过这部分内容)

首先,你要了解的是libSVM只是众多SVM实现版本中的其中之一。而SVM是一种进行两类分类的分类器,在libSVM最新版(libSVM3.1)里面,已经自带了简单的工具,可以对二分类进行演示。以windows平台为例,将libSVM.zip解压之后,有一个名为windows的子文件夹,里面有一个名为svm-toy.exe的可执行文件。直接双击,运行该可执行文件,显示如下的界面

点击第二个按钮“Run”,然后,在左上部分,用鼠标左键随机点几下,代表你选择的第一类模式的数据分布,下图是我随即点了几下的结果:

之后,点击“Change”,接着,用鼠标左键在窗口右下方随便点击几下,代表你选择的第二类模式的数据分布,如下图所示:

接着,点击“Run”,libSVM就帮你把这两类模式分开了,并用两种不同的颜色区域来代表两类不同的模式,如下图所示:

图中左上方紫色的区域,是第一类模式所在的区域,右下方的蓝色区域,是你选择的第二类模式所在的的区域,而两者的分界面,也就是SVM的最优分类面。当然,SVM是通过核函数将原始数据映射到高维空间,在高维空间进行线性分类。换句话说,在高维空间,这两类数据应该是线性可分的,即:最优分类面应该是一条直线,而这里看到的,是将高维空间分类的结果又映射回原始空间所呈现的分类结果,即:非线性的分类面。细心的朋友可能已经发现,在上述界面的右下角,有一个编辑框,里面写着“-t 2 -c 100”,显然,这是libSVM的一些参数,你也可以试着更改这些参数,来选择不同的核函数、不同的SVM类型等来达到最好的分类效果。

 

第二部分:libSVM中的小工具

libSVM中包含以下可执行程序文件(小工具):

(1)svm-scale:一个用于对输入数据进行归一化的简易工具

(2)svm-toy:一个带有图形界面的交互式SVM二分类功能演示小工具;

(3)svm-train:对用户输入的数据进行SVM训练。其中,训练数据是按照以下格式输入的:

<类别号> <索引1>:<特征值1> <索引2>:<特征值2>...

(4)svm-predict:根据SVM训练得到的模型,对输入数据进行预测,即分类。

 

第三部分:libSVM用法介绍:`

      libSVM的所有函数申明及结构体定义均包含在libSVM.h文件当中,在使用过程中,你必须要包含该头文件,并且,对libSVM.cpp进行相应的链接。在对libSVM中的函数用法进行详细介绍之前,我们不妨先简单了解一下libSVM.h中一些结构体的含义。

struct svm_node

{

int index;

double value;

};

该结构体,定义了一个“SVM节点”,即:索引i及其所对应的第i个特征值。这样n个相同类别号的SVM节点,就构成了一个SVM输入向量。即:一个SVM输入向量可以表示为如下的形式:

类别标签 索引1:特征值1 索引2:特征值2 索引3:特征值3...

我们可以将若干个这样的输入向量输入到libSVM进行训练,或者,输入一个类别标签未知的向量对其进行预测。

struct svm_problem

{

int l;

double *y;

struct svm_node **x;

};

该结构体中的l代表训练样本的个数;double型指针y代表l个训练样本中每个训练样本的类别号,也就是我们常说的“标签”;而"SVM节点"x,则是一个指针的指针(如果你对指针的指针不熟悉,完全可以把x理解为一个矩阵),x所指向的内容就是所有训练样本所有的特征值数据。

假如我们有下面的训练样本数据:

类别标签   特征值1  特征值2 特征值3 特征值4 特征值5

   1       0     0.1     0.2      0       0

   2      0     0.1     0.3     -1.2       0

   1        0.4      0      0      0       0

   2      0     0.1       0      1.4      0.5

  1    -0.1    -0.2       0.1      1.1      0.1

那么,svm_problem结构体中的l=5(共有5个训练样本),y=[1,2,1,2,1];指针x所指向的内容可以视为5个行向量,每个行向量有5列,即:x指代一个5*5的矩阵,其值为:

(1,0)(2,0.1)(3,0.2)(4,0)(5,0)(-1,?)

(1,0)(2,0.1)(3,0.3)(4,-1.2)(5,0)(-1,?)

(1,0.4)(2,0)(3,0)(4,0)(5,0)(-1,?)

(1,0)(2,0.1)(3,0)(4,1.4)(5,0.5)(-1,?)

(1,-0.1)(2,-0.2)(3,0.1)(4,1.1)(5,0.1)(-1,?) 

需要提醒的是,这里,每一行最后一列都是以“-1”开头,这是libSVM规定的特征值向量的结束标识;此外,索引应该按照升序方式进行排列。

       

enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };//libSVM规定的SVM类型

 

enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED };//libSVM规定的核函数的类型

 

struct svm_parameter

{

int svm_type;//取值为前面提到的枚举类型中的值

int kernel_type;//取值为前面提到的枚举类型中的值

int degree; //用于多项式核函数/

double gamma;//用于多项式、径向基、S型核函数

   double coef0;//用于多项式和S型核函数

 

/* 以下参数仅仅用于训练阶段 */

double cache_size; //核缓存大小,以MB为单位

double eps; //误差精度小于eps时,停止训练

double C; //用于C_SVC,EPSILON_SVR,NU_SVR

int nr_weight; //用于C_SVC

int *weight_label;//用于C_SVC

double* weight;//用于C_SVC

double nu;//用于NU_SVC,ONE_CLASS,NU_SVR

double p;//用于EPSILON_SVR

int shrinking; //等于1代表执行启发式收缩

int probability;//等于1代表模型的分布概率已知

};

该结构体定义了libSVM中的用到的SVM参数。其中svm_type可以是C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR中的任意一种,代表着SVM的类型;

C_SVC: C-SVM classification

    NU_SVC: nu-SVM classification

    ONE_CLASS: one-class-SVM

    EPSILON_SVR: epsilon-SVM regression

    NU_SVR: nu-SVM regression

kernel_type可以是LINEAR, POLY, RBF, SIGMOID中的一种,代表着核函数的类型;

LINEAR: u'*v,线性核函数;

    POLY: (gamma*u'*v + coef0)^degree,多项式核函数;

    RBF: exp(-gamma*|u-v|^2),径向基核函数;

    SIGMOID: tanh(gamma*u'*v + coef0),S型核函数;

PRECOMPUTED: kernel values in training_set_file,自定义的核函数;

nr_weight, weight_label, and weight这三个参数用于改变某些类的惩罚因子。当输入数据不平衡,或者误分类的风险代价不对称的时候,这三个参数将会对样本训练起到非常重要的调节作用。

nr_weight是weight_label和weight的元素个数,或者称之为维数。Weight[i]与weight_label[i]之间是一一对应的,weight[i]代表着类别weight_label[i]的惩罚因子的系数是weight[i]。如果你不想设置惩罚因子,直接把nr_weight设置为0即可。

为了防止错误的参数设置,你还可以调用libSVM提供的接口函数svm_check_parameter()来对输入参数进行检查。

 

    在使用libSVM进行分类之前,你需要通过样本学习,构建一个SVM分类模型。该分类模型也可以理解为生成一些用于分类的“数据”。当然,构建的分类模型需要保存为文件,以便后续使用。用于libSVM训练的函数,其申明如下所示:

struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param);

显然,该函数的输入,就是svm_problem结构体的prob指针所指向的内容。该结构体在前面已经介绍过,其内部,不仅包含了训练样本的个数,还包含每个训练样本的“标签”及该训练样本对应的特征数据。而svm_parameter类型的param指针则指定了libSVM所用到的诸如SVM类型,核函数类型,惩罚因子之类的参数。另外,该函数的返回值是一个svm_model结构体,该结构体的定义,在libSVM.cpp当中:

struct svm_model

{

svm_parameter param; //SVM参数设置

int nr_class; //类别数量,对于regression和ne-class SVM这两种情况,该值为2

int l; //支持向量的个数

svm_node **SV; //支持向量

double **sv_coef; //用于决策函数的支持向量系数

double *rho; //决策函数中的常数项

double *probA; // pariwise probability information

double *probB;

 

// for classification only

 

int *label; // 每个类类别标签

int *nSV; //每个类的支持向量个数

int free_sv; //如果svm_model已经通过svm_load_model创建,则该值为1;如果svm_model是通过svm_train创建的,该值为0

};

需要提醒的是,libSVM支持多类分类问题,当有k个待分类问题时,libSVM构建k*(k-1)/2种分类模型来进行分类,即:libSVM采用一对一的方式来构建多类分类器,如下所示:

1 vs 2, 1 vs 3, ..., 1 vs k, 2 vs 3, ..., 2 vs k, ..., k-1 vs k。

用户在得到SVM分类模型之后,需要将其进行保存。在这里,libSVM已经提供了相应的函数接口:

int svm_save_model(const char *model_file_name, const struct svm_model *model);

在调用训练函数之后,只需要指定保存位置,直接调用该函数,就可以进行相应的保存。

在对样本进行训练得到分类模型之后,就可以利用该分类模型对未知输入数据进行类别判断了,也就是我们常说的“预测”。用于libSVM预测的函数,其申明如下所示:

double svm_predict(const struct svm_model *model, const struct svm_node *x);

该函数的第一个参数就是利用样本训练得到的SVM分类模型,第二个参数,是输入的未知模式的特征数据,即:得到了表征某一类别的特征数据,根据这些数据,来判断它所对应的类别标签。而SVM分类模型,可以由libSVM定义的下面这个接口函数来进行加载:

struct svm_model *svm_load_model(const char *model_file_name);

此外,在使用上述函数过程中,需要对svm_model及svm_parameter申请内存,而不使用它们的时候,用户需要调用以下两个函数进行内存释放:

void svm_destroy_model(struct svm_model *model);

void svm_destroy_param(struct svm_parameter *param);


libSVM应用举例

  前面提到,很多人看到libSVM这么多的参数,估计要犯晕了。没关系,我之前把相关的libSVM参数已经讲解了一遍,这里,再给出libSVM的用法。如果你不想花时间去仔细研究libSVM,完全可以参照我的函数来直接调用libSVM完成你的工作。

      首先是训练SVM得到模型;假设,有10个训练样本,每个训练样本,有12个特征值,即:每个训练样本的维数是12,也就是说,训练样本构成了一个10*12的矩阵(当然,所有数据应该被归一化到[-1,1]或[0,1]范围内),另外,所有训练样本,应该有一个明确的类别标签,以此来表明当前样本所属的类别。所以,完整的训练样本,应该是10*13的矩阵,这里,我们给出一个10*13的矩阵,并认为,它就是训练样本。每个训练样本是个行向量,而该矩阵的第一列则代表训练样本的“标签”。即:第一个训练样本,类别标签为“1”,第二个训练样本类别标签为“-1”。第一个训练样本的第一个特征值为0.708333,第二个特征值为1,第三个特征值为1...

double inputArr[10][13] = 

{

1,0.708333,1,1,-0.320755,-0.105023,-1,1,-0.419847,-1,-0.225806,0,1, 

-1,0.583333,-1,0.333333,-0.603774,1,-1,1,0.358779,-1,-0.483871,0,-1,

1,0.166667,1,-0.333333,-0.433962,-0.383562,-1,-1,0.0687023,-1,-0.903226,-1,-1,

-1,0.458333,1,1,-0.358491,-0.374429,-1,-1,-0.480916,1,-0.935484,0,-0.333333,

-1,0.875,-1,-0.333333,-0.509434,-0.347032,-1,1,-0.236641,1,-0.935484,-1,-0.333333,

-1,0.5,1,1,-0.509434,-0.767123,-1,-1,0.0534351,-1,-0.870968,-1,-1,

1,0.125,1,0.333333,-0.320755,-0.406393,1,1,0.0839695,1,-0.806452,0,-0.333333,

1,0.25,1,1,-0.698113,-0.484018,-1,1,0.0839695,1,-0.612903,0,-0.333333,

1,0.291667,1,1,-0.132075,-0.237443,-1,1,0.51145,-1,-0.612903,0,0.333333,

1,0.416667,-1,1,0.0566038,0.283105,-1,1,0.267176,-1,0.290323,0,1

};

另外,我们给出一个待分类的输入向量,并用行向量形式表示:

double testArr[]=

{

0.25,1,1,-0.226415,-0.506849,-1,-1,0.374046,-1,-0.83871,0,-1

};

下面,给出完整的SVM训练及预测程序:

#include "stdafx.h"

#include "svm.h"

#include "iostream"

#include "fstream"

using namespace std;  

 

double inputArr[10][13] = 

{

1,0.708333,1,1,-0.320755,-0.105023,-1,1,-0.419847,-1,-0.225806,0,1, 

-1,0.583333,-1,0.333333,-0.603774,1,-1,1,0.358779,-1,-0.483871,0,-1,

1,0.166667,1,-0.333333,-0.433962,-0.383562,-1,-1,0.0687023,-1,-0.903226,-1,-1,

-1,0.458333,1,1,-0.358491,-0.374429,-1,-1,-0.480916,1,-0.935484,0,-0.333333,

-1,0.875,-1,-0.333333,-0.509434,-0.347032,-1,1,-0.236641,1,-0.935484,-1,-0.333333,

-1,0.5,1,1,-0.509434,-0.767123,-1,-1,0.0534351,-1,-0.870968,-1,-1,

1,0.125,1,0.333333,-0.320755,-0.406393,1,1,0.0839695,1,-0.806452,0,-0.333333,

1,0.25,1,1,-0.698113,-0.484018,-1,1,0.0839695,1,-0.612903,0,-0.333333,

1,0.291667,1,1,-0.132075,-0.237443,-1,1,0.51145,-1,-0.612903,0,0.333333,

1,0.416667,-1,1,0.0566038,0.283105,-1,1,0.267176,-1,0.290323,0,1

};

 

double testArr[]=

{

0.25,1,1,-0.226415,-0.506849,-1,-1,0.374046,-1,-0.83871,0,-1

};

 

void DefaultSvmParam(struct svm_parameter *param)

{

param->svm_type = C_SVC;

param->kernel_type = RBF;

param->degree = 3;

param->gamma = 0; // 1/num_features

param->coef0 = 0;

param->nu = 0.5;

param->cache_size = 100;

param->C = 1;

param->eps = 1e-3;

param->p = 0.1;

param->shrinking = 1;

param->probability = 0;

param->nr_weight = 0;

param->weight_label = NULL;

param->weight = NULL;

}

 

void SwitchForSvmParma(struct svm_parameter *param, char ch, char *strNum, int nr_fold, int cross_validation)

{

switch(ch)

{

case 's':

{

param->svm_type = atoi(strNum);

break;

}

case 't':

{

param->kernel_type = atoi(strNum);

break;

}

case 'd':

{

param->degree = atoi(strNum);

break;

}

case 'g':

{

param->gamma = atof(strNum);

break;

}

case 'r':

{

param->coef0 = atof(strNum);

break;

}

case 'n':

{

param->nu = atof(strNum);

break;

}

case 'm':

{

param->cache_size = atof(strNum);

break;

}

case 'c':

{

param->C = atof(strNum);

break;

}

case 'e':

{

param->eps = atof(strNum);

break;

}

case 'p':

{

param->p = atof(strNum);

break;

}

case 'h':

{

param->shrinking = atoi(strNum);

break;

}

case 'b':

{

param->probability = atoi(strNum);

break;

}

case 'q':

{

break;

}

case 'v':

{

cross_validation = 1;

nr_fold = atoi(strNum);

if (nr_fold < 2)

{

cout<<"nr_fold should > 2!!! file: "<<__FILE__<<" function: ";

cout<<__FUNCTION__<<" line: "<<__LINE__<<endl;

 

}

break;

}

case 'w':

{

++param->nr_weight;

param->weight_label = (int *)realloc(param->weight_label,sizeof(int)*param->nr_weight);

param->weight = (double *)realloc(param->weight,sizeof(double)*param->nr_weight);

 

param->weight_label[param->nr_weight-1] = atoi(strNum);

 

param->weight[param->nr_weight-1] = atof(strNum);

break;

}

default:

{

break;

}

}

}

 

void SetSvmParam(struct svm_parameter *param, char *str, int cross_validation, int nr_fold)

{

DefaultSvmParam(param);

cross_validation = 0;

 

char ch = ' ';

int strSize = strlen(str);

for (int i=0; i<strSize; i++)

{

if (str[i] == '-')

{

ch = str[i+1];

int length = 0;

for (int j=i+3; j<strSize; j++)

{

if (isdigit(str[j]))

{

length++;

}

else

{

break;

}

}

char *strNum = new char[length+1];

int index = 0;

for (int j=i+3; j<i+3+length; j++)

{

strNum[index] = str[j];

index++;

}

strNum[length] = '/0';

SwitchForSvmParma(param, ch, strNum, nr_fold, cross_validation);

delete strNum;

}

}

}

 

void SvmTraining(char *option)

{

struct svm_parameter param;

struct svm_problem prob;

struct svm_model *model;

struct svm_node *x_space;

int cross_validation = 0;

int nr_fold = 0;

 

int sampleCount = 10;

int featureDim = 12;

prob.l =  sampleCount;

prob.y = new double[sampleCount];

prob.x = new struct svm_node*[sampleCount];

x_space = new struct svm_node[(featureDim+1)*sampleCount];

 

SetSvmParam(&param, option, cross_validation, nr_fold);

for (int i=0; i<sampleCount; i++)

{

prob.y[i] = inputArr[i][0];

}

 

int j = 0;

for (int i=0; i<sampleCount; i++)

{

prob.x[i] = &x_space[j];

for (int k=1; k<=featureDim; k++)

{

x_space[i*featureDim+k].index = k;

x_space[i*featureDim+k].value = inputArr[i][k];

}

x_space[(i+1)*featureDim].index = -1;

j = (i+1)*featureDim + 1; 

}

 

 

model = svm_train(&prob, &param);

const char* model_file_name = "C://Model.txt";

svm_save_model(model_file_name, model);

svm_destroy_model(model);

svm_destroy_param(&param);

delete[] prob.y;

delete[] prob.x;

delete[] x_space; 

}

int SvmPredict(const char* modelAdd)

{

struct svm_node *testX;

struct svm_model* testModel;

testModel = svm_load_model(modelAdd);

int featureDim = 12;

testX = new struct svm_node[featureDim+1];

for (int i=0; i<featureDim; i++)

{

testX[i].index = i+1;

testX[i].value = testArr[i];

}

testX[featureDim].index = -1;

double p = svm_predict(testModel, testX);

svm_destroy_model(testModel);

delete[] testX;

if (p > 0.5)

{

return 1;

}

else

{

return -1;

}

}

int _tmain(int argc, _TCHAR* argv[])

{

SvmTraining("-c 100 -t 1 -g 4 -r 1 -d 4");

int flag = SvmPredict("c://model.txt");

cout<<"flag = "<<flag<<endl;

system("pause");

return 0;

}



Android上使用LibSVM LibSVM的Java版本源代码包含在其源代码包中。我们只需要libsvm.jar包和svm_train.java svm_predict.java并主要参考主文件夹下的README文件。将jar包添加到工程的libs中,将两个java文件也复制到你的MainActivity.java所在的package中。Android Studio中要点击左上角的Project视图才会看见libs文件夹,如下图 阅读详情

相关推荐

libsvm在python下的使用

1.libsvm在python下的使用 由于研究需要,今天在学习支持向量机svm在python中的使用。看了svm的API后发现,貌似只有svm低级的方法,在网上查了之后才知道要下载libsvm,网址是http://www.csie.ntu.edu.tw/~cjlin/libsvm/。libsvm在python下的目录中包含了svm.py和svmutil.py,而svm.py接口主要包括了一些l

Olaking的专栏 1764

【机器学习】用libsvm C++训练SVM模型

libsvm是台湾大学林智仁(Chih-Jen Lin)教授于2001年开发的一套支持向量机的工具包,可以很方便地对数据进行分类或者回归分析。

HerosOfEarth的博客 9331

LibSVM(java版)的使用

0  准备工作      1)下载一个LibSVM;      2)了解一下SVM的原理还是非常必要的,不然都不知道参数是啥意思。。我看过一篇SVM入门的博客,里面有八讲,分享之。 1  LibSVM的使用介绍

BlockheadLS的博客 1万+

libsvm如何调用svm.cpp进行训练和预测的具体过程

这里写下关于libsvm中,从MATLAB文件夹中的svmtrain.c和svmpredict.c入口,如何调用svm.cpp的过程进行详细的解析。当遇到比较重要的新的函数时,会在后面列出这个函数的作用和详细执行的过程,以便自己能看懂。 注:这里主要侧重调用C_SVC的情况,以及当置b=1时的情况分析。 ---------------------------------------

u010005161的博客 3549

LIBSVM在python下的使用

1)安装Python,直接去官方网站2)运行“cmd”,直接输入python,查看python是32位还是64位2.1  若python是32位的,则在libsvm-3.22文件夹下的windows文件夹中找到动态链接库libsvm.dll),将其添加到系统目录,如`C:\WINDOWS\system32\’,即可在python中使用libsvm2.2  若python是64位的,则需要首先自己编...

像风走了八千里 2252

【LIBSVM】使用C++和LIBSVM实现机器学习+样本分类

【LIBSVM】使用C++和LIBSVM实现机器学习+样本分类

【机器学习】libsvm 简单使用示例(C++)

libsvm简单使用demo一、libsvm使用说明二、svm.h源码#ifndef _LIBSVM_H //如果没有定义 _LIBSVM_H 宏 #define _LIBSVM_H //则定义 _LIBSVM_H 宏,用于防止重复包含 #define LIBSVM_VERSION 317 //定义一个宏,表示 libsvm 的版本号 #ifdef __cplusplus //如果是 C+...

cxyhjl的博客 2567

保姆级教程:在RK3588开发板上编译带MPP硬件加速的FFmpeg(含完整依赖库配置)

本文提供在RK3588开发板上编译支持MPP硬件加速的FFmpeg的详细教程,涵盖交叉编译环境搭建、MPP框架及依赖库配置,最终实现4K视频硬件编解码性能优化。通过实战步骤和性能对比,展示如何充分发挥RK3588的硬件加速能力。

weixin_30839881的博客 418

C++ libsvm 保存和加载训练好的模型

我这个什么意思呢?就是保存模型,用文件的形式把模型保存起来,然后加载libsvm保存的文件。 我看大部分博客要么是用命令行,要么直接出来结果,我这个算是补充了。 那么下载运行之类的我就不说了,详情看我的另外一篇博客。 https://blog.youkuaiyun.com/Yonggie/article/details/97560839 简明扼要。 那么现在我们的工程视图是这样: ...

Yonggie的博客 2590

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

全志T113s3主线linux开发(0)--基础准备

嵌入式Linux设备的启动大概是三步:1)启动芯片+内存:常见的是Uboot,不过全志的Uboot主线对SPI NAND 不太友好,用TF卡就方便。对于T113S芯片,推荐使用Awboot,简陋但快速。开发阶段用这个就方便好多,对SPINAND支持也方便。2)启动linux内核:主线内核以下通篇都用6.13以上的内核。对比tina5.0还在用5.4 ,主要是性能、安全上有变化。6.0以上内核在devicetree的编写具体格式上有了变化,网上大量tina5.0和5.4内核的编写方式不适用。

2301_79234138的博客 2247

关于libsvm的c++训练的有关例子

关于libsvm的c++训练的有关例子** 本人是小白,因为在学习图像处理的过程中,需要用到libsvm,因此将在使用过程中遇到的问题记录下来,方便以后自己查看,也希望能够帮助其他的初学者。 首先关于libsvm的介绍libsvm下载可以从其官网免费获得,可以根据自己的需要下载版本,本人下载的是3.23版本. 不同文件夹对应不同版本的libsvm,其中README是关于libsvm的介绍,里面都是...

xigua061126的博客 1081

【全志V821_FoxPi】6-2 IMX219 MIPI摄像头适配

全志V821芯片适配IMX219 MIPI摄像头(2lane)教程,基于FoxPi开发板V1.2 SDK。文章详细介绍了IMX219的技术参数(800万像素、1/4英寸CMOS、支持1080P@30fps输出)及模组接口原理图。重点展示了设备树配置方法,包括PIO引脚定义(TWI0使用PA3/PA4,复位引脚PA2)、TWI0节点设置(100kHz时钟)以及VIND0节点中sensor0的完整配置(I2C地址0x20、MCLK0、RAW格式输出等)。配置过程强调需注意IMX219的器件地址转换(0x10→0

第四维度的博客 2254

LIBSVM使用方法

1、 Libsvm下载 下载libsvm的最新版本,下载地址为http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 目前最新版本为libsvm-3.22 将libsvm-3.22.zip解压,我的解压到了F:\libsvm。 添加环境变量到path:我的电脑->属性->高级->环境变量->系统变量->变量列表里面双击 Path,在变量值最后添加;F:\libs

于书盼的博客 3万+

【DeepSeek实战】1、DeepSeek民用级开发全指南:从0到1掌握AI应用开发与模型蒸馏实战

DeepSeek创新性地打破了传统AI开发的技术壁垒,通过双模型架构(DeepSeek-V3和R1)实现普惠化与专业化并重。其核心优势包括:零代码操作、浏览器直接使用、中文提示词控制及低成本(2元/百万token)。用户通过简单三步(注册-配置-使用)即可快速开启AI之旅,平台提供$50免费额度支持2个月高频使用。 四大核心应用场景: 办公自动化:周报撰写、PPT生成、数据分析一键完成 内容创作:提供爆款标题生成、垂直领域写作模板 学习辅助:支持文档解析、错题讲解、知识图谱构建 生活服务:个性化行程规划

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1735

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8123

LIBSVM在Matlab下的使用

支持向量机(SVM,Support Vector Machine)是一种基于统计学习理论的模式识别方法,在解决小样本、高维度及非线性的分类问题中应用非常广泛。 LIBSVM是一个由台湾大学林智仁(Lin Chih-Jen)教授等开发的SVM模式识别与回归的软件包,使用简单,功能强大,本文主要介绍其在Matlab中的使用。 一 安装 1. 下载 在LIBSVM的主页上下载最新版本的软件包...

触动人生的博客 4549

详解Pytorch求导

本文主要详解Pytorch求导,希望能对学习Pytorch的同学有所帮助。 文章目录 1. pytorch求导问题 2. pytorch三大类求导代码示例 2.1 标量求导 2.2 向量求导&矩阵求导

weixin_43178406的博客 3074

Weka3.5中使用LibSVM

Dr. Y.Bao推荐数据试验中最好用上SVM的分类方法,让我们在Weka中使用LibSVM,我在网上差了半天,看到许多相同的被转来转去的帖子都讲得人晕头转向,尤其是像我这种Java基础不牢固的人更是不知所以,弄了半天走了不少弯路,不过最后总算是让我把LibSVM集成进Weka了,下面就以我自己的实际经验介绍一下最简单并且切实可行的方法: Weka3.5后增加了libsvm这个选

junnan321的专栏 9934

【WRF-Urban运行】WRF-SLUCM耦合建模参数设置及模拟运行

WRF-SLUCM耦合建模参数设置及模拟运行

WW、forever的博客 1723

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java libsvm使用_LibSVM使用指南

本文包含以下几个部分:支持向量机--SVM简介LibSVM的安装LibSVM的使用LibSVM参数调优Java版LibSVM库函数的调用SVM简介在进行下面的内容时我们认为你已经具备了数据挖掘的基础知识。SVM是新近出现的强大的数据挖掘工具,它在文本分类、手写文字识别、图像分类、生物序列分析等实际应用中表现出非常好的性能。SVM属于监督学习算法,样本以属性向量的形式提供,所以输入空间是Rn的子集。...

weixin_36212493的博客 889

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

详解LibSVM使用

 Dr.Y.Bao推荐数据试验中最好用上SVM的分类方法,让我们在Weka中使用LibSVM,我在网上差了半天,看到许多相同的被转来转去的帖子都讲得人晕头转向,尤其是像我这种Java基础不牢固的人更是不知所以,弄了半天走了不少弯路,不过最后总算是让我把LibSVM集成进Weka了,下面就以我自己的实际经验介绍一下最简单并且切实可行的方法:We

AlextoWarson的专栏 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: C++堆、栈、自由存储区、全局/静态存储区和常量存储区
下一篇: C/C++中stack overflow问题
樱满月
博客等级 码龄14年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值