LibLinear(SVM包)使用说明之(三)实践

LibLinear(SVM包)使用说明之(三)实践

LibLinear(SVM包)使用说明之(三)实践

[email protected]

http://blog.csdn.net/zouxy09

我们在UFLDL的教程中,Exercise: Convolution and Pooling这一章节,已经得到了cnnPooledFeatures.mat特征。在该练习中,我们使用的是softmax分类器来分类的。在这里我们修改为用SVM来替代softmax分类器。SVM由Liblinear软件包来提供。这里是四分类问题,所以Liblinear会根据我们传入的训练样本训练四个二分类器,以实现四分类。以前由softmax分类器得到的准确率是80.406%。在这里换成Liblinear后,准确率变为80.75%。在这里差别不是很大。

在本文的例子中,我们增加了scale和Cross Validation,Cross Validation是用来选择一个最好的参数C的(不知道自己这两个步骤有没有正确,如有错误,还望大家提醒,谢谢)。

具体的代码如下:

[plain] view plaincopy

  1. %// Classification by LibLinear
  2. %// LibLinear: http://www.csie.ntu.edu.tw/~cjlin/liblinear/
  3. %// Author : zouxy
  4. %// Date   : 2013-9-2
  5. %// HomePage : http://blog.csdn.net/zouxy09
  6. %// Email  : [email protected]
  7. clear; clc;
  8. %%% step1: load data
  9. fprintf(1,‘step1: Load data...\n‘);
  10. % pooledFeaturesTrain大小为400*2000*3*3
  11. % pooledFeaturesTest大小为400*3200*3*3
  12. % 第一维是特征个数,也就是特征图个数,第二维是样本个数,第三维是特征图的宽,
  13. % 第四维是特征图的高
  14. load cnnPooledFeatures.mat;
  15. load stlTrainSubset.mat % loads numTrainImages, trainImages, trainLabels
  16. load stlTestSubset.mat  % loads numTestImages,  testImages,  testLabels
  17. % B = permute(A,order) 按照向量order指定的顺序重排A的各维
  18. train_X = permute(pooledFeaturesTrain, [1 3 4 2]);
  19. % 将每个样本的特征拉成一个列向量,每个样本一个列,矩阵大小为3600*2000
  20. train_X = reshape(train_X, numel(pooledFeaturesTrain) / numTrainImages, numTrainImages);
  21. train_Y = trainLabels; % 2000*1
  22. test_X = permute(pooledFeaturesTest, [1 3 4 2]);
  23. test_X = reshape(test_X, numel(pooledFeaturesTest) / numTestImages, numTestImages);
  24. test_Y = testLabels;
  25. % release some memory
  26. clear trainImages testImages pooledFeaturesTrain pooledFeaturesTest;
  27. %%% step2: scale the data
  28. fprintf(1,‘step2: Scale data...\n‘);
  29. % Using the same scaling factors for training and testing sets,
  30. % we obtain much better accuracy. Note: scale each attribute(feature), not sample
  31. % scale to [0 1]
  32. % when a is a vector, b = (a - min(a)) .* (upper - lower) ./ (max(a)-min(a)) + lower
  33. lower = 0;
  34. upper = 1.0;
  35. train_X = train_X‘;
  36. X_max = max(train_X);
  37. X_min = min(train_X);
  38. train_X = (train_X - repmat(X_min, size(train_X, 1), 1)) .* (upper - lower) ...
  39. ./ repmat((X_max - X_min), size(train_X, 1), 1) + lower;
  40. test_X = test_X‘;
  41. test_X = (test_X - repmat(X_min, size(test_X, 1), 1)) .* (upper - lower) ...
  42. ./ repmat((X_max - X_min), size(test_X, 1), 1) + lower;
  43. % Note: before scale the accuracy is 80.4688%, after scale it turns to 80.1875%,
  44. % and took more time. So is that my scale operation wrong or other reasons?
  45. % After adding bias, Accuracy = 80.75% (2584/3200)
  46. %%% step3: Cross Validation for choosing parameter
  47. fprintf(1,‘step3: Cross Validation for choosing parameter c...\n‘);
  48. % the larger c is, more time should be costed
  49. c = [2^-6 2^-5 2^-4 2^-3 2^-2 2^-1 2^0 2^1 2^2 2^3];
  50. max_acc = 0;
  51. tic;
  52. for i = 1 : size(c, 2)
  53. option = [‘-B 1 -c ‘ num2str(c(i)) ‘ -v 5 -q‘];
  54. fprintf(1,‘Stage: %d/%d: c = %d, ‘, i, size(c, 2), c(i));
  55. accuracy = train(train_Y, sparse(train_X), option);
  56. if accuracy > max_acc
  57. max_acc = accuracy;
  58. best_c = i;
  59. end
  60. end
  61. fprintf(1,‘The best c is c = %d.\n‘, c(best_c));
  62. toc;
  63. %%% step4: train the model
  64. fprintf(1,‘step4: Training...\n‘);
  65. tic;
  66. option = [‘-c ‘ num2str(c(best_c)) ‘ -B 1 -e 0.001‘];
  67. model = train(train_Y, sparse(train_X), option);
  68. toc;
  69. %%% step5: test the model
  70. fprintf(1,‘step5: Testing...\n‘);
  71. tic;
  72. [predict_label, accuracy, dec_values] = predict(test_Y, sparse(test_X), model);
  73. toc;
