竞争性自适应重加权算法(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 稳定性
适合光谱数据 小样本易波动
相关推荐
玖玥拾2 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode
重生之后端学习4 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
fpcc4 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划
星星.7227 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_97 小时前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
金幄科技7 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲7 小时前
Linux学习笔记:文件IO
linux·笔记·学习·算法
lhldsg8 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY8 小时前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh8 小时前
百日算法修炼 · Day 17
数据结构·算法