基于表面增强拉曼和近红外光谱技术的微藻油脂检测及种类鉴别软件设计【附代码】
✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)基于77 nm聚苯乙烯模板的银纳米增强基底制备与拉曼光谱预处理流程:
采用气液界面自组装法在单晶硅片上制备紧密排列的聚苯乙烯胶体晶体模板,然后通过磁控溅射在模板上沉积厚度为60 nm的银膜,移除模板后获得呈六方排列的三角形银纳米岛阵列基底。利用该基底采集斜生栅藻、小球藻等120个微藻样本的拉曼光谱,激光波长为785 nm,积分时间10 s。原始光谱首先经过自适应迭代重加权惩罚最小二乘基线校正,其中λ参数取对数空间搜索最优值104.5,迭代循环直到峰面积变化小于0.5%为止。随后进行多元散射校正以消除粒径差异带来的散射效应,再使用谱图小波阈值去噪,小波基为db8,分解层数为4,阈值选取规则为基于Stein无偏风险估计的自适应软阈值。预处理后的光谱在1095 cm⁻¹、1265 cm⁻¹和1652 cm⁻¹等处呈现清晰的不饱和脂肪酸特征峰,信噪比从原始光谱的35.1 dB提升至78.3 dB,为后续定量分析提供了高质量数据。
(2)融合混沌映射与莱维飞行的改进灰狼算法优化BP神经网络油脂预测模型:
构建三层BP神经网络,以竞争性自适应重加权采样和连续投影算法联合筛选出的22个特征波数作为输入,输出为油脂含量。为克服BP网络易陷入局部极小和初始权值敏感问题,采用改进灰狼算法进行全局优化。改进之处有三:其一,采用Cubic混沌映射生成初始种群,使个体均匀分布在搜索空间边界内;其二,在灰狼位置更新公式中引入基于当前迭代次数的动态权重,α狼的权重按余弦函数从0.5衰减至0.2,β和δ狼权重相应增加,保证后期局部精搜;其三,当最优个体停滞超过10代时,对所有狼执行莱维飞行的随机扰动,步长由Gamma分布生成,扰动幅度随迭代逐步缩小。适应度函数为训练集和验证集的均方误差加权和,训练300代后,基于改进灰狼优化的BP模型预测集决定系数Rp²达到0.965,均方根误差RMSEP为3.11 mg/g,相对标准偏差RSD为4.1%,相较于标准BP和GWO-BP分别提高了0.089和0.031,证明该模型对微藻油脂含量快速预测具有高准确度和良好稳定性。
(3)近红外光谱的格拉姆角场图像转换与SqueezeNet-LSTM混合模型藻种鉴别:
将四种微藻的浸入式近红外光谱(900-1700 nm)通过滑动窗口分段和Savitzky-Golay一阶导数平滑预处理后,利用Gramian Angular Summation Field方法将一维光谱序列映射为二维图像。具体通过极坐标编码将每个光谱点的幅值映射为余弦角,并计算不同时间步之间的余弦和形成GASF图像,图像尺寸设为64×64。混合模型骨架为轻量级SqueezeNet v1.1,将Fire模块中的3×3和1×1卷积结合后与双层LSTM串联,LSTM的隐藏层维度为256,用于捕捉图像横向频域依赖关系。分类器采用焦点损失函数替代交叉熵,Gamma参数设为2.0,缓解类别不平衡。在包含斜生栅藻、小球藻、螺旋藻和杜氏盐藻各60个样本的数据集上,采用五折交叉验证,GASF-SqueezeNet-LSTM的平均分类准确率达到99.2%,召回率与精确率均超过98.8%,显著优于直接使用CNN和一维卷积网络的对照模型,且单样本推断时间在GPU上仅为4.3 ms,完全满足实时在线检测需求。整套模型已集成至MATLAB App Designer开发的光谱快速分析软件中,提供一键数据导入、预处理、特征挑选、建模与分类报告生成功能。
import numpy as np import pandas as pd from scipy.signal import savgol_filter from sklearn.preprocessing import MinMaxScaler # 自适应迭代重加权惩罚最小二乘基线校正 def airPLS(x, lambda_=1e4, order=2, max_iter=20): m = len(x); w = np.ones(m) D = np.diff(np.eye(m), order, axis=0) DTD = lambda_ * D.T @ D for _ in range(max_iter): W = np.diag(w) z = np.linalg.solve(W + DTD, w * x) d = x - z dn = d[d < 0] if len(dn) == 0: break std = np.std(dn) if len(dn) > 1 else 0.001 w_next = np.zeros_like(x) w_next[d >= 0] = 0 w_next[d < 0] = np.exp(d[d<0] / (2 * std)) if np.linalg.norm(w - w_next) < 1e-6: break w = w_next return z # Gramian Angular Summation Field 转换 def gasf(series, normalize=True): if normalize: scaler = MinMaxScaler(feature_range=(-1, 1)) series = scaler.fit_transform(series.reshape(-1,1)).flatten() phi = np.arccos(series) gasf_img = np.cos(np.add.outer(phi, phi)) return gasf_img # 改进灰狼优化位置更新 (核心部分) def update_positions_gwo(pop, alpha, beta, delta, a): dim = alpha.shape[0]; pop_size = pop.shape[0] for i in range(pop_size): r1, r2 = np.random.rand(dim), np.random.rand(dim) A1 = 2*a*r1 - a; C1 = 2*r2 D_alpha = np.abs(C1*alpha - pop[i]) X1 = alpha - A1*D_alpha # beta和delta类似计算 r3, r4 = np.random.rand(dim), np.random.rand(dim) A2 = 2*a*r3 - a; C2 = 2*r4 D_beta = np.abs(C2*beta - pop[i]); X2 = beta - A2*D_beta r5, r6 = np.random.rand(dim), np.random.rand(dim) A3 = 2*a*r5 - a; C3 = 2*r6 D_delta = np.abs(C3*delta - pop[i]); X3 = delta - A3*D_delta # 动态权重 w_alpha, w_beta, w_delta = 0.5-0.3*np.cos(np.pi*a[0]/2), 0.3, 0.2 pop[i] = w_alpha*X1 + w_beta*X2 + w_delta*X3 # 莱维扰动 (简化) if np.random.rand() < 0.1: levy = np.random.standard_cauchy(dim) * 0.01 pop[i] += levy return np.clip(pop, -1, 1)如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
