Nano Hash - криптовалюты, майнинг, программирование

Минимизация функции путем изменения параметров с помощью scipy

Я хочу минимизировать следующее уравнение, изменив параметры B0, B1, B2, B3, T1, T2. Переменная y просто еще одна переменная для вычисления целевой функции. Мне просто нужна помощь, чтобы свести к минимуму эту функцию (используемую в качестве целевой функции), изменив параметры, но я не могу получить результаты. Я пробовал использовать scipy, но параметры не менял. Запустив функцию, я получаю желаемый результат:

funcion_opt(B0, B1, B2, B3, T1, T2)
output:  64.30571361326217

Но когда делаю минимизацию, получаю следующий результат:

res = optimize.minimize(funcion_opt, parameters, args=(beta0, beta1, beta2, 
beta3, tau1, tau2))
output: funcion_opt() takes 6 positional arguments but 7 were given

Я знаю, что ошибка - это способ ввести параметры, и здесь мне нужна помощь. Извините, если это недостаточно ясно.

Небольшой пример моей проблемы:

y = np.array([98.494500, 97.828500, 97.610000, 97.314000, 97.014500, 
92.959000, 96.696222])
def objective(b0, b1, b2, b3, t1, t2):
    return (y * b0 + b1) - ( y * b2 + b3) + t1 + t2
    x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1...
    result = minimize(objective, x0, args=(b0, b1, b2, b3, t1, t2))

Я знаю, что входные данные в функции неправильные, переменные, которые являются постоянными, - это y, и я хочу изменить значения параметров b0, b1, b2, b3, t1, t2. Итак, функция минимизации, которая мне нужна, - это та, которая принимает возврат функции и, настраивая параметры, минимизирует ошибку. Так что, возможно, ошибка заключается в установке целевой функции.

Это фиктивная функция, исходная - это сумма квадратов ошибок. После этого мне нужно минимизировать функцию tat, изменив значения параметров внутри возвращаемого значения b0, b1, b2, b3, t1, t2, потому что в функции эти параметры установлены как. Коэффициент скидки не имеет значения, мне просто нужно изменить параметры на те, которые минимизируют целевую функцию:

Когда я пытаюсь свести к минимуму, получаю вывод, что ошибка такая же, а параметры не изменились. Мы будем очень благодарны за любую помощь в этом. Заранее спасибо.


  • Опубликуйте код, который вы пробовали, даже если он не сработал. Минимизация в scipy довольно проста, я уверен, что это будет небольшая ошибка. Но если вы не разместите код, с которым у вас проблемы, никто не сможет сказать вам, что с ним не так. 16.10.2018
  • Извините, я новичок в этом, я отредактирую код. Большое спасибо 16.10.2018
  • Ничего страшного, не нужно извиняться. Но это все еще не весь код - когда вы спрашиваете здесь, лучше всего создать минимальный рабочий пример (в данном случае работа означает создание той же ошибки), который кто-то может скопировать и попытаться выяснить, что не так. Кстати, таким образом (создавая минимальный рабочий пример) вы обычно сами выясняете, что не так (делал это сам много раз). См. stackoverflow.com/help/mcve. 16.10.2018
  • Еще одна вещь, которую вы должны уточнить, это что такое параметр y, и можно ли оптимизировать, используя постоянный параметр 'y'. Потому что основа вашей проблемы в том, что вы используете args для передачи переменных, которые вы хотите оптимизировать (это не то, для чего args). 16.10.2018
  • Кроме того, при создании минимального примера попробуйте использовать какой-нибудь фиктивный function_opt, потому что проблема не в нем. Например, что-то вроде def function_opt(b0, b1, b2, b3, t1, t2, y): return b0 + b1 + b2 + b3 + t1 + t2 + y - то есть что-то, что можно использовать для настройки части минимизации без необходимости знать, что делает function_opt. 16.10.2018
  • Готово, большое спасибо, извините за действительно плохое объяснение, которое я делаю, но мой английский не так хорош. 16.10.2018
  • Хорошо, но это не пример проблемы минимизации. Я имел в виду что-то вроде (очень упрощенно): def function_opt:...; init_x = 0, 1, 2...; opt_result = minimize(...); print opt_result.x, который будет «полным» кодом, который работает и демонстрирует вашу проблему. 16.10.2018
  • Кроме того, я до сих пор не совсем понимаю y - потому что то, что делает minimize, (очень упрощенно) состоит в том, что он пробует разные значения некоторого вектора X (с начальным значением x0), в то время как все другие параметры, которые нужны оптимизированной функции (и они ДОЛЖНЫ быть постоянным) может быть передано в args. Например, у меня может быть функция def myfn(a, b, scale): return (sin(a) + cos(b)) * scale, где я хотел бы оптимизировать a, b параметры для заданной (константы) scale (например, 2). Тогда звонок будет minimize(myfn, [0.0, 0.0], args=(2.0,)) 16.10.2018
  • Готово, если что-то непонятно, не волнуйтесь, я буду продолжать попытки и, когда получу, опубликую. Большое спасибо за вашу помощь, я очень ценю, что вы нашли время, чтобы помочь мне. 16.10.2018
  • Я заметил, что вы удалили y из функции objective - вам следовало оставить его, потому что теперь у него другая подпись, и код выглядит иначе. Поэтому я добавил ответ и для исходной функции. 16.10.2018

