资深博导:我以为数据预处理是常识,直到遇到自己的学生

· 浏览次数 : 1

小编点评

本文主要介绍了光谱数据预处理的重要性和几种常用的预处理技术,包括MSC(多元散射校正)、SNV(标准正规化变换)、光谱微分、基线校正和去趋势。 **1. 多元散射校正 (MSC)** MSC是一种常用的光谱数据预处理方法,用于消除光谱数据中的散射效应和基线漂移。通过计算参考光谱并校正每个样本的光谱数据,MSC可以提高数据质量,增强不同样本之间的可比性。 **2. 标准正规化变换 (SNV)** SNV是另一种光谱数据预处理技术,通过将每个样本减去其均值并除以其标准差来标准化数据。这种方法可以有效消除样本间的散射效应和噪声,提高数据的一致性和可比性。 **3. 光谱微分** 光谱微分是一种通过计算光谱数据的一阶或二阶导数来突出光谱特征的方法。一阶微分可以减少基线漂移的影响,而二阶微分可以揭示光谱中的细微变化。 **4. 基线校正** 基线校正是一种通过去除光谱数据中的系统性趋势来提高数据质量的方法。常用的基线校正方法包括AsLS(自动最小二乘法)和多项式基线校正。 **5. 去趋势** 去趋势处理是一种通过去除光谱数据中的系统性趋势来使数据更加平稳的方法。这种方法常用于消除实验条件、测量误差等因素对光谱数据的影响。 综上所述,光谱数据预处理是光谱分析和建模过程中的关键步骤,通过采用合适的预处理技术,可以提高数据质量,增强模型的准确性和可靠性。

正文

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」

在光谱学领域,数据预处理是不可或缺的一环。

本文将基于 NIR soil 近红外光谱数据,运用 Python 语言进行数据处理,并通过图表直观反映预处理带来的变化。(数据集:后台回复 [ NIR soil ] 获取 )

常用的光谱数据预处理技术包括:

  1. MSC(多元散射校正)
  2. SNV(标准正规化变换)
  3. 光谱微分
  4. 基线校正
  5. 去趋势

一、MSC(多元散射校正)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

# 读取数据
nirsoil_df = pd.read_csv(path)

# 提取光谱数据
spectra = nirsoil_df.filter(like='spc.')

# 进行MSC预处理
def msc(input_data):
    # 计算参考光谱(均值光谱)
    ref_spectrum = np.mean(input_data, axis=0)
    # 初始化校正后的光谱数据矩阵
    corrected_spectra = np.zeros_like(input_data)

    for i in range(input_data.shape[0]):
        fit = np.polyfit(ref_spectrum, input_data[i, :], 1, full=True)
        corrected_spectra[i, :] = (input_data[i, :] - fit[0][1]) / fit[0][0]

    return corrected_spectra

# 应用MSC
msc_spectra = msc(spectra.values)

# 可视化对比
plt.figure(figsize=(12, 6))

