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

        支持向量机(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的性能。同时,为了解决模型参数大多依靠经验选取或者大范围网格搜索耗时较长等问题,不少学者引入遗传算法、粒子群算法等优化算法,从而自动寻找最佳的模型参数使得模型的性能达到最优。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML点击显示、点击隐藏details 标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><details> <summary>Copyright 1999-2011.</summary> <p> - by Refsnes Da…

Redis数据类型

Redis数据类型 一、String数据类型1、概述2、实验 二、List数据类型1、概述2、实验 三、Hash数据类型&#xff08;散列类型&#xff09;1、概述2、实验 四、Set数据类型&#xff08;无序集合&#xff09;1、概述2、应用范围3、实验 五、Sorted Set数据类型&#xff08;zset、有…

JAVA开发与运维(怎么通过docker部署微服务jar包)

目标&#xff1a; 通过docker的方式部署微服务。 一、背景&#xff1a; 我们通过java开发的微服务可以打成jar包&#xff0c;我们可以直接通过裸机部署&#xff0c;也可以通过docker来部署&#xff0c;本文介绍通过docker来部署微服务。 二、首先我们介绍一下docker的发展过程…

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 &#xff08;1&#xff09;针对问题1&#xff1a; &#xff08;2&#xff09;针对问题2&#xff1a; &#xff08;3&#xff09;针对问题3&#xff1a; 五、附上几个典型代码 &#xff08;1&#xff09;K-means算法…

【HTTP 协议】掌握 Web 的核心技术

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 HTTP 协议&#xff08;超文本传输协议&#xff09;&#xff0c;不知道大家第一次是从什么地方了解到这个协议的呢&#xff1f;在真实的网络环境中网络协议的种类非常多&#xff0c;其中有一些耳熟能详的…

深入解析大型语言模型:从训练到部署大模型

简介 随着数据科学领域的深入发展&#xff0c;大型语言模型—这种能够处理和生成复杂自然语言的精密人工智能系统—逐渐引发了更大的关注。 LLMs是自然语言处理&#xff08;NLP&#xff09;中最令人瞩目的突破之一。这些模型有潜力彻底改变从客服到科学研究等各种行业&#x…

SpringSecurity实现Remember-Me实践

【1】基于会话技术的实现 也就是基于Cookie的实现&#xff0c;用户信息通过某种规则进行加密然后生成一个字符串设置为cookie。 ① 登录页面 这里name"remember-me"表示“记住我”的复选框&#xff0c;默认key是remember-me。 <form action"/user/login&…

EasyCVR电子地图鼠标悬停展示经纬度的技术实现

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可…

VS2019 Python连接Sql server2008

安好后&#xff1a; 测试代码&#xff1a; import pymssqltry:conn pymssql.connect(host127.0.0.1,usersa,password123456,databasehotel,charsetutf8)# 连接并执行Sql语句cursor conn.cursor()sql select * from odercursor.execute(sql)# 获取数据集rs cursor.fetchal…

从操作系统角度了解内存管理

一.内存管理 1.主要功能 内存管理的主要功能有: 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地址与内存中的物理地址不可能一致, …

React--Component组件浅析

目录 一 前言二 什么是React组件&#xff1f;三 二种不同 React 组件1 class类组件2 函数组件 四 组件通信方式五 组件的强化方式六 总结 一 前言 在 React 世界里&#xff0c;一切皆组件&#xff0c;我们写的 React 项目全部起源于组件。组件可以分为两类&#xff0c;一类是类…

Redis---集群

目录 一、集群的介绍 1.1 为什么需要集群呢&#xff1f; 1.2 什么是集群&#xff1f; 1.2 集群能干什么呢&#xff1f; 二、集群的算法之分片&槽位slot 2.1 什么是槽位slot&#xff1f; 2.2 分片 2.3 使用槽位和分片的优势 2.4 slot 槽位映射的三种算法 1、哈…

《深入浅出WPF》学习笔记

文章目录 相关资源前言WPF 学习笔记环境配置WPF基础&#xff1a;一个WPF程序是如何启动的xmal文件和cs文件是如何连接的如何确定启动页面xmal文件如何引用别的文件如何引用 WPF是如何创建元素&#xff0c;改变元素的WPF的元素创建和简单属性赋值WPF的树形界面Xmal属性赋值为什么…

内网安全:代理技术详解

目录 代理技术实验所用网络拓扑图及说明 代理技术 SOCK协议 使用代理技术的原因 正向代理与反向代理 实战一&#xff1a;MSF代理通讯 实验原理说明 一. Meterpreter建立路由 二. MSF建立节点 三. 建立代理到MSF上 实战二&#xff1a;CS代理通讯 实验原理说明 一. …

【MYSQL篇】Update语句原理详解

文章目录 前言缓冲池Buffer PoolInnoDB 内存结构redo logundo logBinlog 总结 前言 前面的文章我们已经对MySQL的查询语句的执行流程进行了说明&#xff0c;感兴趣的可以去看看&#xff1a; 【MySQL篇】Select语句原理详解 本篇文章我们来聊聊 MySQL更新语句的执行原理。更新…

从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)

一、前言 doctest从字面意思上看&#xff0c;那就是文档测试。doctest是python里面自带的一个模块&#xff0c;它实际上是单元测试的一种。 官方解释&#xff1a;doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段&#xff0c;然后尝试执行并验证结果 doctest测试…

spring mvc架构模式概述

三层架构: pojo&#xff0c;bean&#xff0c;domain是一个意思&#xff0c;表示实体类 dao表示操作数据库的那个类&#xff0c;一般是一张表一个

Redis主从架构、数据同步原理、全量同步、增量同步

目录 专栏导读一、Redis主从架构二、数据同步原理三、全量同步的流程三、可以从以下几个方面来优化Redis主从就集群四、全量同步和增量同步区别&#xff1f;五、什么时候执行全量同步&#xff1f;六、什么时候执行增量同步&#xff1f;七、超卖问题 大家好&#xff0c;我是哪吒…

Gitlab保护分支与合并请求

目录 引言 1、成员角色指定 1、保护分支设置 2、合并请求 引言 熟悉了Git工作流之后&#xff0c;有几个重要的分支&#xff0c;如Master(改名为Main)、Develop、Release分支等&#xff0c;是禁止开发成员随意合并和提交的&#xff0c;在此分支上的提交和推送权限仅限项目负责…

机器视觉初步6-1:基于梯度的图像分割

把基于梯度的图像分割单独拿出来。 文章目录 一、图像梯度相关算子的原理1. Sobel算子2. Prewitt算子3. Roberts算子 二、python和halcon算子实现1.python实现2.halcon实现 基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。 梯度 1是图像中像素灰度值变化最快的…