2012-07-03 4 views
1

두 개의 서로 다른 실험 데이터 집합이 있습니다. 나는 그 값들 각각에 어떤 함수를 적용함으로써 배포본들 중 하나를 가능한 한 다른 것과 비슷하게 만들 필요가있다. 함수의 예 : F (x) = x * (1 + (x + p1) * p2, 여기서 p1과 p2는 임의의 매개 변수입니다.) 가능한지 알아 내려면 p1 및 P2, 나는 간단한 파이썬 스크립트를 썼다.비정상적인 피팅 알고리즘의 최적화

#!/usr/bin/python 
from scipy.stats import ks_2samp 
from frange import frange 
control = [float(i.rstrip().replace(',', '.')) for i in open('control.txt').readlines()] 
test = [float(i.rstrip().replace(',', '.')) for i in open('1460.txt').readlines()] 
def mean(x): 
    res = sum(x)/len(x) 
    return res 
def testargs(p1, p2): 
    model = [i*(1+(i+p1)*p2) for i in control] 
    if round(mean(model), 4) == round(mean(test), 4): 
     return True 
    else: 
     return False 
results = {} 
for p1 in frange(0, 0.02, 0.001): 
    for p2 in frange(5, 20, 0.01): 
     if testargs(p1, p2): 
      ks = ks_2samp([i*(1+(i+p1)*p2) for i in control], test)[1] 
      results[ks] = (p1, p2) 
result = sorted(results.keys(), reverse=True)[0] 
print('Result: ', result, '\n', 'p1, p2: ', results[result], '\n') 

나는이 못난 가장 느린 하나입니다 가능한 모든 방법의 이해를 불행하게도, 나는 전혀 프로그래밍 배경이없는이 내 첫 겸허 한 노력입니다. 결과 분포의 평균값이 khown 상수라는 것을 감안할 때, 적절한 p1-p2 쌍의 수는 매우 제한적이지만 여기에서는 간단한 무차별 대입을 사용합니다. 나는 p2를의 함수로 표현할 수있는 방법이 있어야한다고 생각합니다. p1,하지만 어떻게 해야할지 전혀 모르겠다. 어쩌면 나 한테 어떤 생각을 던질 수 있을까?
나쁜 영어로 죄송합니다 ...

+0

사이드 노트 : '... rstrip() ... 내가 열면 ('1460.txt ') readlines()'간단하게 ...'for i in open ('1460.txt')'(rstrip이 필요 없음 및 readlines). 또 다른 포인트 : 당신이 SciPy를 사용하고 있기 때문에 NumPy가 설치되어있어 숫자가있는 파일을 직접 읽을 수 있습니다. – EOL

+0

'numpy.loadtxt'와 변환기 기능으로 파일을 읽을 수도 있습니다. 보다 일반적으로, NumPy 배열을 사용하면 모델의 계산뿐만 아니라 무료로'mean()'을 얻을 수 있습니다 ('model = control * (1+ (control + p1) * p2)'). – EOL

+0

대단히 감사합니다.'numpy.loadtxt'는 훨씬 더 간단하고 읽기 쉽도록 만들었습니다! – Axon

답변

0

은 (는) 친구가되었습니다.

일반적으로 두 매개 변수 (p1, p2)를 사용하고 두 분포 (테스트 및 수정 된 컨트롤)가 서로 얼마나 멀리 떨어져 있는지 나타내는 값을 반환하는 함수를 만드는 것입니다. 귀하의 경우에는 (mean(model)-mean(test))**2이 될 수 있습니다. SciPy 최소화 함수는 두 분포 사이의 거리를 최소화하는 매개 변수 (p1, p2)를 제공합니다.

SciPy가 제공하는 몇 가지 최소화 기능을 시도해 볼 수 있습니다. 일부는 문제에 따라 다른 것보다 효과적입니다.

+0

답변 해 주셔서 대단히 감사합니다. 나는 아직 실제 algorythm을 알아 내지 못했지만, 적어도 나는 지금 생각의 방향을 가지고있다. – Axon