# 原始光谱
plt.subplot(1, 2, 1)
plt.plot(spectra.values.T, color='blue', alpha=0.1)
plt.title('Original Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

# MSC校正后的光谱
plt.subplot(1, 2, 2)
plt.plot(msc_spectra.T, color='red', alpha=0.1)
plt.title('MSC Corrected Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

plt.tight_layout()


在输出的图片中,左侧显示的是原始光谱数据,右侧显示的是经过MSC(多元散射校正)处理后的光谱数据。

原始光谱(左侧图)

  • 颜色和形状:每条蓝色的线代表一个样本的光谱数据,颜色浅且分布较散。
  • 特点:可以观察到光谱数据在某些波长处的反射率(Reflectance)存在一定的波动,这可能是由于散射效应和基线漂移引起的。

MSC校正后的光谱(右侧图)

  • 颜色和形状:每条红色的线代表一个样本的校正后的光谱数据,颜色浅且分布较集中。
  • 特点:校正后的光谱数据在各个波长处的反射率(Reflectance)更加一致,减少了由散射效应和基线漂移引起的变化。整体曲线更加平滑,差异性减少。

总结

  • 变化:经过MSC处理后,光谱数据在整体上变得更加一致和平滑,减少了不必要的噪音和变动,使得数据更适合后续的分析和建模。
  • 意义:MSC处理通过消除光谱数据中的散射效应和基线漂移,提高了数据的质量,增强了不同样本之间的可比性。

防失联,进免费知识星球交流。算法知识直达星球:https://t.zsxq.com/ckSu3

更多内容,见免费知识星球

二、SNV(标准正规化变换)

# 提取光谱数据
spectra = nirsoil_df.filter(like='spc.')

# 进行SNV预处理
def snv(input_data):
    # 每个样本减去其均值,然后除以其标准差
    corrected_spectra = (input_data - np.mean(input_data, axis=1, keepdims=True)) / np.std(input_data, axis=1, keepdims=True)
    return corrected_spectra

# 应用SNV
snv_spectra = snv(spectra.values)

# 可视化对比
plt.figure(figsize=(12, 6))

# 原始光谱
plt.subplot(1, 2, 1)
plt.plot(spectra.values.T, color='blue', alpha=0.1)
plt.title('Original Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

# SNV校正后的光谱
plt.subplot(1, 2, 2)
plt.plot(snv_spectra.T, color='green', alpha=0.1)
plt.title('SNV Corrected Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

plt.tight_layout()
plt.show()

在输出的图片中,左侧显示的是原始光谱数据,右侧显示的是经过SNV(标准正规化变换)处理后的光谱数据。

原始光谱(左侧图)

  • 颜色和形状:每条蓝色的线代表一个样本的光谱数据,颜色浅且分布较散。
  • 特点:可以观察到光谱数据在某些波长处的反射率(Reflectance)存在一定的波动,这可能是由于样本间的差异和噪声引起的。

SNV校正后的光谱(右侧图)

  • 颜色和形状:每条绿色的线代表一个样本的校正后的光谱数据,颜色浅且分布较集中。
  • 特点:校正后的光谱数据在各个波长处的反射率(Reflectance)变得更加一致,样本间的差异和噪声显著减少。每条曲线的均值为零,标准差为一,使得所有光谱都在同一个尺度上。

总结

  • 变化:经过SNV处理后,光谱数据的均值被中心化为零,标准差被标准化为一,减少了由于不同样本间的散射效应和噪声带来的影响。
  • 意义:SNV处理通过对每个样本的光谱数据进行均值中心化和标准化,消除了样本间的散射效应,提高了数据的一致性和可比性,使得数据更适合后续的分析和建模。

三、光谱微分

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 读取数据
# nirsoil_df = pd.read_csv('path_to_your_csv.csv')

# 提取光谱数据
spectra = nirsoil_df.filter(like='spc.')

# 进行光谱微分处理
def spectral_derivative(input_data, order=1):
    if order == 1:
        derivative_spectra = np.diff(input_data, n=1, axis=1)
    elif order == 2:
        derivative_spectra = np.diff(input_data, n=2, axis=1)
    else:
        raise ValueError("Only first and second order derivatives are supported.")
    return derivative_spectra

# 一阶微分
first_derivative = spectral_derivative(spectra.values, order=1)

# 二阶微分
second_derivative = spectral_derivative(spectra.values, order=2)

# 可视化对比
plt.figure(figsize=(12, 6))

# 一阶和二阶微分
plt.plot(first_derivative[0, :], label='1st Derivative', color='black')
plt.plot(second_derivative[0, :], label='2nd Derivative', color='red')

plt.title('Spectral Derivatives')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')
plt.legend()
plt.grid(True)
plt.show()

在输出的图片中,我们同时展示了一阶微分和二阶微分处理后的光谱数据。

一阶微分(黑色线)

  • 特点:一阶微分曲线展示了光谱数据在各个波长处的变化率。它突出了光谱曲线的斜率变化,强调了光谱数据中快速变化的区域。
  • 用途:一阶微分处理可以减少基线漂移的影响,并增强光谱中微弱的特征和变化。这对于区分类似的光谱样本非常有用。

二阶微分(红色线)

  • 特点:二阶微分曲线展示了光谱数据的曲率变化率。它进一步强调了光谱曲线的局部最大值和最小值,突出了更细微的变化。
  • 用途:二阶微分处理可以进一步减少基线漂移和噪声的影响,并提供更多关于光谱中细节特征的信息。这对于精细分析光谱数据中的细节特征非常有用。

总结

  • 变化:一阶和二阶微分处理后,光谱数据的变化率和曲率变化率被突出展示,增强了光谱中细节特征的可见性,减少了基线漂移和噪声的影响。
  • 意义:导数处理通过强调光谱数据的变化率和曲率变化率,提供了更清晰的特征和模式,有助于后续的分析和建模。

抱个拳,送个礼

点击 ↑ 领取

四、基线校正

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

# 读取数据
# nirsoil_df = pd.read_csv('path_to_your_csv.csv')

# 提取光谱数据
spectra = nirsoil_df.filter(like='spc.')

# 进行AsLS基线校正
def baseline_als(y, lam=1e5, p=0.01, niter=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 i in range(niter):
        W = diags(w, 0, shape=(L, L))
        Z = W + D
        z = spsolve(Z, w*y)
        w = p * (y > z) + (1-p) * (y < z)
    return z

def baseline_correction(input_data):
    corrected_spectra = np.zeros_like(input_data)
    for i in range(input_data.shape[0]):
        baseline_values = baseline_als(input_data[i, :])
        corrected_spectra[i, :] = input_data[i, :] - baseline_values
    return corrected_spectra

# 应用基线校正
corrected_spectra = baseline_correction(spectra.values)

# 可视化对比
plt.figure(figsize=(12, 6))

# 原始光谱
plt.subplot(1, 2, 1)
plt.plot(spectra.values.T, color='blue', alpha=0.1)
plt.title('Original Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

# 基线校正后的光谱
plt.subplot(1, 2, 2)
plt.plot(corrected_spectra.T, color='green', alpha=0.1)
plt.title('Baseline Corrected Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

plt.tight_layout()
plt.show()

在输出的图片中,左侧显示的是原始光谱数据,右侧显示的是经过基线校正处理后的光谱数据。

原始光谱(左侧图)

  • 颜色和形状:每条蓝色的线代表一个样本的光谱数据,颜色浅且分布较散。
  • 特点:可以观察到光谱数据在各个波长处的反射率(Reflectance)存在一定的基线漂移和噪声,这可能是由测量误差和环境因素引起的。

基线校正后的光谱(右侧图)

  • 颜色和形状:每条绿色的线代表一个样本的校正后的光谱数据,颜色浅且分布较集中。
  • 特点:校正后的光谱数据在各个波长处的反射率(Reflectance)变得更加一致,基线漂移被去除,噪声显著减少。曲线的整体趋势更加平滑和稳定。

总结

  • 变化:经过基线校正处理后,光谱数据的基线漂移被有效去除,减少了由测量误差和环境因素带来的影响,使得光谱数据更加清晰和稳定。
  • 意义:基线校正处理通过去除光谱数据中的基线漂移,提高了数据的质量和一致性,便于后续的分析和建模。

防失联,进免费知识星球交流。算法知识直达星球:https://t.zsxq.com/ckSu3

免费知识星球,欢迎加入交流

五、去趋势

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import detrend

# # 读取数据
# nirsoil_df = pd.read_csv('path_to_your_csv.csv')

# 提取光谱数据
spectra = nirsoil_df.filter(like='spc.')

# 进行去趋势处理
def detrending(input_data):
    detrended_spectra = detrend(input_data, axis=1)
    return detrended_spectra

# 应用去趋势处理
detrended_spectra = detrending(spectra.values)

# 可视化对比
plt.figure(figsize=(12, 6))

# 原始光谱
plt.subplot(1, 2, 1)
plt.plot(spectra.values.T, color='blue', alpha=0.1)
plt.title('Original Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

# 去趋势后的光谱
plt.subplot(1, 2, 2)
plt.plot(detrended_spectra.T, color='brown', alpha=0.1)
plt.title('Detrended Spectra')
plt.xlabel('Wavelength Index')
plt.ylabel('Reflectance')

plt.tight_layout()
plt.show()

在输出的图片中,左侧显示的是原始光谱数据,右侧显示的是经过去趋势处理后的光谱数据。

原始光谱(左侧图)

  • 颜色和形状:每条蓝色的线代表一个样本的光谱数据,颜色浅且分布较散。
  • 特点:光谱数据在各个波长处的反射率(Reflectance)存在一定的趋势,这些趋势可能是由实验条件、测量误差等因素引起的。

去趋势后的光谱(右侧图)

  • 颜色和形状:每条棕色的线代表一个样本的去趋势处理后的光谱数据,颜色浅且分布较集中。
  • 特点:去趋势处理后,光谱数据中各个波长处的趋势被去除,数据更加平稳和一致,减少了由实验条件、测量误差等因素带来的系统性偏差。

总结

  • 变化:经过去趋势处理后,光谱数据中的系统性趋势被去除,光谱曲线更加平稳和一致,减少了外部因素带来的系统性偏差。
  • 意义:去趋势处理通过去除光谱数据中的系统性趋势,提高了数据的质量和一致性,使得光谱数据更适合后续的分析和建模。

更多内容,见微*公号往期文章: 审稿人:拜托,请把模型时间序列去趋势!!

[ 抱个拳,总个结 ]

- 科研为国分忧,创新与民造福 -

日更时间紧任务急,难免有疏漏之处,还请大侠海涵 内容仅供学习交流之用,部分素材来自网络,侵联删

[ 算法金,碎碎念 ]

全网同名,日更万日,让更多人享受智能乐趣

如果觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;

同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖

与资深博导:我以为数据预处理是常识,直到遇到自己的学生相似的内容:

资深博导:我以为数据预处理是常识,直到遇到自己的学生

​ 大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 在光谱学领域,数据预处理是不可或缺的一环。 本文将基于 NIR soil 近红外光谱数据,运用 Python 语言进行数据处理,并通过图表直观反映预处理带来的变化。(数据集:后台回复

【Dotnet 工具箱】推荐一个使用Flutter编写的博客园客户端

推荐一个使用 Flutter 编写的博客园客户端 简单易用并且同时支持Android/Ios平台。 功能包含博客园首页、新闻列表、博问列表 、闪存、我的博客、知识库等。 截图预览 博客园首页 新闻列表 博问列表 闪存列表 我的 我的资料 我的博客 知识库 博客内容 粉丝关注 在启动项目之前,需要在根

CefSharp自定义缓存实现

大家好,我是沙漠尽头的狼。 上文介绍了《C#使用CefSharp内嵌网页-并给出C#与JS的交互示例》,本文介绍CefSharp的缓存实现,先来说说添加缓存的好处: 提高页面加载加速:CefSharp缓存可以缓存已经加载过的页面和资源,当用户再次访问相同的页面时,可以直接从缓存中加载,而不需要重新下

【c#表达式树】最完善的表达式树Expression.Dynamic的玩法

引言 在我第一次写博客的时候,写的第一篇文章,就是关于表达式树的,链接:https://www.cnblogs.com/1996-Chinese-Chen/p/14987967.html,其中,当时一直没有研究Expression.Dynamic的使用方法(因为网上找不到资料),就了解到是程序运行时

整理并发布本科四年的课程资料

可恶,我的本科课程资料 repo 已发布半年,但是发现的人实在是太少了。 如此高质量的课程资料,埋没在互联网中实在可惜,于是写一篇博客引流→ tag: 东南大学 | 计算机科学与技术 | 09 系 | 2019 级 | 专业课 | 往年真题 | 课程笔记 | 期末大作业 数据结构 | 计算机组成原理

[转帖]350W+ CPU、700W+ GPU功耗:冷板和浸没式液冷哪个更有前途?

https://aijishu.com/a/1060000000363530 液冷技术方面我算不上专业,因为最近在一篇博客中看到不错的资料,这里分享给大家顺便做点讨论。 大家应该知道,Intel代号Sapphire Rapids的下一代Xeon处理器最高TDP将达到350W,AMD EPYC4功耗也

基于.NetCore开发博客项目 StarBlog - (29) 开发RSS订阅功能

## 前言 最近忙中偷闲把博客的评论功能给做完了,我可以说这个评论功能已经达到「精致」的程度了😃 但在正式发布之前,先卖个关子,来介绍一下另一个新功能——RSS订阅🔊 ## RSS是啥 来自hk gov新闻网的介绍~ > RSS 是簡易資訊聚合(Really Simple Syndication

[转帖]存算一体芯片技术及其最新发展趋势

https://zhuanlan.zhihu.com/p/450985519 ■作者:陈巍 博士 资深芯片专家,人工智能算法-芯片协同设计专家,擅长芯片架构与存算一体。国内首个可重构存算处理器架构(已在互联网大厂完成原型内测),首个医疗领域专用AI处理器(已落地应用),首个RISC-V/x86/AR

[转帖]存算一体技术是什么?发展史、优势、应用方向、主要介质(收录于存算一体芯片赛道投资融资分析/20220517更新)

https://zhuanlan.zhihu.com/p/480612865 本文深入浅出的介绍存算一体技术的概念、发展历史、技术优势、应用方向、主要介质、技术比对等。 作者 ■ 陈巍 博士 资深芯片专家,人工智能算法-芯片协同设计专家,擅长芯片架构与存算一体。国内首个可重构存算处理器架构(已在互联

Go变量作用域精讲及代码实战

关注作者,复旦AI博士,分享AI领域与云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕博,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 精讲