Python - 使用最小化函数进行简单指数平滑的 alpha 优化时出现 'numpy.float64' 对象不可调用的问题

0 投票
1 回答
2925 浏览
提问于 2025-04-18 15:53

我在运行以下代码时遇到了一个错误,提示是 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')

好的,大家,谢谢你们。我修改了代码,现在这个错误没有了,但我又遇到了一个索引超出范围的错误,这很奇怪,因为不加 minimize 这一行,代码运行得很好。

编辑 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')

1 个回答

1

这里很难准确说出问题出在哪里。我猜这里提到的 minimize 实际上是指 Scipy库中的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 的错误。

这里有一个简单的教程 可以参考,它详细讲解了如何使用 minimize 和顺序最小二乘编程优化算法。

我猜测你其实是想把 rmse 作为第一个参数传入:

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

毕竟,rmse 函数给你的是误差值,而你在优化中就是要最小化这个值。

撰写回答