SVM分类-支持向量机(Support Vector Machine)

news/2024/12/27 3:06:56/

SVM分类详细介绍

源码

什么是SVM分类

SVM分类支持向量机分类)是一种基于**支持向量机(Support Vector Machine, SVM)**的监督学习算法,广泛应用于分类和回归分析。SVM通过在高维空间中寻找最佳分隔超平面,将不同类别的数据样本进行有效区分。其核心思想是最大化类间边界(Margin),以提高模型的泛化能力和鲁棒性。

SVM分类的组成部分
  1. 输入层

    • 接收输入数据的特征向量,每个节点对应一个特征。
  2. 支持向量

    • 位于边界附近的关键样本点,决定了分隔超平面的位置和方向。
  3. 分隔超平面

    • 将不同类别的数据样本分开的决策边界。最佳分隔超平面是使得类间边界最大化的超平面。
  4. 核函数

    • 通过非线性映射将数据从原始空间转换到高维特征空间,使得在高维空间中线性可分。常用的核函数包括线性核、多项式核和径向基函数核(RBF核)。
SVM分类的工作原理

SVM分类通过以下步骤实现分类任务:

  1. 数据准备与预处理

    • 数据收集与整理:确保数据的完整性和准确性,处理缺失值和异常值。
    • 数据划分:将数据集划分为训练集和测试集,常用比例为70%训练集和30%测试集。
    • 数据预处理:对数据进行归一化或标准化处理,以提高模型的训练效果和稳定性。
  2. 构建SVM模型

    • 选择核函数:根据数据分布选择合适的核函数(如线性核、多项式核或RBF核)。
    • 设置参数:设定惩罚因子(C)和核函数参数(如RBF核的γ值),以平衡模型的复杂度和拟合能力。
  3. 训练SVM模型

    • 使用训练集数据训练SVM模型,寻找最佳分隔超平面。
    • 优化目标是最大化类间边界,同时最小化分类错误。
  4. 模型预测与评估

    • 使用训练好的SVM模型对训练集和测试集进行分类预测。
    • 评估模型的分类准确率、混淆矩阵等性能指标,分析模型的泛化能力和分类效果。
SVM分类的优势
  1. 高准确性

    • SVM在处理高维数据和复杂边界问题时表现出色,通常具有较高的分类准确率。
  2. 有效处理非线性关系

    • 通过核函数的非线性映射,SVM能够处理复杂的非线性关系,实现更灵活的分类
  3. 鲁棒性强

    • SVM通过最大化边界来提升模型的泛化能力,减少过拟合现象。
  4. 适用于小样本数据

    • SVM在小样本数据集上也能表现出良好的性能,适合实际应用中的数据不足情况。
  5. 理论基础坚实

    • SVM基于统计学习理论,具有明确的理论支持和优化目标。
SVM分类的应用

SVM分类广泛应用于各类需要高精度分类的领域,包括但不限于:

  1. 医疗诊断

    • 疾病预测:如癌症诊断、心脏病预测等。
    • 病人风险评估:评估病人的手术风险或恢复可能性。
  2. 金融预测

    • 信用评分:评估个人或企业的信用风险。
    • 股票市场预测:预测股票价格的涨跌趋势。
  3. 生物信息学

    • 基因分类:根据基因表达数据进行疾病分类
    • 蛋白质结构预测:预测蛋白质的功能和结构。
  4. 图像与语音识别

    • 图像分类:如手写数字识别、人脸识别等。
    • 语音识别:将语音信号转化为文本或指令。
  5. 工业控制

    • 质量检测:自动化检测产品质量,减少人工误差。
    • 故障诊断:预测和诊断设备故障,提升生产效率。
如何使用SVM分类

