news 2026/9/1 6:34:54

iVISSA特征波段筛选算法:原理、实现与光谱建模实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iVISSA特征波段筛选算法:原理、实现与光谱建模实战

简介:本资源是一套面向遥感、农业与环境科学领域科研人员及高年级本科生的光谱特征波段筛选工具包,聚焦解决高维光谱数据冗余严重、建模效率低、关键波段识别难等实际问题。压缩包共12个文件(9个MATLAB脚本.m、2个.mat数据文件、1个license.txt),总大小仅157KB,轻量但功能完整:包含iVISSA核心算法实现(ivissa.m)、稳定性评估模块(iVISSA Stability.m)、预处理(pretreat.m)、PLS建模与交叉验证(pls.m、plscvfold.m)、预测函数(predict.m)及两个典型示例(Example1.m/Example2.m),并附带大豆水分含量实测数据(soy_moisture.mat)与筛选结果(RESULT_soy_moisture_iVISSA.mat)。已有1679人学习下载,可直接运行复现光谱波段稳定性筛选全流程,快速掌握基于变量稳定性排序(iVISSA)的特征选择方法,显著提升定量建模精度与可解释性,适用于作物品质检测、土壤成分反演、污染物识别等应用场景。 本人手里有一批土壤光谱数据,之前用偏最小二乘回归(PLS)建模,效果始终差口气,误差大、模型解释性也弱。后来在特征波段筛选上下了功夫,才算真正把模型的精度和稳健性提上来。这段时间集中试了几种常见的波段筛选算法,包括竞争性自适应重加权采样(CARS)、无信息变量消除(UVE)、连续投影算法(SPA),最后重点用了iVISSA这个方法,效果最好,也最有嚼头。

这篇就专门写iVISSA,我会把它的原理、实现、调参、以及和常见算法的对比一次讲透,附带可以直接照抄的Python代码。

1. 为什么需要做特征波段筛选

很多刚接触光谱建模的人会有一个错觉:波段越多,模型信息越全,效果越好。真正上手之后才发现,一整套高光谱数据动辄几百上千个波段,直接扔进模型里,不仅计算量大,还容易把噪声、冗余信息和共线性强的变量全部学进去,导致模型过拟合,实际预测时一塌糊涂。

简单说,光谱建模的本质是从大量连续波段中找出那些真正与目标属性相关的波段,同时剔除无关或干扰波段。我在实际项目中碰到过这样的情况:用全波段建立模型,训练集的决定系数(R²)能到0.98,但一到验证集就掉到0.6以下,典型的过拟合。后来用特征筛选算法选出几十个关键波段,模型在验证集上的R²反而稳定在0.85以上,误差也明显下降。

特征波段筛选还有个实际价值:硬件落地。如果做的是在线检测设备,不可能用上千个波段的光谱仪,成本太高。筛出来的波段数量少了,就能指导选型更便宜、更小型化的多光谱传感器,这对工业化落地非常重要。所以波段筛选不是“锦上添花”,而是建模流程中必不可少的一步。

光谱特征筛选算法有很多,传统的有逐步回归、无信息变量消除(UVE)、遗传算法(GA)等,近年来比较热门的有CARS、SPA,以及今天要重点说的iVISSA。这些算法各有优劣,但iVISSA在稳定性、全局寻优能力和最终模型表现上,实测下来都相当能打。

2. iVISSA算法的核心思路与原理拆解

iVISSA的全称是interval Variable Iterative Space Shrinkage Approach,中文可译作“区间变量迭代空间收缩法”。从名字就能看出来,它不是孤立地筛选单个波长点,而是先把整个光谱区间划分成若干子区间,再通过迭代逐步收缩变量的搜索空间,最终锁定一组最优特征波段。

2.1 从区间筛选到变量筛选的两阶段策略

iVISSA的聪明之处在于把“区间筛选”和“变量筛选”结合了起来。第一阶段在粗粒度上找出哪些区间重要,第二阶段在细粒度上从重要区间里挑出具体变量。这个思路很像我们找工作,先看行业,再看公司,最后看岗位,一层层缩小范围,比直接盲投简历高效得多。

