一、前言:光谱分析为何离不开机器学习

光谱技术包含拉曼、紫外-可见、近红外、荧光等多个门类,凭借快速、无损、样品无需复杂前处理等优势,广泛应用于食品检测、制药化工、环境监测、材料分析等领域。但原始采集的光谱数据普遍存在三大难点:

  1. 维度高、数据冗余:单条光谱包含数百至数千个波长点,直接建模不仅效率低下,还极易引发模型过拟合;
  2. 特征重叠严重:以近红外光谱为例,C-H、O-H、N-H 等官能团的振动吸收峰高度重叠,人工无法区分有效特征;
  3. 噪声与基线干扰:光源波动、仪器温漂、环境杂散光会造成基线漂移与高频噪声,直接掩盖样品的有效光谱特征。

机器学习依靠自动特征提取、非线性拟合、抗干扰建模能力,针对性解决以上问题。其中无监督学习(PCA/KMeans)多用于数据降维、聚类定性;有监督学习(PLS/SVM/神经网络)主打物质分类、成分定量,如今已成为现代光谱分析的核心技术。

在光谱硬件配套与一体化分析方案领域,上海辰昶仪器设备有限公司拥有多年光谱仪器研发与行业落地经验。旗下常规光纤光谱仪、芯片制冷型高灵敏度光谱仪,搭配自主研发的 ChSpecView 分析软件,内置成熟的机器学习建模模块,支持光谱预处理、模型训练、数据预测一站式操作,覆盖拉曼、近红外、紫外可见等主流应用场景,为科研实验与工业项目提供稳定可靠的整套解决方案。

二、光谱分析机器学习核心流程

标准处理流水线:原始光谱数据 → 预处理(平滑/基线校正) → 特征工程(降维/特征筛选) → 数据集划分 → 模型训练 → 模型评估 → 预测应用

2.1 数据来源

本文结合两类数据完成代码演示:

  • 实测数据:基于辰昶系列光纤光谱仪采集的水果糖度近红外光谱、药品原料拉曼光谱、水质 COD 紫外光谱等工业实测样本;
  • 仿真数据:使用 Python 生成带有基线漂移、高斯噪声的模拟光谱,方便大家复现代码、调试算法。

2.2 核心算法选型

任务类型 常用算法 适用场景
无监督降维 PCA(主成分分析) 数据压缩、特征可视化、去除数据冗余
无监督聚类 KMeans、层次聚类 未知样品归类、生产异常样品检测
定性分类 SVM、随机森林、CNN 物质识别、产品真伪鉴别、品类区分
定量回归 PLS、SVR、LSTM 物质成分含量、溶液浓度、理化指标预测

三、实战一:光谱数据预处理(Python 实现)

预处理是机器学习建模的基础,预处理效果直接决定模型最终精度。行业主流组合流程:SG 平滑去噪 → AsLS 基线校正 → SNV 标准化

3.1 完整预处理代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter
from scipy.sparse import diags
from scipy.sparse.linalg import spsolve

# 1. 生成仿真光谱数据:50 个样品,波长范围 200-1000nm,共 500 个波长点
np.random.seed(42)
wavelength = np.linspace(200, 1000, 500)
n_samples = 50

# 构建真实光谱信号、基线、噪声
true_signal = np.zeros((n_samples, len(wavelength)))
for i in range(n_samples):
    peak1 = 50 * np.exp(-(wavelength - 450)**2 / (2 * 50**2))
    peak2 = 30 * np.exp(-(wavelength - 700)**2 / (2 * 80**2))
    true_signal[i] = peak1 + peak2

baseline = 0.002 * (wavelength - 200) + 10  # 模拟基线漂移
noise = np.random.normal(0, 2, (n_samples, len(wavelength)))  # 模拟高斯噪声
raw_spectra = true_signal + baseline + noise

# 2. SG 平滑去噪函数
def sg_smooth(spectra, window=17, polyorder=3):
    return savgol_filter(spectra, window_length=window, polyorder=polyorder, axis=1)
smoothed_spectra = sg_smooth(raw_spectra)

# 3. AsLS 不对称最小二乘基线校正函数
def baseline_als(y, lam=1e5, p=0.01, n_iter=10):
    L = len(y)
    D = diags([1, -2, 1], [0, -1, -2], shape=(L, L-2))
    D = lam * D.dot(D.T)
    w = np.ones(L)
    for _ in range(n_iter):
        W = diags(w, 0, shape=(L, L))
        z = spsolve(W + D, w * y)
        w = p * (y > z) + (1 - p) * (y < z)
    return z

