当前位置:   article > 正文

光谱数据预处理综合_光谱预处理方法

光谱预处理方法

往期回顾

介绍

除了化学信息,光谱还包含其他不相关或不需要的信息,如电噪声,基质背景,杂散光,散射效应等。在用化学计量学方法建立校准模型时,利用预处理方法消除光谱数据中的无关信息和噪声是非常必要的。

光谱预处理典型方法

光谱预处理的典型方法主要包括平滑/导数、标准正态变量(SNV)、乘性散射校正(MSC)、傅立叶变换(FT)、小波变换(WT)、正交信号校正(OSC)和净分析物信号(NAS)。

导数是消除加性效应最常用的方法。

SNV和MSC以及扩展MSC(EMSC)是常用的消除倍增效应的方法,它们可以在一定程度上减少固体颗粒尺寸(光散射和有效路径长度的差异)或散射效应对光谱数据的影响。

傅立叶变换和小波变换不仅可以消除噪声,而且可以进行基线校正和提取有效的光谱信息。

OSC和NAS属于非独立于响应变量的方法,主要用于去除光谱中与响应变量正交(不相关)的变异,目的是简化分析模型,提高其预测能力。

去噪的负面影响

去噪是抑制或去除叠加在原始光谱信号上的随机误差,目的是提高信噪比(SNR)。常用的去噪技术有移动平均、SavitzkyGolay(SG)、傅立叶变换(FT)和小波变换(WT)。

这些方法可以有效地消除噪声,但它们可能同时带来信号失真,特别是涉及一些尖锐的光谱(拉曼,NMR,LIBS和X射线衍射)。尖峰去噪失真的根本原因是由于分散的频率分布而导致的频谱采样不足。

为了解决这个问题,有人提出了一种基于四步操作的产量调整操作方法。如下图所示,该方法首先识别原始数据中的信号和噪声水平,然后调整高信号水平区域的采样密度并通过线性插值对其进行富集,随后对整形轮廓进行平滑操作,最后将变形轮廓恢复为原始形状。结果表明,该方法的去噪性能优于SG滤波和小波去噪。

预处理代码

MinMaxScaler

MinMaxScaler是一种常用的数据归一化方法,用于将特征的值压缩到一个特定的范围内。它通过对每个特征的最小值和最大值进行缩放,将特征的值映射到[0,1]的区间上。

MinMaxScaler可以有效地缩放特征的取值范围,使得特征之间的比较更加合理,同时也能够消除异常值的影响。

  1. def normalize_spectrum(spectra):
  2. """
  3. :param data: raw spectrum data, shape (n_samples, n_features)
  4. :return: data after MinMaxScaler :(n_samples, n_features)
  5. """
  6. min_value = np.min(spectra)
  7. max_value = np.max(spectra)
  8. normalized_spectra = (spectra - min_value) / (max_value - min_value)
  9. return normalized_spectra

Standard Normal Variate-SNV

标准正态变量(Standard Normal Variate,SNV)是一种常用的光谱数据预处理方法,用于在光谱分析中降低散射效应和仪器响应等不确定性因素的干扰。

SNV的原理如下:

  1. 计算每个样本的平均值(Mean Spectrum):对于给定的光谱数据,计算所有样本的每个波长位置上的平均反射值(或吸光度值)。
  2. 将每个样本的平均值从原始光谱中减去:将每个样本的光谱数据减去其对应波长位置上的平均值。这样做可以去除样本的均值偏移。
  3. 计算每个样本的标准偏差(Standard Deviation Spectrum):对于减去平均值后的光谱数据,计算每个波长位置上的标准偏差。
  4. 将每个样本的光谱数据除以其对应波长位置上的标准偏差:将每个样本的光谱数据除以其对应波长位置上的标准偏差。这样可以对光谱进行标准化处理,使得每个波长上的光谱变化范围是相似的。

通过SNV预处理,可以将光谱数据中的系统性偏移和尺度变化进行校正,提高光谱数据的可比性和可解释性。SNV适用于大多数光谱数据,尤其是在面对样本之间存在强烈的强度差异或仪器响应不均匀的情况下。

请注意,SNV方法的应用需要谨慎,特别是对于具有明显异常值或噪声的光谱数据。

  1. def snv_spectrum(spectra):
  2. mean_value = np.mean(spectra, axis=1, keepdims=True)
  3. std_value = np.std(spectra, axis=1, keepdims=True)
  4. snv_spectra = (spectra - mean_value) / std_value
  5. return snv_spectra

moving_average

移动平均是一种常用的光谱数据预处理方法,用于平滑光谱数据并减小噪声的影响。该方法通过计算每个波长位置周围一定窗口大小的波长范围内数据的平均值来实现平滑。