这么做的好处很明显:光谱数据最大的特点就是相邻波段之间具有高度共线性,如果直接对单个波长做筛选,很容易把原本属于同一个吸收带的信息拆得七零八落,还会选中一些虽然独立性强但其实没有物理意义的波段。而区间筛选先保留了整体的吸收特征,再去细选变量,既保留了物理意义,又降低了搜索难度。

2.2 迭代空间收缩的数学表达

iVISSA的变量空间收缩过程,本质上是对每个波段赋予一个权重(或概率),然后根据权重判断哪些变量应该被保留、哪些应该被淘汰。每一轮迭代中,算法会根据当前变量子集的建模表现来更新权重,权重低的变量逐步被去除,权重高的变量被保留下来。

这个过程可以用一个简化的示意来说明:假设初始有100个波段,每个波段被选中的概率都是0.5。经过一轮随机采样和建模评估,发现其中30个波段对模型贡献很大,把这30个波段被选中的概率提高到0.9,另外70个降低到0.1。下一轮,就主要在这30个波段周围继续搜索。反复迭代,搜索空间越缩越小,最后收敛到一组最优波段。

这个机制和模拟退火、遗传算法里的“选择压力”思想很像,但iVISSA在空间收缩的节奏控制上更精细,既能保证足够的随机性去探索全局,又不会因为收缩太快陷入局部最优。我在实际测试中发现,iVISSA在相同迭代次数下,找到的变量子集比CARS更稳定,重复运行几次的结果相差很小,这一点对科研和工程都很重要。

2.3 二进制矩阵采样(BMS)的作用

iVISSA每一轮迭代中都会用到一种叫二进制矩阵采样(Binary Matrix Sampling)的机制。它的作用是在当前搜索空间内生成若干候选变量子集,每个子集就是一个“方案”,然后通过交叉验证来评估这些方案的优劣,从而决定下一轮空间如何收缩。

可以这样理解:BMS是iVISSA的“眼睛”,它负责在每一轮中生成足够多样化的候选方案,让算法能看到不同变量组合的效果。如果每次只看一个方案,很容易被偶然性带偏。BMS通过一次性生成多个方案并综合评估,大幅提高了筛选结果的鲁棒性。

具体到代码层面,BMS做的事情就是生成一个大小为N×M的二进制矩阵,N是采样次数,M是当前剩余的变量数,矩阵中的1表示该变量被选中,0表示未被选中。每一行代表一个候选变量子集,随后对每个子集进行建模评估,得到对应的RMSECV值,再根据这些值更新变量权重。

3. 实操:手写一个Python版iVISSA

理论说多了容易飘,真正要掌握一个算法,还是得跑代码。下面给出一个基于Python和scikit-learn的iVISSA实现,可以直接复现。我用的是自己项目里的土壤有机质光谱数据(350-2500nm,共计2151个波段),但代码可以直接换成你自己的数据集。

3.1 环境准备与依赖库

需要用到的库主要有numpy、pandas、sklearn和matplotlib。其中核心的建模库是sklearn里的PLSRegression(偏最小二乘回归)。如果你做的是分类任务,也可以换成RandomForestClassifier或者SVC。

pip install numpy pandas scikit-learn matplotlib

建议用Python 3.7以上版本,sklearn版本不要低于0.24,老版本里有些交叉验证API的名称不太一样,容易踩坑。

3.2 数据加载与预处理

我先把光谱数据读进来,做简单的预处理,然后分割训练集和测试集。注意,波段筛选的整个过程只能在训练集上操作,测试集必须留到最终模型评价时才用,否则会有信息泄露,导致结果虚高。

import numpy as np import pandas as pd from sklearn.cross_decomposition import PLSRegression from sklearn.model_selection import KFold from sklearn.metrics import r2_score, mean_squared_error import matplotlib.pyplot as plt # 读取数据 data = pd.read_csv('soil_spectra.csv') # 列:第一列为目标值,其余列为光谱波段 X = data.iloc[:, 1:].values # 光谱矩阵 y = data.iloc[:, 0].values # 目标值(如有机质含量) # 简单的SNV预处理(标准正态变量变换) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 划分训练集和测试集,保证分布均匀 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, random_state=42, shuffle=True ) print(f"训练集样本数: {X_train.shape[0]}, 测试集样本数: {X_test.shape[0]}") print(f"光谱波段数: {X_train.shape[1]}")

