《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 294974|回复: 8257
收起左侧

[教程] (更新libsvm-faruto版本归来)libsvm-3.1-[FarutoUltimate3.1Mcode]

    [复制链接]

签到天数: 12 天

[LV.3]偶尔看看II

发表于 2011-6-10 15:31:10 | 显示全部楼层 |阅读模式
本帖最后由 faruto 于 2011-8-3 17:28 编辑

【工具箱】

libsvm-3.1-[FarutoUltimate3.1Mcode]

其他名称:libsvm-faruto版本,libsvm-faruto加强工具箱,libsvm-farutoUltimate版本

【更新说明】

libsvm-faruto版本好久都没有更新了,近期我将代码重新整理了一下,看到注释中上次更新代码的时间是2010.01.17,才发现libsvm-faruto版本已经一年多没有添加进行更新,看着自己以前编写的一行行代码,心中不免想起过往那些逝去的岁月,想起过往的那些人,煽情的不多说,此次更新主要内容如下:

1.基于目前的最新的libsvm-3.1编写。
2.对原来的部分代码进行了重新优化。
3.添加ClassResult.m函数,方便给出各种分类准确率,以及给出判别函数的权值w、偏置b、支持向量在原始训练集中的位置索引以及alpha系数。
给出这个函数的目的是方便大家,个人感觉这个函数会对相关朋友有很大帮助。
4.重新编写说明文档TutorialForFarutoUltimate3.1.pdf

由于libsvm回归不支持多输出,本来还想实现libsvm的多输出(lssvm支持多输出,但我详细研究了一下lssvm也就是一维一维的进行回归实现的多输出,libsvm完全可以仿照这种形式实现多输出),但后来又犯懒,因为实在没有技术含量,就搁置了。如果实现有朋友需要就在后期的版本更新中添加吧。另外给大家做个预告,暑假期间我会制作一系列的关于libsvm工具箱和lssvm工具箱的视频,完全免费下载。之前在我的那个专辑期刊中做过预告,这里权当造势啦。O(∩_∩)O

ClassResult.m源代码
  1. function CR = ClassResult(label, data, model, type)
  2. % by faruto
  3. % last modified 2011.06.09
  4. % type 1:输入的data为训练节
  5. %      2:输入的data为测试集
  6. % 当输入的data为训练集时,需要事先在外部将标签转换为1,-1
  7. %%
  8. if nargin < 4
  9.     type = 1;
  10. end
  11. CR = struct();
  12. %%
  13. [plabel,acc,dec] = svmpredict(label,data,model);
  14. %% some info of the data set
  15. disp('===some info of the data set===')
  16. str = sprintf('#class is %d',model.nr_class);
  17. disp(str)
  18. lstr = ['类别标签为 '];
  19. for i = 1:size(model.Label,1)
  20.     lstr = [lstr, num2str(model.Label(i)),' '];
  21. end
  22. disp(lstr);
  23. if type == 1
  24.     str = ...
  25.         sprintf('支持向量数目 %d,所占训练集样本数目比例 %g%% (%d/%d)',model.totalSV,model.totalSV/size(data,1)*100,model.totalSV,size(data,1));
  26.     disp(str);
  27.     ratio = model.totalSV/size(data,1)*100;
  28.     if ratio >= 80
  29.         disp('Tips:支持向量数目所占比例过大(>=80%),可以考虑重新优化参数')
  30.     end
  31. else
  32.     str = ...
  33.         sprintf('支持向量数目 %d',model.totalSV);
  34.     disp(str);   
  35. end
  36. %% 各种分类准确率
  37. disp('===各种分类准确率===');
  38. CR.accuracy = zeros(1,size(model.Label,1)+1);
  39. CR.accuracy(1) = sum(plabel == label)/numel(label);
  40. str = ...
  41.     sprintf('整体分类准确率 = %g%% (%d/%d)',CR.accuracy(1)*100,sum(plabel == label),numel(label));
  42. disp(str)
  43. for i = 1:numel(model.Label)
  44.     p = 0;
  45.     n = 0;
  46.     for run = 1:numel(label)
  47.         if label(run) == model.Label(i)
  48.             if plabel(run) == model.Label(i)
  49.                 p = p + 1;
  50.             else
  51.                 n = n + 1;
  52.             end
  53.         end
  54.     end
  55.     CR.accuracy(i+1) = p/(p+n);
  56.     str = ...
  57.         sprintf('第 %d 类分类准确率 = %g%% (%d/%d)',model.Label(i),CR.accuracy(i+1)*100,p,p+n);
  58.     disp(str);
  59. end
  60. %%
  61. if type == 1
  62.     [tmp index]=ismember(model.SVs,data,'rows');
  63.     CR.SVlocation = index;
  64. end
  65. %%
  66. if numel(model.Label) == 2 && type == 1
  67.     CR.b = -model.rho;
  68.     CR.w = model.sv_coef;
  69.     CR.alpha = zeros(size(model.sv_coef,1),1);
  70.     for i = 1:size(model.sv_coef,1)
  71.         CR.alpha(i) = CR.w(i)/label(CR.SVlocation(i));
  72.     end
  73. end
复制代码
ClassResult.m函数测试代码
  1. %% ClassResult_test
  2. % by faruto
  3. %% a litte clean work
  4. tic;
  5. close all;
  6. clear;
  7. clc;
  8. format compact;
  9. %%
  10. % load wine_test;
  11. % label = train_data_labels;
  12. % data = train_data;

  13. load heart_scale;
  14. data = heart_scale_inst;
  15. label = heart_scale_label;

  16. model = svmtrain(label,data);
  17. %%
  18. type = 1;
  19. CR = ClassResult(label, data, model, type)

  20. %%
  21. toc;

