[编辑: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代码中看到这些值的选择。我最终还需要另一种方法来调用最小化值来检查一系列值,而不是所有值都密切相关。
答案 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)
您可能不希望最小化系数之和,而是最小化平方和。此外,如果可以单独选择乘数,为什么还要同时优化它们?你能发布你当前的代码和一些样本数据吗?