光谱预处理算法(python版本)

本文介绍了基于Python的光谱预处理方法,包括环境搭建、库的引入、数据处理和展示,以MSC为例展示了预处理效果。提供了一段示例代码,并提及后续将更新MATLAB版本。代码来源于湖南师范大学,用于学术目的,作者提供了联系方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

近红外光谱分析技术属于交叉领域,需要化学、计算机科学、生物科学等多领域的合作。为此,在(北京邮电大学杨辉华老师团队)指导下,近期准备开源传统的PLS,SVM,ANN,RF等经典算和SG,MSC,一阶导,二阶导等预处理以及GA等波长选择算法以及CNN、AE等最新深度学习算法,以帮助其他专业的更容易建立具有良好预测能力和鲁棒性的近红外光谱模型。



前言

NIRS是介于可见光和中红外光之间的电磁波,其波长范围为(1100∼2526 nm。 由于近红外光谱区与有机分子中含氢基团(OH、NH、CH、SH)振动的合频和 各级倍频的吸收区一致,通过扫描样品的近红外光谱,可以得到样品中有机分子含氢 基团的特征信息,常被作为获取样本信息的一种有效的载体。 基于NIRS的检测方法具有方便、高效、准确、成本低、可现场检测、不 破坏样品等优势,被广泛应用于各类检测领域。但 近红外光谱存在谱带宽、重叠较严重、吸收信号弱、信息解析复杂等问题,与常用的 化学分析方法不同,仅能作为一种间接测量方法,无法直接分析出被测样本的含量或 类别,它依赖于化学计量学方法,在样品待测属性值与近红外光谱数据之间建立一个 关联模型(或称校正模型,Calibration Model) ,再通过模型对未知样品的近红外光谱 进行预测来得到各性质成分的预测值。现有近红外建模方法主要为经典建模 (预处理+波长筛选进行特征降维和突出,再通过pls、svm算法进行建模)以及深度学习方法(端到端的建模,对预处理、波长选择等依赖性很低)

本篇主要讲述基于python语言的光谱预处理方法,稍后更新matlab语言版本的光谱预处理方法,

一、预处理算法

# 最大最小值归一化
def MMS(data):
    """
       :param data: raw spectrum data, shape (n_samples, n_features)
       :return: data after MinMaxScaler :(n_samples, n_features)
       """
    return MinMaxScaler().fit_transform(data)


# 标准化
def SS(data):
    """
        :param data: raw spectrum data, shape (n_samples, n_features)
       :return: data after StandScaler :(n_samples, n_features)
       """
    return StandardScaler().fit_transform(data)


# 均值中心化
def CT(data):
    """
       :param data: raw spectrum data, shape (n_samples, n_features)
       :return: data after MeanScaler :(n_samples, n_features)
       """
    for i in range(data.shape[0]):
        MEAN = np.mean(data[i])
        data[i] = data[i] - MEAN
    return data


# 标准正态变换
def SNV(data):
    """
        :param data: raw spectrum data, shape (n_samples, n_features)
       :return: data after SNV :(n_samples, n_features)
    """
    m = data.shape[0]
    n = data.shape[1]
    print(m, n)  #
    # 求标准差
    data_std = np.std(data, axis=1)  # 每条光谱的标准差
    # 求平均值
    data_average = np.mean(data, axis=1)  # 每条光谱的平均值
    # SNV计算
    data_snv = [[((data[i][j] - data_average[i]) / data_std[i]) for j in range(n)] for i in range(m)]
    return  data_snv



# 移动平均平滑
def MA(data, WSZ=11):
    
### Python 实现高光谱数据预处理算法 对于高光谱数据的预处理,在Python中有多种库可以利用来执行不同的预处理操作。基于已有的资料[^1],下面是一些常用的预处理技术及其对应的Python实现方式。 #### 一阶差分处理 一阶差分能够减少基线漂移的影响并增强特征峰之间的差异性。通过定义`D1`函数完成对输入数据的一阶差分计算: ```python import numpy as np import pandas as pd def D1(sdata): """一阶差分""" temp1 = pd.DataFrame(sdata) temp2 = temp1.diff(axis=1) temp3 = temp2.values return np.delete(temp3, 0, axis=1) # 使用示例 x = ... # 输入原始光谱数据矩阵 x_processed = D1(x) ``` 此代码片段展示了如何应用一阶差分到给定的数据集上,并返回去除首列后的结果。 #### Savitzky-Golay 平滑滤波器 Savitzky-Golay平滑是一种广泛应用于信号处理领域的方法,它可以在保持形状不变的情况下有效地降低噪声干扰。SciPy提供了内置的支持用于快速构建SG滤波器: ```python from scipy.signal import savgol_filter window_length = 7 # 窗口大小应为奇数 polyorder = 2 # 多项式的阶次 smoothed_data = savgol_filter(data, window_length, polyorder) ``` 这段代码实现了Savitzky-Golay平滑过程,其中`window_length`指定了窗口宽度而`polyorder`则决定了多项式的阶次[^2]。 #### 标准正态变量转换 (SNV) 标准正态变换有助于消除由样品表面反射特性引起的波动影响。可以通过简单的数学运算来实施这一变化: ```python def snv(input_data): output_data = np.zeros_like(input_data) for i in range(input_data.shape[0]): output_data[i,:] = (input_data[i,:] - np.mean(input_data[i,:])) / np.std(input_data[i,:]) return output_data snv_corrected = snv(your_spectral_data) ``` 上述代码段演示了怎样运用SNV方法调整每条记录下的光谱曲线使其具有零均值单位方差分布特点。 除了这些基本功能外,还有其他高级工具包如Hyperspy专门针对电子显微镜获取的多维图像设计;以及Specio专注于生物医学成像中的光谱分析等。根据具体应用场景和个人需求选择合适的软件框架将会更加高效便捷地达成目标。
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值