1

ランダムに分散された実験データの2つの異なるセットがあります。それぞれの値に何らかの関数を適用して、分布の1つを別の分布にできるだけ類似させる必要があります。関数の例:F(x)= x *(1+(x + p1)* p2、ここでp1とp2は任意のパラメーターです。可能かどうか、可能であれば、p1のどの値を使用するかを確認します。そしてp2、私は簡単なpythonスクリプトを書きました:

#!/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')

私は、考えられるすべての方法の中で、これが最も醜くて最も遅い方法であることを理解しています。残念ながら、私にはプログラミングのバックグラウンドがまったくなく、これが私の最初の謙虚な努力です。結果の分布の平均値が既知の定数であることを考えると、適切なp1-p2ペアの数は非常に限られていますが、ここでは単純なブルートフォースを使用します。p2をp1の関数として表現する方法があるはずだと思いますが、どうすればいいのか全くわかりません。多分あなたは私にいくつかの考えを投げることができますか?
私の悪い英語でごめんなさい...

4

1 に答える 1

0

scipy.optimizeはあなたの友達です。

通常は、2つのパラメーター(p1、p2)を取り、2つの分布(テストおよび変更された制御)が互いにどれだけ離れているかを示す値を返す関数を作成します。あなたの場合、これは可能性があります(mean(model)-mean(test))**2。SciPy最小化関数は、2つの分布間の距離を最小化するパラメーター(p1、p2)を提供します。

SciPyが提供する最小化関数のいくつかを試してみることをお勧めします。問題によっては、他の関数よりもうまく機能するものもあります。

于 2012-07-03T05:24:08.330 に答える