如何在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
声明:
如果你找到了我这篇标题的文章,那很大程度上意味着你一定是在 VS 里或者 MFC 里使用 libsvm 工具箱出现了问题。那你也一定知道了,libsvm 在VS工程里的使用与它在 matlab 或者是 python 里面的使用,是多么的不同。
致谢:
如果没有 gg 百分之百的帮助,就凭我在 VS 里编程的菜鸟能力,是绝对不可能1天就搞好的,我绝对会弄半年不止所以非常感谢非常感谢,今后我一定认真学习编程。
正文:
分三部分:第一部分:先把 VS 工程的框架建好
第二部分:工程里包含主函数的 cpp 文件要怎么写
第三部分:把 libsvm 工具箱移植到 MFC 中进行使用
第四部分:在本文代码中能够正确运行的数据格式
资源地址:如何在Visual Studio(VS)里使用libsvm工具箱(与博文相关的代码包)
第一部分:先把 VS 工程的框架建好
对于java、matlab、python、windows 都有相对应的文件夹,文件夹里面的内容和上图中的这个 readme 就可以帮助你在以上四种情况下使用了。
那在 VS 里该怎么使用呢?
首先,我们先建立一个Win32控制台项目,起名为 MM ,如下步骤:
然后,把 libsvm 文件夹里的这几个文件(如下图),都拷贝到 MM 项目的文件夹(如下下图)里去,以备后续使用。
然后,在 MM 项目里,我们把 svm.h 和 svm.cpp 分别添加到头文件和源文件里面去,如下图:
然后,在源文件里,右键——新建项:MM.cpp
接下来是第二部分
第二部分:工程里包含主函数的 cpp 文件要怎么写
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <list>
- #include <fstream>
- #include <iostream>
- #include "svm.h"
- using namespace std;
接下来的内容大致分五部分:
第一:读入训练数据和测试数据
- #define XLEN 10 //生产测试数据,这个感觉就是无用的地方
- #define YLEN 10
- ofstream outdata; //需要准备的所有数据的标签label和特征feature都是分开的,而且特征feature前面不需要加序号冒号这种东西,只需用空格隔开就好
- ifstream indata; //所以这里indata只包含特征,indata_label只包含label,每一行是一个样本的。
- ofstream outdata_lable;
- ifstream indata_lable;
- int NUM = 1440; //由于我的样本特征是 1440 维,所以读数据的时候,我定义了个数,你可以根据自己特征的维度对 NUM 进行更改。
- //char default_param[] = "-t 2 -c 100"; // 这个是 svm_toy.cpp 里对参数的选择
- char default_param[] = "-t 2 -c 4 -g 32"; // 这个是匹配我数据的参数
- struct point { //这个是后面 svm_train 拿来数据做训练时候的数据传入方式
- double *feature;
- //signed char value;
- int value;
- };
- list<point> point_list; // 通过 indata 读进来的数据就放在 point_list 里面
- int current_value = 1; // 路人甲变量
- void clear_all() // 清空链表
- {
- point_list.clear();
- }
然后,我们先读入训练数据,用来训练模型
- void readFile1(char *file,char *file_lable) //定义读入训练数据的函数叫做 readFile1
- {
- indata.open(file,ios::in); //读入特征
- indata_lable.open(file_lable,ios::in); // 读入标签
- cout <<"read data begin"<<endl; // 屏显
- clear_all();
- while(!indata.eof()) // 如果没有读到文件结束,就继续读,知道读完整个 traindata 文件
- {
- double *line = new double[NUM];
- for(int i =0;i<NUM;i++)
- {
- indata >> line[i]; //把特征存起来
- }
- point p;
- indata_lable >>p.value; //把label存起来
- p.feature = line;
- point_list.push_back(p);
- }
- point_list.pop_back(); //如果你的 traindata.txt 文件数据的最后有一个空格的话,需要加上这句话,否则预测会有错如果没有空格,这句话就不需要了
- indata.close();
- indata_lable.close();
- cout <<"read data end"<<endl;
- }
- void readFile2(char *file,char *file_lable) // 读入测试文件的函数叫做 readFile2
- {
- indata.open(file,ios::in); //接下来代码和上面读训练数据是一个样子的
- indata_lable.open(file_lable,ios::in); // <span style="font-family: Arial, Helvetica, sans-serif;">由于读训练数据之后就会建立model,然后才会读测试数据,所以不用担心会有数据覆盖的问题</span>
- cout <<"read test data begin"<<endl;
- clear_all();
- while(!indata.eof())
- {
- double *line = new double[NUM];
- for(int i =0;i<NUM;i++)
- {
- indata >> line[i];
- }
- point p;
- indata_lable >>p.value;
- p.feature = line;
- point_list.push_back(p);
- }
- point_list.pop_back();
- cout <<"read test data end size = "<<point_list.size()<<endl;
- indata.close();
- indata_lable.close();
- }
第二:构建参数 param 的结构体
第三:构建分类问题 prob 的结构体
第四:主函数如下
- int main()
- {
- int choice;
- cout<<"1 train model\n2 test1\n3 test2\n"<<endl;
- cin >>choice;
- switch(choice)
- {
- case 1:
- {
- readFile1("traindata.txt","trainlabel.txt"); //选择1 是训练模型,模型会保存为“model.txt”
- run();
- break;
- }
- case 2:
- {
- readFile2("1.txt","1_label.txt"); // 选择2 是用第一份测试数据进行测试
- testData();
- break;
- }
- case 3:
- {
- readFile2("11.txt","11_label.txt"); // 选择3 是用第二份测试数据进行测试
- testData();
- break;
- }
- }
- system("pause");
- return 0;
- }
第五:结果展示
第三部分:把 libsvm 工具箱移植到 MFC 中进行使用
第四部分:在本文代码中能够正确运行的数据格式
如何在Visual Studio(VS)2012里使用libsvm工具箱的更多相关文章
- 如何在"Visual Studio Code"中使用" Git" 进行版本控制
如何在"Visual Studio Code"中使用" Git" 进行版本控制 本来认为此类教程,肯定是满网飞了.今天首次使用VS Code的Git功能,翻遍了 ...
- 如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framework.ASP.Net MVC等框架的逐渐开源,也让大家看到了微软开源的步伐.CodePlex 则是 ...
- [转]如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
本文转自:http://www.cnblogs.com/stg609/p/3673782.html 开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framew ...
- 如何在Visual Studio中选择C++和C#的编译器版本
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Visual Studio中选择C++和C#的编译器版本.
- Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥
Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥: YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 已经过本人测试 本着分享的精神,希望大家 ...
- Microsoft Visual Studio Professional 2012 专业版 下载
记录(以下内容来自网络收集): 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=30682 直接iso连接下载址: htt ...
- 修改VISUAL STUDIO EXPRESS 2012新建C++文件编码
本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供markdown格式源码,欢迎使 ...
- 关于如何在Visual Studio上仿真调试安卓的U3D应用
正巧最近需要开发一个安卓手机上的Unity3D游戏功能,想着既然要开发么,当然需要调试.本来的话一些基础功能是不需要使用仿真模拟器,直接在U3D的开发编辑器上就能调试,不过有一些安卓上才能执行,比如 ...
- [译]如何在visual studio中调试Javascript
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
随机推荐
- [hdu4667]Building Fence 计算几何 瞎瘠薄搞
大致题意: 给出n个圆和m个三角形,求最小的的,能将所有图形覆盖的图形的周长. 正解为求所有三角形顶点与圆的切点以及圆和圆的切点构造凸包,再求路径. 因为要求结果误差<=1e-3 所以 我们可以 ...
- Python函数系列-一个简单的生成器的例子
def consumer(): while True: x = yield print('处理了数据:',x) def producer(): pass c = consumer() #构建一个生成器 ...
- Python并发编程-多进程socketserver简易版
普通版的socketserver #server.py import socket sk = socket.socket() sk.bind(('127.0.0.1',8080))#建立连接 sk.l ...
- Python类总结-继承-子类和父类,新式类和经典类
子类和父类 class Father(object): #子类在使用super调用父类时,Father后面要加object --新式类 def __init__(self): self.Fname = ...
- js中箭头函数和普通函数this的区别
最近在学习angularJs的时候由于里面涉及到了箭头函数,箭头函数除了声明上有点区别以外,和普通函数最主要的区别还是在this的问题上. Js中函数中嵌套的函数this不会 “继承”.比如说以下代码 ...
- eclipse的一些部署
1. Eclipse导入一个项目Package Exporer-------右键------import------General------Existing Project into Workspa ...
- centos7 更改时区
Linux 系统(我特指发行版, 没说内核) 下大部分软件的风格就是不会仔细去考虑向后 的兼容性, 比如你上个版本能用这种程序配置, 没准到了下一个版本, 该程序已经不见了. 比如 sysvinit ...
- Hibernate 基于外键的双向一对一关联映射
之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...
- 【BZOJ 2039】 2039: [2009国家集训队]employ人员雇佣 (最小割)
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1511 Solved: 728 Descri ...
- GeoIP的使用
GeoIP介绍: 什么是GepIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息.这里面的技术不算难题,关键在于有个精准 的数据库.有了准确的数据源 ...