时间: 2024-07-30 13:33:05

LibLinear(SVM包)使用说明之(三)实践的相关文章

LibLinear(SVM包)使用说明之(一)README

LibLinear(SVM包)使用说明之(一)README LibLinear(SVM包)使用说明之(一)README [email protected] http://blog.csdn.net/zouxy09 本文主要是翻译liblinear-1.93版本的README文件.里面介绍了liblinear的详细使用方法.更多信息请参考: http://www.csie.ntu.edu.tw/~cjlin/liblinear/ 在这里我用到的是LibLinear的Matlab接口,这个在下一博文

LibLinear(SVM包)使用说明之(二)MATLAB接口

LibLinear(SVM包)使用说明之(二)MATLAB接口 LibLinear(SVM包)使用说明之(二)MATLAB接口 [email protected] http://blog.csdn.net/zouxy09 一.介绍 LIBLINEAR是一个简单的求解大规模规则化线性分类和回归的软件包.本文介绍在Matlab中如何使用该软件包.(http://www.csie.ntu.edu.tw/~cjlin/liblinear) 二.安装 在Windows系统中,预编译好的可执行文件在..\w

LibLinear(SVM包)的MATLAB安装

LibLinear(SVM包)的MATLAB安装 1 LIBSVM介绍 LIBSVM是众所周知的支持向量机分类工具包(一些支持向量机(SVM)的开源代码库的链接及其简介),运用方便简单,其中的核函数(常用核函数-Kernel Function)可以自己定义也可以默认.但是对一些大数据来说,有没有非线性映射,他们的性能差不多.如果不使用核,我们可以用线性分类或者回归来训练一个更大的数据集.这些数据往往具有非常高维的特征,例如文本分类Document classification.所以LIBSVM就

VxWorks6.6 pcPentium BSP 使用说明(三):设备驱动

本文主要介绍了pcPentium BSP中包含的驱动程序.包含了官方提供的所有驱动程序,除了aic7888Lib--现在已用得很少的一个AIC-7888 SCSI控制器的驱动介绍.建议重点阅读ataDrv和ataShow部分,其他部分可以略看. BSP通过VxBus的驱动合集和老的非VxBus驱动来支持设备.此版本中,VxBus是默认配置,非VxBus驱动程序支持已被删除. VxBus驱动遵循VxWorks 6.2中引进的总线模型.在此模型中,VxBus提供大部分功能,这在以前是需要放入BSP文

wireshark抓包图解-tcp三次握手四次挥手详解/

http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B%E8%AF%A6%E8%A7%A3/ wireshark抓包图解-tcp三次握手四次挥手详解/ tcpdump抓包命令使用方法及内容解析/

wireshark抓包图解 TCP三次握手/四次挥手详解

wireshark抓到的包与对应的协议层如下图所示: 1. Frame:   物理层的数据帧概况 2. Ethernet II: 数据链路层以太网帧头部信息 3. Internet Protocol Version 4: 互联网层IP包头部信息 4. Transmission Control Protocol:  传输层的数据段头部信息,此处是TCP 5. Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议 1. 源端口号:数据发起者的端口号,16bit

node.js之mysql包使用说明

作者:zhanhailiang 日期:2014.11.16 本文将讲解如何在node.js平台上依赖mysql包实现对mysql的访问. 1. 安装: [root@~/wade/nodejs/nodebeginner/mysql_test]# npm install mysql 2. 基于mysql包实现对mysql的连接和查询: [root@~/wade/nodejs/nodebeginner/mysql_test]# cat mysqltest.js var mysql = require(

java.nio包的分析(三)---Charset的理解

前面分析完2个主要的包类,现在我们来揭开Java.nio的最后块神秘的知识点,Charset编码类,他的功能主要是实现字节与Unicode之间的转码转换.同样先来看看他的包结构.,结构比较单一和简单. 里面一个最最主要的类就是Charset类,看看里面有哪些变量 他的构造函数为 Charset类中也有缓存字节本身的类型 我们来看看他最主要的一个功能encode编码是如何实现的 可以从上图中我们知道编码调用的方法其实是CharsetEncoder的encode方法,然后我们往里找 再来其中核心的e

Lang包知识点(三)Object类

Object类 1.Java中的类体系遵循单根结构,即任何一个类往上追溯都到达同一个父类: 2.Object类就是这个单根体系的根,也就是说它是其它所有类的共同父类: 3.如果用户定义的类没有扩展任何其它类,则默认扩展自Object类 4.Object类中定义的一些方法,会被继承到所有类中 Object类的常用方法 //判断当前对象是否与参数obj(内容)相等,如果有必要,应该在自定义的类中覆盖该方法 boolean equals(Object obj) //返回当前对象的字符串表示,如果有必要