news 2026/10/1 15:53:43

iVISSA光谱特征波段筛选:从概率收缩到区间优化,彻底告别盲目全谱建模

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iVISSA光谱特征波段筛选:从概率收缩到区间优化,彻底告别盲目全谱建模

简介:iVISSA是一套面向光谱特征波段筛选的算法实现与示例资源,适合遥感、环境科学、农业等领域的科研人员和从业者使用。光谱数据往往包含大量冗余波段,该资源聚焦于从高维光谱中挑选信息价值最高的特征波段,以提升定量预测模型的精度与效率。压缩包共12个文件,以9个.m脚本为主,涵盖主程序、预处理、交叉验证、预测等核心函数,同时附有2个.mat示例数据(如大豆水分光谱数据)和1份license.txt许可说明。其中ivissa.m为核心筛选算法,plsnipals.m、plscvfold.m提供偏最小二乘回归与交叉验证支撑,pretreat.m实现去噪、平滑等预处理,便于直接运行Example1.m和Example2.m快速复现完整流程。资源包大小仅157KB,结构紧凑。已有1682人学习下载,适合具备一定光谱数据处理基础的读者,通过源码理解波段选择的每个环节,并迁移到自身的建模任务中,减少数据冗余、提升预测准确性。

1. iVISSA 是什么:光谱特征波段筛选从“肉眼挑峰”进入迭代收缩

在近红外和拉曼光谱的实际项目里,一条成品样本谱通常包含几百甚至上千个波长点。很多人第一步就是把这些点全部塞进 PLS 回归,训练集 R² 很好看,换到新批次样品却一路跑偏。这个问题的常见根源不是仪器漂移,而是光谱特征波段筛选没有做:模型里混进了太多与目标性质无关的波长,回归系数被噪声稀释,换样品后自然站不住。iVISSA 正是专门解决光谱特征波段筛选这一类问题的算法,它用重复采样和概率收缩,从全谱中逐步筛出真正有效的小段波段,兼顾预测精度与物理解释。适合被模型迁移性折磨的应用工程师、想系统做变量选择的研究者,以及要把筛选流程集成进建模套件的开发人员。

2. 做一个能落地的 iVISSA:概率收缩逻辑、目标函数与选型理由

2.1 VISSA 的概率收缩循环:从 0.5 到 0.05/0.95 的变量投票

要理解 iVISSA,先看它的母体 VISSA 是怎么工作的。把光谱矩阵 X 看成 n 个样本、p 个波长的二维数组,每个波长就是一个候选变量。VISSA 的核心思想不是穷举所有变量组合,而是维护一个长度为 p 的概率向量,初始时每个波长的入选概率都是 0.5,意思是它们有均等机会进入下一轮随机子模型。每一代迭代可以拆成四步:按当前概率向量做伯努利采样,生成 K 个变量子集;对每个子集建立 PLS 模型并做交叉验证,得到 RMSECV;把所有子模型按 RMSECV 排序,取前 10% 作为优秀子模型;统计这些优秀子模型里每个波长被选中的频率,频率高的波长概率上调,频率低的概率下调。下一轮迭代就基于更新后的概率向量继续采样。

这个循环的精妙之处在于,它把“哪个变量子集预测误差低”这个问题转化成了“哪些变量在低误差子模型里高频出现”。因为每一轮只有部分波长参与建模,相当于在反复做带权重的组合实验。一个波长如果总是出现在优秀子模型里,说明它对预测目标的贡献是稳定且独立的;反之,一个波长虽然单看可能与 y 相关,但一旦和其他变量组合,预测误差就上升,它的概率就会逐步被压低。经过几十轮迭代,真正重要的变量概率向 0.95 靠拢,无关变量向 0.05 靠拢,最终用阈值切一刀,就得到了特征波段集。

2.2 interval 还是 improved:iVISSA 在光谱落地的两种主流形态

