读文章笔记-OSSFS-DD

文章地址

Online Scalable Streaming Feature Selection via Dynamic Decision

代码地址

内容

预备知识

  • 预备的知识,总体方差计算公式:
    在这里插入图片描述
  • 预备的知识,正态分布:
    在这里插入图片描述
  • 关于Sc和Su的时间复杂度计算。
    在这里插入图片描述

公式(5)(6)的详细推导

在这里插入图片描述

在这里插入图片描述

文章主要贡献

  • 将特征分成选择,丢弃和延迟。提出基于动态决策的在线可扩展流特征选择算法。
  • 通过算法降低总体决策风险。并且动态调整阈值,筛选出最富有信息的特征:1如果两个特征都>β,但是两个特征的联合信息<2β,那么就将候选特征子集的特征作为冗余信息抛弃;2如果两个特征都<β,但是两个特征的联合信息>2β,那么就将未决策的信息放入候选特征子集.
  • 用11组数据集比较现有的7种流特征选择算法。

算法

  • 算法总体就是:1将t时刻获得的ft特征;2计算它的成员度,更新α和β的值;3如果ft的成员度<α就丢弃ft特征;4如果ft的成员度>β,就放入Sc强相关的候选特征子集;并且将fi和fj的的互信息<2β的冗余信息剔除;5如果α<ft的成员度<β,就放入Su弱相关的未确定特征子集,如果Su溢出,那么将fi和fj的的互信息>=2β的信息放入Sc中,清空Su。

对比其他7种算法

  • 对比Alpha-investing[33]:只能为某些数据集选择前一两项特征,没有像本文算法那样有可扩展性。
  • 对比 Fast-OSFS[21]:本文算法在跑GISETTE运行时间打败了它,因为Fast-OSFS导致关键信息丢失。所以本文算法是更稳定的算法。
  • 对比SAOLA[29]:本文算法可以选择出比SAOLA算法更富有信息的特征。
  • 对比OSFSMI[17]: 本文算法在DEXTER and GISETTE花费的运行时间优于OSFSMI。
  • 对比GFSSF[7]:GFSSF对于相关性和冗余分析太苛刻,导致错过很多重要的信息。
  • 对比OFS-A3M[36]:基于邻域粗糙集的OFS-A3M算法运行时间更大。OFS-A3M使用邻域信息进行特征选择,该特征选择可能受到样本分布的显著影响。但是OFS-A3M在一些数据集就用到了较少的样本。
  • 对比OFS-Density[35]:基于邻域粗糙集的OFS-Density。不能处理分布不均匀的数据集。

思考

  • 使用邻域粗糙集处理流特征。
  • 一般基于邻域粗糙处理流特征,有很高的时间复杂度。文章就是提出的新的方法来应对,邻域粗糙集处理的流特征的高时间复杂度。文章中使用全局统计信息来选择信息量最大的特征的可扩展比例。
  • 本文仅检查冗余和不确定性分析中两个特征之间的冗余和联合信息。在未来的工作中,我们将考虑三元组或更多变量的关系。

跑模型

前期准备

  • 1下载库:MIToolboxmi
  • 2将MIToolbox和mi放入,finder-> Application->Matlab->显示包内容->toolbox->把MIToolbox-master和mi放进去后。
  • 3打开电脑终端:cd到…/toolbox/MIToolbox-master
  • 4在电脑终端执行(这是mac端,winsows看第一步):sudo make install
  • 5设置路径MIToolbox和mi。
    在这里插入图片描述
  • 6在matlab终端输入:cd(matlabroot)
  • 7在matlab终端输入:cd toolbox/cd toolbox/MIToolbox-master
  • 8在matlab终端输入:CompileMIToolbox.编译完成后就可以运行测试代码
  • 9运行测试代码,这里可以用,就可以成功了
y = [1 1 1 0 0]';
x = [1 0 1 1 0]';
h(x);
  • 10(这步可以不用看是改警告的),我们在第8步编译CompileMIToolbox的时候,会有警告。解决方法:打开MIToolboxMex.c找到第221行修改如下,则编译的时候不会出现警告。
errorTest = mergeMultipleArraysArities(matrix, mergedVector, numberOfFeatures, (int *)intArities, numberOfSamples);

关于会调用到的系统的函数

std

  • std()标准差
    在这里插入图片描述
std([1,2]); % 此时的为n-1 如果std([1,2],0),为n-1;如果是1为n
% 输出sqrt(0.5) = 0.7071

文章中的筛选的代码积累

A = [1 2 3];
B = 2;
C = A==B; % logical 0 1 0
A(C); % 2

OSFS_DD_mi2

OSFS_DD_mi2的function的输入和输出

%% 输入
% selectedFeatures 选择的特征序号集合
% time 算法运行时间

