【问题标题】:C#. How do I Apply a Gaussian Bell Curve to my Peak?C#。如何将高斯钟形曲线应用于我的峰值?
【发布时间】:2021-01-17 05:24:34
【问题描述】:

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

我已经实现了高斯函数;

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)

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

【问题讨论】:

    标签: c# curve-fitting gaussian


    【解决方案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 )
    

    应该近似您的数据。

    【讨论】:

    • 我已经在 C# 中实现了你上面的伪代码,它看起来很合适,所以谢谢。是的,在示例中我使用了整数。但是 x 轴和 y 轴中的一个或两个是浮点数有关系吗?
    • @Doug 好吧,实际上有一个积分,我乘以 bin 宽度,即 y * dx,(这里 dx = 1 )。因此,如果你得到不均匀间隔的值,它就会改变。如果只有 y 值变为浮动,它应该可以工作。
    【解决方案2】:

    另一种拟合方法如下所示。

    供参考:一般原则在https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales(法语)中进行了解释。 Joseph R. Fox-Rabinovitz 翻译不完整:https://scikit-guess.readthedocs.io/en/latest/appendices/references.html

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      相关资源
      最近更新 更多