【光谱特征选择】竞争性自适应重加权算法CARS(含python代码)

目录

一、背景

二、代码实现

三、项目代码


一、背景

竞争性自适应重加权算法(Competitive Adaptive Reweighted Sampling,CARS)是一种用于选择高光谱数据中最具代表性波段的方法。CARS通过模拟“生物进化”过程,自适应地对光谱波段进行重加权和选择,逐步淘汰冗余和不重要的波段。具体而言,CARS利用回归系数的绝对值作为权重,通过迭代过程不断调整和优化波段选择,从而保留对模型预测最有贡献的波段。该算法具有较好的稳定性和鲁棒性,能够显著提高模型的预测性能,减少数据维度,降低计算复杂度,广泛应用于化学计量学、食品检测、环境监测等领域的光谱分析。

二、代码实现
import pandas as pd
import numpy as np

# 读取数据
data = pd.read_csv("./data/peach_spectra_brix.csv")


# 2. 数据处理
# m * n 
print("数据矩阵 data.shape:",data.shape)

# 50个样本, 600个 波段 第一列是 桃子糖度值 需要分离开
X = data.values[:,1:]
# 等同操作
# X = data.drop(['Brix'], axis=1)

y 
### 竞争性自适应加权算法概述 竞争性自适应加权算法(Competitive Adaptive Reweighted Sampling, CARS)是一种用于特征选择的技术,尤其适用于高维数据集中的波段选择问题。此方法结合了蒙特卡罗采样与偏最小二乘回归(PLS),旨在通过模拟自然界的“优胜劣汰”机制来挑选出最能代表整体信息的关键变量。 #### 原理 CARS的核心在于动态调整样本权重的过程,在每一轮迭代中依据当前模型参数的重要性评分重新分配各个观测值的概率分布。具体来说: - 初始阶段赋予所有训练实例相同的概率; - 随着循环次数增加,那些对目标函数影响更大的输入会被给予更高的选取几率; - 反之,贡献较小的数据点逐渐被淘汰出局; 这种策略有助于聚焦于真正有意义的信息源,同时排除噪声干扰项的影响[^3]。 #### 实现方式 以下是采用Python编程语言实现的一个简化版CARS流程示例: ```python import numpy as np from sklearn.cross_decomposition import PLSRegression from scipy.stats import norm def cars_algorithm(X, y, n_iter=100): """ :param X: 特征矩阵 (n_samples, n_features) :param y: 目标向量 (n_samples,) :param n_iter: 迭代轮数,默认为100次 :return: 被选中的最佳波长索引列表 """ # 初始化权重数组 weights = np.ones(len(y)) / len(y) best_rmse = float('inf') selected_bands_indices = [] for i in range(n_iter): # 使用当前权重进行有放回随机抽样得到新样本集合 indices = np.random.choice(range(len(y)), size=len(y), p=weights, replace=True) sampled_X = X[indices] sampled_y = y[indices] # 构建并评估PLS模型 pls_model = PLSRegression() pls_model.fit(sampled_X, sampled_y) predictions = pls_model.predict(X).ravel() rmsecv = ((predictions - y)**2).mean() ** .5 if rmsecv < best_rmse: best_rmse = rmsecv abs_coefficients = np.abs(pls_model.coef_.flatten()) # 更新权重:增大重要特征对应的样本被抽取的可能性 updated_weights = norm.pdf(abs_coefficients, loc=np.mean(abs_coefficients), scale=np.std(abs_coefficients)) weights = updated_weights / sum(updated_weights) # 记录下此时表现最好的一组波长位置 top_k = int(.8 * len(abs_coefficients)) # 保留前80%最重要的波长 sorted_idx = np.argsort(-abs_coefficients)[:top_k] selected_bands_indices.append(sorted_idx.tolist()) return max(selected_bands_indices, key=lambda idx_list:len(set(idx_list))) ``` 上述代码片段展示了如何利用`scikit-learn`库内的工具完成一次完整的CARS操作。注意这里仅提供了一个基本框架,实际应用时可能还需要考虑更多细节上的优化措施[^4]。 #### 应用场景 由于具备良好的降噪能力和高效筛选有效信号的能力,CARS已被证明特别适合处理如下几类任务: - **光谱数据分析**:如近红外(NIR)、拉曼(Raman)等类型的光谱测量结果往往有大量冗余通道,借助CARS可以快速定位哪些特定频率范围携带最多关于物质成分变化的有效线索。 - **化学计量学领域**:无论是药物研发还是质量控制环节都离不开精准可靠的定量关系建立工作,而CARS正好满足此类需求下的预处理要求[^1]。 - **环境科学方面**:当面对复杂的生态系统监测项目时,比如水质污染程度跟踪研究,则可以通过CARS找出反映污染物浓度波动趋势的最佳指示因子组合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清纯世纪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值