本周一是阅读了基于集成深度神经网络的大规模水质预测的论文,其首先是应用SG滤波器去实现水质数据平滑去噪,再将预处理后的数据,输入给基于LSTM的编码器-解码器神经网络模型去提取水质数据的特征,。对SG滤波器的原理的理解与基于python简单实现SG滤波器的平滑去噪处理,并在滤除噪声的同时可以确保信号的形状、宽度不变。
二是对用OrdinaryKriging模型,去简单实现克里金的空间插值。
文献阅读
作者:Jing Bi, Yongze Lin, Quanxi Dong, Haitao Yuan.
参与单位:北京工业大学信息技术学院软件工程学院
中国北京航空航天大学自动化科学与电气工程学院
中国电子与计算机工程系,新泽西理工学院(2021.4.11日最终版)
水环境时间序列预测是水资源有效管理的重要内容。传统的水质预测主要基于线性模型。然而,由于水环境条件复杂,水质时间序列中存在大量噪声,严重影响水质预测的准确性。另外,线性模型难以处理时间序列数据的非线性关系。为了应对这一挑战,本文提出了一种基于长-短记忆编码-解码神经网络和Savitzky-Golay滤波器的混合模型。其中,Savitzky-Golay滤波器可以消除水质时间序列中的潜在噪声,长-短记忆可以研究复杂水环境中的非线性特征。通过这种方式,提出了一个综合模型,有效地获得了统计特征。基于真实数据的实验证明,它的预测性能优于几种最先进的同行。
为了精准预测DO(溶氧量)与CODMN(化学需要量)等重要水质指标,改善水环境的管理。各种水质指标往往随时间动态变化。准确的水质预测可以帮助水环境管理部门做出决策,从而确保水质值在合理范围内。预测方法:从线性方法(ARIMA,MA)等,到(SVM,ANN,auto-encode,BPNN )等非线性方法,或者有线性与非线性方法的组合。本文引入LSTM可以更好的捕获水质数据的特征,并由于数据中存在噪声,预测模型往往存在过度拟合问题。Savitzky-Golay(SG)滤波器(过滤掉不想要的信号波,杂波)可以减少时间序列的噪声干扰,提高上述模型的预测精度。
Li等人结合LSTM和稀疏自动编码器设计了一种混合预测模型。由稀疏自动编码器预训练的隐藏层中的数据包含水质的潜在特征。该深度模型有效地提高了多步预测的精度。Dong等人采用基本的LSTM模型来预测水质。Bi等人采用注意机制来预测水质。然而,这些模型未能改善LSTM的网络结构。与上述模型不同,我们提出的模型改进了编解码网络结构,使其更好地适应多步时间序列预测。同时,为了解决时间序列数据的降噪问题,本文采用SG滤波器对原始数据进行去噪。
本文设计了一个基于LSTM的编码器-解码器神经网络和SG滤波器(SELSTM)的混合模型来预测未来的水质。(SG滤波器可以在去除噪声的同时有效地保留时间序列的特性)
为了消除水质的频繁变化,我们使用SG过滤器来减少噪声的干扰。该滤波器在去噪过程中保留了数据的有效信息。然后,通过线性最小二乘法对每个数据子序列进行拟合。
为了获得更好的预测精度,本工作提出了一种新的编码器-解码器神经网络,其结构如图:
训练模型:
输入:水质序列{ x 1 ; x 2 ; . . . ; x T x_1;x_2;...;x_T x1;x2;...;xT}
输出:预测序列{ y 1 ; y 2 ; . . . ; y 涛 t y_1;y_2;...;y_涛t y1;y2;...;y涛t}
为了证明SE-LSTM的预测性能,采用三个指标来评价其预测精度。
三个评估标准公式如下:
数据来源:
水环境实验数据集采集自中国北京市古北口。该数据每4小时收集一次,从2014年4月到2018年10月共收集了超过1万条数据。然后,数据集被分成两个部分,包括训练集和测试集,比例为9:1。所有预测模型均采用DO和CODMn作为实验数据。
简介:
1 . Savitzky-Golay平滑滤波是光谱预处理中常用滤波方法,它的核心思想:是对一定长度窗口内的数据点进行k阶多项式拟合,从而得到拟合后的结果。 对它进行离散化处理后后,S-G 滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。
2 . Savitzky-Golay平滑滤波被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器最大的特点在于在滤除噪声的同时可以确保信号的形状、宽度不变。
3 . 用平滑滤波器对信号滤波时,实际上是拟合了信号中的低频成分,而将高频成分平滑出去了。 如果噪声在高频端,那么滤波的结果就是去除了噪声,反之,若噪声在低频段,那么滤波的结果就是留下了噪声。
公式推导:
设滤波窗口的宽度为 n = 2 m + 1 n=2m+1 n=2m+1,各测量点为 x = ( − m , − m + 1 , ⋯ , 0 , 1 , ⋯ , m − 1 , m ) x=(-m, -m+1, \cdots, 0, 1, \cdots, m-1, m ) x=(−m,−m+1,⋯,0,1,⋯,m−1,m),采用 k − 1 k−1 k−1 次多项式对窗口内的数据点进行拟合:
y = a 0 + a 1 x + a 2 x 2 + ⋯ + a k − 1 x k − 1 y = a_0 + a_1 x + a_2 x^2 + \cdots + a_{k-1} x^{k-1} y=a0+a1x+a2x2+⋯+ak−1xk−1
于是就有了 n n n 个这样的方程,构成了 k k k 元线性方程组。要使方程组有解则 n n n 应大于等于 k k k,一般选择 n > k n>k n>k,通过最小二乘法拟合确定拟合参数 A A A。由此可得到:
上述公式可能过于复杂不方便理解,我们假设一个五点三次平滑公式,即 m = 2 m = 2 m=2 , n = 2 ∗ 2 + 1 = 5 n = 2 ∗ 2 + 1 = 5 n=2∗2+1=5 , k = 3 k = 3 k=3 ,代入公式:
转换成矩阵表示的形式为:
Y ( 2 m + 1 ) × 1 Y_(2m+1)×1 Y(2m+1)×1 = X ( 2 m + 1 ) × k X _(2m+1)×k X(2m+1)×k ⋅ A ( k × 1 ) A_ (k×1) A(k×1)+ E ( 2 m + 1 ) × 1 E _(2m+1)×1 E(2m+1)×1
A 的最小二乘解 A − A^- A− 为:
A − = ( X T ⋅ X ) − 1 ⋅ X T ⋅ Y A^-=(X ^T⋅X)-1⋅X^ T⋅Y A−=(XT⋅X)−1⋅XT⋅Y
Savitzky-Golay 滤波器代码实现曲线平滑
python中Savitzky-Golay滤波器调用如下:
两种调用方法
y_smooth = scipy.signal.savgol_filter(y,53,3)
# 或者
y_smooth2 = savgol_filter(y, 99, 1, mode= 'nearest')
# 注意:
y:代表曲线点坐标(x,y)中的y值数组
window_length:窗口长度,该值需为正奇整数。例如:此处取值53
k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
**mode**:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied. )
实现平滑数据简单案例:
import numpy as np
import matplotlib.pyplot as plt
Size = 100
x = np.linspace(1, Size, Size)
data = np.random.randint(1, Size, Size)
print(data)
# >> >
# array([97 78 27 7 83 97 70 64 92 53 28 21 36 97 68 67 72 73 22 57 70 61 93 75
# 76 59 51 17 43 97 92 84 43 70 92 16 59 10 64 60 7 12 42 65 23 14 12 40
# 66 49 77 17 19 93 70 72 36 69 71 44 67 70 64 79 31 9 88 3 64 67 64 58
# 52 20 97 73 72 15 18 60 36 50 83 47 10 6 15 55 76 72 66 88 68 64 18 72
# 60 92 56 21])
# 可视化图线
plt.plot(x, data)
#plt.show()
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
y = savgol_filter(data, 5, 3, mode='nearest')
# 可视化图线
plot1 = plt.plot(x, data, 'b', label='original values')
plot2=plt.plot(x, y, 'r', label='savgol')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.show()
效果图展示:
注:blue为原始数据,red为SG滤波器平滑去噪后数据。
(1)window_length对曲线的平滑作用: window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害(备注:该值必须为正奇整数)。
(2)k值对曲线的平滑作用: k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线。
本周只是看了基于python下载克里金插值函数包pykrige,并没有详细拆开,只是直接利用OrdinaryKriging模型,去简单实现克里金的空间插值。
from pykrige.ok import OrdinaryKriging
import numpy as np
from matplotlib import pyplot as plt
import xlrd #读取excel的库
# 已知采样点的数据,是坐标(x,y)和坐标对应的值
# 矩阵中第一列是x,第二列是y,第三列是坐标对应的值
# data 样例格式
# data = np.array(
# [
# [0.1, 0.1, 0.9],
# [0.2, 0.1, 0.8],
# [0.1, 0.3, 0.9],
# [0.5, 0.4, 0.5],
# [0.3, 0.3, 0.7],
# ])
resArray=[] # 先声明一个空list
data = xlrd.open_workbook("guiyihua.xlsx") #读取文件
table = data.sheet_by_index(0) # 按索引获取工作表,0就是工作表1
for i in range(table.nrows): # table.nrows表示总行数
line=table.row_values(i) # 读取每行数据,保存在line里面,line是list
resArray.append(line) # 将line加入到resArray中,resArray是二维list
resArray=np.array(resArray) # 将resArray从二维list变成数组
# a = np.squeeze(resArray, 0)
# print(a)
# 绘图 网格
x_range = 1.0
y_range = 1.0
range_step = 0.1 # 步长
gridx = np.arange(0.0, x_range, range_step) #三个参数的意思:范围0.0 - 1.0 ,每隔0.1划分一个网格
gridy = np.arange(0.0, y_range, range_step)
ok3d = OrdinaryKriging(resArray[:, 0], resArray[:, 1], resArray[:, 2], variogram_model="linear") # 模型
# variogram_model 是变差函数模型
# pykrige提供 linear, power, gaussian, spherical, exponential, hole-effect
# 几种variogram_model可供选择,默认的为linear模型
# 使用不同的variogram_model,预测效果是不一样的,应该针对自己的任务选择合适的variogram_model
k3d1, ss3d = ok3d.execute("grid", gridx, gridy) # k3d1是结果,给出了每个网格点处对应的值
print(np.round(k3d1,2))
#输出的结果
# [[21.34 21.25 21.17 21.1 21.04 20.96 20.84 20.71 20.56 20.43]
# [21.38 21.28 21.18 21.09 21.03 20.98 20.9 20.7 20.51 20.35]
# [21.43 21.32 21.2 21.06 21.01 21.0 20.9 20.68 20.42 20.25]
# [21.5 21.38 21.25 21.14 21.08 21.04 20.93 20.66 20.32 20.09]
# [21.58 21.46 21.33 21.21 21.22 21.11 20.95 20.64 20.25 19.98]
# [21.69 21.57 21.41 21.26 21.22 21.05 20.83 20.51 20.15 19.93]
# [21.83 21.72 21.56 21.39 21.24 21.07 20.81 20.44 20.13 20.01]
# [21.96 21.88 21.74 21.57 21.46 21.26 20.9 20.51 20.2 20.06]
# [22.08 21.97 21.82 21.66 21.5 21.3 21.0 20.69 20.4 20.16]
# [22.07 21.97 21.83 21.68 21.51 21.31 21.07 20.83 20.58 20.25]]
# 绘图
fig, (ax1) = plt.subplots(1)
ax1.imshow(k3d1, origin="lower")
ax1.set_title("ordinary kriging")
plt.tight_layout()
plt.show()
1.接下来计划将包解开详细看,对照数学公式,理解背后机制;对其中的半方差函数应该是怎样去拟合的,网络该如何去替换。目前还是不清楚。
2.快速学习python数据分析工具,以及pytorch框架的各模型的搭建,跑通经典模型。
无
指导学弟完成了开题报告,以及准备开题答辩工作。