在 Python 中,最小化预测函数的参数通常涉及使用优化算法来调整模型的参数,以减少预测误差。下面介绍几种常见的方法来实现这一目标,主要使用 scipy
和 numpy
库。
1、问题背景
我正在尝试通过解决自己想出的问题来学习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?
具体来说,我想编写一个函数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
2、解决方案
为了解决这个问题,我们可以:
- 定义一个函数来计算预测和实际值之间的误差。
- 定义一个函数来随机生成参数值。
- 使用优化算法来找到一组参数值,从而最小化误差函数。
以下代码示例演示了如何实现此解决方案:
import numpy as np
from scipy.optimize import minimize
# Define the prediction function
def predict_temp(temp_today, temp_yest, k1, k2):
return k1*temp_today + k2*temp_yest
# Define the error function
def error_function(params, temp_today, temp_yest, temp_actual):
# Unpack the parameters
k1, k2 = params
# Compute the predictions
predictions = predict_temp(temp_today, temp_yest, k1, k2)
# Compute the error
error = mean_squared_error(predictions, temp_actual)
return error
# Generate random initial parameters
initial_parameters = np.random.uniform(-1, 1, 2)
# Find the optimal parameters
optimal_parameters = minimize(error_function, initial_parameters, args=(temp_today, temp_yest, temp_actual))
# Print the optimal parameters
print(optimal_parameters)
在上面的代码示例中,我们首先定义了预测函数predict_temp()
和误差函数error_function()
。然后,我们生成一组随机初始参数值。接下来,我们使用scipy.optimize.minimize()
函数来找到一组参数值,从而最小化误差函数。最后,我们打印出最佳参数值。
选择适合的方法取决于你的具体需求和模型的复杂性。以上示例提供了一个基础框架,可以根据需要进行扩展和修改。