模式识别之数据降维(四):SFS方法效果测试

技术凯 2020-12-29 15:35:42 5309

  上篇文章,我们介绍了SFS的基本原理以及matlab的具体实现,并成功选择了40个特征,这篇文章,我们将使用这40个特征进行分类,测试SFS方法的效果。

一、二分类测试

  我们去除二分类样本数据中的无关特征,仅保留SFS选择的40个特征,使用bayes分类器进行分类,观察最终的正确率,测试SFS的性能,使用的数据集以及测试方法和第二讲相同(链接)。具体实现如下:
(1)读取数据集,计算先验概率

(2)去除训练集和测试集的无关特征,仅保留最优的40个特征

(3)使用bayes算法进行分类

完整代码如下:

clear
load('2-Class Problem.mat');
load('feature_selected_SFS');
tic

%获取训练数量
n1=size(Training_class1,2);
n2=size(Training_class2,2);
% 先验概率
pw1=n1/(n1+n2);
pw2=n2/(n1+n2);
dim=size(Training_class1,1);%维数

Training_data1=Training_class1(feature_selected,:);
Training_data2=Training_class2(feature_selected,:);
Testing_data=Testing(feature_selected,:);

%参数估计
[miu1,sigma1]=ParamerEstimation(Training_data1);
[miu2,sigma2]=ParamerEstimation(Training_data2);
%预测结果
predict_label=0;
test_num=size(Testing,2);%获取测试数据数量
for i=1:test_num
    x=Testing_data(:,i);
    pxw1=gaussian(miu1,sigma1,x);
    pxw2=gaussian(miu2,sigma2,x);
    if pw1*pxw1>pw2*pxw2
        predict_label(i)=1;
    else
        predict_label(i)=2;
    end
end
% 计算精度
acc=sum(predict_label==Label_Testing)/test_num;
fprintf('正确率是%.2f%%\n',acc*100);
toc

程序运行结果分析:

  仅用SFS方法选择的40个特征进行分类就可以达到100%的正确率,而且大大节省了程序运行时间。

二、多分类测试

  和二分类一样,去除无关特征,仅保留40个最优特征进行多分类测试,数据集与第二讲相同(链接
(1)获取数据集,处理数据集,去除无关特征,只保留已选择的40个特征

(2)使用bayes对含有40个特征的测试数据进行多分类

完整代码如下:

clear
warning off;
% 读取多分类数据集和选择的40个最优特征
load('Mult-class Problem.mat');
load('feature_selected_SFS');
tic
% 去除无关的特征,只保留40个已选择特征
Training_data=Training_data(feature_selected,:);
Testing_data=Testing_data(feature_selected,:);
class_nums=Label_training(end);% 获取类别数
test_nums=size(Testing_data,2);% 获取测试集大小
train_nums=size(Training_data,2);    % 获取训练集大小

Training_temp=0;
predict=0;

for class=1:class_nums
    [miu(:,class),sigma(:,:,class)]=ParamerEstimation(Training_data(:,Label_training==class));
    num=size(Training_data(:,Label_training==class),2);
    pw(class)=num/train_nums;% 计算先验概率
end
for i=1:test_nums
    for class=1:class_nums
        % 计算类的条件概率密度
        pxw(class)=gaussian(miu(:,class),sigma(:,:,class),Testing_data(:,i));
        % 计算判别式
        g_x(class)=log(pw(class))+log(pxw(class));
    end
    [~,argmax]=max(g_x);
    predict(i)=argmax;
    if mod(i,100) == 0
        acc=sum(predict==Label_testing(1:i))/(i);
        disp(['预测数据号:' num2str(i)])
        disp(['准确度是:' num2str(acc)])
    end
end

acc=sum(predict==Label_testing)/(test_nums);
toc
disp(['总准确度是:' num2str(acc)])        

程序运行结果:

时间用了13s,正确率为66.9%。

三、总结

  本篇文章测试了SFS方法选择的特征对于分类的性能,可以看出,二分类和多分类都能够维持良好的正确率,并且大大降低了程序运行时间。通过对比第二讲(链接),我们发现SFS方法和遗传算法选择的特征对于二分类来说没有什么区别,但是遗传算法选择出来的特征对于多分类来说,正确率和运行速度两方面都略优于SFS方法。聪明的读者可能已经发现SFS方法的缺陷了,正如第三讲所讲,SFS是从第一个特征开始选择,之后所有的特征都是与之前选择的特征组合起来进行对比分析,比如我们要从特征a、b、c中选择两个特征,已经选择好第一个最优特征为a,现在选择第二个特征,那么第二轮选择的特征只可能是ab、ac的组合,那就有可能丢弃了最优的组合bc,这便是SFS方法的缺陷。工程师们后来对SFS方法进行了改进,提出了SFBS(Sequential Forward Backward Selection)方法,加入了反向搜索的过程,扩大了特征选择的范围。
  至此,特征选择的相关内容已经介绍完毕,之后的文章,我们将介绍特征提取相关内容。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 85 9 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
技术凯
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区