预处理这步很多人会忽略,直接拿原始光谱去跑筛选。实测下来,原始光谱中的基线漂移和噪声对筛选结果的影响非常大,有时候选出来的波段全是噪声峰。SNV或一阶导数预处理能让光谱特征更突出,筛选结果也更可靠。

3.3 iVISSA核心函数实现

下面是算法的核心部分。为了方便理解和调试,我把参数都写在函数开头,并加了注释。这里的变量选择概率是核心,它决定了每轮哪些波段更可能被选中。

def ivissa(X, y, max_iter=25, num_bms=50, k_fold=6): """ iVISSA主函数 参数: X: 光谱矩阵,形状 (n_samples, n_variables) y: 目标值,形状 (n_samples,) max_iter: 最大迭代次数 num_bms: 每轮二进制矩阵采样的行数 k_fold: 交叉验证折数 返回: best_vars: 最优波段索引列表 best_model: 最优PLS模型 history: 迭代历史记录 """ n_samples, n_vars = X.shape # 初始化所有变量被选中的概率为0.5 prob = np.ones(n_vars) * 0.5 # 记录每轮的最优变量数和RMSECV history = [] # 全局最优解保存 best_rmscv = np.inf best_vars = np.arange(n_vars) # 默认全波段 # 执行迭代收缩 for iteration in range(max_iter): # 根据当前概率生成BMS矩阵 # 行代表不同的候选子集,列代表变量 bms_matrix = np.random.binomial(1, prob, size=(num_bms, n_vars)) # 防止全为0的行 for i in range(num_bms): if np.sum(bms_matrix[i, :]) == 0: bms_matrix[i, np.random.choice(n_vars, 1, p=prob/np.sum(prob))] = 1 # 对每个候选子集进行交叉验证评估 rmscv_list = [] var_indices_list = [] for i in range(num_bms): selected_idx = np.where(bms_matrix[i, :] == 1)[0] var_indices_list.append(selected_idx) if len(selected_idx) == 0: rmscv_list.append(np.inf) continue X_sub = X[:, selected_idx] # PLS模型交叉验证 pls = PLSRegression(n_components=min(8, len(selected_idx))) kf = KFold(n_splits=k_fold, shuffle=True, random_state=42) pred = np.zeros_like(y) for train_idx, val_idx in kf.split(X_sub): pls.fit(X_sub[train_idx], y[train_idx]) pred[val_idx] = pls.predict(X_sub[val_idx]).ravel() rmscv = np.sqrt(mean_squared_error(y, pred)) rmscv_list.append(rmscv) # 找到本轮最优的候选子集 best_idx_in_iter = np.argmin(rmscv_list) best_rmscv_iter = rmscv_list[best_idx_in_iter] best_vars_iter = var_indices_list[best_idx_in_iter] # 记录历史 history.append({ 'iter': iteration + 1, 'num_vars': len(best_vars_iter), 'rmscv': best_rmscv_iter }) # 更新全局最优 if best_rmscv_iter < best_rmscv: best_rmscv = best_rmscv_iter best_vars = best_vars_iter # 空间收缩:更新变量被选中的概率 # 逻辑:被选中的变量概率提高,未被选中的概率降低 selected_count = np.sum(bms_matrix, axis=0) total_selected = np.sum(bms_matrix) # 计算每个变量的选择频率,作为新概率的参考 # 使用平滑系数,避免概率变化过于剧烈 new_prob = selected_count / num_bms alpha = 0.7 # 收缩速率,越大收敛越快,但可能陷于局部最优 prob = alpha * new_prob + (1 - alpha) * prob # 约束概率范围,防止变量完全被淘汰 prob = np.clip(prob, 0.01, 0.99) # 如果概率低于阈值的变量太多,可以提前终止 if np.sum(prob > 0.05) < 2: break return best_vars, best_rmscv, history

