C #. Как мне применить гауссову колоколообразную кривую к моему пику?

#c# #curve-fitting #gaussian

#c# #подгонка кривой #гауссовская

Вопрос:

У меня слишком много проблем с пониманием того, как подогнать гауссову кривую к моему пику. Есть несколько похожих вопросов, но даже после их рассмотрения я все еще не уверен. Статистика / теория вероятностей и т. Д. Никогда не были моей сильной стороной, но я думаю, что меня смущает то, что гауссовская колоколообразная кривая вычисляется просто с использованием среднего и стандартного отклонения. Фактические необработанные значения в пике не используются, в отличие от других методов подгонки кривой.

Я реализовал функцию Гаусса таким образом;

 public static float getGaussian(float x,  float mean, float stdDev)
{
            float v1 = 1F / (stdDev * (float)Math.Sqrt(2 * Math.PI));
            float v2 = ((x - mean) * (x - mean)) / (2 * (stdDev * stdDev));
            return (v1 * (float)Math.Exp(-v2));
}
  

Я думаю, что это правильно, но моя «кривая» в итоге выглядит как плоская равнина, поэтому я, очевидно, делаю что-то не так.

Вот пример пикавведите описание изображения здесь

Исходные данные, т.Е. Точки (x, y), являются

(9,0)
(10,1)
(11,2)
(12,3)
(13,4)
(14,10)
(15,12)
(16,13)
(17,23)
(18,26)
(19,23)
(20,20)
(21,17)
(22,12)
(23,5)
(24,3)
(25,3)
(26,4)
(27,2)
(28,2)
(29,1)

Кто-нибудь может объяснить, как кривая Гаусса должна быть рассчитана на основе этих данных и как будет выглядеть кривая?

Ответ №1:

Кажется, что у вас есть только целые числа. Предполагая, что это гистограмма, полученная из обычных распределенных данных, вы бы просто:

 xs = sum_i x_i * y_i
ns = sum_i y_i
mean = xs / ns

ss = sum_i  y_i * ( x_i - mean) * ( x_i - mean)
sigma = sqrt( ss / ( ns - 1 ) )
  

Наконец, если g( x, x0, s ) является нормализованным гауссовым значением со средним x0 и стандартным отклонением s , то

 ns * g( x, mean, sigma )
  

должно приблизить ваши данные.

Комментарии:

1. Я реализовал ваш псевдокод выше на C #, и он хорошо выглядит, так что спасибо. Да, в примере я использовал целые числа. Но имеет ли значение, если одна или обе оси x и y были числами с плавающей запятой?

2. @Doug Ну, практически есть интеграция, где я умножаю на ширину ячейки, т. Е. y * dx, ( здесь dx = 1 ). Итак, если вы получаете неравномерно распределенные значения, они меняются. Если только значения y становятся плавающими, это должно сработать.

Ответ №2:

Другой метод подгонки показан ниже.

введите описание изображения здесь

введите описание изображения здесь

Для информации: общий принцип объясняется в https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales (По-французски). Неполный перевод Джозефа Р. Фокса-Рабиновица в: https://scikit-guess.readthedocs.io/en/latest/appendices/references.html

В данном случае преобразование в линейную регрессию получается благодаря интегральному уравнению : введите описание изображения здесь