libsvm工具箱C++下编程实践1

转载请说明出处  http://blog.csdn.net/u013491262/article/details/37344193   点击打开链接

step1 :  理论学习,资料随便找

step2:  源码分析,资料随便找

step3; 简单实践

一、生成数据

为了将问题简化,特意生成训练集  tain_data.txt

类1 : y<=x-1 ,

类2 : y>= x+1 .

个100组数据,特征为2维。

测试集100组数据test_data.txt

int main(){
    freopen("tain_data.txt" ,  "w" , stdout) ;

    srand( (unsigned int) time(NULL) ) ;
    int n = 0 , x , y ;

    while(n < 100){
        x = rand() % 10 + 1 ;
        y = rand() % 10 + 1 ;
        if(y <= x - 1)  printf("-1 %d %d\n" , x, y) ;
        else continue ;
        n++ ;
    }

    n = 0 ;
    while(n < 100){
        x = rand() % 10 + 1 ;
        y = rand() % 10 + 1 ;
        if(y >= x + 1)  printf("1 %d %d\n" , x, y) ;
        else continue ;
        n++ ;
    }

    freopen("test_data.txt" ,  "w" , stdout) ;
    n = 0 ;
    while(n < 100){
        x = rand() % 10 + 1 ;
        y = rand() % 10 + 1 ;
        if(y <= x - 1)       printf("-1 %d %d\n" , x, y) ;
        else if(y >= x + 1)  printf("1 %d %d\n" , x, y) ;
        else continue ;
        n++ ;
    }

    return 0;
}

二: 实验

引用《交大源码分析》

引用《交大源码分析》

代码部分: 此代码难度系数很小,没有细讲必要。

#include "svm.h"
using namespace std ;

const int feature_size = 2 ;
const int train_size = 200 ;
svm_problem prob ;

void init_svm_problem(){
     prob.l = train_size ;
     prob.y = new double[train_size] ;
     prob.x = new svm_node* [train_size] ;
     svm_node *x_space = new svm_node[train_size*(1+feature_size)] ;
     ifstream  in ;
     in.open("tain_data.txt") ;
     double value , lb ;
     for(int i = 0 ; i < train_size ; i++){
         in>>lb ;
         //prob.y[i] = lb ;
         if(i < train_size/2) prob.y[i] = 1 ;
         else       prob.y[i] = -1 ;
         for(int j = 0 ; j < feature_size ; j++){
             in>>value ;
             if(value != 0.0){
                x_space[i*(feature_size+1) + j].index = j + 1 ;
                x_space[i*(feature_size+1) + j].value = value ;
             }
         }
         x_space[i*(feature_size+1) + feature_size].index = -1 ;
         prob.x[i] = &x_space[i*(feature_size+1)] ;
     }
     in.close() ;
}

svm_parameter param ;
void  init_svm_parameter(){
      param.svm_type = C_SVC;
      param.kernel_type = RBF;
      param.degree = 3;
      param.gamma = 0.0001;
      param.coef0 = 0;
      param.nu = 0.5;
      param.cache_size = 100;
      param.C = 11;
      param.eps = 1e-5;
      param.p = 0.1;
      param.shrinking = 1;
      param.probability = 0;
      param.nr_weight = 0;
      param.weight_label = NULL;
      param.weight = NULL;
}

const int test_size = 100 ;
double predict_lable[test_size] ;
double test_lable[test_size] ;

int  main(){
     init_svm_problem() ;
     init_svm_parameter() ;
     if(param.gamma == 0) param.gamma = 0.5 ;
     svm_model* model = svm_train(&prob , &param) ;
     ifstream in ;
     in.open("test_data.txt") ;
     svm_node *test = new svm_node[3] ;
     for(int i = 0 ; i < test_size ; i++){
          double value ;
          in>>test_lable[i] ;
          for(int j = 0 ; j < feature_size ; j++){
               in>>value ;
               if(value != 0.0){
                   test[j].index = j + 1 ;
                   test[j].value = value ;
               }
          }
          test[feature_size].index = -1 ;
          predict_lable[i] = svm_predict(model , test) ;
     }

     int yes = 0 ;
     for(int i = 0 ; i < test_size ; i++){
         // cout<<test_lable[i] <<" , "<<predict_lable[i]<<endl ;
         if(test_lable[i] == predict_lable[i])  yes++ ;
     }
     cout<<yes<<endl ;
     printf("%.2lf%%\n" , (0.0+yes)/test_size) ;
     in.close() ;
     return 0 ;
}

结果

效果不好,没有寻找参数。

待续文。

-----------------------------

问题解决,由于文件单词拼写错误。

--------------------------------------测试数据-----------------------------------------------------------

tain_data.txt

