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

我知道在所有可能的方式中,这是最丑陋和最慢的一种。不幸的是,我根本没有编程背景,这是我第一次卑微的努力。鉴于得到的分布的平均值是一个 khown 常数,适当的 p1-p2 对的数量非常有限,但我在这里使用了简单的蛮力。我认为,应该有某种方法可以将 p2 表示为 p1 的函数,但我完全不知道该怎么做。也许你可以给我一些想法?
对不起,我的英语不好...

4

1 回答 1

0

scipy.optimize是你的朋友,在这里。

您通常要做的是创建一个函数,该函数接受两个参数(p1,p2)并返回一个值,该值指示两个分布(测试和修改控制)彼此之间的距离;在你的情况下,这可以是(mean(model)-mean(test))**2. SciPy 最小化函数为您提供最小化两个分布之间距离的参数 (p1, p2)。

您可能想尝试一些 SciPy 提供的最小化函数:根据问题,有些比其他的工作得更好。

于 2012-07-03T05:24:08.330 回答