iVISSA 在不同论文和仓库里可能指两种改进方向。一种是 improved VISSA,改进点放在概率更新策略、目标函数或初始采样分布上,比如用贝叶斯信息准则替换纯 RMSECV,或者引入加权自举采样来加速收敛。另一种是 interval VISSA,把搜索单位从单个变量提升到连续区间。我在光谱项目里几乎都优先按 interval VISSA 来理解,理由很朴素:光谱是连续信号,一个特征谱区本来就对应某种化学键振动或分子结构,如果算法筛出来的结果是 15 个互不相邻的孤立波长点,化学上很难交代,换一台同型号仪器也未必复现。

interval 版本的标准做法是两级搜索。先把连续波长按固定长度切成窗口,比如每 20 个波长为一段,在窗口层面做一次 VISSA,筛出重要的谱区段;然后只把这些重要区段内的波长展开,在变量尺度上再做一次 VISSA,得到最终的精筛波段。这样既保留了 VISSA 用模型误差驱动筛选的优点,又强制加入了光谱连续性约束,结果更接近工程师能理解和向领导汇报的形式。后面第 3 章的代码就是按这个两级结构写的。

2.3 为什么要选 iVISSA:和 SPA、CARS、UVE 的对比

光谱特征筛选的算法不少,各自适用场景差别很大。SPA(连续投影算法)通过寻找共线性最小的投影方向来选变量,速度快、确定性高,但输出是离散点,物理意义弱,适合作为粗筛工具而不是最终方案。CARS(竞争自适应重加权采样)用回归系数绝对值做蒙特卡洛淘汰,在化学计量学里非常流行,但它依赖的阈值参数多,对光谱噪声敏感,结果稳定性常被吐槽。UVE(无信息变量消除)把人工噪声变量混入矩阵做对比,擅长快速剔除完全无用的波长,却不擅长从剩余变量中挑出最优子集。

iVISSA 的优势在于目标函数直接就是交叉验证后的 RMSECV,每一步都在为最终预测误差服务,而概率收缩机制又能跳出局部最优,不会像贪婪式搜索那样一条路走到黑。下面是常用方法的选择参考。

方法搜索单位主要机制结果形态常见短板
SPA单个变量投影寻优离散波长点忽略相位邻域信息
CARS单个变量蒙特卡洛淘汰稀疏变量集参数多,阈值敏感
UVE单个变量噪声对比无信息变量剔除不能直接给最优子集
VISSA单个变量概率收缩采样稀疏变量集单点搜索,连续性弱
iVISSA窗口+变量两级概率收缩连续谱区计算量较大

2.4 目标函数与 EDF:把“筛得好”从感觉变成可计算

VISSA 这类算法最大的隐患是过拟合。变量选得越多,模型自由度越大,交叉验证误差常常显得越低,但这个低误差是模型复杂度堆出来的,不是真实预测能力的提升。VISSA 论文中引入了 EDF(等效自由度)来约束这个过程,EDF 同时考虑变量数和 PLS 潜变量数对模型复杂度的影响,让变量筛选不只优化 RMSECV,而是优化“RMSECV 与复杂度之间的平衡”。

实际代码实现里,我一般用近似方案代替严格 EDF:当两个随机子模型的 RMSECV 相差不到 2% 时,强制选择变量数量更少的那个;在保存全局最优子集时,同时记录变量数和 PLS 成分数,把二者之和作为复杂度代理指标。这个近似和论文里精确 EDF 的决策差异通常很小,但理解和修改成本低得多。如果后续有严格对标论文的需求,再按 EDF 定义重算一遍损失函数即可。

3. 用 Python 跑通 iVISSA:预处理、核心循环到区间版扩展

3.1 数据准备与预处理顺序:为什么筛选前必须先校正

光谱数据直接进筛选经常翻车。近红外光谱受固体颗粒大小、装样松紧、环境湿度影响,基线漂移和光散射差异常常比目标化学成分的变化还大。如果不先做预处理,iVISSA 极有可能把基线漂移区域筛成“重要特征”,因为那些区域在区分训练集样本时确实有效,但换一批物理形态不同的样品就完全失效。我的固定套路是:先做 SNV(标准正态变量变换)或 MSC(多元散射校正),视数据散射程度决定,然后视峰重叠情况决定是否做一阶导或二阶导,最后再进变量筛选。SNV 实现很简单:每个样本减去自身光谱均值,再除以自身光谱标准差。

