Оптимизация списка
Не знаю как подступиться. Считаю минимум для функции 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()