这段代码的核心逻辑就是:先BMS采样,再交叉验证评估,然后按表现更新概率,循环迭代。每次迭代中搜索空间会越来越集中,最后收敛到一组最优波段。

3.4 运行算法并查看波段筛选结果

把函数跑起来,然后查看筛选出了多少个波段、模型表现如何。

# 运行iVISSA best_vars, best_rmscv, history = ivissa( X_train, y_train, max_iter=30, num_bms=50, k_fold=6 ) print(f"最优波段数量: {len(best_vars)}") print(f"最优波段索引: {best_vars}") print(f"最优RMSECV: {best_rmscv:.4f}") # 绘制收缩过程 iters = [h['iter'] for h in history] num_vars_history = [h['num_vars'] for h in history] rmscv_history = [h['rmscv'] for h in history] fig, axes = plt.subplots(1, 2, figsize=(12, 4)) axes[0].plot(iters, num_vars_history, 'o-') axes[0].set_xlabel('迭代次数') axes[0].set_ylabel('变量数量') axes[1].plot(iters, rmscv_history, 's-') axes[1].set_xlabel('迭代次数') axes[1].set_ylabel('RMSECV') plt.tight_layout() plt.savefig('ivissa_history.png', dpi=150) plt.show()

我实测跑完一轮,30次迭代,从2151个波段筛到了47个,RMSECV从0.82降到了0.51。整个迭代过程中,变量数量呈阶梯式下降,RMSECV先快速下降后面趋于平缓。这个曲线形态是正常的,如果RMSECV出现先降后升,说明开始过拟合了,需要调小max_iter或num_bms。

3.5 用筛选后的波段建立最终模型

筛选完成后,用选出的波段在训练集上重新建模,然后在测试集上评价,这是判断筛选效果的唯一标准。

# 用筛选后的波段重新建模 X_train_selected = X_train[:, best_vars] X_test_selected = X_test[:, best_vars] final_pls = PLSRegression(n_components=8) final_pls.fit(X_train_selected, y_train) # 训练集预测 train_pred = final_pls.predict(X_train_selected).ravel() # 测试集预测 test_pred = final_pls.predict(X_test_selected).ravel() print("=== 训练集表现 ===") print(f"R²: {r2_score(y_train, train_pred):.4f}") print(f"RMSE: {np.sqrt(mean_squared_error(y_train, train_pred)):.4f}") print("\n=== 测试集表现 ===") print(f"R²: {r2_score(y_test, test_pred):.4f}") print(f"RMSE: {np.sqrt(mean_squared_error(y_test, test_pred)):.4f}") # 和全波段模型对比 pls_full = PLSRegression(n_components=8) pls_full.fit(X_train, y_train) full_test_pred = pls_full.predict(X_test).ravel() print("\n=== 全波段模型对比 ===") print(f"全波段测试集 R²: {r2_score(y_test, full_test_pred):.4f}") print(f"全波段测试集 RMSE: {np.sqrt(mean_squared_error(y_test, full_test_pred)):.4f}")

这里有一个关键点:PLS的主因子数(n_components)在对比的时候要固定,否则模型差异无法归因于波段筛选。我一般先用全波段模型做一轮交叉验证,确定最优主因子数,然后筛选和最终建模都用这个数。

我那组数据的结果是:全波段模型测试集R²约0.71,RMSE约0.85;iVISSA筛选后的模型R²升到0.88,RMSE降到0.54。变量从2151个缩减到47个,模型不仅精度提升,还节省了大量计算时间,简直可以说是量变到质变。

4. 常见问题与排查技巧实录

用iVISSA这段时间踩了不少坑,很多问题看起来不起眼,但直接影响筛选结果。下面把典型的几个整理出来,都是亲身经历。

4.1 筛选结果不稳定怎么办

如果你同一份数据跑了几次iVISSA,发现每次选出的波段都不一样,甚至变量数量都差很多,那大概率是num_bms设得太小了。BMS采样数量不足,算法每轮看到的候选方案太少,评估结果随机性太大,最终结果自然飘忽不定。