-1 6 2
-1 8 1
-1 9 2
-1 2 1
-1 8 3
-1 5 2
-1 10 2
-1 8 5
-1 2 1
-1 7 6
-1 7 2
-1 8 3
-1 9 8
-1 4 2
-1 4 2
-1 9 8
-1 10 1
-1 10 7
-1 10 2
-1 8 1
-1 9 4
-1 10 1
-1 6 2
-1 8 2
-1 7 5
-1 8 1
-1 5 1
-1 5 2
-1 10 1
-1 6 3
-1 7 6
-1 10 3
-1 8 4
-1 10 5
-1 10 8
-1 7 1
-1 10 2
-1 5 3
-1 9 8
-1 10 1
-1 10 9
-1 7 5
-1 9 7
-1 6 1
-1 8 6
-1 5 1
-1 7 1
-1 9 3
-1 9 1
-1 7 5
-1 5 1
-1 10 9
-1 4 1
-1 7 5
-1 4 2
-1 9 4
-1 7 2
-1 9 5
-1 10 6
-1 10 4
-1 5 1
-1 8 2
-1 7 4
-1 5 3
-1 5 3
-1 7 2
-1 10 6
-1 10 7
-1 8 2
-1 10 3
-1 10 4
-1 10 4
-1 8 7
-1 6 1
-1 3 2
-1 9 3
-1 5 1
-1 10 9
-1 9 2
-1 5 4
-1 10 4
-1 9 7
-1 4 3
-1 4 1
-1 10 7
-1 5 1
-1 9 3
-1 6 1
-1 6 1
-1 3 1
-1 6 1
-1 8 2
-1 8 7
-1 10 6
-1 8 5
-1 7 1
-1 7 6
-1 9 2
-1 8 5
-1 9 2
1 5 10
1 5 7
1 4 10
1 4 9
1 9 10
1 2 4
1 2 8
1 3 7
1 7 8
1 9 10
1 1 5
1 5 9
1 4 5
1 4 8
1 6 7
1 2 8
1 2 10
1 4 5
1 6 8
1 1 9
1 4 6
1 4 5
1 1 9
1 2 4
1 1 9
1 5 8
1 3 7
1 6 7
1 4 10
1 3 7
1 4 6
1 4 9
1 3 6
1 1 4
1 5 9
1 1 6
1 2 5
1 4 6
1 1 9
1 4 8
1 9 10
1 7 9
1 2 3
1 4 9
1 1 4
1 3 8
1 4 9
1 4 8
1 8 10
1 9 10
1 6 8
1 1 10
1 2 3
1 1 9
1 1 8
1 8 10
1 3 7
1 2 7
1 1 10
1 5 7
1 1 10
1 4 7
1 3 5
1 6 9
1 2 7
1 2 5
1 1 5
1 1 4
1 5 6
1 1 6
1 3 7
1 5 9
1 6 10
1 1 9
1 3 10
1 6 10
1 2 7
1 4 7
1 2 7
1 6 7
1 2 8
1 7 9
1 1 7
1 4 8
1 1 5
1 4 7
1 3 6
1 2 4
1 4 9
1 5 9
1 3 10
1 7 9
1 3 7
1 1 10
1 4 10
1 6 8
1 3 4
1 6 9
1 3 7
1 3 5

test_data.txt

1 2 10
1 1 7
-1 7 3
1 1 6
-1 8 1
1 4 8
-1 9 6
1 3 10
-1 4 2
1 1 9
-1 8 5
-1 9 4
-1 9 3
-1 8 3
-1 8 6
1 1 5
1 1 3
1 1 5
-1 6 3
-1 9 5
-1 8 2
1 2 10
1 3 6
-1 9 8
1 1 4
1 5 6
-1 9 8
-1 8 2
1 3 6
1 5 6
-1 8 4
1 6 7
-1 9 3
1 9 10
1 3 5
1 1 2
-1 10 7
-1 8 6
1 4 6
-1 9 3
-1 8 2
1 2 8
-1 2 1
-1 9 7
-1 8 3
-1 9 3
1 1 2
-1 8 5
-1 7 4
1 3 10
1 3 8
-1 10 7
1 3 6
1 5 6
-1 6 2
1 1 6
1 1 7
1 5 6
-1 9 3
1 3 10
1 4 7
-1 8 2
-1 6 2
-1 7 6
-1 9 1
-1 10 5
1 3 7
-1 7 2
-1 7 2
-1 10 4
1 2 8
-1 10 2
1 3 8
-1 7 1
1 5 10
-1 5 4
-1 3 1
-1 10 1
1 6 10
1 8 10
-1 7 3
1 1 8
1 1 10
1 3 7
-1 2 1
1 2 7
-1 7 4
-1 6 5
1 4 8
1 2 7
1 5 7
1 7 10
-1 10 9
-1 5 1
-1 10 1
-1 7 4
1 3 4
-1 9 2
-1 8 7
1 2 6

libsvm工具箱C++下编程实践1

时间: 2024-09-28 12:05:17

libsvm工具箱C++下编程实践1的相关文章

libsvm工具箱C++下编程实践2