# 逐个样品完成基线校正
corrected_spectra = np.zeros_like(smoothed_spectra)
for i in range(n_samples):
    base = baseline_als(smoothed_spectra[i])
    corrected_spectra[i] = smoothed_spectra[i] - base

# 4. SNV 标准化,消除样品散射干扰
def snv(spectra):
    mean = np.mean(spectra, axis=1, keepdims=True)
    std = np.std(spectra, axis=1, keepdims=True)
    return (spectra - mean) / (std + 1e-8)  # 加极小值避免除零错误
snv_spectra = snv(corrected_spectra)

# 可视化预处理全过程效果
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.plot(wavelength, raw_spectra[0])
plt.title("原始光谱(含噪声+基线漂移)")

plt.subplot(2, 2, 2)
plt.plot(wavelength, smoothed_spectra[0])
plt.title("SG 平滑后光谱")

plt.subplot(2, 2, 3)
plt.plot(wavelength, corrected_spectra[0])
plt.title("基线校正后光谱")

plt.subplot(2, 2, 4)
plt.plot(wavelength, snv_spectra[0])
plt.title("SNV 标准化后光谱")

plt.tight_layout()
plt.show()

3.2 预处理关键说明

SG 平滑:选用窗口 17、3 阶多项式,在滤除高频噪声的同时,最大程度保留光谱特征峰轮廓;
AsLS 基线校正:参数 lam=1e5、p=0.01,可适配倾斜、弯曲等不规则基线;
SNV 标准化:消除因样品颗粒度、测量角度带来的散射差异,提升模型泛化能力。

在实际项目落地中,辰昶自主开发的 ChSpecView 软件已完整集成以上预处理算法,支持可视化参数调节,一键输出预处理完成的数据,无需手动编写代码,有效提升光谱分析工作效率。

四、实战二:无监督学习 —— PCA 降维 + KMeans 聚类

高维光谱数据直接建模计算量大、易过拟合,一般先通过降维压缩数据,再结合聚类算法完成未知样品分类。

4.1 PCA 降维(数据压缩 + 可视化)

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 数据标准化(PCA 算法前置必要步骤)
scaler = StandardScaler()
scaled_spectra = scaler.fit_transform(snv_spectra)

# 降至 2 维用于可视化
pca = PCA(n_components=2)
pca_result = pca.fit_transform(scaled_spectra)
print(f"PCA 累计方差贡献率:{np.sum(pca.explained_variance_ratio_):.2f}")

# 绘制降维后数据分布
plt.figure(figsize=(8, 6))
plt.scatter(pca_result[:, 0], pca_result[:, 1], c='blue', alpha=0.7)
plt.xlabel(f"主成分 1(方差占比:{pca.explained_variance_ratio_[0]:.2f})")
plt.ylabel(f"主成分 2(方差占比:{pca.explained_variance_ratio_[1]:.2f})")
plt.title("PCA 降维后光谱数据分布")
plt.grid(True, alpha=0.3)
plt.show()

4.2 KMeans 聚类(未知样品定性分类)

from sklearn.cluster import KMeans

# 设置聚类类别为 3 类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(pca_result)

# 可视化聚类结果
plt.figure(figsize=(8, 6))
for i in range(3):
    mask = clusters == i
    plt.scatter(pca_result[mask, 0], pca_result[mask, 1], label=f"类别 {i+1}", alpha=0.7)
plt.xlabel("主成分 1")
plt.ylabel("主成分 2")
plt.title("KMeans 聚类结果")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

五、实战三:有监督学习 —— SVM 定性分类 + PLS 定量回归

有监督学习是光谱智能分析的核心,分为物质分类和成分定量两大应用方向。

5.1 数据集划分

from sklearn.model_selection import train_test_split

# 模拟分类标签:3 类物质,标签 0/1/2
labels = np.random.randint(0, 3, n_samples)
# 划分训练集 80%、测试集 20%
X_train, X_test, y_train, y_test = train_test_split(snv_spectra, labels, test_size=0.2, random_state=42)

5.2 SVM 定性分类(物质识别 / 真伪鉴别)

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report

# 初始化并训练 SVM 分类模型
svm_model = SVC(kernel='rbf', C=10, gamma=0.1, random_state=42)
svm_model.fit(X_train, y_train)