%% 输出
% X 样本属性数据矩阵
% Y 样本标签矩阵
% sig1 应该是k1
% sig2 应该是k2
% PoolSize是undetermined subset的大小

function [selectedFeatures,time] = OSFS_DD_mi2(X,Y,sig1,sig2,PoolSize)

OSFS_DD_mi2的调用

%% OSFS_DD_mi2
clear;
clc;

data = load('wine.mat');
wineData = data.standdata;
[~, column] = size(wineData); % 178*14
samples = wineData(:,1:end-1);
label = wineData(:,column); % 取最后一列的标签

[selectedFeatures,time] = OSFS_DD_mi2(samples,label,1,2,100);
selectedFeatures
time

OSFS_DD_mi2的代码注释和说明

在这里插入图片描述

%% 参数的设置
% nargin < 3 % 内置参数只有两个的时候设置 sig1 = 1;sig2 = 2;PoolSize = 100;
% MIArray = [];%%% 每个属性互信息数组
% AccIndexs = [];%%% 储存每个 互信息>β 特征数组 候选特征子集
% DeterIndexs = [];%%% 未确定特征子集
start = tic; % 开始时间

%% 第一个for循环
%{
最终获得 
1.mi_F>β 删除冗余特征后的候选特征子集AccIndexs 
2.α<mi_F<β 当特征数量大于边界值时,未确定子集DeterIndexs的重要特征被提取到AccIndexs,然后清空DeterIndexs
%}

%%  最后一个if判断
% 如果DeterIndexs还是非空就最后筛选出重要的特征然后清空

%% 最后参数输出
selectedFeatures = AccIndexs;%%% 输出最后选择的特征集
time = toc(start);%%% 输出最后结束时间

OSFS_DD_mi2中的updateMeanStd

动态std标准差

  • 原来标准差
    在这里插入图片描述

  • 动态更新std标准差
    在这里插入图片描述
    在这里插入图片描述

  • 动态更新std标准差代码

Sn = (1/(Num-1))*((Num-2)*std^2+((Num-1)/Num)*(newVal-mean)^2);
std_new = sqrt(Sn);

动态平均值

  • 原来平均值
    在这里插入图片描述

  • 动态平均值
    在这里插入图片描述
    在这里插入图片描述

  • 动态更新平均值代码

mean_new = mean+(newVal-mean)/Num;

OSFS_DD_mi2中的flushDeterPool

  • α<特征的互信息<β,处理undetermined未确定的域Delaying;或者Nus>100时处理缓存池中的边界特征.

flushDeterPool的function的输入和输出

%% 输入
% X 样本集
% Y 标签值
% DeterIndexs 未确定的特征集
% beta β的值
% MIArray 互信息数组

%% 输出
% selectedIndex 提取的有用的特征

function [selectedIndex] = flushDeterPool(X,Y,DeterIndexs,beta,MIArray)

flushDeterPool的注释和说明

在这里插入图片描述

% 遍历DeterIndexs中的特征,如果两个特征之间的联合互信息>2β,那么就加入selectedIndex中,最后再进行去重得到新的selectedIndex
% MIToolbox/cmi.m DeterIndexs中的第i个特征原本的互信息+第i个特征与第i+1个特征的联合互信息
jointMI = MIArray(1,ind)+cmi(X(:,ind),Y,X(:,ind_joint));
if jointMI > 2*beta % 互信息 > 2β 就把i和i+1的特征放入候选集合
	selectedIndex = [selectedIndex,ind,ind_joint];%%% 但是这里的写法很容易多选重复的特征
	break; % 直接跳出内部的for循环回到外层
end

OSFS_DD_mi2中的checkPoolRedundancy

  • 特征的互信息>β,处理候选集中的冗余特征。

checkPoolRedundancy的function的输入和输出

%% 输入
% X 样本集
% Y 标签值
% AccIndexs 候选的特征集
% newIndex 新选的特征的index
% MIArray 互信息数组
% beta β的值

%% 输出
% delIndx 要删除的冗余特征

function [delIndx] = checkPoolRedundancy(X,Y,AccIndexs,newIndex,MIArray,beta)

checkPoolRedundancy的注释和说明

% 就是将候选特征集中的新进入的特征
newMI = MIArray(1,newIndex); % 获取当前newIndex的互信息

% 与其他特征进行联合互信息的对比,如果联合互信息< 2β,那么就放入要删除的特征集中。
if newMI < indMI % 如果这个新的特征的互信息都小于原本的互信息就放入要删除的index中然后直接返回
	delIndx = [newIndex];
	break;
else % 如果这个新的特征的互信息都大于原本的互信息就先放入要删除的数组中
	delIndx = [delIndx,ind];
end  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值