Python 平滑离散数据集

Python 平滑离散数据集,python,numpy,scipy,curve-fitting,smoothing,Python,Numpy,Scipy,Curve Fitting,Smoothing,我试图平滑此数据集,并生成一条带有误差条的代表性曲线。获取数据点的方法采用相当粗略的步骤进行离散化。我没有太多编程经验,但正在努力学习。我读到高斯滤波器可能是一个不错的选择。任何帮助都将不胜感激 以下是一个示例数据集: Time (min) Non-Normalized Shrinkage Normalized Shrinkage 200 93 1.021978022 202 92 1.010989011 204 92 1.010989011 206 92 1.010989011

我试图平滑此数据集,并生成一条带有误差条的代表性曲线。获取数据点的方法采用相当粗略的步骤进行离散化。我没有太多编程经验,但正在努力学习。我读到高斯滤波器可能是一个不错的选择。任何帮助都将不胜感激

以下是一个示例数据集:

Time (min)  Non-Normalized Shrinkage    Normalized Shrinkage
200 93  1.021978022
202 92  1.010989011
204 92  1.010989011
206 92  1.010989011
208 92  1.010989011
210 92  1.010989011
212 91  1
214 90  0.989010989
216 90  0.989010989
218 90  0.989010989
220 88  0.967032967
222 88  0.967032967
224 87  0.956043956
226 86  0.945054945
228 86  0.945054945
230 86  0.945054945
232 86  0.945054945
234 86  0.945054945
236 85  0.934065934
238 84  0.923076923
240 83  0.912087912
242 83  0.912087912
244 83  0.912087912
246 82  0.901098901
248 83  0.912087912
250 82  0.901098901
252 81  0.89010989
254 81  0.89010989
256 82  0.901098901
258 82  0.901098901
260 79  0.868131868
262 80  0.879120879
264 80  0.879120879
我在网上的某个地方找到了这个代码片段,但我不知道如何实现它,也不知道它是否就是我想要的

def smoothListGaussian(list,degree=5):  

window=degree*2-1  

weight=numpy.array([1.0]*window)  

weightGauss=[]  

for i in range(window):  

    i=i-degree+1  

    frac=i/float(window)  

    gauss=1/(numpy.exp((4*(frac))**2))  

    weightGauss.append(gauss)  

weight=numpy.array(weightGauss)*weight  

smoothed=[0.0]*(len(list)-window)  

for i in range(len(smoothed)):  

    smoothed[i]=sum(numpy.array(list[i:i+window])*weight)/sum(weight)  

return smoothed 

通常,您会为此使用库,而不是自己实现它

我将使用
scipy.ndimage
而不是
scipy.signal
。如果你有一个信号处理类,你可能会发现
scipy.signal
方法更直观,但是如果你没有,它可能看起来很混乱
scipy.ndimage
提供了一个简单的函数调用
gaussian_filter
,而不必了解更多的信号处理约定

下面是一个简单的例子,使用您在问题中发布的数据。这假设您的数据是定期采样的(即:每2个时间单位采样一次)

大部分内容都非常简单,但您可能会注意到我在
scipy.ndimage.gaussian_filter(收缩率,3)
中指定的
3
的“神奇”值。这是样本中高斯函数的
sigma
参数。因为您的数据在时间上每2个单位采样一次,所以这是6个单位的
sigma

sigma
参数完全类似于“钟形曲线”正态分布中的标准偏差。它越大,高斯函数就越宽,曲线就越平滑。通过反复试验,对于这个特定的数据集,值3似乎是合适的,但您应该进行试验,看看您认为什么是最好的

最后一点注意:有很多不同的方法来解决这个问题。高斯滤波器是一个合理的解决方案,但还有很多其他的。如果确切的结果非常重要,您可能应该比较几种方法,看看哪种方法最适合您的特定数据集


在您的评论中,您询问将平滑数据保存到文件中,而不是打印它。下面是一个简单的例子,说明了一种方法:

import numpy as np
import scipy.ndimage

time, _, shrinkage = np.loadtxt('discrete_data.txt', skiprows=1).T
smoothed = scipy.ndimage.gaussian_filter(shrinkage, 3)

np.savetxt('smoothed_data.txt', np.c_[time, smoothed])

<>如果你的数据集是有限的,我会考虑用径向基函数来研究高斯过程回归(GPR)。这将获得与使用高斯滤波器平滑函数类似的结果,但有两个重要的好处:

  • 它可以自动选择过滤器的“神奇”标准偏差,这意味着输出估计值将最适合您的数据
  • 它将为您提供一个估计,它的输出符合您的数据的自信程度-为您提供最佳的误差条
  • 以下是用于估计正弦波的探地雷达示例:


    如果您认为这可以解决您的问题,我建议您查看Python中的GPy库:

    非常感谢。我将尝试实现这一点。确切的解决方案并不重要,更多的是为了演示目的。我有来自不同样本的多条曲线,我将一条接一条地绘制它们。遗憾的是,我在使用matplotlib.pyplot库时遇到了一些困难<代码>导入错误:没有名为matplotlib.pyplot的模块我尝试将序言更改为指向matplotlib的安装位置,但这似乎不起作用。实际上,得到一个高斯数据点的曲线图会更有益,我可以画出它。我该怎么做?@SeattleCooker-你是如何安装matplotlib的?您是否可能安装了多个python可执行文件,并且为其中一个安装了matplotlib,而不是另一个?我使用
    easy\u install matplolib
    安装了matplotlib,这是绝对可能的。我有一台mac电脑,在过去的一年里,我一直在用python处理不同的事情。我想要一个干净的安装,但从我所读到的来看,如果我做得不好,我可能会很容易把事情搞砸。可能发生的情况是,
    easy\u install
    指向一个python可执行文件,而您在运行脚本时调用另一个python可执行文件。检查
    哪个python
    的输出,并调用安装matplotlib的python可执行文件的完整路径(它不会是哪个python输出的内容)。例如,如果您正在使用Anaconda,并将其安装在主目录中,则可以调用
    $home/Anaconda/bin/python
    import numpy as np
    import scipy.ndimage
    
    time, _, shrinkage = np.loadtxt('discrete_data.txt', skiprows=1).T
    smoothed = scipy.ndimage.gaussian_filter(shrinkage, 3)
    
    np.savetxt('smoothed_data.txt', np.c_[time, smoothed])