#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
В данном случае преобразование в линейную регрессию получается благодаря интегральному уравнению :