基于麻雀搜索算法的同步优化特征选择 - 附代码

2024-06-18 07:18

本文主要是介绍基于麻雀搜索算法的同步优化特征选择 - 附代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于麻雀搜索算法的同步优化特征选择 - 附代码

文章目录

  • 基于麻雀搜索算法的同步优化特征选择 - 附代码
    • 1.数据集
    • 2.SVM模型建立
    • 3.麻雀搜索算法同步优化特征选择
    • 4.测试结果
    • 5.参考文献:
    • 6.Matlab代码

摘要:针对传统支持向量机在封装式特征选择中分类效果差、子集选取冗余、计算性能易受核函数参数影响的不足, 利用麻雀优化算法对其进行同步优化。

1.数据集

wine 数据的来源是 UCI 数据库 , 记录的是在意大利同一区域里三种不同品种的葡萄酒的化学成分分析,数据里含有 178 个样本,每个样本含有 13 个特征分量(化学成分〉,每个样本 的类别标签已给。将这 178 个样本的 50%作为训练集,另 50%作为测试集 ,用训练集对 SVM 进行训练可以得到分类模型,再用得到的模型对测试集进行类别标签预测。

整体数据存储在 chapter_WineClass. mat ,解释如下: classnumber = 3 ,记录类别数目;

wine, 178 × 13 的 一个 double 型的矩阵,记录 178 个样本的 13 个属性;

wine_ labels, 178 × 1的 一个 double 型的列向盘,记录 178 个样本各自的类别标签 。

请添加图片描述

图1.数据集

2.SVM模型建立

首先需要从原始数据里把训练集和测试集提取出来,然后进行一定的预处理(必要的时候 还需要进行特征提取),之后用训练集对 SVM 进行训练,最后用得到的模型来预测测试集的分类标签。
请添加图片描述

图2.SVM模型

其中数据预处理采用归一化处理:对训练集和测试集进行归一化预处理,采用的归一化映射如下 。
y = x − x m i n x m a x − x m i n (1) y = \frac{x-x_{min}}{x_{max} - x{min}} \tag{1} y=xmaxxminxxmin(1)

3.麻雀搜索算法同步优化特征选择

​ 在元启发式群智能算法优化计算时, 对于不同的优化问题, 种群个体代表不同含义. 针对特征选择问题而言, 其实质是二元优化问题, 优化后的选择特征结果表示仅限于“0”与“1”, 值“0”表示未选择该特征, 值“1”表示选择该特征. 优化选择特征时, 种群的个体解可视为一维向量, 每个维度的原始数据值与 0.5 比较, 大于等于 0.5 则选择该特征, 否则剔除该特征.特征选择可视为多个目标优化问题, 当分类结果中分类准确率较高, 选择特征子集个数较少时说明所得分类效果优秀. 在算法迭代过程中, 一般采用适应度函数来评估每个解的质量. 为了平衡分类准确率和特征子集个数这两个指标.因此,根据SVM分类器所得到的解的分类准确率与特征选择的所选特征子集个数, 设计适应度函数 如下所示:
f i t e n e s s = a r g m a x ( a c c u r a c y [ p r e d i c t ( t r a i n ) ] + a c c u r a c y [ p r e d i c t ( t e s t ) ] + 1 − r / N ) fiteness = argmax(accuracy[predict(train)]+accuracy[predict(test)] + 1 - r/N) fiteness=argmaxaccuracy[predict(train)]+accuracy[predict(test)]+1r/N
其中accuracy[predict(train)],accuracy[predict(test)]分别为训练集和测试集(验证集)准确率,根据自身需要看是只用训练集准确率还是综合考虑验证集准确率,r为选择的特征个数,N为总特征个数。

由于麻雀是求极小值,将目标求最大值转换为求极小值
f i t n e s s = − f i t n e s s fitness = -fitness fitness=fitness
请添加图片描述

4.测试结果

麻雀算法参数设置如下:

%%  麻雀参数设置
% 定义优化参数的个数,在该场景中,优化参数的个数为数据集特征总数 。
%目标函数
fobj = @(x) fun(x,train_wine_labels,train_wine,test_wine_labels,test_wine); 
% 优化参数的个数 特征维度
dim = size(train_wine,2); %特征维度
% 优化参数的取值下限,[0,1],大于0.5为选择该特征,小于0.5为不选择该特征
lb = 0;
ub = 1;
%%  参数设置
pop =10; %麻雀数量
Max_iteration=50;%最大迭代次数             
%% 优化
[Best_pos,Best_score,curve]=SSA(pop,Max_iteration,lb,ub,dim,fobj); 

请添加图片描述
请添加图片描述

基础SVM训练集最终预测准确率:100
基础SVM测试集最终预测准确率:98.8764
SSA特征选择后SVM训练集最终预测准确率:100
SSA特征选择后SVM测试集最终预测准确率:100
总特征数:13
麻雀算法选择的特征总数:9
麻雀算法选择的特征(0为不选择,1为选择):1 0 0 1 1 1 1 0 0 1 1 1 1

从结果来看,经过特征选择后,特征数明显减少,由13维变为9维,而且训练集和测试集精度均能达到比较好的结果。

5.参考文献:

[1]贾鹤鸣,姜子超,李瑶.基于改进秃鹰搜索算法的同步优化特征选择[J/OL].控制与决策:1-9[2021-11-02].https://doi.org/10.13195/j.kzyjc.2020.1025.

6.Matlab代码

这篇关于基于麻雀搜索算法的同步优化特征选择 - 附代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071638

相关文章

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.