Моделирование
В качестве проблемы моделирования вы должны выбрать между тем, как перейти от четырехмерного пространства к одномерному. Вам нужна функция проекции: p: - R 4 -> R
Функция проецирования отметит часть ваших знаний о вашей проблеме. Если вы знаете, что первые параметры имеют гораздо большее значение, чем другие, вы можете перейти к функции p: (x, y, z, t) -> x и забыть о других параметрах. В общем, у вас нет этих знаний. Поэтому мы используем бритву Оккама (это часть машинного обучения в этой моделирующей части задачи. ), и сделайте модель как можно более простой, но не более того:
Я выбираю для примера: (1) p: (x, y, z, t) -> x + y + z + t
поэтому каждый параметр образца будет одинаково влиять на результат; Другим решением может быть: (2) * p: (x, y, z, t) -> x * y * z * t *
Но с преобразованием журнала на (2) вы получите что-то похожее на (1).
Вы выбираете функцию обучения: f (x) -> a * x ^ 3 + b * x ^ 2 + c * x + d. Вы должны позаботиться о том, как применять проекцию к функции обучения. Применение буквы p к модели не дает:
f(x,y,z,t) ->
a*(x + y + z + y)^3 +
b*(x + y + z + y)^2 +
c*(x + y + z + y)^1 +
d*(x + y + z + y)^0
но :
f(x,y,z,t) ->
a*(x)^3 + b*(x)^2 + c*(x) + d +
a*(y)^3 + b*(y)^2 + c*(y) + d +
a*(z)^3 + b*(z)^2 + c*(z) + d +
a*(t)^3 + b*(t)^2 + c*(t) + d
Это свойство независимости ваших параметров: вы применяете функцию обучения к каждому параметру. Знание того, что параметры связываются как уже закодированные, как часть выбора оператора '+' между каждым параметром.
Итак, решение проблемы изучения параметров (a1, b1, c1, d1) должно подойти для вашей модели:
f(x,y,z,t) ->
a1*(x^3 + y^3 + z^3 + t^3) +
b1*(x^2 + y^2 + z^2 + t^2) +
c1*(x + y + z + t) +
d1
Решение
При работе с gnuplot эти проблемы можно решить с помощью функция соответствия (глава 7).
f(x,y,z,t) = a1*(x**3 + y**3 + z**3 + t**3) + b1*(x**2 + y**2 + z**2 + t**2) + c1*(x + y + z + t) + d1
fit f(x,y,t,u) 'mydata.dat' using 1:2:3:4 via a1, b1, c1, d1
NB1: при использовании подгонки имя переменной 'z' зарезервировано для чего-то другого (помощь подгонки); поэтому вы должны переименовать переменную при использовании 'fit'.
NB2: mydata.dat содержит образцы, в которых каждый столбец разделен таблицей. Вы также должны добавить известное значение y для каждого образца. Итак, в mydata.dat есть 5 столбцов. (и имя файла должно заканчиваться на '.dat').
Итак, вот файл mydata.dat, который я использую:
1.5 2.3 4.2 0.9 1.0
1.2 0.3 1.2 0.3 2.0
0.5 1.3 2.2 1.5 3.0
4.2 2.5 3.2 6.2 4.0
Как видите, я добавил столбцы «y», которые дают ожидаемое значение для каждого образца. Затем запустите инструмент в консоли:
gnuplot> f(x,y,z,t) = a1*(x**3 + y**3 + z**3 + t**3) + b1*(x**2 + y**2 + z**2 + t**2) + c1*(x + y + z + t) + d1
gnuplot> fit f(x,y,t,u) 'mydata.dat' using 1:2:3:4 via a1, b1, c1, d1
[many lines]
After 9 iterations the fit converged.
final sum of squares of residuals : 8.7617e-31
abs. change during last iteration : -2.9774e-30
Exactly as many data points as there are parameters.
In this degenerate case, all errors are zero by definition.
Final set of parameters
=======================
a1 = 0.340413
b1 = -2.7489
c1 = 6.44678
d1 = -4.86178
Итак, проблема решена.
Gnuplot - это открытый исходный код, поэтому просмотр исходного кода может стать хорошей отправной точкой, если вы хотите написать его самостоятельно. Вы также можете начать с "help fit" в gnuplot; речь идет о нелинейном (NLLS) алгоритме Марквардта-Левенберга нелинейных наименьших квадратов. .
Реализация эквивалентных алгоритмов на самом деле не требует всех этих математических знаний (математика нужна только для скорости). Все, что вам нужно сделать, это алгоритмы поиска (например, генетика; изменяет параметры a1-d1 случайным образом после их записи в двоичном формате), где критерием оптимизированного поиска является метод наименьших квадратов ошибок с обучающими выборками.
person
Galigator
schedule
19.07.2013