C#。如何将高斯钟形曲线应用于峰值?

C#。如何将高斯钟形曲线应用于峰值?,c#,curve-fitting,gaussian,C#,Curve Fitting,Gaussian,我在理解如何将高斯曲线拟合到峰值时遇到了极大的困难。有一些类似的问题,但即使看了这些,我仍然不确定。统计学/概率论等从来都不是我的强项,但我想让我困惑的是高斯贝尔曲线只是用平均值和标准差计算出来的。与其他曲线拟合方法不同,不使用峰值中的实际原始值 我这样实现了高斯函数 public static float getGaussian(float x, float mean, float stdDev) { float v1 = 1F / (stdDev * (float)

我在理解如何将高斯曲线拟合到峰值时遇到了极大的困难。有一些类似的问题,但即使看了这些,我仍然不确定。统计学/概率论等从来都不是我的强项,但我想让我困惑的是高斯贝尔曲线只是用平均值和标准差计算出来的。与其他曲线拟合方法不同,不使用峰值中的实际原始值

我这样实现了高斯函数

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)


谁能解释一下高斯曲线应该如何从这些数据中计算出来,以及曲线是什么样子的吗?

看起来你只有整数。假设这是一个来自正态分布数据的柱状图,您只需要:

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 )

应近似于您的数据。

另一种拟合方法如下所示

供参考:一般原则用(法语)解释。Joseph R.Fox Rabinovitz未完成的翻译:

在本例中,通过积分方程可获得线性回归的转换:

我已经用C#实现了上面的伪代码,它看起来非常合适,谢谢。是的,在这个例子中我使用了整数。但是,如果x轴和y轴中的一个或两个都是浮点数,这有关系吗?@Doug,实际上有一个积分,我乘以箱子宽度,即y*dx(这里dx=1)。因此,如果得到的值间隔不均匀,则会发生变化。如果只有y值变为浮动,它应该可以工作。