我使用图像处理提取了一组240个特征。目标是在训练后将测试案例分类为7个不同的类别。每个类别大约有60个观测值(即,每个类别大约有60个特征向量,每个向量有240个分量)。
许多研究论文和书籍使用顺序向前搜索或顺序向后搜索来从特征向量中选择最佳特征。下图展示了一个顺序向前搜索算法。
任何这样的算法都使用某种标准来区分特征。一个常见的方法是使用Bhattacharyya距离作为标准。Bhattacharyya距离是一种分布之间的发散度量。通过一些研究和学习,我发现对于类别A,有一个矩阵M1包含该类别的所有60个特征向量,该矩阵有n=60行和m=240列(因为总共有240个特征),以及对于类别B的一个类似的矩阵M2,我可以计算出它们之间的Bhattacharyya距离,并找出它们的相互依赖性。
我的问题是如何将这两者整合。我如何将Bhattacharyya距离作为标准纳入上述算法中以选择最佳特征。
回答:
在@的帮助下,我终于理解了这个概念。这是我的实现。尽管我使用了Plus l Take away r算法(顺序向前向后搜索),我还是会发布它,因为一旦去掉向后搜索,它基本上是相同的。下面的实现是用Matlab编写的,但非常容易理解:
S=zeros(Size,1); %用全零初始化二进制数组特征列表,意味着没有选择任何特征
k=0;
while k<n %开始SFS。n是需要提取的特征数量
t=k+l; %l是每次迭代中要添加的特征数量
while k<t
R=zeros(Size,1); %Size是特征总数
for i=1:Size
if S(i)==0 %如果特征尚未被选择。S是一个二进制数组,它对每个被选中的特征标记为1
S_copy=S;
S_copy(i)=1;
R=OperateBhattacharrya(Matrices,S_copy,i,e,R); %每次迭代的结果存储在R中
end
end
k=k+1; %增加k
[~,N]=max(R); %将R中最大元素的索引作为最佳特征选择
S(N)=1; %将选中的特征索引标记为1
end
t=k-r; %r是在选择l个特征后要移除的特征数量。l>r
while k>t %开始顺序向后搜索
R=zeros(Size,1);
for i=1:Size
if S(i)==1
S_copy=S;
S_copy(i)=0;
R=OperateBhattacharrya(Matrices,S_copy,i,1,R);
end
end
k=k-1;
[~,N]=max(R);
S(N)=0;
end
fprintf('Iteration :%d--%d\n',k,t);
end
我希望这能帮助到有类似问题的人。