使用SVM分类模型主要包括以下步骤:

  1. 准备数据集

    • 数据收集与整理:确保数据的完整性和准确性,处理缺失值和异常值。
    • 数据划分:将数据集划分为训练集和测试集,常用比例为70%训练集和30%测试集。
    • 数据预处理:对数据进行归一化或标准化处理,以提高模型的训练效果和稳定性。
  2. 设置SVM参数

    • 惩罚因子(C):控制分类错误的惩罚程度,较大的C值会减少分类错误,但可能导致过拟合。
    • 核函数参数(γ):控制RBF核的宽度,较大的γ值会使决策边界更加复杂,较小的γ值则使边界更加平滑。
  3. 构建与训练模型

    • 选择核函数:根据数据分布选择合适的核函数,如RBF核。
    • 训练模型:使用训练集数据训练SVM模型,寻找最佳分隔超平面。
  4. 模型预测与评估

    • 预测:使用训练好的SVM模型对训练集和测试集进行分类预测。
    • 评估:计算分类准确率、生成混淆矩阵,分析模型的性能和泛化能力。
  5. 结果分析与可视化

    • 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的分类效果。
    • 误差曲线:绘制模型的误差随决策树数目或其他参数变化的曲线,观察模型的收敛情况。
    • 混淆矩阵:生成混淆矩阵,详细分析分类的具体性能指标,如精确率、召回率和F1分数。
使用SVM分类的步骤示例

以下以一个具体的步骤示例,说明如何在MATLAB中实现SVM分类

  1. 数据准备

    • 确保数据集数据集.xlsx的最后一列为类别标签,且标签为整数编码。
    • 使用MATLAB读取数据,并进行随机打乱、划分训练集和测试集。
  2. 数据预处理

    • 对输入数据进行归一化处理,确保数据在相同的尺度范围内。
    • 保持类别标签的原始形式,适应分类任务。
  3. 模型构建与参数设置

    • 设置SVM的参数,如惩罚因子(C)和核函数参数(γ)。
    • 使用MATLAB的svmtrain函数创建SVM模型,并训练输出层权重。
  4. 模型训练与测试

    • 使用训练集数据训练SVM模型。
    • 对训练集和测试集进行预测,计算分类准确率。
  5. 结果可视化

    • 绘制训练集和测试集的真实值与预测值对比图,直观展示模型的分类效果。
    • 生成混淆矩阵,详细分析分类性能。

通过上述步骤,用户可以利用SVM分类模型高效地解决各种分类问题,提升模型的准确性和鲁棒性。


代码简介

该MATLAB代码实现了基于**支持向量机(SVM)**的分类算法,简称“SVM分类”。其主要流程如下:

  1. 数据预处理

    • 导入数据集,并随机打乱数据顺序。
    • 将数据集划分为训练集和测试集。
    • 对数据进行归一化处理,以提高训练效果。
  2. 模型构建与参数设置

    • 设置SVM的参数,如惩罚因子(C)和核函数参数(γ)。
    • 使用MATLAB的svmtrain函数创建SVM模型,并训练输出层权重。
  3. 模型训练与测试

    • 使用训练集数据训练SVM模型。
    • 对训练集和测试集进行预测,并计算分类准确率。
  4. 结果分析与可视化

    • 绘制预测结果对比图。
    • 绘制误差曲线。
    • 绘制特征重要性图(如果适用)。
    • 生成混淆矩阵,评估模型性能。

以下是添加了详细中文注释的SVM分类MATLAB代码。


MATLAB代码(添加详细中文注释)

