徐海蛟博士 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