复制代码
测试结果
  1. Accuracy = 86.6667% (234/270) (classification)
  2. ===some info of the data set===
  3. #class is 2
  4. 类别标签为 1 -1
  5. 支持向量数目 132,所占训练集样本数目比例 48.8889% (132/270)
  6. ===各种分类准确率===
  7. 整体分类准确率 = 86.6667% (234/270)
  8. 第 1 类分类准确率 = 80.8333% (97/120)
  9. 第 -1 类分类准确率 = 91.3333% (137/150)
  10. CR =
  11.       accuracy: [0.8667 0.8083 0.9133]
  12.     SVlocation: [132x1 double]
  13.              b: -0.4245
  14.              w: [132x1 double]
  15.          alpha: [132x1 double]
  16. Elapsed time is 0.023713 seconds.
  17. >>
复制代码
【工具箱下载】

游客,如果您要查看本帖隐藏内容请回复

2.jpg

【说明文档下载】

游客,如果您要查看本帖隐藏内容请回复

1.jpg

评分

参与人数 24威望 +5 贝壳 +24 贡献 +53 收起 理由
tb297811_55 + 1 + 3 感谢您分享自己珍贵的资料
zs20061621 + 3 感谢您分享自己珍贵的资料
general1987 + 1 + 3 感谢您分享自己珍贵的资料
lalagjp + 1 + 3
carol_wei + 3 学习了

查看全部评分

该用户从未签到

发表于 2016-1-31 11:47:36 | 显示全部楼层
谢谢楼主分享!
回复 支持 1 反对 1

使用道具 举报

该用户从未签到

发表于 2016-12-13 15:47:31 | 显示全部楼层
版主大大你好。
我最近拜读了您的《matlab神经网络43个案例分析》,现有一个问题,第16章回归预测分析中,您提供的代码

  1. % 打印精细选择结果
  2. disp('打印精细选择结果');
  3. str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg);
  4. disp(str);

  5. %% 利用回归预测分析最佳的参数进行SVM网络训练
  6. cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg) , ' -s 3 -p 0.01'];
  7. model = svmtrain(TS,TSX,cmd);

  8. %% SVM网络回归预测
  9. [predict,mse] = svmpredict(TS,TSX,model);
  10. predict = mapminmax('reverse',predict',TSps);
  11. predict = predict';

  12. % 打印回归结果
  13. str = sprintf( '均方误差 MSE = %g 相关系数 R = %g%%',mse(2),mse(3)*100);
  14. disp(str);
复制代码


  1. [predict,mse] = svmpredict(TS,TSX,model);
复制代码

这一句有问题,使用libsvm3.2不能运行这句。
不知道其他人是不是也有遇到这样的问题?
回复 支持 1 反对 0

使用道具 举报

签到天数: 16 天

[LV.4]偶尔看看III

发表于 2011-6-10 15:41:42 | 显示全部楼层
敬佩faruto!!!辛苦了!

签到天数: 1 天

[LV.1]初来乍到

发表于 2011-6-10 15:42:55 | 显示全部楼层
期待您能编写一个针对有偏数据集评估准则如AUC等的参数寻优函数

签到天数: 12 天

[LV.3]偶尔看看II

 楼主| 发表于 2011-6-10 15:43:55 | 显示全部楼层
hotonwu 发表于 2011-6-10 15:41
敬佩faruto!!!辛苦了!

多谢您的支持~

签到天数: 12 天

[LV.3]偶尔看看II

 楼主| 发表于 2011-6-10 15:45:36 | 显示全部楼层
aoshuang 发表于 2011-6-10 15:42
期待您能编写一个针对有偏数据集评估准则如AUC等的参数寻优函数

关于有偏数据集(un-balanaced label data)相关问题的参数寻优,我一直都列入计划更新中,只是我想更加系统化弄一下。O(∩_∩)O

签到天数: 1 天

[LV.1]初来乍到

发表于 2011-6-10 15:50:49 | 显示全部楼层
回复 faruto 的帖子

哈哈 太好了 希望我这篇文章完成之前能看到您的程序更新 嘻嘻~~

签到天数: 12 天

[LV.3]偶尔看看II

 楼主| 发表于 2011-6-10 16:14:34 | 显示全部楼层
aoshuang 发表于 2011-6-10 15:50
回复 faruto 的帖子

哈哈 太好了 希望我这篇文章完成之前能看到您的程序更新 嘻嘻~~

什么文章?

签到天数: 11 天

[LV.3]偶尔看看II

发表于 2011-6-10 22:11:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

签到天数: 71 天

[LV.6]常住居民II

发表于 2011-6-11 07:17:59 | 显示全部楼层
楼主发帖辛苦了,谢谢楼主分享!
昨天发现MATLAB函数百科很赞,中文函数帮助果然强大哦

签到天数: 12 天

[LV.3]偶尔看看II

 楼主| 发表于 2011-6-11 10:43:19 | 显示全部楼层
myisland 发表于 2011-6-10 22:11
灰常感谢,faruto,拜你为师……

不客气
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 陕ICP备08102094号  

GMT+8, 2017-9-27 03:43 , Processed in 1.114045 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表