import numpy as np def snv(x): # x: (n_samples, n_wavelengths),逐样本做标准正态变换 mean = x.mean(axis=1, keepdims=True) std = x.std(axis=1, keepdims=True, ddof=1) std[std < 1e-10] = 1.0 # 防止常值光谱除零 return (x - mean) / std

这段代码里keepdims=True是为了让均值向量的形状能和原始矩阵对齐,ddof=1用的是样本标准差,和多数化学计量学软件保持一致。注意预处理参数必须在训练集上计算,测试集直接套用训练集的均值和标准差,否则会产生数据泄漏。后面第 6 章会再强调这一点。

3.2 VISSA 最小实现:概率采样、PLS 评价与收缩主循环

下面是一个教学级但完整可运行的 VISSA 最小实现。它包含三个部分:一个计算 RMSECV 的 PLS 交叉验证函数,一个执行概率收缩的主循环,和一个固定随机种子的调用示例。生产环境里我会把子模型数调到 1000 以上,但演示代码先用较小数值保证能跑通。

import numpy as np from sklearn.cross_decomposition import PLSRegression from sklearn.model_selection import KFold def rmsecv_pls(X, y, mask, n_components=8, cv=5, seed=42): # 只用 mask 选中的波长列建立 PLS,返回 5 折交叉验证 RMSECV Xs = X[:, mask] kf = KFold(n_splits=cv, shuffle=True, random_state=seed) errs = [] n_comp = min(n_components, Xs.shape[1]) # 潜变量数不能超过变量数 for train_idx, val_idx in kf.split(Xs): pls = PLSRegression(n_components=n_comp, scale=True, max_iter=2000) pls.fit(Xs[train_idx], y[train_idx]) pred = pls.predict(Xs[val_idx]).ravel() errs.append((y[val_idx] - pred) ** 2) return float(np.sqrt(np.mean(np.concatenate(errs)))) def vissa(X, y, max_iter=30, n_submodels=400, cv=5, pls_comp=8, thres=0.7, step=0.1, elite_ratio=0.1): n_vars = X.shape[1] prob = np.full(n_vars, 0.5) # 所有波长初始入选概率相同 best_rmse = np.inf best_mask = None for it in range(max_iter): models = [] for _ in range(n_submodels): mask = np.random.binomial(1, prob, size=n_vars).astype(bool) while mask.sum() < 2: # 保证每个子模型至少选 2 个变量 mask = np.random.binomial(1, prob, size=n_vars).astype(bool) score = rmsecv_pls(X, y, mask, n_components=pls_comp, cv=cv) models.append((mask, score)) models.sort(key=lambda x: x[1]) # 按 RMSECV 升序 keep = max(1, int(n_submodels * elite_ratio)) elite = [m for m, _ in models[:keep]] freq = np.vstack(elite).astype(int).mean(axis=0) # 优秀子模型中的入选频率 prob += step * ((freq > 0.6) - (freq < 0.4)) # 概率上调或下调 prob = np.clip(prob, 0.05, 0.95) # 防止概率收敛到 0 或 1 再不出来 if models[0][1] < best_rmse: best_rmse = models[0][1] best_mask = models[0][0].copy() n_active = int((prob > thres).sum()) print(f"iter {it+1}: best RMSECV={best_rmse:.4f}, active={n_active}") final_mask = prob > thres return final_mask, prob, best_rmse

这个实现的逻辑和论文版本是一致的。每次迭代生成 400 个随机子模型,每个子模型都做一次 5 折 PLS 交叉验证,用 400 个 RMSECV 的排序结果来决定波长概率的涨跌。freq > 0.6和freq < 0.4是两个经验阈值,对应概率更新方向;step=0.1控制每轮变化的幅度。阈值thres=0.7是最终决定入选波段的概率门限,设低一点得到更宽的波段集,设高一点得到更稀疏的波段集。调用方式如下:

