使用python优化一组数据

时间:2014-08-14 11:28:39

标签: python optimization

使用python优化一组数据。

以下数据集可用 x,y,f(x),f(y)。

要优化的功能(最大化): f(x,y)= f(x)* y - f(y)* x

基于以下约束:

V> = sqrt(f(x)^ 2 + f(y)^ 2)

I> = sqrt(x ^ 2 + y2)

其中V和I是常数。

任何人都可以让我知道我需要使用哪种优化模块?根据我的理解,我需要执行离散优化,因为我已经为x,y,f(x)和f(y)设置了f值。

1 个答案:

答案 0 :(得分:1)

使用复杂的优化器(http://docs.scipy.org/doc/scipy/reference/optimize.html)来解决这个问题是个不错的主意。

这看起来像一个问题,可以在O(n^2) n=max(|x|,|y|)下轻松解决,只需:

  1. 排序x,y,f(x),f(y)创建sorted(x), sorted(y), sorted(f(x)), sorted(f(y))
  2. 为每个x找到sorted(y)I^2 >= x^2+y^2占有的位置,f(x)sorted(f(y))以及V^2 >= f(x)^2 + f(y)^2的位置(两个二进制)搜索,I^2 >= x^2+y^2 <=> |y| <= sqrt(I^2-x^2),以便您可以在恒定时间内找到&#34;屏障&#34;然后使用bin搜索来查找最接近的实际数据点&#34;在不平等的右侧&#34; 34)
  3. 遍历sorted(x)和每个x
    • 同时迭代yf(y)的元素并丢弃(在此循环中)不在步骤2中找到的borth间隔的点。(线性复杂度)
    • 记录x_max,y_max最大化的参数对f(x_max,y_max)
  4. 返回x_max,y_max
  5. 总复杂度低于二次,因为步骤1需要O(nlgn),步骤2中的每次循环迭代都是O(lgn)所以整个步骤2需要O(nlgn),步骤3中的循环是{ {1}}和第3步的第一个子步骤中的循环是O(n)(但在现实生活中它应该由于约束而几乎不变),这使得整个算法O(n)(并且在大多数情况下它将表现为O(n^2))。它也不依赖于O(nlgn)的定义(它将它用作黑盒子),因此您可以通过这种方式优化任意函数。