gpt4 book ai didi

python - 需要帮助理解 Python 中的函数传递

转载 作者:太空狗 更新时间:2023-10-30 01:44:06 27 4
gpt4 key购买 nike

我正在尝试通过解决我遇到的一些问题来自学 Python,我需要一些帮助来理解如何传递函数。

假设我要根据今天和昨天的温度预测明天的温度,我编写了以下函数:

def predict_temp(temp_today, temp_yest, k1, k2):
return k1*temp_today + k2*temp_yest

我还编写了一个误差函数来比较预测温度列表与实际温度并返回平均绝对误差:

def mean_abs_error(predictions, expected):
return sum([abs(x - y) for (x,y) in zip(predictions,expected)]) / float(len(predictions))

现在,如果我有过去某个时间间隔内的每日温度列表,我可以看到我的预测函数如何使用特定的 k1 和 k2 参数,如下所示:

>>> past_temps = [41, 35, 37, 42, 48, 30, 39, 42, 33]
>>> pred_temps = [predict_temp(past_temps[i-1],past_temps[i-2],0.5,0.5) for i in xrange(2,len(past_temps))]
>>> print pred_temps
[38.0, 36.0, 39.5, 45.0, 39.0, 34.5, 40.5]
>>> print mean_abs_error(pred_temps, past_temps[2:])
6.5

但是,在给定误差函数和我的 past_temps 数据的情况下,如何设计一个函数来最小化我的 predict_temp 函数的参数 k1 和 k2?

具体来说,我想编写一个函数 minimize(args*),它采用预测函数、误差函数、一些训练数据,并使用一些搜索/优化方法(例如梯度下降)来估计和返回值给定数据的 k1 和 k2 最小化我的错误?

我不是问如何实现优化方法。假设我能做到。相反,我只想知道如何将我的预测和误差函数(以及我的数据)传递给我的最小化函数,以及如何告诉我的最小化函数它应该优化参数 k1和 k2,这样我的最小化函数就可以自动搜索一堆不同的 k1 和 k2 设置,每次将我的预测函数与这些参数应用于数据和计算误差(就像我手动为 k1=0.5 和k2=0.5 以上),然后返回最好的结果。

我希望能够传递这些函数,这样我就可以轻松地交换不同的预测和误差函数(不仅仅是参数设置的不同)。每个预测函数可能有不同数量的自由参数。

我的最小化函数应该看起来像这样,但我不知道如何继续:

def minimize(prediction_function, which_args_to_optimize, error_function, data):
# 1: guess initial parameters
# 2: apply prediction function with current parameters to data to compute predictions
# 3: use error function to compute error between predictions and data
# 4: if stopping criterion is met, return parameters
# 5: update parameters
# 6: GOTO 2

编辑:就这么简单??这一点都不好玩。我要回到 Java。

更严肃地说,我想我也对如何使用具有不同数量参数的不同预测函数进行调整感到困惑。如果我只是将所有自由参数作为一个元组,我可以保持函数的形式相同,以便于传递和使用。

最佳答案

这是一个如何将一个函数传递给另一个函数的例子。 apply_func_to 将一个函数 f 和一个数字 num 作为参数并返回 f(num)

def my_func(x):
return x*x

def apply_func_to(f, num):
return f(num)

>>>apply_func_to(my_func, 2)
4

如果您想变聪明,可以使用 lambda(也可以使用匿名函数)。这些允许您“即时”传递函数,而无需单独定义它们

>>>apply_func_to(lambda x:x*x, 3)
9

希望这对您有所帮助。

关于python - 需要帮助理解 Python 中的函数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/578812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com