np.random.seed(42) X_snv = snv(X) sel, prob, rmse = vissa(X_snv, y, max_iter=20, n_submodels=200) print("selected wavelength indices:", np.where(sel)[0])

注意这里只固定了全局随机种子,实际项目还需要在交叉验证、数据划分等环节统一固定种子,否则每次跑出的波段集都会有差异。运行时间方面,700 个波长、200 个子模型、20 轮迭代,在普通笔记本上大约几分钟内可以完成;如果换成 1000 个子模型和 50 轮,时间会线性上升,建议先用降采样或窗口化把变量数压下来。

3.3 iVISSA 的区间版实现:先把波长装进窗口再收缩

现在把 VISSA 升级成 interval 形态。第一级以窗口为单位做变量收缩,第二级在选中窗口内部做精细选择。窗口特征的构造常见做法是取窗口内所有波长的平均值,这样每个窗口得到一个综合信号强度,相当于把光谱数据降维后再做变量选择。

def window_means(X, win=20): n, p = X.shape n_win = p // win return np.column_stack([X[:, i*win:(i+1)*win].mean(axis=1) for i in range(n_win)]) # 第一级:窗口级 VISSA Xw = window_means(X_snv, win=20) sel_win, _, _ = vissa(Xw, y, max_iter=10, n_submodels=200) # 将选中窗口展开为原始波长候选集 candidate_idx = np.concatenate([ np.arange(i*20, (i+1)*20) for i in np.where(sel_win)[0] ]) # 第二级:在候选波长内部做变量级 VISSA Xc = X_snv[:, candidate_idx] sel_var, _, _ = vissa(Xc, y, max_iter=15, n_submodels=300) final_wave = candidate_idx[sel_var] print("final wave indices:", final_wave)

第一级 VISSA 里max_iter=10就够用了,因为窗口数量远小于波长数量,收敛得快;第二级在候选区间内做变量级筛选,迭代次数可以稍多。窗口大小 20 是经验值,具体要根据光谱分辨率来定:如果化学峰半宽只有 5 个波长点,窗口取 10 更合适;如果是宽缓的蛋白质峰,窗口可以放到 30。选择窗口的另一个好处是减少最终结果的离散程度,筛出来的波段天然是连续区间,方便后续做谱峰归属。

3.4 可视化输出:把筛选结果落回原始谱线

筛选完一定要把波段画回原始光谱上,用眼睛确认结果是否合理。这个步骤能发现很多数字指标看不出的问题,比如筛出了强烈的噪声区、选在基线陡坡上、或者漏掉了肉眼可见的强吸收峰。

import matplotlib.pyplot as plt wavelength = np.arange(X.shape[1]) plt.plot(wavelength, X_snv.mean(axis=0), lw=1, color='black') for idx in final_wave: plt.axvspan(idx, idx+1, color='red', alpha=0.3) plt.xlabel("wavelength index") plt.ylabel("mean SNV intensity") plt.show()

图中红色竖带就是最终保留的谱区。如果红带恰好覆盖了已知的目标成分吸收峰,说明筛选结果有物理依据;如果红带集中在噪声区或光谱边缘,即使 RMSECV 很好看,这个结果也值得怀疑,需要回头检查预处理和参数设置。

4. iVISSA 的 4 个关键参数:迭代次数、子模型数、概率步长与窗口尺度

4.1 max_iter:用活跃变量数判断收敛,而不是只看迭代到上限

max_iter 不等于“跑满就是收敛”。我见过不少人设了 50 次迭代,跑完直接拿结果,但中间过程完全不看。更稳妥的做法是在主循环里打印active数量,也就是当前概率超过最终阈值 thres 的变量个数。如果 active 数量连续 5 轮到 10 轮不再变化,说明概率向量已经基本稳定,可以提前终止;如果到最后一轮还在上下跳动,说明概率步长太大或者子模型数太少,加迭代次数没有意义,要先降 step 或者加 n_submodels。经验上,变量数 700 左右时,30 到 50 轮足够收敛;如果做了窗口化,第一级通常 10 轮就稳定了。