%% 初始化
clear                % 清除工作区变量
close all            % 关闭所有图形窗口
clc                  % 清空命令行窗口
warning off          % 关闭警告信息%% 导入数据
res = xlsread('数据集.xlsx');  % 从Excel文件中读取数据,假设最后一列为类别标签%% 数据分析
num_class = length(unique(res(:, end)));  % 计算类别数(假设最后一列为类别标签)
num_res = size(res, 1);                   % 计算样本数(数据集中的行数)
num_size = 0.7;                           % 设定训练集占数据集的比例(70%训练集,30%测试集)
res = res(randperm(num_res), :);          % 随机打乱数据集顺序,以避免数据排序带来的偏差(如果不希望打乱可注释该行)
flag_conusion = 1;                        % 设置标志位为1,表示需要绘制混淆矩阵(要求MATLAB 2018及以上版本)%% 设置变量存储数据
P_train = []; P_test = [];    % 初始化训练集和测试集的输入数据矩阵
T_train = []; T_test = [];    % 初始化训练集和测试集的输出数据矩阵%% 划分数据集
for i = 1 : num_classmid_res = res((res(:, end) == i), :);           % 提取当前类别的所有样本mid_size = size(mid_res, 1);                    % 计算当前类别的样本数mid_tiran = round(num_size * mid_size);         % 计算当前类别训练样本的数量(四舍五入)% 划分训练集输入和输出P_train = [P_train; mid_res(1: mid_tiran, 1: end - 1)];       % 将当前类别的训练集输入添加到P_trainT_train = [T_train; mid_res(1: mid_tiran, end)];              % 将当前类别的训练集输出添加到T_train% 划分测试集输入和输出P_test  = [P_test; mid_res(mid_tiran + 1: end, 1: end - 1)];  % 将当前类别的测试集输入添加到P_testT_test  = [T_test; mid_res(mid_tiran + 1: end, end)];         % 将当前类别的测试集输出添加到T_test
end%% 数据转置
P_train = P_train';  % 转置训练集输入,使每列为一个样本
P_test = P_test';    % 转置测试集输入
T_train = T_train';  % 转置训练集输出
T_test = T_test';    % 转置测试集输出%% 得到训练集和测试样本个数
M = size(P_train, 2);  % 训练集样本数
N = size(P_test , 2);  % 测试集样本数%% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);          % 对训练集输入进行归一化,范围[0,1]
p_test = mapminmax('apply', P_test, ps_input );         % 使用训练集的归一化参数对测试集输入进行归一化
t_train = T_train;                                      % 保持训练集输出不变
t_test  = T_test ;                                      % 保持测试集输出不变%% 转置以适应模型
p_train = p_train'; p_test = p_test';                   % 转置输入数据,使每列为一个样本
t_train = t_train'; t_test = t_test';                   % 转置输出数据,使每列为一个样本%% 创建模型
c = 10.0;      % 设置惩罚因子C,控制分类错误的惩罚程度
g = 0.01;      % 设置RBF核函数的γ参数,控制核函数的宽度
cmd = ['-t 2', '-c ', num2str(c), ' -g ', num2str(g)];  % 构建SVM训练命令参数
model = svmtrain(t_train, p_train, cmd);  % 使用svmtrain函数训练SVM模型,-t 2表示使用RBF核%% 仿真测试
T_sim1 = svmpredict(t_train, p_train, model);  % 使用训练集数据进行预测,得到训练集的预测结果
T_sim2 = svmpredict(t_test , p_test , model);  % 使用测试集数据进行预测,得到测试集的预测结果%% 性能评价
error1 = sum((T_sim1' == T_train)) / M * 100 ;  % 计算训练集的分类准确率(百分比)
error2 = sum((T_sim2' == T_test )) / N * 100 ;  % 计算测试集的分类准确率(百分比)%% 数据排序
[T_train, index_1] = sort(T_train);     % 对训练集真实标签进行排序,获取排序索引
[T_test , index_2] = sort(T_test );     % 对测试集真实标签进行排序,获取排序索引T_sim1 = T_sim1(index_1);                % 按排序索引调整训练集预测结果
T_sim2 = T_sim2(index_2);                % 按排序索引调整测试集预测结果%% 绘图
% 绘制训练集预测结果对比图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1) % 绘制真实值与预测值对比曲线
legend('真实值', '预测值')                                        % 添加图例
xlabel('预测样本')                                                % 设置X轴标签
ylabel('预测结果')                                                % 设置Y轴标签
string = {'训练集预测结果对比'; ['准确率=' num2str(error1) '%']};  % 创建标题字符串
title(string)                                                    % 添加图形标题
grid                                                             % 显示网格% 绘制测试集预测结果对比图
figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1) % 绘制真实值与预测值对比曲线
legend('真实值', '预测值')                                        % 添加图例
xlabel('预测样本')                                                % 设置X轴标签
ylabel('预测结果')                                                % 设置Y轴标签
string = {'测试集预测结果对比'; ['准确率=' num2str(error2) '%']};   % 创建标题字符串
title(string)                                                    % 添加图形标题
grid                                                             % 显示网格%% 混淆矩阵
if flag_conusion% 绘制训练集混淆矩阵figurecm = confusionchart(T_train, T_sim1);  % 创建训练集的混淆矩阵图cm.Title = '训练集混淆矩阵';               % 设置混淆矩阵标题cm.ColumnSummary = 'column-normalized';      % 设置列摘要为归一化cm.RowSummary = 'row-normalized';            % 设置行摘要为归一化% 绘制测试集混淆矩阵figurecm = confusionchart(T_test, T_sim2);    % 创建测试集的混淆矩阵图cm.Title = '测试集混淆矩阵';               % 设置混淆矩阵标题cm.ColumnSummary = 'column-normalized';      % 设置列摘要为归一化cm.RowSummary = 'row-normalized';            % 设置行摘要为归一化
end

代码说明

  1. 初始化

    • 清理环境:通过clear清除工作区变量,close all关闭所有图形窗口,clc清空命令行窗口,warning off关闭警告信息,确保代码运行环境的干净和无干扰。
  2. 导入数据

    • 读取数据:使用xlsread函数从Excel文件数据集.xlsx中读取数据。假设数据集的最后一列为类别标签,其他列为特征。
  3. 数据分析

    • 类别数:通过unique函数计算数据集中不同类别的数量。
    • 样本数:通过size函数获取数据集的行数,即样本总数。
    • 训练集比例:设定训练集占数据集的比例为70%。
    • 数据打乱:使用randperm函数随机打乱数据集的顺序,以避免数据排序带来的偏差。如果不希望打乱数据集,可以注释掉该行代码。
    • 训练集样本数:通过round(num_size * num_samples)计算训练集的样本数量。
    • 特征维度:通过size(res, 2) - outdim计算输入特征的维度(总列数减去输出维度)。
  4. 划分训练集和测试集

    • 训练集输入:提取前num_train_s个样本的输入特征,并进行转置,使每列为一个样本。
    • 训练集输出:提取前num_train_s个样本的输出(类别标签),并进行转置。
    • 测试集输入:提取剩余样本的输入特征,并进行转置。
    • 测试集输出:提取剩余样本的输出(类别标签),并进行转置。
    • 样本数量:通过size函数获取训练集和测试集的样本数量,分别赋值给MN
  5. 数据归一化

    • 训练集归一化:使用mapminmax函数将训练集输入数据缩放到[0,1]的范围内,并保存归一化参数ps_input
    • 测试集归一化:使用mapminmax('apply', P_test, ps_input),应用训练集的归一化参数对测试集输入数据进行同样的归一化处理,确保训练集和测试集的数据尺度一致。
    • 输出数据保持不变:将训练集和测试集的输出数据保持不变,适应分类任务。
  6. 转置以适应模型

    • 转置输入数据:将训练集和测试集的输入数据进行转置,使每列为一个样本,符合MATLAB模型输入要求。
    • 转置输出数据:将训练集和测试集的输出数据进行转置,使每列为一个样本。
  7. 创建模型

    • 设置SVM参数
      • c = 10.0:设定惩罚因子C,控制分类错误的惩罚程度。较大的C值会减少分类错误,但可能导致过拟合。
      • g = 0.01:设定RBF核函数的γ参数,控制核函数的宽度。较大的γ值会使RBF核更局部,较小的γ值则使RBF核更全局。
    • 构建SVM训练命令:通过cmd字符串构建SVM训练的命令参数,-t 2表示使用RBF核,-c-g分别设定惩罚因子和γ参数。
    • 训练SVM模型:使用svmtrain函数训练SVM模型,传入训练集的输出和输入数据,以及设定的命令参数。
  8. 仿真测试

    • 训练集预测:使用训练集数据对训练好的SVM模型进行预测,得到训练集的预测结果T_sim1
    • 测试集预测:使用测试集数据对训练好的SVM模型进行预测,得到测试集的预测结果T_sim2
  9. 性能评价

    • 计算训练集准确率:通过比较训练集的预测结果与真实标签,计算分类准确率error1(百分比)。
    • 计算测试集准确率:通过比较测试集的预测结果与真实标签,计算分类准确率error2(百分比)。
  10. 数据排序

    • 排序训练集标签:使用sort函数对训练集的真实标签进行排序,并获取排序索引index_1
    • 排序测试集标签:使用sort函数对测试集的真实标签进行排序,并获取排序索引index_2
    • 调整预测结果顺序:根据排序索引调整训练集和测试集的预测结果顺序,确保绘图时的对齐。
  11. 绘图

    • 训练集预测结果对比图
      • 绘制对比曲线:使用plot函数绘制训练集的真实值与预测值对比图,红色星号表示真实值,蓝色圆圈表示预测值。
      • 图形设置:添加图例、坐标轴标签、标题和网格,提升图形的可读性。
    • 测试集预测结果对比图
      • 绘制对比曲线:使用plot函数绘制测试集的真实值与预测值对比图,红色星号表示真实值,蓝色圆圈表示预测值。
      • 图形设置:添加图例、坐标轴标签、标题和网格,提升图形的可读性。
  12. 混淆矩阵

    • 训练集混淆矩阵
      • 创建混淆矩阵图:使用confusionchart函数生成训练集的混淆矩阵图。
      • 图形设置:设置混淆矩阵的标题和摘要选项(列和行均归一化),便于分析分类性能。
    • 测试集混淆矩阵
      • 创建混淆矩阵图:使用confusionchart函数生成测试集的混淆矩阵图。
      • 图形设置:设置混淆矩阵的标题和摘要选项(列和行均归一化),便于分析分类性能。

代码使用注意事项

  1. 数据集格式

    • 类别标签:确保数据集.xlsx的最后一列为类别标签,且类别标签为整数编码(如1, 2, 3等)。
    • 特征类型:数据集的其他列应为数值型特征,适合进行归一化处理。如果特征包含类别变量,需先进行编码转换。
  2. 参数调整

    • 惩罚因子(C):惩罚因子C控制分类错误的惩罚程度。较大的C值会使模型更严格地分类训练数据,可能导致过拟合;较小的C值则允许更多的分类错误,可能导致欠拟合。根据数据集的复杂度和噪声水平调整C值。
    • 核函数参数(γ):γ参数控制RBF核函数的宽度。较大的γ值会使RBF核更局部化,适用于数据分布较为密集的情况;较小的γ值会使RBF核更全局化,适用于数据分布较为分散的情况。根据数据分布调整γ值。
    • 训练集比例:默认设置为70%训练集,30%测试集。根据数据集大小和任务需求调整训练集比例,以确保训练集具有足够的代表性。
  3. 环境要求

    • MATLAB版本:确保使用的MATLAB版本支持svmtrainsvmpredict函数。svmtrainsvmpredict属于LIBSVM工具箱,需要安装相关工具箱或使用MATLAB内置的SVM函数(如fitcsvmpredict)进行替代。
    • 工具箱:需要安装统计和机器学习工具箱(Statistics and Machine Learning Toolbox),以支持SVM相关函数。
  4. 性能优化

    • 数据预处理:除了归一化处理,还可以考虑主成分分析(PCA)等降维方法,减少特征数量,提升模型训练效率。
    • 特征选择:通过特征重要性分析,选择对分类任务贡献较大的特征,剔除冗余或噪声特征,提升模型性能。
    • 交叉验证:采用交叉验证方法评估模型的泛化能力,避免因数据划分偶然性导致的性能波动。
    • 参数调优:使用网格搜索(Grid Search)或随机搜索(Random Search)等方法优化SVM的参数(C和γ),以获得最佳性能。
  5. 结果验证

    • 交叉验证:采用k折交叉验证方法评估模型的稳定性和泛化能力,尤其在数据集较小的情况下。
    • 多次运行:由于SVM具有随机性(尤其在数据打乱的情况下),建议多次运行模型,取平均性能指标,以获得更稳定的评估结果。
    • 模型对比:将SVM分类模型与其他分类模型(如BP神经网络、随机森林等)进行对比,评估不同模型在相同数据集上的表现差异。
  6. 混淆矩阵分析

    • 理解分类性能:通过混淆矩阵,了解模型在不同类别上的分类表现,识别容易混淆的类别。
    • 调整模型:根据混淆矩阵的分析结果,进一步调整模型参数或进行数据预处理,以提升模型的整体性能。
  7. 代码适应性

    • MATLAB函数更新:在较新的MATLAB版本中,svmtrainsvmpredict函数可能被fitcsvmpredict函数替代。根据实际使用的MATLAB版本,调整代码以使用最新的函数接口。
    • 兼容性检查:确保代码中使用的函数和参数在当前MATLAB版本中是可用和兼容的。

通过理解和应用上述SVM分类模型,初学者可以有效地处理各种分类任务,并深入掌握支持向量机的工作原理和应用方法。不断调整和优化模型参数,结合实际应用场景,能够进一步提升模型的实用价值和应用效果。


http://www.ppmy.cn/news/1558414.html

相关文章

【OCR】数据集合集!

本文将为您介绍经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 RapidOCR 更新时间:2024-12-24 访问地址: GitHub 描述: 基于 ONNXRuntime、OpenVINO 和 PaddlePaddle 的超棒 OCR 多编程语言工具包。多平台、多语言 OCR 工具…

线性代数期末总复习的点点滴滴(1)

一、可逆矩阵、行列式、秩的关系 1.行列式与可逆矩阵的关系 所以,不难看出矩阵可逆的充分必要条件是该矩阵的行列式不为0。 2.接着来看,满秩和矩阵行列式的关系 不难看出满秩和行列式不为0是等价的。 3.再来看,满秩和矩阵可逆的关系 说明了…

Python实现将series系列数据格式批量转换为Excel

在Python中,如果你有一系列的数据(假设是存储在列表或其他数据结构中的数据),想要批量转换为Excel格式,可以使用pandas库来实现。以下是一个简单的示例代码,假设你的数据是一个包含多个字典的列表&#xff…

EasyExcel停更,FastExcel接力

11月6日消息,阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布,将停止更新,未来将逐步进入维护模式,将继续修复Bug,但不再主动新增功能。 EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称,官方…

医疗行业 UI 设计系列合集(一):精准定位

在当今数字化时代,医疗行业与信息技术的融合日益紧密,UI 设计在其中扮演着至关重要的角色。精准定位的 UI 设计能够显著提升医疗产品与服务的用户体验,进而对医疗效果和患者满意度产生积极影响。 一、医疗行业 UI 设计的重要性概述 医疗行业…

Kafka无锁设计

前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一。通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能。为了更好地理解 Kafka 的无锁设计,我们首先对比传统的队列模型,然后探讨 Kafka 如何通过无锁机制优化生产者…

Milvus矢量数据库 麒麟v10安装

什么是Milvus矢量数据库? Milvus 创建于 2019 年,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的海量嵌入向量。 作为专门设计用于处理对输入向量的查询的数据库,它能够对一万亿级的向量进行索引…

24 go语言(golang) - gorm框架安装及使用案例详解

一、简介 官方文档 GORM是一个用于Go语言的ORM(对象关系映射)库,它简化了与数据库交互的过程。GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite和SQL Server等。 1.1 关键特性 自动迁移:GORM可以根据结构体自动…