(转载)支持向量机(support vector machine, SVM)的分类(matlab实现)

news2024/11/19 1:23:40
        支持向量机(support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,最小化结构风险,提高了模型的泛化能力,且没有数据维数的限制。在进行线性分类时,将分类面取在离两类样本距离较大的地方;进行非线性分类时通过高维空间变换,将非线性分类变成高维空间的线性分类问题。
        本章将详细介绍支持向量机的分类原理,并将其应用于基于乳腺组织电阻抗频谱特性的乳腺癌诊断。

1 理论基础

1.1 支持向量机分类原理

1.线性可分SVM
        支持向量机最初是研究线性可分问题而提出的,因此,这里先详细介绍线性SVM的基本思想及原理。
        值得一提的是,若数据集中的绝大多数样本是线性可分的,仅有少数几个样本(可能是异常点)导致寻找不到最优分类超平面。针对此类情况,通用的做法是引入松弛变量,并对式(28-7)中的优化目标及约束项进行修正,即
        2.线性不可分SVM
        在实际应用中,绝大多数问题都是非线性的,这时对于线性可分SVM是无能为力的。对于此类线性不可分问题,常用的方法是通过非线性映射φ:R?→H,将原输入空间的样本映射到高维的特征空间H中,再在高维特征空间H中构造最优分类超平面,如图28-2所示。另外,与线性可分SVM相同,考虑到通过非线性映射到高维特征空间后仍有因少量样本造成的线性不可分情况,亦考虑引入松弛变量。  

        3.多分类SVM
        由线性可分SVM和线性不可分SVM的原理可知,支持向量机仅限于处理二分类问题,对于多分类问题,须做进一步的改进。目前,构造多分类SVM的方法主要有两个:直接法和间接法。直接法通过修改待求解的优化问题,直接计算出用于多分类的分类函数,该方法计算量较大、求解过程复杂、花费时间较长,实现起来比较困难。间接法主要是通过组合多个二分类SVM来实现多分类SVM的构建,常见的方法有一对一(one-against-one)和一对多(one-against-all)两种,

1.2 libsvm软件包简介

        libsvm工具箱是台湾大学林智仁(C.JLin)等人开发的一套简单的、易于使用的SVM模式识别与回归机软件包,该软件包利用收敛性证明的成果改进算法,取得了很好的结果。libsvm共实现了5种类型的SVM:C-SVC,u-SVC,One Class-SVC,e-SVR和v-SVR等。下面将详细介绍libsvm软件包中主要函数的调用格式及注意事项。
        1.SVM训练函数svmtrain
        函数svmtrain用于创建一个SVM模型,其调用格式为
model= svmtrain(train_label,train_matrix,'libsvm_options');
        其中,train_label为训练集样本对应的类别标签;train_matrix为训练集样本的输入矩阵;libsvm_options为SVM模型的参数及其取值(具体的参数、意义及其取值请参考libsvm软件包的参数说明文档,此处不再赘述);model为训练好的SVM模型。值得一提的是,与BP神经网络及RBF神经网络不同,train_label及train_matrix为列向量(矩阵),每行对应一个训练样本。
        2.SVM预测函数svmpredict
        函数svmpredict用于利用已建立的SVM模型进行仿真预测,其调用格式为
[predict _label,accuracy]= svmpredict(test_label,test _matrix,model);
        其中,test_label为测试集样本对应的类别标签;test_matrix为测试集样本的输入矩阵;model为利用函数svmtrain训练好的SVM模型;predict_label为预测得到的测试集样本的类别标签;accuracy为测试集的分类正确率。需要说明的是,若测试集样本对应的类别标签test_label未知,为了符合函数svmpredict调用格式的要求,随机填写即可,在这种情况下,accuracy便没有具体的意义了,只需关注预测的类别标签predict_label即可。

2 案例背景

2.1 问题描述

        乳腺是女性身体的重要器官,乳腺疾病类别繁多,病因复杂,其中,乳腺癌是乳腺疾病的一 种,逐渐成为危害女性健康的主要恶性肿瘤之一。近年来,乳腺癌等乳腺疾病发病率呈明显上升趋势,被医学界称为“女性健康第一杀手”。
        相关研究结果表明,在直流状态下,不同生物组织表现出不同的电阻特性,生物组织电阻抗随着外加电信号频率的不同而表现出较大的差异。常见的电阻抗测量方法有:电阻抗频谱法(impedance spectroscopy)、阻抗扫描成像法(electrical impedance scanning,EIS)、电阻抗断层成像法(electrical impedance tomography,EIT)等。电阻抗频谱法的测量依据是生物组织的电阻抗随着外加电信号频率的不同而呈现出较大的差异。阻抗扫描成像法的原理是癌变组织与正常组织及良性肿瘤组织的电导(阻)率相比,存在着显著性的差异,从而使得均匀分布在组织外的外加电流或电压场产生畸变。电阻抗断层成像法则利用设于体表外周的电极阵列及微弱测量电流,提取相关特征并重新构造出截面的电阻抗特性图像。
        尽管目前的电阻抗测量结果还存在一些偏差,但相关研究已经证实癌变组织与正常组织的电阻抗特性存在显著的差异。因此,乳腺组织的电阻抗特征可以应用于乳腺癌的检查与诊断中。由于电阻抗测量法具有无创、廉价、操作简单、医生与病人易于接受等优点,随着测量技术的不断发展,电阻抗测量系统精度的日益提高,基于乳腺组织电阻抗特性的乳腺癌诊断技术势必会在临床检查与诊断中发挥其特有的作用。
        1996年,Jossinet研究小组利用电阻抗频谱法测量了来自64位妇女的106个乳腺样本的电阻抗特性,并将其分为6组:乳腺组织、结缔组织、脂肪组织、乳腺病、纤维腺瘤和乳腺癌,其中前3组是正常组织,后3组是病变组织(其中前2组是良性病变)。各组的乳腺样本数如表28-1所列。

2.2 解题思路及步骤

        依据问题描述中的要求,利用SVM建立乳腺癌诊断模型并对模型的性能进行评价,大体上可以分为以下几个步骤,如图28-5所示。

        1.产生训练集/测试集
        与前面几章类似,要求所产生的训练集样本数不宜太少,且应具有代表性。同时,由于libsvm软件包对输入的数据有格式上的要求,需要转换产生的训练集和测试集输入矩阵和类别标签以满足函数svmtrain和函数svmpredict调用格式的要求。
        2.创建/训练SVM诊断模型
        利用函数svmtrain可以方便地创建/训练一个SVM模型,值得一提的是,在创建之前,如若需要,还应对数据进行归一化。同时,由于不同核函数类型及参数对模型的泛化能力影响较大,因此,需要确定核函数类型及选择较好的参数。一般选用RBF核函数,且利用交叉验证方法选择较好的模型参数。
        3.仿真测试
        当SVM诊断模型训练好后,输入测试集的类别标签及输入矩阵函数svmpredict,便可以得到对应的预测类别标签及正确率。
        4.性能评价
        依据函数svmpredict返回的正确率,可以对建立的模型性能进行评价。若模型性能不理想,可以从以下3个方面进行调整:训练集的选择、核函数的选择及模型参数的取值,并在此基础上重新建立模型,直到模型的性能达到要求为止。

3 MATLAB程序实现

        利用MATLAB及libsvm软件包中提供的函数,可以方便地在MATLAB环境下实现上述步骤。

%% 清空环境变量
clear all
clc

%% 导入数据
load BreastTissue_data.mat
% 随机产生训练集和测试集
n = randperm(size(matrix,1));
% 训练集——80个样本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);
% 测试集——26个样本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);