4.2 n_submodels:子模型少是噪声,多则算力爆炸

每一轮的随机子模型数直接决定统计可信度。n_submodels=200 时,优秀子模型只有 20 个,频率统计的方差很大,概率更新容易受偶然组合影响;升到 1000 时,优秀子模型有 100 个,频率估计更稳,但耗时线性增长。我的一般习惯是:样本数低于 100 时用 500 个子模型,样本数几百到上千时用 1000。如果项目对运行时间敏感,先做 UVE 或 SPA 粗筛把变量数压到 100 到 200 个,再跑 VISSA,这样 400 个子模型就够用。计算时间与子模型数和迭代次数成正比,优化方向永远是先降变量数,而不是先降子模型数。

4.3 prob_step 与 threshold:概率更新步长决定收敛质量

step 控制每轮概率调整的幅度。step=0.1 是常见默认值,意思是频率高的变量每轮概率上调 10%,大约 4 到 5 轮就能从 0.5 走到 0.9 附近。step 太大容易造成振荡,比如某轮由于随机抽样偶然选中了一批变量,概率被猛抬,下一轮这批变量又以高概率进入大量子模型,结果优秀子模型全被它们占据,真实重要的变量反而被压下去。如果观察到 active 数量反复上下跳,把 step 降到 0.05 再跑一轮。threshold 决定最终入选变量数量,一般取 0.7。想要更稀疏的特征集就用 0.85,想保守一点就用 0.6。注意 threshold 设低时入选变量变多,模型复杂度上升,需要同步增加 EDF 惩罚或减少 PLS 成分数。

4.4 window_size 与 n_components:两个隐含参数决定筛选的物理尺度

window_size 不是 VISSA 主循环里的参数,而是 interval 版的第一级切窗宽度。它决定了筛选结果的“分辨率”:窗宽太细,比如 5 个点,结果还是接近单点筛选,连续性优势消失;窗宽太粗,比如 50 个点,一个重要谱区里混进了不重要的波长,第二级筛选压力大。我一般先观察原始光谱中最窄吸收峰的半峰宽,用半峰宽的两倍左右作为窗宽。比如某体系的峰半高宽是 8 个波长点,窗口就取 15 到 20。PLS 成分数 n_components 同样重要,无论哪个子模型都带着同一套成分数参与交叉验证,如果成分数设得过高,每个子模型几乎都能拟合得很好,排序就失去区分度;设得过低,则所有模型都欠拟合。常见做法是先用全谱 PLS 找 RMSECV 曲线的最低点,再用对应成分数作为 VISSA 的固定值。

参数推荐范围主要影响调参要点
max_iter30 - 100概率是否收敛看 active 数连续 5 轮不变即可停
n_submodels500 - 1000统计稳定性小样本 500,大样本 1000
step0.05 - 0.1收敛速度与振荡active 数跳动时降 step
thres0.6 - 0.9最终入选变量数结合 EDF 惩罚调整
window_size10 - 30 点谱区连续粒度按半峰宽估算
n_components5 - 10PLS 潜变量数用全谱 RMSCV 曲线初选

5. iVISSA 实战避坑:5 个高频翻车场景与排查路径

5.1 同一条数据每次跑出不同波段集

现象:代码没改,数据没换,连续运行两次 iVISSA,筛选出的波段索引对不上,有时差几个点,有时差一整段。
原因:VISSA 本身依赖随机采样,np.random.binomial每次用不同的随机数流,交叉验证里的数据划分也是随机的,两处随机性叠加,结果自然不同。
解决:在整个流程入口固定随机种子,常见做法是np.random.seed(42),同时给 KFold 的random_state设固定值。更严格的项目还要把训练集、验证集划分顺序存成文件,保证每次运行完全可复现。如果固定种子后结果仍然不稳定,说明 n_submodels 太少,加大到 1000 再跑。

