Оптимизация списка

Не знаю как подступиться. Считаю минимум для функции f(x) и получаю результат: на расстоянии 5.087 минимум приходится на -24.083.

import tensorflow as tf
import numpy as np

optimizers = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.96, nesterov=True)

def f(x):
    return x ** 2 * tf.math.sin(x)

tfx = tf.Variable(-4.87)

for x in range(0, 1000):
    val = optimizers.minimize(lambda: f(tfx), var_list=[tfx])
    
print(np.round(tfx.numpy(), 3), np.round(f(tfx).numpy(), 3))

Как можно преобразовать этот код, чтобы получить минимум-максимум для нижеследующей y? Чтобы отобразить минимумы и максимумы на графике как в примере ниже, используя SGD оптимизацию.

x = np.arange(0,30,0.1)
y = np.sin(x)

plt.figure()
plt.plot(y)

Ответы (1 шт):

Автор решения: deethereal

А в чем проблема? У вас же уже все готово:
Надо задать функцию sin(x), которую вы хотите оптимизировать:

import numpy as np
import matplotlib.pyplot as plt

optimizers = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.96, nesterov=True)

def f(x):
    return  tf.math.sin(x)

После чего начинаете оптимизацию: минимизацию sin(x) и максимизацию -sin(x):

tfx_min = tf.Variable(5.)
tfx_max = tf.Variable(5.)


for x in range(0, 1000):
    min_val = optimizers.minimize(lambda: f(tfx_min), var_list=[tfx_min])
    max_val = optimizers.minimize(lambda: -f(tfx_max), var_list=[tfx_max])
print(np.round(tfx_min.numpy(), 3), np.round(f(tfx_min).numpy(), 3))
print(np.round(tfx_max.numpy(), 3), np.round(f(tfx_max).numpy(), 3))
>>> 4.712 -1.0 
>>> 7.854 1.0  

После чего изображаете полученный результат на графике:

x = np.arange(0,30,0.1)
y = np.sin(x)
plt.scatter(tfx_min.numpy(),f(tfx_min).numpy(), label='min', color='m')
plt.scatter(tfx_max.numpy(),f(tfx_max).numpy(),  label='max',color='r')
plt.plot(x,y)
plt.legend()
plt.show()

sin(x)

→ Ссылка