function [feature,accuracy]=CFSPabs_SBFS(data_input)
%%
% 实现 CFSPabs 与SVM的顺序后向 浮动 混合特征选择
%%
[m,n]=size(data_input);
% [ gi ,giF ]=f_score( data_input );
rest_fea=1:1:n-1;
select_fea=rest_fea;
%% 首先使用 全部特征子集 训练SVM,得到一个平均正确率
tem_acc=[];
% feature={};
indices=crossvalind('Kfold',data_input(1:m,n),5); % 十折交叉验证 随机分包
for i=1:5
test=(indices==i); % 获得test集元素在数据集中对应的单元编号
train=~test; % train集元素的编号为非test元素的编号
train_data=data_input(train,:); % 从数据集中划分出train样本的数据
test_data=data_input(test,:);
[pre_label,acc]=SVM_SFS(train_data,rest_fea);
tem_acc=[tem_acc,acc(1,1)];
end
max_acc=mean(tem_acc);
% feature{1}=rest_fea;
%% 尝试从剩余特征子集中去除一个特征,并计算相应的DFS的值
k=1;
% while ~isempty(rest_fea)
while length(rest_fea)-1>0
dfs=[];
k=k+1;
d=size(rest_fea,2);
for i=1:d
data=[];
visit=zeros(1,d);
%%
visit(i)=1;
rest=(visit==1);
select=~rest;
tem_fea=rest_fea(1,select);
len=size(tem_fea,2);
% tem_fea=select(1,rest);
%%
for j=1:len
data(:,j)=data_input(:,tem_fea(j));
end
data(:,end+1)=data_input(:,end); %加类标列
ms=CFSPabs_score(data); % 计算临时特征的DFS值
% dfs(i)=dfsi(k);
% if dfsi(k)>tem1
% tem1=dfsi(k);
% max=rest_fea(i);
% end
% select_fea=[select_fea,max];
% if rest_fea(j)==max
dfs=[dfs,ms];
end
[~,ind]=sort(dfs,'descend');
visit=zeros(1,d);
visit(ind(1))=1;
delete_fea=rest_fea(ind(1)); % 本次去除的特征编号
rest1=(visit==1);
select1=~rest1;
rest_fea=rest_fea(1,select1);
%% 计算特征数减 1 的特征子集的正确率
tem_acc=[];
indices=crossvalind('Kfold',data_input(1:m,n),5); % 十折交叉验证 随机分包
for i=1:5
test=(indices==i); % 获得test集元素在数据集中对应的单元编号
train=~test; % train集元素的编号为非test元素的编号
train_data=data_input(train,:); % 从数据集中划分出train样本的数据
test_data=data_input(test,:);
[pre_label,acc]=SVM_SFS(train_data,rest_fea);
tem_acc=[tem_acc,acc(1,1)];
end
meanAcc=mean(tem_acc);
% accuracy=[accuracy,mean(tem_acc)];
if meanAcc>=max_acc
% delete_fea=rest_fea(ind(1));
len1=length(select_fea);
for i=1:len1
if select_fea(i)==delete_fea
visit=zeros(1,len1);
visit(i)=1;
rest2=(visit==1);
select2=~rest2;
select_fea=select_fea(1,select2);
break;
end
end
end
max_acc=meanAcc;
end
feature=select_fea;
accuracy=max_acc;
end