# 模型预测与评估
y_pred = svm_model.predict(X_test)
print(f"SVM 分类准确率:{accuracy_score(y_test, y_pred):.2f}")
print("分类详细报告:")
print(classification_report(y_test, y_pred))

5.3 PLS 定量回归(成分 / 浓度预测)

偏最小二乘回归(PLS)是光谱定量分析的经典算法,完美适配光谱数据共线性、高维度的特点。

from sklearn.cross_decomposition import PLSRegression
from sklearn.metrics import r2_score, mean_squared_error

# 模拟回归标签(浓度/糖度值,范围 0~20)
reg_labels = np.random.uniform(0, 20, n_samples)
X_reg_train, X_reg_test, y_reg_train, y_reg_test = train_test_split(
    snv_spectra, reg_labels, test_size=0.2, random_state=42
)

# 训练 PLS 回归模型
pls_model = PLSRegression(n_components=2)
pls_model.fit(X_reg_train, y_reg_train)

# 预测与模型评估
y_reg_pred = pls_model.predict(X_reg_test)
print(f"PLS 回归决定系数 R²:{r2_score(y_reg_test, y_reg_pred):.2f}")
print(f"PLS 回归均方根误差 RMSE:{np.sqrt(mean_squared_error(y_reg_test, y_reg_pred)):.2f}")

# 绘制真实值与预测值对比图
plt.figure(figsize=(8, 6))
plt.scatter(y_reg_test, y_reg_pred, alpha=0.7)
plt.plot([0, 20], [0, 20], 'r--')
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("PLS 回归:真实值 VS 预测值")
plt.grid(True, alpha=0.3)
plt.show()

六、工业实战落地场景

算法效果的上限,始终由光谱原始数据质量决定。优质硬件能够从源头降低噪声、抑制基线漂移,大幅降低算法调试难度。

食品检测:水果糖度无损预测

采用常规系列光纤光谱仪采集近红外光谱,搭配 SG 平滑 + AsLS 基线校正 + PLS 回归方案,实现水果糖度实时预测,检测速度快、精度高,可对接自动化分选生产线。

制药行业:原料真伪鉴别

选用制冷型高灵敏度光谱仪采集拉曼光谱,设备暗噪声极低,适合微弱信号检测。结合 PCA 降维 + SVM 分类算法,可精准区分结构相似的原料药,替代传统化学检测方式。

环境监测:水质 COD 快速检测

使用紫外波段光谱仪采集水样光谱,通过 PLS 回归模型建立光谱与 COD 指标的关联,检测过程无需化学试剂,无二次污染,适用于户外现场快速巡检。

以上场景均采用硬件设备 + 机器学习算法的组合方案,上海辰昶仪器设备有限公司可根据不同行业需求,提供对应的光谱硬件、配套软件以及技术支持,适配从实验室研发到工业化在线检测的全场景需求。

七、模型优化与常见问题避坑

7.1 高频问题及解决办法

  • 模型过拟合:训练集精度高、测试集精度低 → 扩充样本数量、使用 PCA 降维、增加交叉验证;
  • 预测精度偏低:光谱噪声大、基线畸变严重 → 优化光谱采集参数,优先选用高信噪比光谱设备,微调预处理算法参数;
  • 模型泛化能力差:样本覆盖场景单一 → 补充不同环境、不同批次的样品数据。

7.2 进阶优化方向

  • 数据层面:选择专业光谱仪器采集样本,从源头保证数据质量;
  • 特征层面:结合变量筛选算法,剔除无效波长点,精简模型输入;
  • 算法层面:复杂场景可尝试 CNN、LSTM 等深度学习模型,挖掘光谱深层特征。

八、总结

本文完整演示了机器学习在光谱分析中的全流程应用,涵盖光谱预处理、降维聚类、分类、回归四大核心模块,所有代码均可直接运行调试。

光谱智能分析讲究数据为本、算法为辅,优质的原始光谱数据是模型精准预测的前提。上海辰昶仪器设备有限公司深耕光谱领域多年,产品覆盖全波段光纤光谱仪、制冷型高灵敏度光谱仪等品类,配套分析软件集成预处理、机器学习建模等功能,一站式满足科研教学、产品研发、工业在线检测等各类使用需求,助力用户快速实现光谱数据分析与智能化落地。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