如何使用scipy.optimize来最小化一组函数?

时间:2012-01-05 15:57:59

标签: scipy

[编辑:fmin()方法是我的问题的不错选择。但是,我的问题是其中一个轴是其他轴的总和。应用乘数后,我没有重新计算y轴。因此,我的优化函数返回的值总是返回相同的值。这给了fmin没有方向所以它选择的乘数非常接近。一旦优化函数中的计算得到纠正,fmin就选择了更大的范围。]

我有两个数据集,我想应用乘数来查看哪些值可以“改善”它们的相关系数。

例如,假设数据集1的相关系数为-6,数据集2的相关系数为.5。

我可以对可能会改善系数的每个数据集应用不同的乘数。我想找到一组乘数来为这两个数据集选择,以优化每组的相关系数。

我编写了一个目标函数,它采用乘数列表,将它们应用于数据集,计算相关系数(scipy.stats.spearmanr()),并对这些系数求和。因此,我需要使用scipy.optimize中的一些东西将一组乘数传递给此函数,并找到优化此总和的集合。

我尝试过使用optimize.fmin和其他几个。但是,我希望优化技术使用更大范围的乘数。例如,我的数据集可能有数百万的值,但fmin只会选择1.0,1.05左右的乘数。这不足以以任何有意义的方式修改这些相关系数。

以下是我的目标函数的一些示例代码:

def objective_func(multipliers):
    for multiplier in multipliers:
        for data_set in data_sets():
            x_vals = getDataSetXValues()
            y_vals = getDataSetYValues()
            xvals *= muliplier
            coeffs.append(scipy.stats.spearmanr(x_vals, y_vals)

    return -1 * sum(coeffs)

我正在使用-1,因为我实际上想要最大值,但fmin用于最小化。

以下是我尝试使用fmin的示例:

print optimize.fmin(objective_func)

乘数从1.0开始,范围在1.05,1.0625之间。我可以在实际的fmin代码中看到这些值的选择。我最终还需要另一种方法来调用最小化值来检查一系列值,而不是所有值都密切相关。

2 个答案:

答案 0 :(得分:1)

将x数据乘以某个因子并不会真正改变Spearman等级相关系数。

>>> x = numpy.random.uniform(-10,10,size=(20))
>>> y = numpy.random.uniform(-10,10,size=(20))
>>> scipy.stats.spearmanr(x,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*10,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*1e6,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*1e-16,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*(-2),y)
    (0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*(-2e6),y)
    (0.24661654135338346, 0.29455199407204263)

(元组中的第二项是p值。)

如果你翻转术语的符号,你可以改变它的符号,但Spearman相关性的全部意义在于它告诉你任何单调关系捕获关联的程度。可能这解释了为什么fmin没有多少改变乘数:它没有获得任何方向反馈,因为返回的值是恒定的。

所以我看不出你要做的事情是如何运作的。

我也不确定为什么你选择所有Spearman系数和p值的总和作为你想要最大化的因素:Spearman系数可以是负数,所以你可能想要将它们平方,而且你还没有提到p值,所以我不确定你为什么把它们扔掉。

[我猜我们可能正在使用不同的scipy版本,而我们的spearmanr函数会返回不同的东西。我有0.9.0。]

答案 1 :(得分:0)

您可能不希望最小化系数之和,而是最小化平方和。此外,如果可以单独选择乘数,为什么还要同时优化它们?你能发布你当前的代码和一些样本数据吗?