我试图通过解决我提出的一些问题来教自己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
但是如何设计一个函数来最小化我的predict_temp函数的参数k1和k2给定一个错误函数和我的past_temps数据?
具体来说,我想写一个函数最小化(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
作为参数和return 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
希望这可以帮助.