svm理论与实验之22: 自定义核函数在Matlab平台上的使用


徐海蛟博士 Teaching.


1984年,莫勒尔和班格尔特合作成立了MathWorks公司,正式把MATLAB推向市场。


MATLAB(矩阵实验室)是MATrix LABoratory的缩写,是一款由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++和FORTRAN)编写的程序。


首先把libsvm下的4个程序编译后放入Matlab平台上:
libsvmread.mexw32   svmpredict.mexw32
libsvmwrite.mexw32  svmtrain.mexw32
直接拷贝过去<libsvm目录>\matlab\也行。
(1)安装C++编译器,matlab自带c编译器(Lcc-win32 C 2.4.1)
(a)安装C++编译器(vc6.0或者Microsoft Visual C++ .NET等)
(b)matlab登记: mex -setup % 登记安装
(b)这一步可不做,下面make的时候会询问使用哪个编译器。
(2)添加路径 File >> Set Path >> <libsvm目录>\matlab >> Save
>> rehash toolboxcache % 更新缓存
(3)编译: 输入 make, 把c文件编译成mex或mexw32执行文件
(a)cd <libsvm目录>\matlab
(b)make




%% 自定义核练习(matlab2010b/libsvm 3.17)
%% 计时,清零,清屏
tic;
clear;
clc;
close all;
format compact;
pwd % 显示当前目录: <libsvm目录>\matlab, 不对的话要进入该目录


%% 前面svm文章里谈到用心脏病数据heart_scale做过实验
% 加载文本数据文件,该文件前面150行做训练数据
[heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');


%% 数据水平分割,该文件前面150行做训练数据
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);


%% heart_scale文件后面120行(151~270行)做训练数据
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:);


%% -t 0, 使用线性核函数
model_linear = svmtrain(train_label, train_data,'-t 0');
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);


% 结果: Accuracy = 85% (102/120) (classification)


%% ** Precomputed Kernel -1 **
% 使用的核函数 K(x,x') = (x * x') (线性核)
% 核矩阵
ktrain1 = train_data*train_data';
Ktrain1 = [(1:150)',ktrain1]; % 格式化:第1列是序号
model_precomputed1 = svmtrain(train_label, Ktrain1,'-t 4');


ktest1 = test_data*train_data';% 格式化:第1列是序号
Ktest1 = [(1:120)', ktest1];
[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label, Ktest1, model_precomputed1);
% 结果: Accuracy = 85% (102/120) (classification)




%% ** Precomputed Kernel -2 **
% 使用的核函数 K(x,x') = ||x|| * ||x'||
% 核矩阵
ktrain2 = ones(150,150);
for i = 1:150
 for j = 1:150
 ktrain2(i,j) = sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
 end
end
Ktrain2 = [(1:150)',ktrain2];% 格式化:第1列是序号
model_precomputed2 = svmtrain(train_label, Ktrain2,'-t 4');


ktest2 = ones(120,150);
for i = 1:120
 for j = 1:150
 ktest2(i,j) = sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
 end
end
Ktest2 = [(1:120)', ktest2];% 格式化:第1列是序号
[predict_label_P2, accuracy_P2, dec_values_P2] = svmpredict(test_label, Ktest2, model_precomputed2);
% 结果: Accuracy = 67.5% (81/120) (classification)




%% ** Precomputed Kernel -3 **
% 使用的核函数 K(x,x') = (x * x') / ||x|| * ||x'||
% 核矩阵
ktrain3 = ones(150, 150);
for i = 1:150
 for j = 1:150
 ktrain3(i,j) = ...
 train_data(i,:)*train_data(j,:)'/(sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
 end
end
Ktrain3 = [(1:150)',ktrain3];
model_precomputed3 = svmtrain(train_label, Ktrain3,'-t 4');


ktest3 = ones(120, 150);
for i = 1:120
 for j = 1:150
 ktest3(i,j) = ...
 test_data(i,:)*train_data(j,:)'/(sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
 end
end
Ktest3 = [(1:120)', ktest3];
[predict_label_P3, accuracy_P3, dec_values_P3] = svmpredict(test_label, Ktest3, model_precomputed3);
% 结果: Accuracy = 84.1667% (101/120) (classification)




%% 显示精度结果
accuracyL = accuracy_L(1)   % 线性核
accuracyP1 = accuracy_P1(1) % 自定义核-1
accuracyP2 = accuracy_P2(1) % 自定义核-2
accuracyP3 = accuracy_P3(1) % 自定义核-3
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值