首页 > 其他分享 >机器学习(一)——递归特征消除法实现SVM(matlab)

机器学习(一)——递归特征消除法实现SVM(matlab)

时间:2024-06-21 21:42:33浏览次数:13  
标签:SVM features 递归 特征 模型 分类 num matlab accuracy

机器学习方法对多维特征数据进行分类:本文用到非常经典的机器学习方法,使用递归特征消除进行特征选择,使用支持向量机构建分类模型,使用留一交叉验证的方法来评判模型的性能。
构建模型:支持向量机(Support Vector Machine,SVM);
特征选择:递归特征消除(Recursive Feature Elimination,RFE);
交叉验证:留一交叉验证(Leave one out cross validation,LOOCV)。
下面本问将逐一开始介绍这些方法。

支持向量机
适用场景:
1、只能用于2分类任务
2、目的是寻找一个超平面来对样本进行分割
3、注意:构建超平面不一定用到所有样本,只用到距离超平面最近的那些样本
模型调参:
1、当样本之间线性可分时,选用线性核函数(linear kernel)构建分类模型。
2、当模型线性不可分时候,需要适用非线性核函数(rbf,Gaussian,Polynomial)将数据分布映射到更高维的空间中来构建超平面,进而来构建分类模型。
3、选择哪种核函数,一般通过改变核函数来比较模型的分类性能来确定。matlab中自带的核函数只有四种,如果需要使用其他核函数请自行下载相关软件包。

递归特征消除
作用:
1、降低特征维度
2、选择最优的特征组合,使模型达到最好的分类效果(类似于贪心算法)。
步骤:
1、对于一个具有n维特征的数据集合,首先用n维特征构建SVM分类器模型,通过交叉验证的方法计算模型的分类准确性。
2、从当前特征集合中依次移除每一个特征,然后用剩下特征构建分类模型,使用交叉验证的方法计算特征移除后的分类准确率。
3、若某特征移除后模型的分类准确率反而上升,则该特征对分类模型没有贡献度,则将该特征移除,剩下特征作为保留特征。
4、使用剩下特征重复步骤2,直到所有的特征子集为空后便可以得到n个模型,选择分类准确率最高的特征集合作为最优的特征集合。

留一交叉验证
适用场景:
小样本构建分类模型,当样本量很小时,不足以区分单独的训练集和测试集时,通常使用这种方法。该方法的基本思想就是,当有n个样本的情况下,依次保留其中1个样本,用剩下n-1个样本构建分类模型,用保留的样本进行测试。这样就可以得到n个模型,计算这n个模型分类结果的平均值就可以得到在该数据分布情况下,使用某种分类方法构建分类模型的性能。

matlab实现的代码如下:

labels = res(:, 1);
features = res(:, 2:end);
features=zscore(features);%特征进行归一化
% 加载数据集并准备标签和特征数组
[num_samples, num_features] = size(features);

selected_indices = 1:num_features; % 初始选定所有特征的索引
selected_features_history = cell(num_features, num_features); % 存储选定的特征历史记录  
accuracy_history = zeros(num_features, num_features); % 存储准确率历史记录    
feature_to_remove = -1;

% 开始逐步特征选择
for i = 1:num_features
    best_accuracy = 0;
    temp_indices = selected_indices; % 创建临时特征索引列表
    
    % 对每个特征进行评估
    for j = 1:length(temp_indices)
        features_subset = temp_indices(temp_indices ~= j);%去除特征后输入分类器的特征
        [num1,num2]=size(features_subset);
        % 使用留一交叉验证评估SVM分类器性能
        accuracy = 0;
        for k = 1:num_samples
            % 留一样本作为验证集,其余样本作为训练集
            train_features = features(:, features_subset);
            train_features(k, :) = []; % 删除验证样本的特征
            train_labels = labels;
            train_labels(k) = []; % 删除验证样本的标签
            test_feature = features(k, features_subset);
            test_label = labels(k);
            
            % 训练SVM模型
            svm_model = fitcsvm(train_features, train_labels, 'KernelFunction', 'linear');
            
            % 在验证集上进行预测并计算准确率
            predicted_label = predict(svm_model, test_feature);
            if predicted_label == test_label
                accuracy = accuracy + 1;
            end
        end
        accuracy = accuracy / num_samples; % 计算准确率
        accuracy_history(i,j)=accuracy;   %将每次分类的准确率存到一个数组中
        selected_features_history{i,j} = features_subset;%将每次分类用到的特征存到一个数组里
        %temp_indices

        % 如果当前特征组合的准确率更高,则更新最佳特征及其对应的准确率
        if (accuracy_history(i,j) > best_accuracy)
           
            best_accuracy = accuracy_history(i,j);
            feature_to_remove = temp_indices(j);
        end
        
    end



    
    % 删除性能下降最快的特征
    selected_indices = selected_indices(selected_indices ~= feature_to_remove);
   % selected_features_history{i} = selected_indices; % 更新选定的特征历史记录
%     accuracy_history(i) = best_accuracy; % 更新准确率历史记录
    disp(['Removed feature index: ', num2str(feature_to_remove)]);
end


[max_value, max_index] = max(accuracy_history(:));

% max_value 将是数组中的最大值
% max_index 将是数组中最大值所在的位置(线性索引)
[row, col] = ind2sub(size(accuracy_history), max_index);

% row 和 col 将是数组中最大值的行和列索引


% 输出最终选定的特征索引
% disp('最优的分类准确性为');
% disp(max_value);

