2015-01-01 2 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.signal 대신 scipy.ndimage을 사용하려고합니다. 신호 처리 클래스를 사용했다면 scipy.signal 접근 방식이 더 직관적이라고 생각할 수 있지만 그렇지 않은 경우 혼란 스러울 수 있습니다. scipy.ndimage은 몇 가지 더 많은 신호 처리 규칙을 이해해야하는 것과는 반대로 간단하고 간단한 한 번 호출로 gaussian_filter을 제공합니다.

다음은 질문에 게시 한 데이터를 사용하여 간단한 예입니다. 여기서는 데이터를 정기적으로 샘플링한다고 가정합니다 (시간당 2 단위). 이 대부분의

enter image description here

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() 

은 매우 솔직,하지만 당신은 내가 scipy.ndimage.gaussian_filter(shrinkage, 3)에서 지정한 3의 "마법"값을 알 수 있습니다. 그것은 샘플에서 가우시안 함수의 sigma 매개 변수입니다. 귀하의 데이터는 2 단위로 샘플링되기 때문에 sigma은 6 단위입니다.

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를 설치 했습니까? 파이썬 실행 파일이 둘 이상 설치되어 있고 matplotlib가 하나만 설치되었지만 다른 파일은 설치되지 않았습니까? –

관련 문제