2015-01-01 119 views
1

我正在嘗試平滑此數據集並生成帶有誤差線的單個代表性曲線。採集數據點的方法採用相當粗略的步驟進行離散化處理。我沒有太多的編程經驗,但正在努力學習。我讀過高斯濾波器可能是一個不錯的選擇。任何幫助,將不勝感激。 Optical dilatometer data for shrinkage of a ceramic pellet平滑離散數據集

下面是一個例子的數據集:

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 
+0

您可以提供您目前使用的代碼嗎?還有一個示例數據集? – Ffisegydd

+0

我到目前爲止還沒有任何代碼。我發現上面粘貼的這一塊,但我不知道如何實現它。對不起,這樣的菜鳥。 – SeattleFreezer

回答

4

通常情況下,您會爲此使用一個庫,而不是自己實現它。

我打算使用scipy.ndimage代替scipy.signal。如果你有一個信號處理類,你可能會發現scipy.signal方法更直觀,但如果你沒有,它可能會讓人感到困惑。 scipy.ndimage提供了一個簡單的單功能呼叫gaussian_filter,而不必理解更多的信號處理約定。

下面是一個快速示例,使用您在問題中發佈的數據。這假設你的數據是定期採樣的(它是:每2單位時間)。

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.ndimage 

time, _, shrinkage = np.loadtxt('discrete_data.txt', skiprows=1).T 

fig, ax = plt.subplots() 
ax.plot(time, shrinkage, 'ro') 
ax.plot(time, scipy.ndimage.gaussian_filter(shrinkage, 3)) 
plt.show() 

enter image description here

這其中大部分是相當直接的,但你可能會注意到,我在scipy.ndimage.gaussian_filter(shrinkage, 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]) 
+0

非常感謝。我會試圖實現這一點。確切的解決方案並不重要,它更多用於演示目的。我有來自不同樣本的多條曲線,我將要將它們一個繪製在另一個之上。 – SeattleFreezer

+0

不幸的是,我在matplotlib.pyplot庫中遇到了一些困難。 'ImportError:沒有名爲matplotlib的模塊。pyplot'我試着改變序言指向matplotlib的安裝位置,但似乎沒有工作。實際上,只要獲得我可以繪製的高斯數據點的陰謀就更有益處。我會怎麼做? – SeattleFreezer

+0

@SeattleFreezer - 你是如何安裝matplotlib的?是否有可能安裝了多個python可執行文件,並且您安裝了matplotlib而不是其他版本? –