光谱特征选择---随机蛙跳变量选择RF

介绍随机蛙跳(RandomFrog,RF)算法及其在光谱数据分析中的应用,该算法通过迭代更新过程选择具有解释能力的变量,提高模型预测精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        我们已经连续好几期在讲特征变量选择算法,这其中一个很重要的一个原因是:光谱数据的高维冗余性和目标值与少数解释变量之间的相关性,也就是特征解释问题。如何从实际测量的高维光谱数据中选择具有解释能力(特征变量)的变量是目前特征选择或者特征降维的主要研究内容,也是光谱分析建模的关键组成。

        本期分享的随机蛙跳(Random Frog, RF)主要参考李宏东老师于2012年发表在ACA的论文(题目见文末),区别于由Kevin Lanes和Mustafa Eusuff于2003年提出的随机蛙跳算法(Shuffled Frog Leaping Algorithm, SFLA),RF迭代更新过程更加简单直观,而SFLA粒子群优化算法相似,本期就RF在光谱特征分析建模中的应用进行介绍,并以真实数据进行代码解析和结果展示,对于代码在光谱交流群内。

        1. 随机蛙跳RF

        作者原文以基因表达过程中的关键变量选择为背景提出了RF算法,结合光谱建模分析应用,我们首先介绍RF的基本原理。对于光谱变量X,其n行表示样本数,p列表示变量,对应的目标矩阵Y由nx1的变量组成,其迭代计算过程主要包括以下三步:

        (1)随机生成包含Q个变量的子集V0;

        (2)在V0的基础上提出一个包含Q*个变量的候选变量子集V*,以一定的概率接受V*作为V1,用V1代替V0,循环该过程;

        (3)计算各个变量选择的概率值,以此作为变量重要性评价指标。

        在RF算法计算过程中,主要涉及5个关键参数,分别是:

        (1)N:迭代次数,一般根据数据规模设置;

        (2)Q:初始数据子集所含变量数;

        (3)\theta:控制正态分布方差的因子,用于控制抽取进入候选变量子集的变量数;

        (4)w:用于重采样时调整变量个数;

        (5)\eta:用于设定接受性能不优于 V0 的候选变量子集 V* 的概率的上限。

上述变量中,除了Q和N外,其余变量均设置为默认值,此外,变量的重要性不再是单纯的以回归系数的大小为依据,而是以N次迭代中变量出现的概率为依据。

        2. 代码分析

        RF的matlab调用如下所示:​​​​​​​

function F=randomfrog_pls(X,Y,A,method,N,Q,criterion)%+++ Random Frog for variable selection for high dimensional data.%+++ Input:  X: m x n  (Sample matrix)%            Y: m x 1  (measured property)%            A: The maximal number of latent variables for%               cross-validation%       method: data pretreat method,'center' or 'autoscaling'%            N: The number of Simulation.%            Q: Intial number of variables to sample%+++ Criterion: index for variable assessment:'RegCoef',or 'sr'%+++ Output: Structural data: F

        输出的结构体F包含的主要变量有:​​​​​​​

F.N=N;                   %迭代次数F.Q=Q0;                  %子集变量数F.model=model;           %模型参数,此处选PLSF.minutes=toc/60;        %计算时间/SF.method=method;         %预处理方法F.Vrank=Vrank;           %变量序号F.Vtop10=Vtop10;         % top-10 变量F.probability=probability; % 各变量被选概率F.nVar=nVar;             %迭代建模过程中子集变量个数F.RMSEP=RMSEP;           %迭代模型RMSEP

        3. 实例分析

        本文以公开数据集Corn进行测试分析,对应下载链接已在前期中给出,原始光谱为:

        基于RF算法,我们选择前60个变量,具体的分布如图所示,其中有部分点分布在起始点附近,而大部分分布在500左右,对于起始点附近的点,可能是我们子集变量个数设置过小,导致这些变量的选择概率较高。

        各变量在100次迭代循环过程中的选择概率分布如下图所示,对应上图,我们可以看到选择概率大于0的个数较少,而且分布相对集中,对于上图所选前60变量过多,可能需要多次交叉验证才能确定最佳的特征变量个数。

        基于所选变量所建模型的PLS预测结果如下所示,可知预测结果精度较高,能够实现目标指标的有效预测。

        对比发现,RF算法能够有效选择光谱特征变量,其基本分析过程跟iPLS相似,区别在于区间的可变性和变量的随机选择性,也正是这种过程产生了变量的竞争选择机制,进而确保了变量的有效性。

        至此,我们简要介绍了RF算法并应用实例数据进行了分析,下期会介绍区间随机蛙跳iRF算法,欢迎大家交流分析,有需要的可通过私信公众号加入光谱交流群。

