Функция плотности вероятности в гистограмме (gnuplot)

Вопрос или проблема

Я работал над построением гистограммы в gnuplot, но я хотел бы также включить распределение плотности вероятности поверх самой гистограммы. В настоящее время я могу создать рисунок ниже, но кажется, что масштаб функции плотности вероятности полностью неправильный.

данные из ‘DZ_ref-CCSD_error’ – https://pastebin.com/xX1MUd8i

Прикрепленный код:

reset
stats 'DZ_ref-CCSD_error' using 1
 n=STATS_records #количество интервалов
 max=STATS_max #максимальное значение
 min=STATS_min #минимальное значение
 width=(max-min)/n #ширина интервала
 binwidth=6
#+width/2.0 для центра графика
 bin(x,width)=width*floor(x/width) + width/2.0
 set term png
 set output "histogram_out.png"
 set xtics -100,50,100
 set boxwidth binwidth
 set mxtics 5
 set style fill solid 0.5 
 set tics out nomirror
 set tics font ", 12"
 set ytics 0,0.25,0.5
 set mytics 5
 set yrange [0:0.50]
 set xrange [-100:100]
 gauss(x)=a/(sqrt(2*pi)*sigma)*exp(-(x-mean)**2/(2*sigma**2))
 fit gauss(x) 'DZ_ref-CCSD_error' via a, sigma, mean
 plot 'DZ_ref-CCSD_error' u (bin($1, binwidth)-0.5*binwidth):(1./n*binwidth) smooth fnormal w boxes lc           rgb     "green" notitle, \
  gauss(x) w lines ls 2 lw 2

гистограмма с неправильной плотностью вероятности

Если кто-то может указать на мою ошибку или добавить какие-либо мысли по этому вопросу, я буду очень признателен!

Ответ или решение

Вопрос о наложении функции плотности вероятности (PDF) на гистограмму в gnuplot является весьма актуальным среди исследователей и специалистов в области статистики и визуализации данных. Вы привели код, который создает гистограмму, но, как вы упомянули, масштаб вашей функции плотности вероятности кажется неправильным. Давайте разберем этот вопрос более подробно.

1. Понять структуру данных

Для начала, убедитесь, что ваши данные из файла ‘DZ_ref-CCSD_error’, доступного по ссылке, действительно имеют нужный формат. Данные должны быть организованы в виде одного столбца с числовыми значениями, которые вы хотите визуализировать.

2. Основы построения гистограммы в gnuplot

Ваш код создает гистограмму следующим образом:

plot 'DZ_ref-CCSD_error' u (bin($1, binwidth)-0.5*binwidth):(1./n*binwidth) smooth fnormal w boxes lc rgb "green" notitle

Однако здесь присутствует некорректное применение функции нормализации для подсчета вероятности. Давайте попробуем разобраться в масштабах.

3. Параметры для корректного расчета плотности

Формула для гистограммы должна нормализоваться к единице, чтобы соответствовать функции плотности вероятности. Для этого можно воспользоваться следующей логикой:

  • Общее количество наблюдений (n) необходимо использовать для нормализации высоты столбиков гистограммы.
  • Вместо использования фиксированной высоты 1./n*binwidth используйте:

[
\text{height} = \frac{\text{количество элементов в интервале}}{n \cdot \text{ширина интервала}}
]

В таком случае код будет выглядеть так:

plot 'DZ_ref-CCSD_error' u (bin($1, binwidth)-0.5*binwidth):(1.0/count($1)) smooth freq w boxes lc rgb "green" notitle

Здесь count($1) определяет количество элементов, попадающих в заданный интервал.

4. Коррекция функции плотности

Ваше определение гауссовой функции также требует небольших корректировок для нормализации:

gauss(x) = a * (1 / (sqrt(2 * pi) * sigma)) * exp(-((x - mean)**2) / (2 * sigma**2))

Вашу функцию следует представить в виде нормализованной, где ‘a’ является максимальной амплитудой, а не произвольной константой.

5. Финальная версия кода

Объединив все вышесказанное, финальный код может выглядеть следующим образом:

reset
stats 'DZ_ref-CCSD_error' using 1
n=STATS_records
max=STATS_max
min=STATS_min
width=(max-min)/n
binwidth=6
bin(x,width) = width*floor(x/width) + width/2.0

set term png
set output "histogram_out.png"
set xtics -100,50,100
set boxwidth binwidth
set style fill solid 0.5 
set ytics 0,0.25,0.5
set yrange [0:0.50]
set xrange [-100:100]

gauss(x) = (1 / (sqrt(2 * pi) * sigma)) * exp(-((x - mean)**2) / (2 * sigma**2))
fit gauss(x) 'DZ_ref-CCSD_error' via a, sigma, mean

set key outside
plot 'DZ_ref-CCSD_error' u (bin($1, binwidth)-0.5*binwidth):(1.0/count($1))/n/width smooth freq w boxes lc rgb "green" notitle, \
     gauss(x) w lines ls 2 lw 2 title 'Гауссово распределение'

6. Заключение

С помощью указанных изменений вы сможете корректно отобразить функцию плотности вероятности поверх гистограммы. Убедитесь, что функции и параметры правильные, чтобы визуализация была точной и понятной. Если у вас возникнут дополнительные вопросы или потребуется помощь с другими аспектами gnuplot или анализа данных, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...