Недавно я обнаружил действительно странное поведение моей модели ИИ. Я хотел построить модель ИИ, которая попыталась бы угадать неявные функции на основе данных, которые я ей предоставил. Например, уравнение цветка:
И вот как я записал это в массиве Numpy:
K = 0.75
a = 9
def f(x):
return x - 2 - 2*np.floor((x - 1)/2)
def r1(x):
return abs(6 * f(a * K * x / 2 / np.pi)) - a/2
t = np.linspace(0, 17 * math.pi, 1000)
x = np.cos(t) * r1(t)
y = np.sin(t) * r1(t)
points = np.vstack((x, y)).T
После этого я попробовал немного поэкспериментировать и позволил своему ИИ угадать форму этого цветка! С первой попытки все действительно было написано.
Вот:
Ну, у меня есть отличный пример. После этого я попробовал поэкспериментировать и проверил, что будет, если я перетасую массив точек, и получил совершенно ошеломляющие результаты!
И я не мог объяснить, почему порядок декартовых координат имеет значение для приближенной неявной функции цветка. Может ли кто-нибудь объяснить это?
Вот код для AI.
# Define the neural network model
model = Sequential()
model.add(Dense(128, input_dim=2, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(2, activation='linear'))
# Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')
# Train the model
model.fit(points, points, epochs=100, batch_size=32)
Не могли бы вы исправить/исправить утверждения «позволил моему ИИ на самом деле попытаться угадать форму» и «Приблизительная форма», чего на самом деле не произошло? Правильный текст может быть таким: «Как Matplotlib соединил заданный список точек», а может быть и нет?
Решено, так что на самом деле проблема заключалась в том, как я рисовал реальный результат работы ИИ. На самом деле Ай хорошо обобщил это, но, поскольку точки были перетасованы, matplotlib просто соединил точки не по порядку и получил странные результаты.
Не могли бы вы доказать это утверждение? Лучше всего опубликовать полный код, а также запустить и опубликовать результаты «предсказывающей» модели со случайным порядком входных точек сетки [x_i, y_i] для некоторых тестовых случаев 1E9, охватывающих 2D-домены (-1E1, + 1E1), ( -1E401, -1E400 ), ( -1E-400, +1E-400 ), чтобы увидеть фактический уровень «правильности» модели как есть. В любом случае, наслаждайтесь будущим :о)
ну, зачем мне включать такие большие значения, если исходная функция не распространяется на эти пределы @user3666197
Цель состоит в том, чтобы действительно проверить, хорошо ли «обученный» предсказатель преуспевает в реальных ситуациях (реальный мир не курирует «академически» наивные наборы данных, а как раз наоборот — сигналы тревоги НАСА «Аполлон-11» о посадке на Луну (были очень близки) до крушения или очистки миссии с очернением пролета и возвращением обратно на Землю) был кристально ясным примером того, как «академически»-наивные «испытания»-(только предварительно обработанные)-примеры могут убить весь экипаж. То же самое и здесь. если вы при обучении не привели примеров из этих областей (чего вы не сделали), тем более ответственно вы должны протестировать, что выйдет «выходом наружу», если вас об этом попросят .predict()
...
На самом деле, это вопрос сюжета. Порядок в сюжете имеет значение, а порядок в разбросе нет:
import matplotlib.pyplot as plt
shuffled_points = np.random.permutation(points)
plt.scatter(*points.T) # in .scatter()-method POINT-s are depicted
plt.scatter(*shuffled_points.T) # in .scatter()-method order does NOT matter
plt.plot(*points.T, color = "r") # in .plot()-method interpolator follows the order
plt.plot(*shuffled_points.T, color = "r") # method creates a SEQUENCE of LINEs
Правильно ли я прочитал, что вы «тестируете» обученную модель не чем иным, как точками, по которым она была «обучена»? На каком университетском курсе этому учили? Проверка «предсказывающих» способностей «обученной» модели должна предоставить такую модель с еще не увиденными данными (не просто тем же набором, просто в другом порядке появления), не так ли? Не могли бы вы улучшить свой ответ фактическими результатами настоящего тестирования, как указано в stackoverflow.com/questions/78811505/… ?
Не придавайте этому большого значения. Проблема ОП связана с Matplotlib, а не с ML. Не стесняйтесь «улучшить» ответ ;)
Нарисуйте хотя бы .scatter()
из на самом деле predicted_points
...
Обновил ответ, удалив предсказание встретиться с вами на полпути. Лучше не получится ;)
@ user3666197 Основная цель ИИ — аппроксимировать функцию и нарисовать какую-то фигуру на основе заданных точек.
При всём уважении, не так. Как указано в исходном коде, «ИИ» не тестировался ни в одной другой точке, кроме тех, которые были «обучены» (что неудивительно) и «соответствовали» функции (поэтому не имея контрпримеров, нет была предпринята попытка увидеть, насколько хорошо или плохо модель «обобщала» обученный набор данных). Исходный код рисует точки (в .scatter()
-методе) или интерполированные линии (в .plot()
-методе), но ни первое, ни второе не было результатом модели ИИ, только стандартный вывод из Matplotlib, модель ИИ не имеет подсказка «формы», она видела точки.
@user3666197 user3666197 ну, как следует составлять данные тестирования для точек, которые представляют некоторую неявную функцию?
Как было описано здесь - stackoverflow.com/users/3666197/user3666197 Если обученный преобразователь (2-в-2-выход) действительно покрывает «правильные» переводы во всех таких доменах, вы можете быть уверены, что он работает. Если он генерирует мусор или выходит из строя, лучше знать об этом, прежде чем он «убьет следующую команду», как объяснялось выше — это справедливо, не так ли? Кто захочет еще раз повторить какую-либо ошибку, допущенную НАСА? Никогда не знаешь, кто будет экипажем, которого «(не) убьют снова», не так ли?
@user3666197 user3666197 о, спасибо за замечание! Я допустил критическую ошибку, мне следует сопоставить координаты с одним выходом, потому что по определению неявная функция — это такая функция, что F(r1, r2, r3 .... rn) = 0
Решено, так что на самом деле проблема заключалась в том, как я рисовал реальный результат работы ИИ. На самом деле Ай хорошо обобщил это, но, поскольку точки были перетасованы, matplotlib просто соединил точки не по порядку и получил странные результаты.