%% 数据归一化
[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';

%% SVM创建/训练(RBF核函数)

% 寻找最佳c/g参数——交叉验证方法
[c,g] = meshgrid(-10:0.2:10,-10:0.2:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
        cg(i,j) = svmtrain(train_label,Train_matrix,cmd);     
        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end        
        if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j) 
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end               
    end
end
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
% 创建/训练SVM模型
model = svmtrain(train_label,Train_matrix,cmd);

%% SVM仿真测试
[predict_label_1,accuracy_1] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2] = svmpredict(test_label,Test_matrix,model);
result_1 = [train_label predict_label_1];
result_2 = [test_label predict_label_2];

%% 绘图
figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真实类别','预测类别')
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string = {'测试集SVM预测结果对比(RBF核函数)';
          ['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)

PS:如果提示:错误使用 svmtrain (line xxx) Y must be a vector or a character array.说明你的matlab中已经不包含libsvm工具箱以及svmtrain函数,改用fitcsvm即可。

        由于训练集和测试集是随机产生的,所以程序每次运行的结果都会不同。某次运行的测试集预测结果如表28-3所列。从表中可以清晰地看到,只有样本7和9预测错误,测试集的预测正确率达到92.31%(24/26)。且如前文所述,乳腺癌、纤维腺瘤和乳腺病(标签分别为1、2和3)为病变组织,乳腺组织、结缔组织和脂肪组织(标签分别为4、5、6)为正常组织,若仅判断为病变组织或正常组织(即二分类),则样本9则判断正确(将乳腺癌诊断为纤维腺瘤,同为病变组织),预测正确率将达到96.15%(25/26),这也从另外一个角度体现了SVM用于二分类的优越性。

4 延伸阅读

4.1 性能对比

        1.归一化对模型性能的影响
        为了评价归一化对模型性能的影响,这里尝试不对输入矩阵进行归一化,测试集的预测结果如表28-4所列。从表中可以看出,相比于归一化情况,未归一化的测试集预测正确率要低很多,仅为23.08%(6/26)。然而,需要说明的是,归一化并非一个不可或缺的处理步骤,针对具体问题应进行具体分析,从而决定是否要进行归一化。

        2.核函数对模型性能的影响
        保证其他模型参数不变,仅修改核函数的类型,选择不同核函数时的训练集及测试集预测正确率如表28-5所列。从表中可以清晰地看到,线性核函数和Sigmoid核函数对应的正确率较低,而RBF核函数和多项式核函数对应的训练集预测正确率相当,但从模型的泛化能力考虑,即同时衡量测试集的预测正确率,则RBF核函数对应的模型性能最佳。因此,如前文所述,一般采用默认设置的RBF核函数进行建模。

4.2 案例延伸

        近年来,越来越多的专家与学者致力于SVM方面的研究,取得了许多进展。一方面,针对目前的SVM训练算法复杂度较大、计算时间较长等问题,不少学者提出了新的训练算法;另一方面,一些专家尝试着寻找更简单、更有效的核函数以简化运算并提升SVM的性能。同时,为了解决模型参数大多依靠经验选取或者大范围网格搜索耗时较长等问题,不少学者引入遗传算法、粒子群算法等优化算法,从而自动寻找最佳的模型参数使得模型的性能达到最优。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis进阶 - Redis主从

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis进阶 - Redis主从 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-master-slave.html 搭建主从架构 单节点 Redis 的并发能力是有上限的&#xff0c;要进一步提高 Redis 的并发能力&am…

CSS3技巧35:滚动的条纹背景

感觉好久没更博客了&#xff0c;虽然我经常登录看下粉丝数。O(∩_∩)O 端午节摆烂&#xff0c;休息了下&#xff0c;恢复下元气。 节后开始满负荷工作。 ---------------------------正文开始------------------------------------------ 做进度条的时候&#xff0c;有时候会…

Tomcat【部署zrlog】

目录 目录 1、单节点部署zrlog【192.168.200.121】 1.1、 创建数据库、远程登录用户 1.2、 浏览器访问 2、 LB集群-构建-部署zrlog-NFS共享存储 2.1、 安装、配置LB【192.168.200.120】 2.2、 NFS-资源共享【192.168.200.125】 3、配置tomcat访问日志中记录真实IP 1、单…

[元带你学: eMMC协议详解 20] emmc的命令(cmd)、响应(resp)详解

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 8100字&#xff0c; 主要内容 对eMMC的command进行详细介绍&#xff0c;主要包含如下内容&#xff1a; (1) emmc命令有哪些 (2) 使用不同命…

Java POI (1)—— 数据读写操作快速入门

一、Excel的版本区别&#xff08;03版和07版&#xff09; 所谓“03版” 和 “07版”&#xff0c;指的是 Microsoft Excel 版本号。这些版本号代表着不同的Excel 文件格式。2003版 Excel 使用的文件格式为 .xls&#xff0c;而2007版开始使用新的文件格式 .xlsx。 . xlsx 文件格式…

Unreal 5 蓝图常用的一些节点和规范

命名规范 蓝图类以 BP_作为前缀 对应Blue Print 混合空间以 BS_作为前缀 Blend Space 静态网格体以 SM_作为前缀 StaticMesh 骨骼网格体以 SK_作为前缀 Skeletal Mesh 纹理以 T_作为前缀 Texture 粒子系统 以 PS_作为前缀 Particle System 主材质以 M_作为前缀 Material 材质子…

手术机器人常见骨科手术 TKA UKA HTO

TKA UKA HTO 首先这几种手术都是常见的手术&#xff0c;下面先进行常见的但要介绍&#xff1a; 近年来有大量的研究聚焦于手术方式的对比&#xff0c;这里先就现有证据对「HTO」、单髁置换「UKA」和全膝置换「TKA」做一个简要的总结&#xff0c;以便于速查&#xff1a; TKA 不…

熵权法步骤及例题讲解

一、基本原理 在信息论中&#xff0c;熵是对不确定性的一种度量。不确定性越大&#xff0c;熵就越大&#xff0c;包含的信息量越大&#xff1b;不确定性越小&#xff0c;熵就越小&#xff0c;包含的信息量就越小。 根据熵的特性&#xff0c;可以通过计算熵值来判断一个事件的随…

【玩转Linux操作】详细讲解shell的注释,变量,字符串,数组等操作

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;概述⭐注意⭐示例&#x1f3f3;️‍&#x1f308;然…

scala的基本语法

注释 对于scala的注释&#xff0c;简而言之就是一句话&#xff0c;和java的注释一模一样 基本语法 &#xff08;1&#xff09;单行注释&#xff1a;// &#xff08;2&#xff09;多行注释&#xff1a;/* */ &#xff08;3&#xff09;文档注释&#xff1a;/****/代码示例&…

samaphore、countdownlatch、cyclinarrier

目录 一、samaphore 1、介绍 2、应用 3、原理 二、countdownlatch 三、cyclicbarrier 一、samaphore 1、介绍 信号量&#xff0c;用来限制同时访问共享资源的线程上限。可以理解为停车场入口的提示排&#xff0c;标识有多少车位&#xff0c;有车位才能进去停车&#xf…

ElasticSearch-使用IK分词器进行分词

使用KIbana测试IK分词器 打开开发工具台 ik_smart 最少分词器 分词结果比较少 GET _analyze{"analyzer": "ik_smart","text": "中国共产党"}ik_max_word 颗粒度最细分词器 分词结果比较多,组成各种结果,穷尽词库的可能&#xff01…

easypan前端学习

文章目录 前端项目node 版本node镜像构建项目创建项目安装项目所有依赖 图片资源网站encodeURI & decodeURIapp.config.globalProperties与getCurrentInstanceObject.assignvue-cookies安装vue-cookies 使用vue-cookiesrouter.currentRoutepreserve logimport.meta.envRequ…

QPaint绘制图形

流程 继承QWidget类&#xff0c;重写paintEvent方法&#xff0c;在其中使用QPainter进行绘图。 举例 创建项目&#xff0c;项目结构如下&#xff1a; // widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget…

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…

LVDS (Low Voltage Differential Signaling)基础知识

LVDS(Low Voltage Differential Signaling&#xff09;: 是一种小振幅差分信号技术&#xff0c;它使用非常低的幅度信号 (250mV~450mv&#xff09;通过一对平行的 PCB 走线或平衡电缆传输数据。 在两条平行的差分信号线上流经的电流及电压振幅相反&#xff0c;噪声信号同时耦…

小鱼C python - 集合的练习

题一&#xff1a;用字典实现集合的去重特性 1. 生成100个1&#xff5e;100的随机值 思路&#xff1a; 1. range 范围 2. random.randint(a,b) import random x [] for I in range(100):x.append(random.randint(1,100)) print(x) 2. x和y的交集 思路&#xff1a;1.遍历x,…

通过 pGina 对 Windows 设备进行管理

文章目录 前言1、环境信息1.1、服务器端1.2、客户端 2、pGina 安装及配置2.1、下载并安装2.2、配置2.3、模拟测试2.4、Windows 远程登录测试 总结 前言 对 Windows 设备进行管理&#xff0c;一般是通过 AD 进行的&#xff0c;但是这玩意儿是收费的&#xff0c;而且还挺贵。有没…