Ответы:


1

Ваша проблема заключается в передаче (b0, b1, b2, b3, t1, t2) в качестве аргументов - это должен быть вектор оптимизации, поэтому его следует передавать только в форме начального x0 (что вы и сделали). Поскольку вы удалили y из функции objective, нет необходимости в args (который предназначен для передачи постоянных параметров оптимизированной функции).

Вот как, я думаю, должно выглядеть использование objective функции после исправления (я завершил его с импортом и всем остальным, чтобы вы могли запускать его без изменений):

import numpy as np
from scipy.optimize import minimize

y = 10.0

def objective(b0, b1, b2, b3, t1, t2):
    return (y * b0 + b1) - ( y * b2 + b3) + t1 + t2

def objective_proxy(x):
    return objective(*x)

x0 = np.array([0.03, -0.03, 0, 0, 1, 1])
result = minimize(objective_proxy, x0)

Когда вы попробуете это с исходной функцией (у которой был y в качестве последнего параметра), вы можете передать y в args сейчас, потому что он постоянный, и результат будет выглядеть следующим образом:

y_value = np.array([98.494500, 97.828500, 97.610000, 97.314000, 97.014500, 
92.959000, 96.696222])

def function_opt(b0, b1, b2, b3, t1, t2, y):
    ...
    ...
    return ...

def function_opt_proxy(x, y):
    args = list(x) + [y]
    return function_opt(*args)


x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1...
result = minimize(function_opt_proxy, x0, args=(y_value,)

Обратите внимание, что я изменил y на y_value, чтобы избежать путаницы между параметром function_opt.

фиксированный:

Я добавил прокси-функцию, которая заботится о расширении параметров от повторяемых до индивидуальных.

16.10.2018
  • Спасибо. Результат: def objective(b0, b1, b2, b3, t1, t2, y): return (((np.exp(b0 + (b1 + b2) * (1 - np.exp(-x/t1)) * t1/x - b2 * np.exp(-x/t1) + b3 * (1 - np.exp(-x/t2)) * t2 / x - b3 * np.exp(-x / t2)) -1) - y) ** 2).sum() x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1... result = optimize.minimize(objective, x0, args=(y)) TypeError: objective() missing 5 required positional arguments: 'b2', 'b3', 't1', 't2', and 'y' x - это переменная, установленная перед функцией @Jan Spurny. Думаю проблема в том, чтобы связать значения x0 с параметрами функции 16.10.2018
  • О, я понимаю ... моя плохая - исправляю ответ сейчас 17.10.2018
  • спасибо, это отлично работает. Спасибо большое за вашу помощь 17.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..