Я пытаюсь научить себя 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 моей функцииprept_temp с учетом функции ошибки и моих данных past_temps?
В частности, я хотел бы написать функцию минимизации (аргументы *), которая принимает функцию прогнозирования, функцию ошибки, некоторые обучающие данные и использует некоторый метод поиска / оптимизации (например, градиентный спуск) для оценки и возврата значений. 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
Редактировать: Это так просто ?? Это не весело. Я возвращаюсь на Яву.
Что касается более серьезной ноты, я думаю, что я также был зациклен на том, как использовать различные функции прогнозирования с различным количеством параметров для настройки. Если я просто возьму все свободные параметры в один кортеж, я смогу сохранить форму функции такой же, чтобы ее было легко передавать и использовать.