5.2 筛选结果全是一条条孤立单峰

现象:选出来的波长点彼此不相邻,在光谱图上呈散点状,完全看不出谱区形状,化学归属无从谈起。
原因:直接用变量级 VISSA,忽略光谱连续性。算法只关心预测误差,不关心波长之间是否有物理关联,所以在信息冗余的光谱里选出互相独立的单点很容易。
解决:改用 interval 版 iVISSA,先窗口后变量,两级搜索从结构上保证结果连续。如果坚持用变量级,也可以在每轮概率更新后对概率向量做一次滑动平均平滑,让相邻波长的概率互相影响,但这会引入额外参数,不如切窗口直接。

5.3 训练组 RMSECV 很低,外部验证组 R² 却崩了

现象:VISSA 跑完,训练集交叉验证 RMSE 漂亮得惊人,模型拿到外部测试集上预测误差翻倍,R² 掉到 0.5 以下。
原因:筛选过程只优化了 RMSECV,没有对变量数量做惩罚。变量越多,模型自由度越大,交叉验证误差被复杂性压低。尤其在样本量小于变量数的高维场景,这种过拟合几乎是必然的。
解决:引入 EDF 惩罚,或者按第 2.4 节的近似方案:两个子模型 RMSE 相差 2% 以内时选变量更少的。同时在外部验证时使用重复交叉验证,比如 5 次 5 折,报告 RMSE 的标准差而不是单次数值。

5.4 换一种预处理,筛选出的波段区完全改变

现象:同一批数据,用 SNV 预处理筛出 A、B 两个区域,换成 MSC 后筛出的区域变成 C、D,两部分几乎不重叠。
原因:预处理改变的是光谱的形状和方差分布,而 VISSA 是模型驱动方法,哪里的信号与 y 相关性最强,哪里就是优势变量。不同预处理放大的信息不同,结果自然不同,这不一定是算法的 bug。
解决:先花时间确定一条固定的预处理链,不轻易切换。比较不同预处理方案时,不要只比较最终筛选波段的重合度,而要比较筛选后 PLS 模型在外部测试集上的 RMSEP。只要 RMSEP 在同一水平,波段不同是可以接受的。

5.5 小样本高维数据跑不动或不敢信

现象:样本只有 50 个,波长却有 2000 个,iVISSA 跑得非常慢,而且每一轮生成的子模型训练集只有几十个样本,PLS 很容易在随机组合上拟合出极低的 CV 误差。
原因:高维小样本下,随机子模型数量虽多,但每次可用的信息极其有限,统计噪声被样本量放大,筛选结果缺乏可信度。
解决:先用 SPA 或 UVE 把变量数粗筛到 100 以内,再跑 iVISSA 细筛。如果仍然担心稳定性,把整个筛选流程重复 20 次,只保留每次都被选中的变量。这样虽然会丢失一些边缘变量,但留下的是最可靠的波段集。

6. iVISSA 筛完之后:重复投票、SPA 串联与外部验证

6.1 二十次重复投票:让随机收敛变成稳定集

筛选结果稳定,比筛选结果完美更重要。我常用的收尾操作是把 iVISSA 重复跑 20 次,每次用不同的随机种子,记录每个波长被选中的次数,只保留出现频率不低于 15 次的变量作为最终特征集。这样做的本质是在随机搜索算法上做了一次集成,抵消单次运行时的抽样波动。代码实现不复杂,只需要被调主循环外面再套一层循环。

votes = np.zeros(X.shape[1]) for i in range(20): np.random.seed(100 + i) sel, _, _ = vissa(X_snv, y, max_iter=30, n_submodels=300) votes[sel] += 1 stable = votes >= 15

6.2 与 SPA 或 UVE 串联:先粗筛再精筛的常规组合

