%For probability estimates, you need '-b 1' for training and testing:
load('F:\matlab库\heart_scale.mat')
model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07 -b 1');
[predict_label, accuracy, prob_estimates] = svmpredict(heart_scale_label, heart_scale_inst, model, '-b 1');
%For Linear Kernel and Precomputed Kernel
%% 数据水平分割,该文件前面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)
%% ** Precomputed Kernel -4 **
% 使用的核函数 :高斯核
% 核矩阵
ktrain4 = ones(150, 150);
for i = 1:150
for j = 1:150
gamma=1;
kernel=exp(-gamma * sum( (train_data(i,:)-train_data(j,:)).^2 ) );%每一行为其特征
ktrain4(i,j) =kernel;
end
end
Ktrain4 = [(1:150)',ktrain4];
model_precomputed4 = svmtrain(train_label, Ktrain4,'-t 4');
ktest4 = ones(120, 150);
for i = 1:120
for j = 1:150
gamma=1;
kernel=exp(-gamma * sum( ( test_data(i,:)-train_data(j,:)).^2 ) );%每一行为其特征
ktest4(i,j) =kernel;
end
end
Ktest4 = [(1:120)', ktest4];
[predict_label_P4, accuracy_P4, dec_values_P4] = svmpredict(test_label, Ktest4, model_precomputed4);
% 结果: Accuracy = 84.1667% (101/120) (classification)
%%
评论1