disp('对应的选择的特征索引为:');
disp(selected_features_history{row,col});


%利用选出来的特征重新建模求准确率
features_new=features(:,selected_features_history{row,col});
%features_new=features;
% lables是样本标签
predictedScores=zeros(56,2);

accuracy_new=0;
        for k = 1:num_samples
            % 留一样本作为验证集,其余样本作为训练集
            train_features = features_new(:,:);
            train_features(k, :) = []; % 删除验证样本的特征
            train_labels = labels;
            train_labels(k) = []; % 删除验证样本的标签
            test_feature = features_new(k,:);
            test_label = labels(k);
            
            % 训练SVM模型
            svm_model = fitcsvm(train_features, train_labels, 'KernelFunction', 'linear');
            
            % 在验证集上进行预测并计算准确率
           % predicted_label = predict(svm_model, test_feature);
            [predicted_label,predictedScore] = predict(svm_model, test_feature);
            predictedScores(k,:)=predictedScore;
            if predicted_label == test_label
                accuracy_new = accuracy_new + 1;
            end
        end
        accuracy_new = accuracy_new / num_samples; % 计算准确率


% 输出最终选定的特征索引
disp('最优的分类准确性为');
disp(accuracy_new);```
       

标签:SVM,features,递归,特征,模型,分类,num,matlab,accuracy
From: https://www.cnblogs.com/Yizhiyingyingguai/p/18261360

相关文章

  • 信道编码——Turbo码Matlab编译码实现与性能分析
    第三篇博客感言“不要成为一个只会用Matlab仿真SNR-BER的猴子。”前段时间比较焦虑就业,到处搜索通信的就业情况。很多人说通信日薄西山,不无道理,与前十几二十年相比,现在的确是哑火了,5G、6G带来的变革远不如3G、4G那么震撼,并且电子信息专业学生越来越多,就业岗位和待遇却不见......
  • 基于Matlab中plot的六方元胞自动机+源代码+文档说明
    文章目录源码下载地址项目介绍项目功能界面预览项目备注源码下载地址源码下载地址点击这里下载代码项目介绍运行MainSixGrid.m文件即可默认随机出生,大小为10x10,演化100步,黑色为死亡,白色为存活,规则为邻居数量大于2且小于3时存活,否则死亡有兴趣的话可以通过更改la......
  • python 趣味习题_递归函数(炸弹迷宫的走法)
    @[toc]python学习中,常会遇到一些百思不得其解的难题,但有时“灵光一现”找准方法,难题便会迎刃而解。本专栏旨在记录本人解决问题的思考方法,及实现过程。有更好方法或对程序执行有疑问的伙伴,可在评论区留言,共同讨论。题目要求题目描述:在一串连续的迷宫(房间编号为1-11的......
  • 基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真
    1.算法运行效果图预览    2.算法运行软件版本MATLAB2022a 3.部分核心程序P=[Dat1_wav1;Dat1_wav2;Dat2_wav1;Dat2_wav2;Dat3_wav1;Dat3_wav2;Dat4_wav1;Dat4_wav2];T=[ones(800,1);2*ones(800,1);3*ones(800,1);4*ones(800,1)];%GRNN训练net=newgrnn(......
  • 基于蝗虫优化的KNN分类特征选择算法的matlab仿真
    1.程序功能描述      基于蝗虫优化的KNN分类特征选择算法。使用蝗虫优化算法,选择最佳的特征,进行KNN分类,从而提高KNN分类的精度。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行   3.核心程序[idx1,~,idx2]=dividerand(rows,0.8,0,0.2);Ptrain......
  • Matlab数学建模实战应用:案例1 - 股票价格预测
    目录前言一、问题分析二、模型选择三、Matlab代码实现完整代码示例四、模型改进1.引入更多特征2.使用更复杂的模型3.模型参数优化五、实例总结总结前言股票价格预测是金融工程中的重要问题,利用数学建模可以帮助分析和预测股票价格的波动趋势,帮助投资者做出更......
  • 递归算法:代码迷宫中的无限探索
    ✨✨✨学习的道路很枯燥,希望我们能并肩走下来!目录前言一深入理解递归二迭代VS递归三递归算法题目解析3.1汉诺塔问题 3.2合并两个有序链表3.3反转链表 3.4 两两交换链表中的节点 3.5Pow(x,n)(快速幂) ​四总结总结前言作为递归、搜索与回溯算法......
  • Leedcode【222】. 完全二叉树的节点个数——Java解法(递归)
    Problem: 222.完全二叉树的节点个数题目思路解题方法复杂度Code效果题目给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的......
  • MATLAB神经网络工具箱使用介绍
      本文介绍MATLAB软件中神经网络拟合(NeuralNetFitting)工具箱的具体使用方法。  在MATLAB人工神经网络ANN代码这篇文章中,我们介绍了MATLAB软件中神经网络(ANN)的纯代码实现;而在MATLAB软件中,其实基于神经网络拟合工具箱,就可以点点鼠标实现神经网络的回归。本文就对基于这一工具......
  • Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)
    前言Matlab(矩阵实验室)是全球领先的数学计算软件开发商美国MathWorks公司研发的一款面向科学与工程计算的高级语言的商业数学软件,集算法开发、数据分析、可视化和数值计算于一体的编程环境,其核心是仿真交互式矩阵计算,广泛应用于科学计算、数据分析、算法开发和绘图设计等......