### 高光谱特征提取与随机森林算法结合 #### Python 实现 对于高光谱图像处理中的特征提取,可以采用多种方法来减少维度并提高分类精度。这里介绍一种结合随机蛙跳(Random Frog, RF)算法进行特征选择,并利用随机森林(Random Forests)作为分类器的方法。 首先定义一个简单的框架来进行高光谱数据预处理: ```python import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score def preprocess_data(X, y): """对输入的数据X和标签y做初步清理""" # 假设已经完成标准化等操作... return X, y # 加载数据集 (此处省略具体加载过程) data = ... # shape=(样本数量, 波段数目) labels = ... # 对应的类别标签向量 # 数据划分训练集测试集 train_X, test_X, train_y, test_y = train_test_split(data, labels) # 特征子集初始化 V0 及其他参数设定 Q 和 N Q = int(np.sqrt(train_X.shape[1])) # 初始变量子集中变量个数 N = 50 # 迭代次数 selected_features_indices = [] # 存储最终选定特征索引列表 for iteration in range(N): # 开始迭代循环 current_subset = list(set(selected_features_indices).union( set(np.random.choice(range(train_X.shape[1]), size=Q)))) # 使用当前特征子集构建模型评估性能 rf_model = RandomForestClassifier() rf_model.fit(train_X[:, current_subset], train_y) predictions = rf_model.predict(test_X[:, current_subset]) acc = accuracy_score(test_y, predictions) if acc >= max([accuracy_score(test_y, RandomForestClassifier().fit( train_X[:, selected_features_indices], train_y).predict(test_X[:, selected_features_indices])) ] + [acc]): selected_features_indices = current_subset print(f'Selected feature indices: {selected_features_indices}') ``` 此部分实现了基于随机蛙跳的思想逐步挑选最佳特征组合的过程[^3]。接着通过`sklearn`库里的`RandomForestClassifier()`完成了分类任务。 #### MATLAB 实现 同样地,在MATLAB环境中也可以实现类似的流程。下面给出一段简化版代码片段用于说明如何调用内置工具箱函数执行相同的操作: ```matlab % Load your hyperspectral dataset here. load('hyperspectralData.mat'); % Assuming data is stored in 'hyperspectralData' % Preprocessing steps go here... % Define parameters for Random Frog algorithm Q = round(sqrt(size(hyperspectralData, 2))); % Number of features to select initially N = 50; % Iteration count bestFeaturesIdx = []; maxAcc = 0; for i = 1:N candidateSet = unique([bestFeaturesIdx randperm(numel(hyperspectralData), Q)]); mdl = TreeBagger(100, ... hyperspectralData(:, candidateSet)', ... label', ... 'OOBPrediction','On'); oobError = mdls.OOBError; [~, predLabels] = predict(mdl,hyperspectralData(:,candidateSet)'); currAcc = sum(predLabels==label)/length(label); if currAcc > maxAcc bestFeaturesIdx = candidateSet; maxAcc = currAcc; end end disp(['Selected Feature Indices:', num2str(bestFeaturesIdx')]); ``` 这段脚本展示了怎样运用Matlab自带的支持包(`TreeBagger`)创建随机森林模型,并且按照随机蛙跳策略更新所选特征集合。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值