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


你可能感兴趣的:(数据挖掘,大数据,SVM,智能搜索,徐海蛟,徐海蛟博士)