目录
一、SVM基本介绍
1.1 SVM算法定义
1.2 SVM和逻辑回归的区别
二、实验数学原理
三、实验算法和实验步骤
四、实例分析
一、SVM基本介绍
1.1 SVM算法定义
SVM全称是supported vector machine(支持向量机),即寻找到一个超平面使样本分成两类,并且间隔最大。
SVM能够执行线性和非线性分类,回归,甚至是异常值监测任务。特别适用于中小型复杂数据集的分类。
1.2 SVM和逻辑回归的区别
- 逻辑回归和SVM都是寻找一条分类直线,目标是把这两个类别分开
- 逻辑回归的最终判断标准是:准确率,而SVM最终的判断结果是:准确率+最大间隔
- 逻辑回归的分类直线可能有多条,而SVM的分类直线只有一条。
单纯考虑准确率和考虑最大间隔哪个泛化性能更好一点:
- 准确率只考虑了在训练集上的预测能力
- 准确率+最大间隔即考虑了预测能力,又考虑了模型对未知样本的泛化能力。
二、实验数学原理
线性支持向量机:
三、实验算法和实验步骤
二分类逻辑回归算法:
输入:
输出过程:
1.读取数据集
2.数据归一化
3.构造问题的约束二次规划
4.构建拉格朗日函数
5.将问题对偶化
6.利用SMO算法进行求解,得到分类预测模型
7.根据预测模型对预测集样本的类别进行预测
输出:数据集的预测结果
四、实例分析
数据来源:传送门1 传送门2
线性向量机:
clear;close all;clc;
%% 第一步:读取数据
load SVMdata1.mat;
%% 第二步:分离训练集和测试集
% [train_X,train_y,test_X,test_y] = split_train_test(X,y,2,0.8);
% randperm随机打算数据集X的顺序
index = randperm(size(X,1)); %获取打算顺序后的数据集的索引
n = length(index); %得到index的个数
% 分离训练集
T = round(n*0.8);
train_X = X(index(1:T),:); %分离出数据集X中的训练集
train_y = y(index(1:T),:); %分离出数据集y中的训练集
% 分离测试集或预测集
test_X = X(index(T+1:end),:); %分离出数据集X中的测试集
test_y = y(index(T+1:end),:); %分离出数据集y中的测试集%% 第三步:标准支持向量机拟合训练
svmline = svmtrain(train_X,train_y,'Showplot',true);%% 第四步:SVM预测
predictline = svmclassify(svmline,test_X,'Showplot',true);
fprintf('预测分类结果为:\n')
disp(predictline')
%继续绘制测试集数据
hold on; %继续在这张图上绘制
plot(test_X(:,1),test_X(:,2),'gs','Markersize',12) %圈出预测数据
xlabel('x') %添加行标签
ylabel('y') %添加列标签
title('标准支持向量机') %添加标题
hold off %接下来绘制重启一张图
%% 第五步:预测的准确率
accu = 1-sum(abs(predictline-test_y))/length(test_y);
fprintf('预测结果准确率为:%d',accu)
高斯向量机:
clear;close all;clc;
%% 第一步:读取数据
load SVMdata2.mat;
%% 第二步:分离训练集和测试集
% [train_X,train_y,test_X,test_y] = split_train_test(X,y,2,0.8);
% randperm随机打算数据集X的顺序
index = randperm(size(X,1)); %获取打算顺序后的数据集的索引
n = length(index); %得到index的个数
% 分离训练集
T = round(n*0.8);
train_X = X(index(1:T),:); %分离出数据集X中的训练集
train_y = y(index(1:T),:); %分离出数据集y中的训练集
% 分离测试集或预测集
test_X = X(index(T+1:end),:); %分离出数据集X中的测试集
test_y = y(index(T+1:end),:); %分离出数据集y中的测试集%% 第三步:高斯拟合训练集
svmgs = svmtrain(train_X,train_y,'Showplot',true,'kernel_function','rbf','rbf_sigma',1);%% 第四步:SVM预测
predict = svmclassify(svmgs,test_X,'Showplot',true);
fprintf('预测分类结果为:\n')
disp(predict')
%继续绘制测试集数据
hold on; %继续在这张图上绘制
plot(test_X(:,1),test_X(:,2),'gs','Markersize',12) %圈出预测数据
xlabel('x') %添加行标签
ylabel('y') %添加列标签
title('高斯核支持向量机') %添加标题
hold off %接下来绘制重启一张图
%% 第五步:预测的准确率
% accu = sum(strcmp(predict,test_y))/length(test_y)*100
accu = 1-sum(abs(predict-test_y))/length(test_y);
fprintf('预测结果准确率为:%d',accu)