竞争性自适应重加权算法(CARS) 是光谱分析(如 NIR、Raman)和高维化学计量学中非常经典的变量选择(Feature Selection)算法 。它的核心思想是模仿"适者生存"的自然选择机制,通过多次采样和指数衰减的保留策略,剔除无信息变量,筛选出与浓度最相关的特征波长。
一、CARS 算法核心思想
CARS 通过以下步骤进行变量筛选:
- 蒙特卡洛采样(MCS):随机选取部分样本构建子集。
- 指数衰减保留策略(EDR):每次迭代保留权重绝对值大的变量,淘汰小的。
- 自适应重加权(Adaptive Weighting):基于 PLS 回归系数赋予变量权重。
- 交叉验证(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 稳定性 |
| 适合光谱数据 | 小样本易波动 |