移动平均的原理如下:

  1. 确定移动平均窗口大小:选择一个合适的窗口大小,通常为奇数,用于计算每个波长位置的平均值。窗口大小确定了平滑程度,较大的窗口会更平滑,但也可能平滑掉一些重要的特征。

  2. 对每个波长位置进行移动平均计算:从第一个波长位置开始,计算该波长及其周围窗口内的数据的平均值。再移动窗口,对下一个波长位置进行计算,以此类推,直到处理完所有波长位置。

  3. 更新光谱数据:将每个波长位置的原始值替换为对应窗口内数据的平均值。这样可以平滑光谱数据,减少噪声对结果的影响。

移动平均是一种简单而有效的光谱数据平滑方法,可以帮助减少高频噪声,并使光谱数据更加平滑和易于分析。但需要注意的是,在使用移动平均进行数据平滑时,窗口大小的选择需要根据实际情况进行调整,以平衡平滑效果和保留特征的需求。如果窗口太小,平滑效果可能不明显,而如果窗口太大,可能会平滑掉重要的光谱特征。因此,要根据具体问题和数据特征来确定最佳的移动平均窗口大小。

  1. def moving_average(spectra, window_size):
  2. num_spectra, num_points = spectra.shape
  3. smoothed_spectra = np.zeros((num_spectra, num_points))
  4. for i in range(num_spectra):
  5. for j in range(num_points):
  6. start = max(0, j - window_size // 2)
  7. end = min(num_points, j + window_size // 2 + 1)
  8. smoothed_spectra[i, j] = np.mean(spectra[i, start:end])
  9. return smoothed_spectra

savitzky_golay_smoothing

Savitzky-Golay平滑是一种常用的光谱数据预处理方法,用于平滑光谱曲线并去除高频噪声的影响。它基于最小二乘多项式拟合,通过拟合局部数据,计算平滑后的曲线。

Savitzky-Golay平滑的原理如下:

  1. 确定参数:确定两个重要的参数,滑动窗口大小(window size)和多项式拟合阶数(polynomial order)。滑动窗口大小确定了平滑区域的大小,而多项式拟合阶数决定了拟合曲线的复杂度。

  2. 确定滑动窗口:将滑动窗口应用于光谱数据,窗口的大小会决定滑动窗口内要拟合的数据点数量。常见的窗口大小为奇数。

  3. 进行多项式拟合:在每个窗口内,采用最小二乘法进行多项式拟合。将窗口内的数据点与多项式进行拟合,得到平滑后的拟合曲线。

  4. 计算平滑数据:对于每个窗口,将拟合曲线在窗口中心的值作为平滑后的数据点。在滑动窗口的过程中,每个数据点都会至少参与一次多项式拟合,从而得到整个光谱数据的平滑曲线。

Savitzky-Golay平滑方法通过使用多项式拟合来估计光谱曲线的趋势,同时消除了高频噪声。与移动平均相比,Savitzky-Golay平滑方法保留了更多光谱的细节,因为它使用多项式进行拟合,可以更好地适应光谱数据的变化。此外,通过调整滑动窗口大小和多项式拟合阶数,可以在平滑效果和保留特征之间进行平衡。

需要注意的是,在应用Savitzky-Golay平滑方法时,需要根据实际情况选择适当的滑动窗口大小和多项式拟合阶数。窗口大小过大可能会平滑掉光谱中的细节,而阶数过高可能导致过度拟合。因此,建议在应用该方法时进行实验和调整,以找到最适合数据集的参数设置。

  1. def savitzky_golay_smoothing(spectra, window_size, polynomial_order,deriv):
  2. smoothed_spectra = np.zeros_like(spectra)
  3. for i in range(spectra.shape[0]):
  4. smoothed_spectra[i] = savgol_filter(spectra[i], window_size, polynomial_order,deriv)
  5. return smoothed_spectra

first_derivative

一阶导数是光谱数据预处理中常用的一种方法,用于检测光谱曲线的变化率。通过计算光谱数据中相邻波长位置间的变化率,可以帮助识别和突出峰值、吸收特征等信号。

一阶导数的原理如下:

  1. 获取原始光谱数据:获得光谱数据,通常是一系列测量值或反射光谱。

  2. 计算相邻波长位置的差异:对于每个波长位置,计算它与相邻波长位置的差异。即,计算当前波长位置的反射光谱值与前一个和后一个波长位置的反射光谱值之间的差异。

  3. 标准化变化率:将差异值除以相邻波长位置间的距离。这样可以消除不同波长位置之间的间距差异,使得得到的变化率在相同的尺度上可比较。

通过计算一阶导数,可以突出反射光谱中的突变、峰值和吸收特征等。一阶导数可以帮助识别和分析光谱中的特征,并用于分析光谱数据中的变化趋势。

需要注意的是,在计算一阶导数时,可能会放大光谱数据中的噪声。因此,在应用一阶导数预处理之前,可以选择进行平滑或滤波操作,以减少噪声的影响。

此外,为了更好地分析光谱数据,可能还需要考虑二阶导数等更高阶的导数计算。每种导数方法都有其适用的场景和属性,根据具体需求选择合适的导数方法进行数据预处理。

  1. def first_derivative(spectra):
  2. num_spectra, num_points = spectra.shape
  3. derivative_spectra = np.zeros((num_spectra, num_points))
  4. for i in range(num_spectra):
  5. derivative_spectra[i, 1:-1] = (spectra[i, 2:] - spectra[i, :-2]) / 2
  6. return derivative_spectra

second_derivative

光谱数据预处理中的二阶导数处理是一种常用的方法,用于增强光谱数据中的特征和边缘信息,以及去除噪声和背景干扰。

二阶导数可以提供光谱数据的局部斜率信息,从而帮助我们检测峰值、谷值和它们之间的距离。通过应用二阶导数,我们可以突出光谱中的特征,使其更易于识别和理解。

需要注意的是,适当的参数选择和平滑方法的选择对于二阶导数处理的效果非常重要,需要针对具体情况进行调整和优化。

  1. def second_derivative(spectra):
  2. num_spectra, num_points = spectra.shape
  3. derivative_spectra = np.zeros((num_spectra, num_points))
  4. for i in range(num_spectra):
  5. derivative_spectra[i, 1:-1] = spectra[i, :-2] - 2 * spectra[i, 1:-1] + spectra[i, 2:]
  6. return derivative_spectra

MSC

多元散射在光谱数据中产生的原因是光线在样本中传播时,与多个其他组分或颗粒发生散射。这种散射会导致光线的路径变长,使得光在样品中的传播过程中发生偏离和扩散,从而影响到光谱信号的强度和形状

  1. def MSC(data):
  2. """
  3. :param data: raw spectrum data, shape (n_samples, n_features)
  4. :return: data after MSC: shape (n_samples, n_features)
  5. """
  6. n, p = data.shape
  7. msc = np.ones((n, p))
  8. mean = np.mean(data, axis=0) # Calculate the mean spectrum
  9. # Linear fitting
  10. for i in range(n):
  11. y = data[i, :]
  12. l = LinearRegression()
  13. l.fit(mean.reshape(-1, 1), y.reshape(-1, 1))
  14. k = l.coef_
  15. b = l.intercept_
  16. msc[i, :] = (y - b) / k
  17. return msc

Fourier Transform smoothing

Fourier Transform (FFT) smoothing是一种基于傅里叶变换的光谱数据预处理方法,旨在减少光谱中的噪声、突发峰和细节变动,以提高数据的平滑性和可读性。

该方法的原理基于傅里叶变换的频域特性。傅里叶变换将信号从时域转换为频域,使得信号在频域中的特征更加明显。对光谱数据应用傅里叶变换后,可以通过滤波的方式在频域中对信号进行平滑处理。

然而,需要注意的是,平滑过程可能会造成数据的一定程度的模糊,因此在选择窗口函数和平滑程度时需要权衡光谱特征的保留和噪声的减少。

  1. from scipy.signal import savgol_filter, general_gaussian
  2. def FT(data,sigma,m):
  3. """
  4. :param data: spectral data, shape (n_samples, n_features)
  5. :return: data after Fourier Transform, shape (n_samples, n_features)
  6. """
  7. n, p = data.shape
  8. dataf = np.zeros((n, p), dtype=np.complex128)
  9. for i in range(n):
  10. Data =np.hstack((data[i,:],np.flip(data[i,:])))
  11. win = np.roll(general_gaussian(Data.shape[0], m, sigma), Data.shape[0]//2)
  12. fdata = np.fft.fft(Data)
  13. dataf[i,:] = np.real(np.fft.ifft(fdata*win))[:data[i,:].shape[0]]
  14. return dataf

 

Fourier_derivative_smoothing

Fourier derivative smoothing(Fourier变换导数平滑)是一种基于傅里叶变换和导数处理的光谱数据预处理方法,旨在同时平滑信号和提取信号的特征。

该方法的原理是将光谱数据转换到频域,然后对频域数据应用导数操作进行平滑处理。导数操作可以提供信号的变化率信息,从而帮助提取信号中的特征和边缘。

使用基于傅里叶的导数平滑的最大优点是,我们可以避免在频谱的极值处丢点。

  1. def Fourier_derivative_smoothing(data,sigma,m):
  2. """
  3. 使用基于傅里叶的导数平滑的最大优点是,我们可以避免在频谱的极值处丢点。
  4. """
  5. n, p = data.shape
  6. dataf = np.zeros((n, p), dtype=np.complex128)
  7. for i in range(n):
  8. Data =np.hstack((data[i,:],np.flip(data[i,:])))
  9. qq =2*np.pi*np.arange(-Data.shape[0]//2,Data.shape[0]//2,1)/Data.shape[0]
  10. win = np.roll(general_gaussian(Data.shape[0], m, 0.5*sigma), Data.shape[0]//2)
  11. fdata = np.fft.fft(Data)
  12. f2data = np.roll(np.roll(fdata, -Data.shape[0]//2)*(-qq**2),Data.shape[0]//2)
  13. dataf[i,:] = np.real(np.fft.ifft(f2data*win))[:data[i,:].shape[0]]
  14. return dataf

感谢关注!收藏!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/398587
推荐阅读
相关标签
  

闽ICP备14008679号