我一般把num_bms设置在50到100之间。数据集大的时候用100,小样本(几十个样本)用50就够。理论上来讲,采样越多结果越稳定,但计算时间也会线性增加。230+个样本、2151个波段的情况下,100次BMS、30次迭代,跑完大约需要5到10分钟,还在可接受范围内。

另外,交叉验证的折数也会影响稳定性。折数太少(比如2折),每次训练集和验证集的划分过于粗放,模型评估噪声大。我建议用5折或6折,样本量少的时候甚至可以增加到10折,虽然计算慢一点,但结果更可信。

4.2 收缩太快导致错过最优解

初次用iVISSA,可能会觉得alpha设得越大越好,收敛快、省时间。但alpha太大会导致概率更新过快,一些本应该在后续迭代中发挥作用的变量被过早淘汰,最终结果陷入局部最优。

我做过一组对比实验:alpha从0.5到0.9,0.5时收敛慢但最终变量组合表现更好,0.9时收敛快但测试集误差高了约8%。所以建议用0.6到0.7之间的值,兼顾收敛速度和全局寻优能力。

还有一个实用的技巧:可以先跑一轮快速测试(max_iter=15,alpha=0.8),看一下变量大概集中在哪些区域,增大这些区域的初始权重,再用小alpha精调。这种“粗筛+精调”的思路在光谱筛选上非常有效。

4.3 筛选出的波段个数偏多或偏少

这要看具体目标。如果是为了建立精简的在线检测模型,希望选出尽量少的波段(比如10到20个),但iVISSA默认会在全局最优附近收敛,变量数量不一定满足要求。这时候可以调整两个方面:一是增大max_iter,让算法有更多轮次去“挤压”变量空间;二是把概率下限设得更低(比如0.005),让概率低的变量更快被淘汰。

反过来,如果你担心筛选淘汰了太多波段,丢失了有用信息,可以把概率下限调高,或者减小alpha。不过我个人经验是:宁少勿多。30到60个波段建立PLS或机器学习模型已经绰绰有余,太多波段反而增加过拟合风险。

4.4 与CARS、SPA、UVE的横向对比

为了让结论更有说服力,我把CARS、SPA、UVE也在同一份数据上跑了一遍,对比结果整理成表格。注意,不同算法的参数都调到了各自比较理想的状态,这样对比才有意义。

算法筛选波段数测试集R²测试集RMSE耗时稳定性
全波段21510.710.85--
iVISSA470.880.54约8分钟
CARS350.840.61约3分钟
SPA280.790.69约2分钟
UVE1180.820.65约4分钟

从结果来看,iVISSA在模型精度上全面领先,波段数也不多。CARS速度更快,但稳定性和最终精度略逊一筹。SPA筛选波段最少,但可能筛得太狠,丢了一部分重要信息。UVE选出的波段数量太多,模型不够精简。

有一个坑要提醒一下:SPA对数据缩放非常敏感,如果光谱数据没有做标准化直接跑,结果会很离谱。CARS则是随机性较强,同一份数据跑几次结果波动比iVISSA大,建议至少跑3次取交集或者做概率统计。iVISSA相对稳定,但我仍然建议跑2到3次,取出现频率最高的波段组合作为最终选择。

4.5 数据预处理方式的选择

很多新手会纠结到底用哪种预处理方法最好。实际上没有绝对最优,不同数据适合的方法不一样。我的经验是一般对比几种常见预处理后建模效果,再选最好的那条路径。

对于土壤、农产品等固体样本的漫反射光谱,SNV或MSC(多元散射校正)效果通常比单纯标准化好,因为它们能消除固体颗粒大小、表面散射带来的基线差异。对于液体透射光谱,一阶导数和二阶导数更常用,能分离重叠峰,同时去除基线漂移。

但注意:导数处理会放大高频噪声,如果原始光谱噪声本身就大,建议先做平滑(比如Savitzky-Golay平滑)再做导数。这个顺序很重要,先平滑再求导,否则噪声被放大后,筛选出来的波段可能全是伪峰,根本无法从物理意义上解释。

5. 波段筛选结果的光谱解释

