竞争性自适应重加权算法(CARS)

竞争性自适应重加权算法(CARS) 是光谱分析(如 NIR、Raman)和高维化学计量学中非常经典的变量选择(Feature Selection)算法 。它的核心思想是模仿"适者生存"的自然选择机制,通过多次采样和指数衰减的保留策略,剔除无信息变量,筛选出与浓度最相关的特征波长。


一、CARS 算法核心思想

CARS 通过以下步骤进行变量筛选:

  1. 蒙特卡洛采样(MCS):随机选取部分样本构建子集。
  2. 指数衰减保留策略(EDR):每次迭代保留权重绝对值大的变量,淘汰小的。
  3. 自适应重加权(Adaptive Weighting):基于 PLS 回归系数赋予变量权重。
  4. 交叉验证(CV):记录每次迭代的 RMSECV,选择最优变量子集。

二、CARS 算法流程图

复制代码
原始光谱数据 (X)
    ↓
蒙特卡洛采样 (MCS)
    ↓
PLS 回归 → 回归系数 → 权重
    ↓
指数衰减淘汰变量
    ↓
交叉验证评估
    ↓
最优变量子集

三、Matlab 实现(标准 CARS)

1、 主函数:CARS 变量选择

matlab 复制代码
function [SelectedVar, RMSECV, VarNum] = cars_pls(X, y, N, f, q)
% -------------------------------------------------
% X: 光谱矩阵 [n_samples × n_variables]
% y: 浓度向量 [n_samples × 1]
% N: 采样次数 (默认 50)
% f: 保留率衰减因子 (默认 0.9)
% q: 交叉验证折数 (默认 5)
% -------------------------------------------------

if nargin < 2, error('Input X and y!'); end
if nargin < 3, N = 50; end
if nargin < 4, f = 0.9; end
if nargin < 5, q = 5; end

[n, p] = size(X);
RMSECV = zeros(N,1);
VarNum = zeros(N,1);

% 初始权重
w = ones(p,1);

for i = 1:N
    % 1. 蒙特卡洛采样
    idx = randsample(n, round(0.8*n));
    Xs = X(idx,:);
    ys = y(idx);
    
    % 2. PLS 回归
    [~,~,~,~,coef] = plsregress(Xs, ys, 10);
    
    % 3. 权重更新
    w = abs(coef(end,:))';
    
    % 4. 指数衰减淘汰
    keepRate = f^(i/N);
    thresh = quantile(w, 1-keepRate);
    idxKeep = w >= thresh;
    
    % 5. 交叉验证
    Xc = X(:,idxKeep);
    [~,~,~,~,~,stats] = plsregress(Xc, y, 10);
    RMSECV(i) = stats.PRESS / n;
    
    VarNum(i) = sum(idxKeep);
end

% 选择最优变量
[~, bestIdx] = min(RMSECV);
SelectedVar = find(idxKeep);
end

2、 使用示例(NIR 光谱)

matlab 复制代码
%% 示例数据
load spectra.mat % X: 光谱, y: 浓度

% 运行 CARS
[selVar, rmsecv, varNum] = cars_pls(X, y, 50, 0.9, 5);

% 绘图
figure;
subplot(1,2,1)
plot(rmsecv)
xlabel('Iteration'); ylabel('RMSECV');

subplot(1,2,2)
plot(varNum)
xlabel('Iteration'); ylabel('Number of Variables');

fprintf('最优变量数: %d\n', length(selVar));

四、CARS + PLS 建模(推荐流程)

matlab 复制代码
% 使用 CARS 筛选后的变量建模
X_sel = X(:, selVar);

% PLS 建模
[XL, YL, XS, YS, BETA, PCTVAR] = plsregress(X_sel, y, 5);

% 预测
y_pred = [ones(size(X_sel,1),1) X_sel] * BETA;

% 评价
rmse = sqrt(mean((y - y_pred).^2));
fprintf('RMSE = %.4f\n', rmse);

五、CARS + SVM(非线性建模)

matlab 复制代码
% 数据标准化
X_sel = zscore(X(:, selVar));
y = zscore(y);

% SVM 回归
svm = fitrsvm(X_sel, y, ...
    'KernelFunction','rbf', ...
    'Standardize',false);

% 预测
y_pred = predict(svm, X_sel);

参考代码 竞争性自适应重加权算法 www.youwenfan.com/contentcsu/63421.html

六、CARS 的优缺点

优点 缺点
自动筛选变量 对参数敏感
抗过拟合 计算量较大
物理意义明确 依赖 PLS 稳定性
适合光谱数据 小样本易波动
相关推荐
foundbug9991 小时前
LSSVM(最小二乘支持向量机)状态分类与预测
算法
z200509301 小时前
今日算法:617,合并二叉树
算法·leetcode
ZHW_AI课题组2 小时前
基于逻辑回归的乳腺癌预测分类
算法·分类·逻辑回归
胡志辉2 小时前
贪心算法最坑的地方:每一步都看起来很对,最后还是错了
算法
代码北人生2 小时前
GitHub 日榜第一、月下载 110 万:supervision 出现之前,写计算机视觉代码是什么感觉
算法·claude
南宫萧幕2 小时前
HEV能量管理策略 Simulink 实战:从零搭建 Rule-based 与 A-ECMS 对比模型及排错指南
人工智能·算法·matlab·simulink·控制
WBluuue2 小时前
Codeforces 1095 Div2(ABCDE)
c++·算法
IT当时语_青山师__JAVA技术栈2 小时前
数组与链表深度解析:从内存布局到工业级实践
java·算法·面试
吃着火锅x唱着歌2 小时前
LeetCode 496.下一个更大元素I
算法·leetcode·职场和发展