【6】python生成数据曲线平滑处理——(Savitzky

【6】python生成数据曲线平滑处理——(Savitzky

相关文章:

Python xlwt数据保存到 Excel中以及xlrd读取excel文件画图

先上效果图:

由于高频某些点的波动导致高频曲线非常难看,为了降低噪声干扰,需要对曲线做平滑处理,让曲线过渡更平滑,可以看出经过平滑处理后更明显去除噪声且更加美观。

1.滑动平均滤波滑动平均滤波法 (又称:递推平均滤波法),它把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。

优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。

缺点: 灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM 。

效果如下:卷积核越大越平滑。

Numpy.convolve函数:(numpy.convolve函数官方文档)

代码语言:javascript复制numpy.convolve(data, kernel, mode=‘full’) # 返回a=data和kernel的离散线性卷积。参数说明:data:(N,)输入的第一个一维数组

kernel:(M,)输入的第二个一维数组

和一维卷积参数类似,data就是被卷积数据,kernel是卷积核大小。

mode:{‘full’, ‘valid’, ‘same’}参数可选,该参数指定np.convolve函数如何处理边缘。

mode可能的三种取值情况:

full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。‘valid’ 返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。(推荐这种)代码如下:

代码语言:javascript复制import xlwt

import random

import numpy as np

from scipy.signal import savgol_filter

import matplotlib.pyplot as plt

import xlrd

import scipy

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

x_data=[]

y_data=[]

x_data1=[]

y_data1=[]

x_data3=[]

x_data4=[]

data = xlrd.open_workbook('train_reward.xls')

table = data.sheets()[0]

data1 = xlrd.open_workbook('train_reward_2.xls')

table1 = data1.sheets()[0]

cap = table.col_values(1) #读取第二列数据

cap1 = table.col_values(0)#读取第一列数据

#print(cap) #打印出来检验是否正确读取

cap2 = table1.col_values(1) #读取第二列数据

cap3 = table1.col_values(0)#读取第一列数据

#print(cap) #打印出来检验是否正确读取

for i in range(1,9999):

y_data.append(cap[i])

# x_data.append(cap1[i]*50) #对第一列数据扩大50倍

x_data.append(cap1[i]) #对第一列数据扩大50倍

for i in range(1,2231):

y_data1.append(cap2[i])

# x_data.append(cap1[i]*50) #对第一列数据扩大50倍

x_data1.append(cap3[i]) #对第一列数据扩大50倍

#?平滑处理:

modes = ['full', 'same', 'valid'] #模式

# mode可能的三种取值情况:

# full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。

# ‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。

# ‘valid’ 返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。

def moving_average(interval, windowsize):

window = np.ones(int(windowsize)) / float(windowsize)

for m in modes:

re = np.convolve(interval, window, 'valid')

return re

for i in range(1,9975):

x_data3.append(i)

for i in range(1,2207):

x_data4.append(i)

plt.plot(x_data, y_data, 'g',label ="TD3",alpha=0.2)

y_av = moving_average(y_data, 25)

plt.plot(x_data3, y_av, 'b',label ="TD3")

y_av2 = moving_average(y_data1, 25)

plt.plot(x_data4, y_av2, 'red',label ="DDPG")

# plt.grid()网格线设置

plt.grid(True)

plt.title('滑动平均滤波/卷积核25')

plt.legend()#标签

plt.xlabel('episodes')

plt.ylabel('Average reward')

plt.show()2. Savitzky-Golay 滤波器实现曲线平滑对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在**scipy库**里直接调用,不需要再定义函数。

代码语法:

python中Savitzky-Golay滤波器调用如下:

代码语言:javascript复制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. )(1)window_length对曲线的平滑作用: window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害(备注:该值必须为正奇整数)。

(2)k值对曲线的平滑作用: k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线。

Savitzky-Golay平滑滤波是光谱预处理中的常用滤波方法,其核心思想:是对一定长度窗口内的数据点进行k阶多项式拟合,从而得到拟合后的结果。 对它进行离散化处理后,S-G 滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。Savitzky-Golay平滑滤波被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器的 最大特点:在滤除噪声的同时可以确保信号的形状、宽度不变使用平滑滤波器对信号滤波时,实际上是拟合了信号中的低频成分,而将高频成分平滑出去了。 如果噪声在高频端,那么滤波的结果就是去除了噪声,反之,若噪声在低频段,那么滤波的结果就是留下了噪声。效果如下:

代码如下:

代码语言:javascript复制import xlwt

import random

import numpy as np

from scipy.signal import savgol_filter

import matplotlib.pyplot as plt

import xlrd

import scipy

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

x_data=[]

y_data=[]

x_data1=[]

y_data1=[]

data = xlrd.open_workbook('train_reward.xls')

table = data.sheets()[0]

data1 = xlrd.open_workbook('train_reward_2.xls')

table1 = data1.sheets()[0]

cap = table.col_values(1) #读取第二列数据

cap1 = table.col_values(0)#读取第一列数据

#print(cap) #打印出来检验是否正确读取

cap2 = table1.col_values(1) #读取第二列数据

cap3 = table1.col_values(0)#读取第一列数据

#print(cap) #打印出来检验是否正确读取

for i in range(1,9999):

y_data.append(cap[i])

# x_data.append(cap1[i]*50) #对第一列数据扩大50倍

x_data.append(cap1[i]) #对第一列数据扩大50倍

for i in range(1,2321):

y_data1.append(cap2[i])

# x_data.append(cap1[i]*50) #对第一列数据扩大50倍

x_data1.append(cap3[i]) #对第一列数据扩大50倍

#?平滑处理:

tmp_smooth1 = scipy.signal.savgol_filter(y_data,25,3)

# tmp_smooth2 = scipy.signal.savgol_filter(y_data,63,4)

plt.semilogx(x_data,y_data,label = "TD3",alpha=0.2) #//增加透明度

plt.semilogx(x_data,tmp_smooth1,label = 'TD3-smooth',color = 'red')

# plt.semilogx(x_data,tmp_smooth2,label = 'mic'+str(1)+'拟合曲线-53',color = 'green')

tmp_smooth3 = scipy.signal.savgol_filter(y_data1,25,3)

#% window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害

#! k值推荐3-5k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线

# tmp_smooth2 = scipy.signal.savgol_filter(y_data,63,4)

plt.semilogx(x_data1,y_data1,label = "DDPG",alpha=0.3) #//增加透明度

plt.semilogx(x_data1,tmp_smooth3,label = 'DDPG-smooth',color = 'blue')

# plt.plot(x_data, y_data,color="#006bac")

plt.title('Savitzky-Golay 滤波器25/3')

plt.legend()#标签

plt.xlabel('episodes')

plt.ylabel('Average reward')

plt.show() 参考链接:

python 数据、曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)

python 平滑_Python 生成曲线进行快速平滑处理

相关推荐

黄金叶天尊香烟价格表2025价格表
365bet在线官网

黄金叶天尊香烟价格表2025价格表

📅 08-08 👁️ 9483
如何把小米手机上的便签导出为文本?
天天365彩票软件官方下载3D

如何把小米手机上的便签导出为文本?

📅 10-14 👁️ 6579
人切除一个肾会怎么样
365bet在线官网

人切除一个肾会怎么样

📅 08-09 👁️ 8072
VSCode常用插件及配置
365娱乐场投注

VSCode常用插件及配置

📅 12-07 👁️ 3660
2023年使用率会很高的9个SSH远程连接工具有这些!网工、运维你们用的是哪个?
ipadmini和ipad哪个好
365娱乐场投注

ipadmini和ipad哪个好

📅 07-12 👁️ 8158