使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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