使用Bhattacharyya距离进行特征选择

我使用图像处理提取了一组240个特征。目标是在训练后将测试案例分类为7个不同的类别。每个类别大约有60个观测值(即,每个类别大约有60个特征向量,每个向量有240个分量)。

许多研究论文和书籍使用顺序向前搜索或顺序向后搜索来从特征向量中选择最佳特征。下图展示了一个顺序向前搜索算法。这是SFS算法的快照

任何这样的算法都使用某种标准来区分特征。一个常见的方法是使用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

我希望这能帮助到有类似问题的人。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注