#python #algorithm #class #parameter-passing
#python #алгоритм #класс #передача параметров
Вопрос:
Я пытаюсь закодировать класс абстрактного алгоритма, но я не знаю, как управлять множеством алгоритмов.
class Algorithm:
def __init__(self, x_init):
self.x = x_init
def run(self, n_it):
for it in range(n_it):
self.x = self.T(self.x)
def T(self, x):
pass
Он состоит в том, чтобы запускать мой алгоритм во время итераций n_it. Моя проблема в том, что некоторые алгоритмы имеют гиперпараметры, итак, как я могу их включить? Кроме того, некоторые алгоритмы используют шаг в прошлом x_{n-1}, и я бы
self.x = self.T(self.x, self.x_past)
но это не работает с этой настройкой. Какое решение, по вашему мнению, является лучшим?
T может быть вне класса, но для меня логичнее быть внутри. Я использую Algorithm как абстрактный класс и создаю дочерний класс для каждого из моих алгоритмов, определяя T. Возможно, есть более эффективный способ.
Я, вероятно, могу использовать *args
и *kwargs
. Более того, поскольку я ввел x в качестве атрибута, я могу написать
def T(self):
pass
и изменять непосредственно в T, это, вероятно, более логично с точки зрения pythonic, но немного меньше с математической точки зрения. Есть ли у вас какие-либо предложения по улучшению моего кода и решению моей проблемы?
Ответ №1:
Вы пытаетесь использовать здесь технику функционального программирования. Использование OO-дизайна вокруг него создает код без реальной пользы. Ниже приведена более простая версия вашего кода:
def run (x, n_it, t):
for it in range(n_it)
x = t(x)
return x
И теперь, если кто-то хочет что-то делать с метапараметрами, они могут просто передать замыкание.
def setup_t(parameters):
prev_x = 0
def t (x):
answer = ... # do something with parameters and x
nonlocal prev_x = x
return answer
return t
Таким образом, вызывающий может обрабатывать метапараметры в настройке и отслеживать предыдущее значение или три, если им нужно. Они лучше вас подготовлены к тому, с какими сложностями им приходится иметь дело, поэтому предоставьте это им.
Комментарии:
1. Я не уверен, что понимаю (но это кажется отличным). Предположим, что я хочу повторить следующее уравнение: x_{n 1} = alpha * x_n (1- alpha) *x_{n-1} Что я могу сделать с вашей настройкой? И другим примером может быть x_{n 1} = x_n 1/n **2
2. @NM36 Честно говоря, я бы потратил некоторое время на изучение wiki. python.org/moin/Generators и просто используйте функциональные методы. Поэтому вместо того, чтобы пытаться создать фреймворк для передачи алгоритма извне, передайте диапазон в алгоритм и верните генератор.