目录
支持向量机回顾:
拉格朗日对偶问题“拉格朗日对偶问题”如何直观理解?“KKT条件” “Slater条件” “凸优化”打包理解_哔哩哔哩_bilibili
什么是软间隔
【数之道27】详解SVM支持向量机软间隔数学思想_哔哩哔哩_bilibili
惩罚因子和松弛变量都是什么,及其区别【数之道27】详解SVM支持向量机软间隔数学思想_哔哩哔哩_bilibili
SVM如何使用核函数映射到高维空间 【数之道26】SVM支持向量机-核技巧Kernel Trick详解(多项式核函数,无限维度高斯核函数)_哔哩哔哩_bilibili
数据背景:
数据来源链接:
CRCV | Center for Research in Computer Vision at the University of Central Florida
SVM分类方案:
代码(方法1):
clc; close all; clear all;
%% ——————提取所有S0Xall_feature.xlsx文件信息结构体——————————————
excel_path='H:\newdata\';
data_path_list=dir(strcat(excel_path,'*.xlsx'));
data_name=(string({data_path_list.name}))';
DX_data_name=data_name(1:length(data_name),1);
%% ——————批量读取S0Xall_feature.xlsx——————————————
n=length(DX_data_name);
K=[];
zhonglei=[1;1;1;1;1;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5;6;6;6;6;6;7;7;7;7;7];
for i=1:n
F=[];
for sheet=1:3
F_i=xlsread(char(strcat(excel_path,DX_data_name(i))),sheet,"A1:D35");
F=[F F_i];
end
F=[F zhonglei];
K=[K; F];
end
pathout_all = 'H:\S0Xall_feature_labled.xlsx';
xlswrite(pathout_all,K,1,'A1');
%% ——————分离训练数据和测试数据————————————
Train=[K(1:5:end,:);K(2:5:end,:);K(5:5:end,:);K(4:5:end,:)];
Test=K(3:5:end,:);
pathout_train = 'H:\Train_dataset.xlsx';
xlswrite(pathout_train,Train,1,'A1');
pathout_test = 'H:\Test_dataset.xlsx';
xlswrite(pathout_test,Test,1,'A1');
%% ————————————SVM 多分类(一对多)————————————
TrainingSet=Train(:,1:12);
TestSet=Test(:,1:12);
GroupTrain=Train(:,13);
results =my_MultiSvm(TrainingSet, GroupTrain, TestSet);
disp('multi class problem');
key=Test(:,13);
percentage=length(find(results==key))/0.63;
p=['分类准确率为', num2str(percentage) , '%'];
disp(p);
%%————————算法函数——————————
function [y_predict,models] = my_MultiSvm(X_train, y_train, X_test)
y_labels = unique(y_train);
n_class = size(y_labels, 1);
models = cell(n_class, 1);
for i = 1:n_class
class_i_place = find(y_train == y_labels(i));
svm_train_x = X_train(class_i_place,:);
sample_num = numel(class_i_place);
class_others = find(y_train ~= y_labels(i));
svm_train_x = [svm_train_x; X_train(class_others,:)];
svm_train_y = [ones(sample_num, 1); -1*ones(size(class_others,1), 1)];
disp(['生成模型:', num2str(i)])
models{i} = fitcsvm(svm_train_x, svm_train_y ,'Standardize',true,'KernelFunction','RBF',...
'KernelScale','auto');
end
test_num = size(X_test, 1);
y_predict = zeros(test_num, 1);
for i = 1:test_num
if mod(i, 63) == 0
disp(['预测个数:', num2str(i)])
end
bagging = zeros(n_class, 1);
for j = 1:n_class
model = models{j};
[label, rat] = predict(model, X_test(i,:));
bagging(j) = bagging(j) + rat(2);
end
[maxn, maxp] = max(bagging);
y_predict(i) = y_labels(maxp);
end
end
代码(方法2):
clc; close all; clear all;
%% ——————提取所有S0Xall_feature.xlsx文件信息结构体——————————————
excel_path='H:\newdata\';
data_path_list=dir(strcat(excel_path,'*.xlsx'));
data_name=(string({data_path_list.name}))';
DX_data_name=data_name(1:length(data_name),1);
%% ——————批量读取S0Xall_feature.xlsx——————————————
n=length(DX_data_name);
K=[];
zhonglei=[1;1;1;1;1;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5;6;6;6;6;6;7;7;7;7;7];
for i=1:n
F=[];
for sheet=1:3
F_i=xlsread(char(strcat(excel_path,DX_data_name(i))),sheet,"A1:D35");
F=[F F_i];
end
F=[F zhonglei];
K=[K; F];
end
pathout_all = 'H:\S0Xall_feature_labled.xlsx';
xlswrite(pathout_all,K,1,'A1');
%% ——————分离训练数据和测试数据————————————
Train=[K(1:5:end,:);K(2:5:end,:);K(5:5:end,:);K(4:5:end,:)];
Test=K(3:5:end,:);
pathout_train = 'H:\Train_dataset.xlsx';
xlswrite(pathout_train,Train,1,'A1');
pathout_test = 'H:\Test_dataset.xlsx';
xlswrite(pathout_test,Test,1,'A1');
%% ————————————SVM 多分类(一对一)————————————
X_train=Train(:,1:12);%训练数据
y_train=Train(:,13);%训练标签
X_test=Test(:,1:12);%测试数据
classifier =fitcecoc(X_train,y_train,'OptimizeHyperparameters','all', ...
'HyperparameterOptimizationOptions', ...
struct('AcquisitionFunctionName', 'expected-improvement-plus'));
CVSVMModel = crossval(classifier); % 10-fold by default
loss = kfoldLoss(CVSVMModel) %估算泛化误差
y_predict = predict(classifier, X_test);
disp('multi class problem')
key=Test(:,13);
% disp([key y_predict]);
percentage=length(find(y_predict==key))/0.63;
p=['分类准确率为', num2str(percentage) , '%'];
disp(p);
ConfMat=confusionchart(key, y_predict)
ConfMat.InnerPosition = [0.10 0.10 0.85 0.85];
代码流程图:
多分类(一对一,一对多)
自动优化超参数:
总结:
参考文献: