光谱分析预处理工具箱(一)总览
本来一直想基于pyqt5写一个小小的光谱分析软件。集成搜索最佳预处理,GPU加速支持等。并想把AutoML技术用上,自动实现特征工程,机器学习模型搜索和超参数搜索,然后集成各种模型得出最后的模型,完全自动化只需少量人工干预。
**自动机器学习(AutoML)**是将机器学习应用于现实问题的端到端流程自动化的过程。
传统机器学习模型大致可分为以下四个部分:数据采集、数据预处理、优化、应用;
其中数据预处理与模型优化部分往往需要具备专业知识的数据科学家来完成,他们建立起了数据到计算的桥梁。
然而,即使是数据科学家,也需要花费大量的精力来进行算法与模型的选择。
机器学习在各种应用中的成功,导致对机器学习从业人员的需求不断增长,因此我们希望实现真正意义上的机器学习,让尽可能多的工作也能够被自动化完成,进一步降低机器学习的门槛,让没有该领域专业知识的人也可以使用机器学习来完成相关的工作。
AutoML应运而生。
从传统机器学习模型出发,AutoML从特征工程、模型构建、超参优化三方面实现自动化;并且也提出了end-to-end的解决方案。
但是我还是在校大学生,目前比较忙,没有时间做,有时间再写成一个python框架并发布到git。这里先将一些光谱预处理的工具发布出来,这是第一篇,总览,写的很粗糙,只做了一些参数的标注。以后有时间的话会慢慢介绍各种光谱预处理算法。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import signal
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler,StandardScaler
# 最大最小值归一化
def MMS(data):
return MinMaxScaler().fit_transform(data)
# 标准化
def SS(data):
return StandardScaler().fit_transform(data)
# 均值中心化
def CT(data):
for i in range(data.shape[0]):
MEAN = np.mean(data[i])
data[i]=data[i]-MEAN
return data
# 标准正态变换
def SNV(data):
for i in range(data.shape[0]):
MEAN = np.mean(data[i]) # 计算平均值
STD = np.std(data[i],ddof=1) # 标准偏差
data[i] = (data[i] - MEAN)/STD
return data
# 移动平均平滑
# WSZ是窗口宽度,是奇数
def MA(a,WSZ=21):
for i in range(a.shape[0]):
out0 = np.convolve(a[i],np.ones(WSZ,dtype=int),'valid')/WSZ
r = np.arange(1,WSZ-1,2)
start = np.cumsum(a[i,:WSZ-1])[::2]/r
stop = (np.cumsum(a[i,:-WSZ:-1])[::2]/r)[::-1]
a[i] = np.concatenate(( start , out0, stop ))
return a
# Savitzky-Golay平滑滤波,w和q为参数
def SG(data,w=21,p=3):
return signal.savgol_filter(data,w,p)
# 一阶导数
def D1(data):
n,p = data.shape
Di = np.ones((n,p-1))
for i in range(n):
Di[i] = np.diff(data[i])
return Di
# 二阶导数
def D2(data):
n,p = data.shape
Di = np.ones((n,p-2))
for i in range(n):
Di[i] = np.diff(np.diff(data[i]))
return Di
# 趋势校正(DT)
def DT(data):
x = np.asarray(range(350,2501),dtype = np.float32)
out = np.array(data)
l = LinearRegression()
for i in range(out.shape[0]):
l.fit(x.reshape(-1,1),out[i].reshape(-1,1))
k = l.coef_
b = l.intercept_
for j in range(out.shape[1]):
out[i][j] = out[i][j]-(j*k+b)
return out
# 多元散射校正
# MSC(数据)
def MSC(Data):
# 计算平均光谱
n,p = Data.shape
msc = tp.ones((n,p))
for j in range(n):
mean = tp.mean(Data,axis = 0)
# 线性拟合
for i in range(n):
y = Data[i,:]
l = LinearRegression()
l.fit(mean.reshape(-1,1),y.reshape(-1,1))
k = l.coef_
b = l.intercept_
msc[i,:] = (y - b) / k
return msc