두 개의 서로 다른 실험 데이터 집합이 있습니다. 나는 그 값들 각각에 어떤 함수를 적용함으로써 배포본들 중 하나를 가능한 한 다른 것과 비슷하게 만들 필요가있다. 함수의 예 : 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,하지만 어떻게 해야할지 전혀 모르겠다. 어쩌면 나 한테 어떤 생각을 던질 수 있을까?
나쁜 영어로 죄송합니다 ...
사이드 노트 : '... rstrip() ... 내가 열면 ('1460.txt ') readlines()'간단하게 ...'for i in open ('1460.txt')'(rstrip이 필요 없음 및 readlines). 또 다른 포인트 : 당신이 SciPy를 사용하고 있기 때문에 NumPy가 설치되어있어 숫자가있는 파일을 직접 읽을 수 있습니다. – EOL
'numpy.loadtxt'와 변환기 기능으로 파일을 읽을 수도 있습니다. 보다 일반적으로, NumPy 배열을 사용하면 모델의 계산뿐만 아니라 무료로'mean()'을 얻을 수 있습니다 ('model = control * (1+ (control + p1) * p2)'). – EOL
대단히 감사합니다.'numpy.loadtxt'는 훨씬 더 간단하고 읽기 쉽도록 만들었습니다! – Axon