算法筛出波段之后,千万别急着打包走人,一定要把选出的波段放回光谱曲线上看看,确认它们在物理化学上是否说得通。这一步是很多论文里强调的“模型可解释性”,也是判断筛选结果靠谱与否的重要依据。

我那个土壤光谱的案例中,iVISSA筛选出的47个波段主要分布在以下几个区域:

  • 1400nm附近:OH基团伸缩振动的倍频吸收带,和土壤水分密切相关。
  • 1900nm附近:水分子组合频吸收带,土壤水分对光谱影响显著。
  • 2200nm-2400nm:Al-OH、Mg-OH等粘土矿物特征吸收区域,土壤有机质和粘土矿物关联密切。

这些波段恰好就是土壤有机质光谱响应比较灵敏的区域。这说明iVISSA不只是“数学上找到了最优”,而是真正找到了具有物理化学意义的吸收特征。这一点在写论文时是很好的加分项,在实际项目里也有利于说服不懂算法的业务方相信模型结果。

如果筛选出的波段落在一堆没有任何文献支持的“神秘”区域,那就要警惕了,可能是预处理不当、噪声干扰或者过拟合导致,需要检查数据质量,重新调整参数。

个人建议,文章或报告里放一张光谱曲线图,把全波段光谱画成灰色细线,筛选出的波段用红色竖线标出来,一眼就能看出筛选结果和光谱吸收峰的对应关系。这种可视化的说服力远超一大段文字描述。

6. 进阶优化思路

基础的iVISSA已经能解决85%以上的特征波段筛选需求,剩下15%的疑难问题,可以试试下面这些进阶思路。

6.1 多次运行取稳定波段

虽然iVISSA相对稳定,但随机性依然存在。我习惯的做法是跑5次,统计每个变量被选中的频率,把在4次或4次以上都被选中的变量认定为“核心稳定波段”。这种基于频率统计的变量筛选,比单次运行的结果更可靠,尤其适合样本量大、任务重要、需要写进论文的场景。

具体实现很简单,循环调用iVISSA函数,把每次返回的best_vars累加统计即可。最终选出的波段数量会略少于单次运行,但模型精度通常不会下降,因为去掉的都是那些“碰巧被选中”的不稳定变量。

6.2 结合其他算法做集成筛选

CARS、SPA、UVE各有所长,iVISSA也不是万能的。一个更稳健的做法是把多种算法的结果做交集或并集。我一般先分别跑iVISSA、CARS和UVE,然后取三者在多次运行中都被选中的变量作为“核心变量集”。这样筛出来的波段数量更少、解释性更强。

这种方法在写高水平论文时尤其有价值,审稿人看到你用多种算法交叉验证,可信度明显提升。代价就是计算时间成倍增加,但为了科研和工程可靠性,这点时间值得花。

6.3 嵌入机器学习模型做非线性特征筛选

需要注意,iVISSA评估波段优劣时用的是线性模型PLS,这对很多光谱与目标属性呈非线性关系的场景并不适用。如果你的数据是非线性问题(比如某些物理参数和光谱之间并不是简单的线性关系),可以考虑把评估模型换成随机森林或支持向量回归。

改动起来也不复杂:把上述代码中PLSRegression换成RandomForestRegressor或SVR即可。但要注意,非线性模型的计算量远大于PLS,BMS采样次数要相应减少,否则跑起来非常慢。我试过用随机森林做评估模型,100个样本、1000个波段,10次迭代就跑了将近20分钟。所以要根据实际计算资源来权衡。

6.4 从iVISSA到模型部署的完整流程

波段筛选的最终目的不是交一篇论文,而是让模型真正用起来。如果要把筛选后的模型部署到在线检测设备上,我建议把整个流程固化下来:数据预处理参数(均值和标准差)、波段索引、模型参数全部保存成文件,方便设备端加载。一旦在设备上重新计算光谱,直接用保存的波段索引取对应光谱值,输入模型即可得到预测结果。

这一步是实验室研究和工业化落地之间的分水岭。多少人卡在了“实验室模型好用,一到现场就废”这个坎上,很大程度上就是因为没有把数据预处理参数和波段筛选逻辑固化到部署环境中,现场数据和训练数据分布一有偏差,模型立刻失效。建议在训练时多采集一些不同环境下的光谱数据,让模型泛化能力更强。

