Gnuplot
Подгонка данных с помощью gnuplot
Поиск…
Вступление
Команда fit может поместить пользовательскую функцию в набор точек данных (x,y)
или (x,y,z)
, используя реализацию алгоритма Marquardt- Levenberg с нелинейным методом наименьших квадратов ( NLLS ).
Любая пользовательская переменная, встречающаяся в теле функции, может служить в качестве параметра соответствия, но возвращаемый тип функции должен быть реальным.
Синтаксис
- fit [ xrange ] [ yrange ] функция « файл данных » с использованием модификатора через параметр_файл
параметры
параметры | подробность |
---|---|
Параметры установки a , b , c и любая буква, которая ранее не использовалась | Используйте буквы для представления параметров, которые будут использоваться для соответствия функции. Например: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
Параметры файла start.par | Вместо использования неинициализированных параметров (Marquardt-Levenberg автоматически инициализируется для вас a=b=c=...=1 ), вы можете поместить их в файл start.par и их вызовет в разделе parameter_file . Например: fit f(x) 'data.dat' u 1:2 via 'start.par' . Пример для файла start.par показан ниже. |
замечания
Краткое введение
fit
используется для поиска набора параметров, которые «наилучшим образом» соответствуют вашим данным для вашей пользовательской функции. Подгонка оценивается на основе суммы квадратов разностей или «остатков» (SSR) между входными точками данных и значениями функций, оцениваемых в тех же местах. Эта величина часто называется «chisquare» (т. Е. Греческая буква chi, до степени 2). Алгоритм пытается минимизировать SSR или, точнее, WSSR, так как остатки «взвешиваются» по ошибкам входных данных (или 1.0) перед тем, как быть квадратными. ( Ibidem )
Файл fit.log
После каждого этапа итерации дается подробная информация о состоянии подгонки как на экране, так и на так называемом log-файле fit.log
. Этот файл никогда не будет удален, но всегда добавлен так, что история соответствия не будет потеряна.
Установка данных с ошибками
Может быть до 12 независимых переменных, всегда есть 1 зависимая переменная, и может быть установлено любое количество параметров. Необязательно, оценки погрешности могут быть введены для взвешивания точек данных. (Т. Уильямс, К. Келли - gnuplot 5.0, Интерактивная программа построения )
Если у вас есть набор данных и вы хотите поместиться, если команда очень простая и естественная:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
где вместо f(x)
может быть также f(x, y)
. В случае, если вы также имеете оценки ошибок данных, просто добавьте {y | xy | z}errors
( { | }
представляют возможные варианты) в опции модификатора (см. Синтаксис) . Например
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
где {y | xy | z}errors
требуется, соответственно, 1 ( y
), 2 ( xy
), 1 ( z
) столбец, определяющий значение оценки ошибки.
Экспоненциальная подгонка с xyerrors
файла
Оценки ошибок данных используются для расчета относительного веса каждой точки данных при определении взвешенной суммы квадратов остатков, WSSR или chisquare. Они могут влиять на оценки параметров, поскольку они определяют, какое влияние оказывает отклонение каждой точки данных от установленной функции на конечных значениях. Некоторая информация о выходных данных, включая оценки ошибок параметров, более значима, если были получены точные оценки ошибок данных. ( Ibidem )
Мы возьмем образец данных, measured.dat
, составленный из 4 столбцов: координаты оси x ( Temperature (K)
), координаты оси y ( Pressure (kPa)
), оценки ошибки x ( T_err (K)
) и оценки y-ошибок ( P_err (kPa)
).
#### 'measured.dat' ####
### Dependence of boiling water from Temperature and Pressure
##Temperature (K) - Pressure (kPa) - T_err (K) - P_err (kPa)
368.5 73.332 0.66 1.5
364.2 62.668 0.66 1.0
359.2 52.004 0.66 0.8
354.5 44.006 0.66 0.7
348.7 34.675 0.66 1.2
343.7 28.010 0.66 1.6
338.7 22.678 0.66 1.2
334.2 17.346 0.66 1.5
329.0 14.680 0.66 1.6
324.0 10.681 0.66 1.2
319.1 8.015 0.66 0.8
314.6 6.682 0.66 1.0
308.7 5.349 0.66 1.5
Теперь просто составьте прототип функции, которая из теории должна приблизиться к нашим данным. В этом случае:
Z = 0.001
f(x) = W * exp(x * Z)
где мы инициализировали параметр Z
потому что в противном случае оценка экспоненциальной функции exp(x * Z)
приводит к огромным значениям, которые приводят к (с плавающей запятой) бесконечности и NaN в алгоритме подгонки Marquardt-Levenberg, обычно вам не нужно будет инициализировать переменные - посмотрите здесь , если вы хотите узнать больше о Marquardt-Levenberg.
Пришло время подбирать данные!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Результат будет выглядеть так:
After 360 iterations the fit converged.
final sum of squares of residuals : 10.4163
rel. change during last iteration : -5.83931e-07
degrees of freedom (FIT_NDF) : 11
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 0.973105
variance of residuals (reduced chisquare) = WSSR/ndf : 0.946933
p-value of the Chisq distribution (FIT_P) : 0.493377
Final set of parameters Asymptotic Standard Error
======================= ==========================
W = 1.13381e-05 +/- 4.249e-06 (37.47%)
Z = 0.0426853 +/- 0.001047 (2.453%)
correlation matrix of the fit parameters:
W Z
W 1.000
Z -0.999 1.000
Где теперь W
и Z
заполняются требуемыми параметрами и оценками ошибок на них.
В приведенном ниже коде представлен следующий график.
set term pos col
set out 'PvsT.ps'
set grid
set key center
set xlabel 'T (K)'
set ylabel 'P (kPa)'
Z = 0.001
f(x) = W * exp(x * Z)
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
p [305:] 'measured.dat' u 1:2:3:4 ps 1.3 pt 2 t 'Data' w xyerrorbars,\
f(x) t 'Fit'
Участок с припадок measured.dat
Использование команды with xyerrorbars
будет отображать ошибки оценки по х и по у. set grid
будет помещать пунктирную сетку на основные тики.
В случае, если оценки ошибок недоступны или несущественны, возможно также установить данные без {y | xy | z}errors
:
fit f(x) "measured.dat" u 1:2 via W, Z
В этом случае также избегать xyerrorbars
.
Пример файла "start.par"
Если вы загружаете свои параметры соответствия из файла, вы должны объявить в нем все параметры, которые вы собираетесь использовать, и, при необходимости, инициализировать их.
## Start parameters for the fit of data.dat
m = -0.0005
q = -0.0005
d = 1.02
Tc = 45.0
g_d = 1.0
b = 0.01002
Fit: базовая линейная интерполяция набора данных
Основное использование подгонки лучше всего объясняется простым примером:
f(x) = a + b*x + c*x**2 fit [-234:320][0:200] f(x) ’measured.dat’ using 1:2 skip 4 via a,b,c plot ’measured.dat’ u 1:2, f(x)
Диапазоны могут быть заданы для фильтрации данных, используемых при установке. Точки данных вне диапазона игнорируются. (Т. Уильямс, К. Келли - gnuplot 5.0, Интерактивная программа построения )
Линейная интерполяция (фитинг с линией) - это самый простой способ подгонки набора данных. Предположим, у вас есть файл данных, в котором рост вашего y-количества является линейным, вы можете использовать
[...] линейных полиномов для построения новых точек данных в пределах диапазона дискретного набора известных точек данных. (из Википедии, Линейная интерполяция )
Пример с полиномом первого класса
Мы собираемся работать со следующим набором данных, который называется house_price.dat
, который включает в себя квадратные метры дома в определенном городе и его цену в 1000 долларов.
### 'house_price.dat'
## X-Axis: House price (in $1000) - Y-Axis: Square meters (m^2)
245 426.72
312 601.68
279 518.16
308 571.50
199 335.28
219 472.44
405 716.28
324 546.76
319 534.34
255 518.16
Давайте поместим эти параметры с помощью gnuplot. Сама команда очень проста, как вы можете заметить из синтаксиса, просто определите подходящий прототип, а затем используйте команду fit
чтобы получить результат:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Но было бы интересно также использовать полученные параметры в самом графике. Код ниже соответствует файлу house_price.dat
а затем house_price.dat
параметры m
и q
чтобы получить наилучшую аппроксимацию кривой набора данных. Как только у вас есть параметры, вы можете рассчитать значение y-value
, в этом случае цена дома , из любой данной x-vaule
( квадратные метры дома), просто подставляя формулу
y = m * x + q
соответствующее x-value
. Давайте прокомментируем код.
0. Установив термин
set term pos col
set out 'house_price_fit.ps'
1. Обычное администрирование, чтобы украсить график
set title 'Linear Regression Example Scatterplot'
set ylabel 'House price (k$ = $1000)'
set xlabel 'Square meters (m^2)'
set style line 1 ps 1.5 pt 7 lc 'red'
set style line 2 lw 1.5 lc 'blue'
set grid
set key bottom center box height 1.4
set xrange [0:450]
set yrange [0:]
2. Правильная посадка
Для этого нам нужно будет только ввести команды:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Сохранение значений m
и q
в строке и построение графика
Здесь мы используем функцию sprintf
для подготовки метки (помещенной в object rectangle
), в которой мы собираемся напечатать результат подгонки. Наконец, мы построим весь граф.
mq_value = sprintf("Parameters values\nm = %f k$/m^2\nq = %f k$", m, q)
set object 1 rect from 90,725 to 200, 650 fc rgb "white"
set label 1 at 100,700 mq_value
p 'house_price.dat' ls 1 t 'House price', f(x) ls 2 t 'Linear regression'
set out
Результат будет выглядеть следующим образом.