我正在通过解决一些问题来学习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
但是,我该如何设计一个函数来最小化我的预测温度函数的参数 k1 和 k2 呢?考虑到一个错误函数和我的过去温度数据。
具体来说,我想编写一个名为 minimize(args*) 的函数。它需要接收一个预测函数、一个误差函数、一些训练数据,使用某种搜索/优化方法(例如梯度下降)来估计并返回最小化误差的 k1 和 k2 的值。
我不是在询问如何实现优化方法。假设我已经能够这样做了。相反,我只是想知道如何将我的预测和误差函数(以及我的数据)传递给我的 minimize 函数,以及如何告诉我的 minimize 函数它应该对参数 k1 和 k2 进行优化,以便我的 minimize 函数可以自动搜索不同的 k1 和 k2 设置,每次使用这些参数应用于数据并计算误差(就像我手动为 k1=0.5 和 k2=0.5 时所做的那样),然后返回最佳结果。
我希望能够传递这些函数,以便轻松地更换不同的预测和误差函数(除了参数设置之外,还可能有其他区别)。每个预测函数可能具有不同数量的自由参数。
我的 minimize 函数应该像这样,但是我不知道该如何继续:
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。
更严肃的是,我认为我也被卡住了,不知道如何使用具有不同参数数量的不同预测函数进行调整。如果我将所有自由参数放在一个元组中,我可以保持函数的形式相同,使其易于传递和使用。