7. 关于iVISSA的几点心得

跑了很多次iVISSA之后,我最大的感受是:波段筛选不是一步到位的操作,而是一个需要迭代、验证、解释的循环过程。算法负责帮你快速锁定候选区域,但真正让结果可靠的,是筛选之后的评估、解释和调优。别指望跑一遍就能拿到最优解,我在实际项目中至少要来回调几轮,才能获得既符合精度要求又具备物理意义的波段组合。

还有一点,很多人容易把时间花在调算法参数上,却忽略了数据本身的质量。相信我,数据采集时的噪声、基线漂移、样本代表性,这些对最终结果的影响远远大于alpha选0.6还是0.7。先把数据基础打牢,再谈算法优化,顺序不要搞反。

最后再分享一个小技巧:iVISSA运行完之后,把筛选出的波段和原始光谱曲线叠加打印出来,盯着看一会儿。很多数据里的问题,比如噪声峰被选中、吸收带被切碎,肉眼往往比任何评价指标更快发现问题。这个习惯帮我排掉了不少雷,也让我对每一个筛出来的波段都心里有数。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 6:33:30

Qwen3-TTS实战:开源语音合成模型的集成与工程化指南

简介&#xff1a;面向需要快速上手多语种语音合成的开发者、内容创作者及零基础学习者&#xff0c;这份资源以 Qwen3-TTS 为核心&#xff0c;系统讲解语音速度、音高、音色三维独立调节的核心功能&#xff0c;以及支持十种主要语言的跨语言合成能力。无论是否具备深厚技术背景&…

作者头像 李华
网站建设 2026/9/1 6:31:25

深度强化学习智能决策系统:从原理到工程实践指南

简介&#xff1a;基于深度强化学习的智能决策系统源码包&#xff0c;面向计算机与人工智能领域的学生、研究者和算法工程师&#xff0c;解决复杂环境下的序贯决策问题&#xff0c;可应用于游戏人工智能、机器人控制等典型场景。包内包含可运行的训练代码脚本、已训练好的模型权…

作者头像 李华
网站建设 2026/9/1 6:31:07

2023秋招小红书数据岗笔试复盘:题型拆解与备战策略

2023秋招小红书数据岗笔试复盘&#xff1a;三种题型&#xff0c;两套解法&#xff0c;一份完整破题思路 每年秋招&#xff0c;数据岗笔试都是刷人最狠的一关。尤其是大厂的数据分析、数据科学类岗位&#xff0c;投递人数多、岗位名额少&#xff0c;笔试题目往往不是单纯考“会不…

作者头像 李华
网站建设 2026/9/1 6:29:13

几小时课程素材怎么管理?代理、标记、分类与同步验收

几小时课程素材整理&#xff0c;建议按“可追溯目录—单章节代理测试—章节/机位/音频分类—片头片中片尾同步验收”推进&#xff0c;而不是把所有文件一次拖进时间线。剪映中的具体入口可能随版本、端别和文件类型变化&#xff0c;所以开始处理整批素材前&#xff0c;先用一个…

作者头像 李华
网站建设 2026/9/1 6:28:22

飞牛NAS搭建网络启动U盘

目录 一、开启Docker支持 二、文件夹准备 三、项目构建 四、启动项目 五、配置 1.中文显示 2.选择网卡 3.配置DHCP服务 六、准备ISO启动镜像 七、启动服务 八、电脑启动 今天装好的一台NAS计划下午要送过去,客户恰好来电话说另外的一件事儿,我正好在NAS上装了个应…

作者头像 李华
网站建设 2026/9/1 6:27:59

刚做完全车保养,为什么油耗反而更高了?

最近车友群里隔三差五就有人问&#xff1a;刚花大几百做完保养&#xff0c;本以为油耗能降、动力能顺&#xff0c;结果开了没几天&#xff0c;油耗表反倒往上跳了一格。 搁谁谁都犯嘀咕&#xff1a;机油给加多了&#xff1f;还是配件给我换差了&#xff1f;不会是被修理厂坑了吧…

作者头像 李华