Я новичок в gnuplot. Я также новичок в повторной выборке плотности ядра с использованием гауссовой функции, поддерживаемой gnuplot с использованием «гладкой плотности». Я поигрался с демонстрационным скриптом gnuplot, представленным ниже. Я пытаюсь понять, что означает второй столбец $kdensity1. Если я напечатаю $kdensity1, я получу следующие значения:
(...)
140,76 13,1663 13,1663 я
146.032 12.5092 12.5092 я
151.304 11.6501 11.6501 я
156.575 10.6298 10.6298 я
161.847 9.5347 9.5347 я
167.119 8.48325 8.48325 я
172.391 7.56657 7.56657 я
177.662 6.80631 6.80631 я
(...)
Первый столбец представляет собой вычисленное ядро Гаусса по выборочным значениям, определенным вторым столбцом $viol1, предоставленным рандомизированным выражением. Но я пытаюсь понять, как вычисляется второй столбец $kdensity1, поскольку он определяет «плотность» или распространение скрипичного сюжета. И, похоже, предполагается константа 20,0 из расчета $2/20,0. Но это значение, несомненно, должно быть другим, учитывая другой набор выборок, имеющий другой диапазон. Таким образом, как вычисляется столбец 2 $kdensity1 (или какова его взаимосвязь) и как мне найти константу (20) для вычисления расширения?
nsamp = 3000
set print $viol1
do for [i=1:nsamp] {
y = (i%4 == 0) ? 300. + 70.*invnorm(rand(0)) \
: (i%4 == 1) ? 400. + 10.*invnorm(rand(0)) \
: 120. + 40.*invnorm(rand(0))
print sprintf(" 35.0 %8.5g", y)
}
unset print
set title "kdensity mirrored sideways to give a violin plot"
set table $kdensity1
plot $viol1 using 2:(1) smooth kdensity bandwidth 10. with filledcurves above y lt 9 title 'B'
unset table
set border 2
unset margins
unset xtics
set ytics nomirror rangelimited
set xrange [-1:5]
plot $kdensity1 using (3 + $2/20.):1 with filledcurve x=3 lt 9 notitle, '' using (3 - $2/20.):1 with filledcurve x=3 lt 9 notitle





Вы имеете в виду демонстрацию скрипичного сюжета . Проверьте в Википедии Kernel_(statistics) и в gnuplot help kdensity:
Опция Smooth kdensity генерирует и строит оценку плотности ядра с использованием ядер Гаусса для распределения, из которого был получен набор значений. Значения берутся из первого столбца данных, необязательные веса берутся из второго столбца. Гауссиан помещается в каждую точку, а сумма всех этих гауссиан отображается как функция. Чтобы получить нормализованную гистограмму, каждый вес должен быть равен 1/количество точек.
...
и взгляните на дальнейший минимизированный пример.
$Data требуется только один столбец данныхsmooth kdensity часть (1) — это вес этой точки данных, здесь постоянное значение 1 (из-за круглых скобок). Как подсказывает help kdensity, вместо этого вы можете использовать (1/N), где N — количество баллов, чтобы получить нормализованный скрипичный сюжет.with filledcurves above y lt 9 title 'B' для отображения в таблице. Это создает ненужный третий столбец, который идентичен второму столбцу.Насколько я понимаю, для каждой точки данных будет ядро Гаусса заданной ширины и площади 1. И вы суммируете все гауссианы, что даст вам форму кривой во втором столбце $kdensity.
Что касается $2/20., я думаю, что этот коэффициент 20. в примере является просто коэффициентом масштабирования, чтобы два скрипичных графика не пересекались на графике.
Чтобы автоматически определить разумный коэффициент масштабирования, вы можете сделать stats, чтобы получить максимум второго столбца блока данных $kdensity.
Если вы хотите сравнить несколько графиков скрипки, вам следует принять максимум всех максимумов в качестве коэффициента масштабирования.
А 3 + и 3 - в команде сюжета — это просто смещение по оси X, где зеркально отображается ваш скрипичный сюжет.
Скрипт:
### violin plot
reset session
$Data <<EOD
1.0
2.0
4.0
1.0
2.0
2.0
EOD
N = |$Data|
set table $kdensity
plot $Data u 1:(1) smooth kdensity bandwidth 0.2
unset table
stats [*:*][*:*] $kdensity u 2
print STATS_max, STATS_min
set key noautotitle
set xrange[1:5]
set yrange[0:5]
plot $kdensity u (3 + $2/STATS_max):1 w filledcurve x=3 lt 9, \
'' u (3 - $2/STATS_max):1 w filledcurve x=3 lt 9
### end of script
На самом деле вы можете сократить команду построения графика до одной строки:
plot for [i=-1:1:2] $kdensity u (3 + i*$2/STATS_max):1 w filledcurve x=3 lt 9
Результат:
Второй комментарий. Это просто поразило меня. В объяснении плотности ядра используется терминология «математической статистики». Но в терминологии электротехники функция плотности ядра — это передаточная функция передискретизации фильтра нижних частот. Передаточная функция передискретизации нормализуется до 1, чтобы обеспечить коэффициент усиления 1 для процесса фильтрации. Таким образом, второй столбец представляет собой результат фильтрации выборок, выполненной путем свертки входных выборок с помощью функции передискретизации передачи нижних частот. График скрипки поворачивает отфильтрованные входные сэмплы на 90 градусов и отражает их.
Да, ты прав. Используя ваше объяснение с информацией, представленной по этой ссылке: todatascience.com/… Я смог понять второй столбец. Если я использую $Data с единственным значением 1, я могу вычислить второе значение — «импульсный» отклик ядра Гаусса. Вычисленные значения соответствуют второму столбцу $kdensity.