大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」
在光谱学领域,数据预处理是不可或缺的一环。
本文将基于 NIR soil 近红外光谱数据,运用 Python 语言进行数据处理,并通过图表直观反映预处理带来的变化。(数据集:后台回复 [ NIR soil ] 获取 )
常用的光谱数据预处理技术包括:
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(多元散射校正)处理后的光谱数据。
原始光谱(左侧图)
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(标准正规化变换)处理后的光谱数据。
原始光谱(左侧图)
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()
在输出的图片中,左侧显示的是原始光谱数据,右侧显示的是经过基线校正处理后的光谱数据。
原始光谱(左侧图)
基线校正后的光谱(右侧图)
总结
防失联,进免费知识星球交流。算法知识直达星球: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()
在输出的图片中,左侧显示的是原始光谱数据,右侧显示的是经过去趋势处理后的光谱数据。
原始光谱(左侧图)
去趋势后的光谱(右侧图)
总结
更多内容,见微*公号往期文章: 审稿人:拜托,请把模型时间序列去趋势!!
- 科研为国分忧,创新与民造福 -
日更时间紧任务急,难免有疏漏之处,还请大侠海涵 内容仅供学习交流之用,部分素材来自网络,侵联删
如果觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;
同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。