转载请说明出处  http://blog.csdn.net/u013491262/article/details/37344193   点击打开链接 上周由于皮肤有点过敏,去医院来来回回一周. 前几天去上海比完赛,拿了个银牌靠前 ,遗憾总会有的. 于是更新放慢了 . 这篇博客没有什么含金量,只是拿heart_scale.txt这个文件的格式改了改部分代码,内容上没有什么.用到了一些C++的一些不太常用的知识点,也很水. 希望会对需要的人有点帮助. 我的看法,选择MATLAB做svm的分类和C++

关于libsvm工具箱在64位matlab下的安装说明

LIBSVM工具箱的安装 基本方法: 1.在网上下载LIBSVM工具箱. http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.将LIBSVM工具箱所在目录添加到MATLAB工作搜索目录. 3.选择编译器: (1) 安装好VC++ 编译器: (2) 在MATLAB命令窗键入:mex –setup (3) 按提示选择相应的 C++ 编译器. 4.修改MATLAB自带的svmtrain函数名称. MATLAB自带svmtrain函数,与LIBSVM中函数名称冲突,必

如何在Visual Studio(VS)2012里使用libsvm工具箱

原文:http://blog.csdn.net/u014691453/article/details/40393137 软件版本: Visual Studio版本:VS2012 (注:使用方法在 VS2010 上面亲测同样可用,只是可能会出现的问题是: VS2010 和 VS2012 之间有些函数写法不同,需在编译前做改动,譬如 VS2010 的 scanf 对比 VS2012 的 scanf_s ) libsvm版本:libsvm-3.18 声明: 如果你找到了我这篇标题的文章,那很大程度上意

编程实践积累

1 编程经验实践,积累,总结,分享 2 3 4 博客地址:http://www.cnblogs.com/liaowanzhong/ 5 6 7 8 9 10 11 12 13 14 15 1. 大量群发邮件:购买Edm服务,大的互联网企业是和邮箱服务商签订协议(百度,腾讯,京东,阿里,csdn) 16 站内信 17 内网发短信:短信猫 18 19 2. Servlet Filter 生命周期 20 *Servlet:看配置文件中web.xml配置其启动的优先级别,即当load-on-startu

Linux shell一行流编程实践

Linux下很多命令用起来真相当方便,尤其是进行批处理操作时.(话说感觉这种程序也不复杂,windows咋一直不搞一个好用的shell呢) 这里列出一些常用shell操作的应用,具体命令的用法与解释就不列了,网上有很多很好的教程. 批量重命名 假如当前目录下有若干.wma文件,我希望把它们批量转成.mp3文件 例: 001.wma -> 001.mp3 解决方案: awk ? 1 ls * | awk -F '.' '{print "mv "$0" "$1&q

并发编程实践五:ReentrantLock

ReentrantLock是一个可重入的互斥锁,实现了接口Lock,和synchronized相比,它们提供了相同的功能,但ReentrantLock使用更灵活,功能更强大,也更复杂.这篇文章将为你介绍ReentrantLock,以及它的实现机制. ReentrantLock介绍 通常,ReentrantLock按下面的方式使用: public class ReentrantLockTest { private final ReentrantLock lock = new ReentrantLo

郑捷《机器学习算法原理与编程实践》学习笔记(第六章 神经网络初步)6.3 自组织特征映射神经网路(SMO)

具体原理网址:http://wenku.baidu.com/link?url=zSDn1fRKXlfafc_tbofxw1mTaY0LgtH4GWHqs5rl8w2l5I4GF35PmiO43Cnz3YeFrrkGsXgnFmqoKGGaCrylnBgx4cZC3vymiRYvC4d3DF3 自组织特征映射神经网络(Self-Organizing Feature Map.也称Kohonen映射),简称为SMO网络,主要用于解决模式识别类的问题.SMO网络属于无监督学习算法,与之前的Kmeans算

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

1.Unix shell的功能 shell是一个管理进程和运行程序的程序.所有常用的shell都有3个主要功能: (1)运行程序: (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言. 2.Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行.在Unix术语中,一个可执行程序是一些机器指令机器数据的序列.一个进程是程序运行时的内存空间和设

终端控制和和信号——《Unix/Linux编程实践教程》读书笔记(第6章)

1.有些程序处理从特定设备来的数据.这些与特定设备相关的程序必须控制与设备的连接.Unix系统中最常见的设备是终端. 2.终端驱动程序有很多设置.各个设置的特定值决定了终端驱动程序的模式.为用户编写的程序通常需要设置终端驱动程序为特定的模式. 3.键盘输入分为3类,终端驱动程序对这些输入做不同的处理.大多数建代表常规数据,它们从驱动程序传输到程序.有些键调用驱动程序中的编辑函数.如果按下删除键,驱动程序将前一个字符从它的行缓冲中删除,并将命令发送到终端屏幕,使之从显示器中删除字符.最后,有些键调