SciPy中的差异进化

时间:2018-03-15 20:11:26

标签: python optimization scipy mathematical-optimization differential-evolution

我正在尝试使用SciPy中的differential_evolution。我有三个矩阵:x,y和P - 所有大小(14,6)。我必须使用以下公式:

z= np.log10(g)+ np.log10(c)*np.log10(P) 

找到最小化的c(实数从0到2)的值:

numpy.median(z**2)

这个表达。我尝试的是这个(我提供方便的数据):

import numpy as np
from scipy.optimize import differential_evolution
def func(c, args):
    z = args[0] + np.log10(c)*np.log10(args[1])

    return np.median(z**2)


if __name__ == '__main__':
    bounds = [(0, 2)]

    x = np.array([[126581.94951205,  97601.85624482,  59659.00330833,
         27646.48551627,   9202.50377458,   4840.25789068],
       [213571.84886437, 148750.52154776,  85979.81139937,
         38757.37831212,  11775.99906427,   4619.32027948],
       [195684.50299021, 131818.78542437,  74376.55189913,
         32793.21715377,  10288.70838873,   4042.58093119],
       [177598.13865746, 120942.50439911,  68866.09898276,
         30819.5354775 ,  10588.08746517,   5011.71808947],
       [126433.18311483,  85863.57788065,  48923.64502157,
         21828.60950911,   7907.37639781,   4410.61819399],
       [103431.88029629,  67452.94418262,  37608.36861047,
         16456.97701443,   6027.98704858,   3550.06927169],
       [100689.06813945,  64380.21348052,  34764.02910376,
         14849.85472635,   5607.19256065,   3605.5709208 ],
       [ 96509.22946744,  63832.74512518,  36041.69174706,
         15802.87650901,   6473.33232805,   4664.07058733],
       [113078.63455882,  73227.02362359,  40861.09037499,
         17385.89127848,   7074.98444924,   5136.84232454],
       [121241.93118924,  78537.13681709,  44257.97654994,
         18584.94999742,   7733.39219718,   5869.49536788],
       [115948.06368262,  73995.07204278,  41536.21315507,
         16851.59724901,   6736.25125909,   4851.5738275 ],
       [115024.20359423,  72108.15245783,  40341.98473413,
         15900.55422399,   6243.63777265,   4411.24859372],
       [108754.83802899,  66210.25952459,  36485.42905112,
         14577.73925124,   5553.23702141,   3736.5217322 ],
       [ 95340.59125024,  58458.97552915,  32364.19705748,
         13236.30114676,   4929.04023171,   3202.21731277]])
    y = y=np.array([[118166.08  ,  95784.692 ,  68134.878 ,  37119.959 ,  17924.157 ,
          7445.3083],
       [ 99265.027 ,  70679.135 ,  43297.559 ,  19822.017 ,   8527.8497,
          3404.7113],
       [ 80227.797 ,  50972.879 ,  26648.604 ,  11190.488 ,   4836.6514,
          2249.9172],
       [ 68510.582 ,  39288.19  ,  19938.938 ,   9312.6881,   4907.6661,
          2681.2709],
       [ 65193.15  ,  36610.107 ,  18612.181 ,   9211.144 ,   5416.1685,
          3372.1282],
       [ 67188.918 ,  37227.699 ,  20132.92  ,  11663.275 ,   7315.3472,
          4648.1669],
       [ 64802.06  ,  38885.622 ,  22008.537 ,  13100.638 ,   8043.0185,
          5049.2097],
       [ 68104.867 ,  41212.89  ,  23247.898 ,  14134.707 ,   8805.2547,
          5526.1014],
       [ 74180.595 ,  41268.904 ,  22868.016 ,  13841.437 ,   8660.1413,
          5401.245 ],
       [ 78920.685 ,  42743.389 ,  23932.305 ,  13910.089 ,   8439.3342,
          5141.7051],
       [ 91329.012 ,  45733.772 ,  25430.818 ,  14144.185 ,   8273.7953,
          5016.5839],
       [ 92217.594 ,  44984.3   ,  23353.596 ,  13467.631 ,   8099.728 ,
          4948.26  ],
       [ 94508.441 ,  48114.879 ,  24735.311 ,  13358.097 ,   7821.8587,
          4806.7923],
       [108211.73  ,  53987.095 ,  25872.772 ,  13189.61  ,   7552.7164,
          4497.2611]])
    P=10000*np.array([[0.6011,0.6011,0.6011,0.6011,0.6011,0.6011],
[0.9007,0.9007,0.9007,0.9007,0.9007,0.9007],
[1.1968,1.1968,1.1968,1.1968,1.1968,1.1968],
[1.4178,1.4178,1.4178,1.4178,1.4178,1.4178],
[1.5015,1.5015,1.5015,1.5015,1.5015,1.5015],
[1.439,1.439,1.439,1.439,1.439,1.439],
[1.2721,1.2721,1.2721,1.2721,1.2721,1.2721],
[1.0616,1.0616,1.0616,1.0616,1.0616,1.0616],
[0.8543,0.8543,0.8543,0.8543,0.8543,0.8543],
[0.6723,0.6723,0.6723,0.6723,0.6723,0.6723],
[0.5204,0.5204,0.5204,0.5204,0.5204,0.5204],
[0.3963,0.3963,0.3963,0.3963,0.3963,0.3963],
[0.2990,0.2990,0.2990,0.2990,0.2990,0.2990],
[0.2211,0.2211,0.2211,0.2211,0.2211,0.2211]])

        g=np.log10(y) - np.log10(x)

    args = (g,P)
    result = differential_evolution(func, bounds, args=args)
    print(func(bounds, args))

我收到此错误:TypeError: func() takes exactly 2 arguments (3 given)。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

def func(c, g, P):
    z = g + np.log10(c)*np.log10(P)
    return np.median(z**2)

if __name__ == '__main__':
    # Your arrays go here
    g = np.log10(y) - np.log10(x)
    args = (g, P)
    result = differential_evolution(func, bounds, args=(g, P))
    # will print the value of c and value of the optimized function
    print (result.x, result.fun)