变量数特别多或样本量很小的时候,我会先用 SPA 选 30 到 50 个候选波长,然后把 VISSA 的搜索空间限制在这 50 个候选点上。这个组合既给了 VISSA 一个合理起点,又保留了概率收缩对组合优化的能力。类似地,UVE 可以先剔除大约 70% 的无信息变量,再用 iVISSA 精筛。串联后总耗时往往比直接跑全谱 iVISSA 短得多,结果稳定度也更高。

6.3 用外部测试集验证筛选结果:RMSEP 与 R² 的对比标准

筛选和建模都只能在训练集上做,测试集必须留到最后一刻才接触。这里最容易犯的细节错误是预处理泄漏:SNV 的均值和标准差必须在训练集上算,然后套用到测试集,而不是测试集单独做一次 SNV,否则等于测试信息提前进入了模型。代码上要把筛选、预处理、建模三项都封装成“训练专用函数”,测试集只走一遍预测流程。

from sklearn.model_selection import train_test_split X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42) X_tr_s = snv(X_tr) # 训练阶段:筛选 + 建模 sel, _, _ = vissa(X_tr_s, y_tr, max_iter=20, n_submodels=300) pls = PLSRegression(n_components=5).fit(X_tr_s[:, sel], y_tr) # 测试阶段:套用训练集 SNV 均值/标准差 X_te_s = (X_te - X_tr.mean(axis=0)) / X_tr.std(axis=0) pred_te = pls.predict(X_te_s[:, sel]).ravel()

这个三段式流程我已经形成习惯:先预处理,再筛选,最后建模,每一段都只在训练侧拟合参数。换过太多数据集后发现,凡是外部验证崩掉的案例,往回查八成都是测试侧悄悄做了“独立预处理”。筛选稳定性和数据泄漏问题处理干净,iVISSA 这类算法才能真正成为光谱建模里的可复现工具,这也是我最后想提醒你的一个原则:特征筛选不是一次性的魔法,而是一条需要固定种子、固定流程、反复验证的工程链路。希望帮到你。

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

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

被Skill/MCP/Hook搞晕三周,我画了张决策图

事情是这样的。我团队从今年3月开始全员切 Claude Code。一开始还好&#xff0c;大家往 CLAUDE.md 里塞项目规范&#xff0c;顺手写几个 /deploy、/review 的 Custom Commands&#xff0c;日子过得去。一个月后噩梦开始。前端同学用 Skill 封了一套「组件库使用规范」&#xff…

作者头像 李华
网站建设 2026/10/1 15:53:02

盘点大模型训练平台:商汤大装置SenseCore与Token交付及同业路径

盘点大模型训练平台:商汤大装置SenseCore与Token交付及同业路径来源&#xff1a;综合网络 时间&#xff1a;2026-09-30 数据截至 2026 年 9 月摘要&#xff1a;大模型训练平台选型正在从"看GPU数量"转向"看训练工艺、算力计量、推理交付和全生命周期工程&…

作者头像 李华
网站建设 2026/10/1 15:53:02

我的世界-1-产品性能展示

将产品3D数模导入世界&#xff0c;可模拟现实&#xff0c;输出产品性能&#xff0c;使用年限等

作者头像 李华
网站建设 2026/10/1 15:51:48

【9月终章】企业级 Agent 架构月度全景白皮书与 2027 演进路线图

【9月终章】企业级 Agent 架构月度全景白皮书与 2027 演进路线图在 2026 年 9 月的整整 30 天中&#xff0c;YueJoy 团队在企业级智能体&#xff08;Enterprise Agent&#xff09;架构的深水区进行了连续、高强度的工程探索与落地演进。 作为整月 300 篇系列文章的压轴终章&…

作者头像 李华
网站建设 2026/10/1 15:51:29

量子力学波包坍缩与概率云:Canvas 绘制量子态观测微动效

量子力学波包坍缩与概率云&#xff1a;Canvas 绘制量子态观测微动效在量子力学&#xff08;Quantum Mechanics&#xff09;的微观世界中&#xff0c;存在着一条颠覆经典物理学确定性常识的至高哲学定律&#xff1a;“在未经人类或外部仪器介入观测之前&#xff0c;一个微观粒子…

作者头像 李华