【问题标题】:How to minimize forecast error with fmin?如何使用 fmin 最小化预测误差?
【发布时间】:2016-11-01 20:29:00
【问题描述】:

我正在尝试通过选择正确的“退出率”(r) 来最小化预测误差。我对 Pandas 还是很陌生,对 SciPy 还是很陌生。请帮忙!

import pandas as pd
from scipy.optimize import fmin

data = pd.DataFrame({'Division': [1,2,3]*3,
                     'Month': ['May','May','May','June','June','Jun','Jul','Jul','Jul'],
                     'Definite_Units':[8]*9,
                     'Maybe_Units':[3,2,1]*3,
                     'Actually_Shipped_Units':[9]*9})

p = lambda r,x,y: x+y*r
e = lambda r,x,y,z: abs(1-(p(x,y,r)/z))

x = div_data['Definite_Units'].sum
y = div_data['Maybe_Units'].sum
z = div_data['Actually_Shipped_Units'].sum

for d in range(1,4):
    r0 = 1
    div_data = data['Division']=d
    x = div_data['Definite_Units'].sum()
    y = div_data['Maybe_Units'].sum()
    z = div_data['Actually_Shipped_Units'].sum()
    t = fmin(e,r0,args=(x,y,z))
    print d, t

我希望每个部门都有一个 r 来最小化 e。

所以在这种情况下,我的输出应该是:

  • 第 1 部分:r = 0.33,e = 0
  • 第 2 部分:r = 0.50,e = 0
  • 第 3 部分:r = 1.00,e = 0

【问题讨论】:

  • 那么问题是什么...
  • @sascha 我如何设置它以获得最小化 e 的每个部门的 r?
  • 我现在明白 fmin 要求 args 在一个数组中,我正在努力。
  • @sascha 我在我的代码上做了很多工作并在这里发布了一个新问题:stackoverflow.com/questions/38152316/…

标签: python python-2.7 scipy


【解决方案1】:

所以我在这个项目中学到了一些关于 fmin 的东西:

-参数必须是数组格式,所以我创建了 return_array 辅助函数。

-要优化的变量必须在要最小化的函数中首先列出。所以对我来说它必须是 e(r,c,u,s),而不是 e(c,u,s,r)。

#calculate new fall out rates with fmin
import numpy as np
import pandas as pd
from scipy.optimize import fmin

data = pd.DataFrame({'DIV': [1,2,3]*3,
                     'MONTH': ['May','May','May','June','June','Jun','Jul','Jul','Jul'],
                     'C':[8]*9,
                     'U':[3,2,1]*3,
                     'S':[9]*9})

data.to_csv(r'C:\Users\mbabski\Documents\Unit Plan Summer 2016\data_test.csv')

def return_array(x):
    return x.values

def mape(c,u,s,r): #returns an array of line level Mean Absolute Percentage Errors
    p = c + u * r #calculates the forecasted number number
    m = abs(1.0-(p/s)) #calculates the MAPE at the line level
    return m

def e(r,c,u,s): #calculates average of the MAPEs
    return np.mean(mape(c,u,s,r)) 

for d in range(1,4):
    div_data = data[data.DIV==d]
    c = return_array(div_data.C)
    u = return_array(div_data.U)
    s = return_array(div_data.S)
    r0 = [[1.0]]
    t = fmin(e,r0,args=(c,u,s))
    print 'r:',t

优化成功终止。
当前函数值:0.000011
迭代次数:16
函数评估:32
r:[0.33330078]
优化成功终止。
当前函数值:0.000000
迭代次数:15
函数评估:30
r:[0.5]
优化成功终止。
当前函数值:0.000000
迭代次数:10
函数评估:20
r:[1.]

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2012-09-04
    相关资源
    最近更新 更多