【问题标题】:Python - 'numpy.float64' object is not callable using minimize function for alpha optimization for Simple Exponential SmoothingPython - 'numpy.float64' 对象不可调用使用最小化函数进行简单指数平滑的 alpha 优化
【发布时间】:2014-09-26 17:08:36
【问题描述】:

我收到 TypeError: 'numpy.float64' object is not callable 以下代码错误:

import numpy as np
from scipy.optimize import minimize

def ses(data, alpha):
    fit=[]
    fit.append(alpha*data[1] + (1-alpha)*data[0])
    for i in range(2, len(data)):
        fit.append(data[i]*alpha + fit[i-2]*(1-alpha))
    return fit

def rmse(data, fit):
    se=[]
    for i in range(2,len(data)):
        se.append((data[i]-fit[i-2])*(data[i]-fit[i-2]))
    mse=np.mean(se)
    return np.sqrt(mse)


alpha=0.1555 # starting value
fit=ses(d[0], alpha)
error=rmse(d[0], fit)

result=minimize(error, alpha, (fit,), bounds=[(0,1)], method='SLSQP') 

我尝试了许多替代方法,但都不起作用。将列表更改为数组并使乘法不涉及指数(np.sqrt() 而不是 ()**0.5)

编辑:

def ses(data, alpha):
    fit=[]
    fit.append(alpha*data[1] + (1-alpha)*data[0])
    for i in range(2, len(data)):
        fit.append(data[i]*alpha + fit[i-2]*(1-alpha))
    return fit

def rmse(data, alpha):
    fit=ses(data, alpha)
    se=[]
    for i in range(2,len(data)):
        print i, i-2
        se.append((data[i]-fit[i-2])*(data[i]-fit[i-2]))
    mse=np.mean(se)
    return np.sqrt(mse)


alpha=0.1555 # starting value
data=d[0]


result = minimize(rmse, alpha, (data,), bounds=[(0,1)], method='SLSQP')

好的,谢谢。对此进行了编辑,我已经停止了错误,但是现在我得到一个索引超出范围的错误,这很奇怪,因为没有最小化行,代码运行得很好。

编辑 2:

出现了一系列愚蠢的错误,其中大部分是我不知道的问题,但通过反复试验解决了。

对于优化指数平滑的一些工作代码:

def ses(data, alpha):
    'Simple exponential smoothing'

    fit=[]
    fit.append(data[0])
    fit.append(data[1]) ## pads first two
    fit.append(alpha*data[1] + (1-alpha)*data[0])

    for i in range(2, len(data)-1):
        fit.append(alpha*data[i] + (1-alpha)*fit[i])
    return fit


def rmse(alpha, data):
    fit=ses(data, alpha)
    se=[]
    for i in range(2,len(data)):
        se.append((data[i]-fit[i-2])*(data[i]-fit[i-2]))
    mse=np.mean(se)
    return np.sqrt(mse)

alpha=0.5
data = d[0]

result = minimize(rmse, alpha, (data,), bounds=[(0,1)], method='SLSQP')

【问题讨论】:

  • 发布完整的 Traceback。让它更容易。
  • minimize() 在哪里定义?发布此功能。
  • 我认为你的函数定义中有 alphadata 参数。

标签: python optimization numpy scipy minimize


【解决方案1】:

很难确切地说出问题出在哪里。我假设minimize 实际上是Scipy's minimize

如果是这样,第一个参数应该是一个函数。相反,您传递的是 rmse 函数的输出,它是一个双精度数。

error=rmse(d[0], fit) # <--- returns a number

你应该有:

result=minimize(<some function here>, alpha, (fit,), bounds=[(0,1)], method='SLSQP')

minimize被调用时,它会尝试调用error,从而抛出一个TypeError: 'numpy.float64' object is not callable

有一个简单的教程 here 详细介绍了如何将 minimize 与顺序最小二乘编程优化算法一起使用。

我会冒昧地猜测您实际上希望将rmse 作为第一个参数传递:

result=minimize(rmse, alpha, (fit,), bounds=[(0,1)], method='SLSQP')

毕竟,rmse 函数会为您提供错误值,而这正是您在此类优化中最小化的值。

【讨论】:

  • 请阅读minimize 的文档,您当前的代码显然将数字作为第一个参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多