python 绘制训练曲线--插值法 曲线平滑处理
Posted R-G-B
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 绘制训练曲线--插值法 曲线平滑处理相关的知识,希望对你有一定的参考价值。
文章目录
1 训练曲线–震荡的非常厉害
上一篇文章用python自己绘制训练曲线震荡的非常厉害(下图绿色曲线),而tensorboard的曲线比较平滑(下下图黑色曲线),
原因是tensorboard显示的曲线是经过平滑处理过的(其灰黑色的背景就平滑处理前的波形)
2 插值法 曲线行平滑处理
实现所需的库: numpy、scipy、matplotlib
插值法的常见实现方法:
nearest:最邻近插值法
zero:阶梯插值
slinear:线性插值
quadratic、cubic:2、3阶B样条曲线插值
详情代码如下
from matplotlib import pyplot as plt
import csv
import numpy as np
# 使用插值法 对曲线平滑处理 滤波器后得到平滑曲线
from scipy.interpolate import make_interp_spline
filename = "D:/python/pltt/train_loss.csv" #.csv文件路径,这里可以添加绝对路径
with open(filename) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = [] #横纵坐标分别建立了两个list
y = []
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据,放入list
y.append(float(row[2]))
# 插值法 对曲线平滑处理
x_array=np.array(x) #list转array,为了调用下面的min,max
y_array=np.array(y)
x_smooth = np.linspace(x_array.min(), x_array.max(), 300) # np.linspace 等差数列,从x.min()到x.max()生成500个数,便于后续插值
y_smooth = make_interp_spline(x_array, y_array)(x_smooth)
# 可视化图线
plt.plot(x_smooth,y_smooth,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
plt.show()
平滑效果
3 注意事项—平滑前先将 list转array
# 插值法 对曲线平滑处理
x_array=np.array(x) #list转array,为了调用下面的min,max; 否则下面min,max执行会报错
y_array=np.array(y)
x_smooth = np.linspace(x_array.min(), x_array.max(), 300) # np.linspace 等差数列,从x.min()到x.max()生成500个数,便于后续插值
y_smooth = make_interp_spline(x_array, y_array)(x_smooth)
4 Savitzky-Golay 滤波器实现曲线平滑
python 绘制训练曲线--Savitzky-Golay 滤波平滑处理
文章目录
- 1 训练曲线--震荡的非常厉害
- 2 Savitzky-Golay 滤波器--平滑曲线
- 3 python 绘制训练曲线--插值法 曲线平滑处理
- 4 python 绘制训练曲线--基于Numpy.convolve曲线平均滤波
- 5 用python自己绘制训练曲线
1 训练曲线–震荡的非常厉害
上一篇文章用python自己绘制训练曲线震荡的非常厉害(下图绿色曲线),而tensorboard的曲线比较平滑(下下图黑色曲线),
原因是tensorboard显示的曲线是经过平滑处理过的(其灰黑色的背景就平滑处理前的波形)
2 Savitzky-Golay 滤波器–平滑曲线
对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。
from matplotlib import pyplot as plt
import csv
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
filename = "D:/python/pltt/train_loss.csv" #.csv文件路径,这里可以添加绝对路径
with open(filename) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = [] #横纵坐标分别建立了两个list
y = []
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据,放入list
y.append(float(row[2]))
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--代表曲线点坐标(x,y)中的y值,为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
mode--滤波器的填充信号的扩展类型
'''
y = savgol_filter(y, 99, 1, mode= 'nearest')
# 可视化图线
plt.plot(x,y,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
plt.show()
不同滤波参数的平滑效果
y = savgol_filter(y, 99, 1, mode= 'nearest')
y = savgol_filter(y, 33, 10, mode= 'nearest')
y = savgol_filter(y, 55, 2, mode= 'nearest')
3 python 绘制训练曲线–插值法 曲线平滑处理
4 python 绘制训练曲线–基于Numpy.convolve曲线平均滤波
python 绘制训练曲线–基于Numpy.convolve曲线平均滤波
python 绘制训练曲线 平滑处理–Savitzky-Golay 滤波器曲线平滑
5 用python自己绘制训练曲线
以上是关于python 绘制训练曲线--插值法 曲线平滑处理的主要内容,如果未能解决你的问题,请参考以下文章
python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置
python matplotlib怎么在一张图上画多条曲线?Python处理多个csv文件生成叠加曲线图——综合示例:平滑处理图注图例图题范围缩放