在将高斯拟合到曲线时,我的高斯模型定义为:
def model(position, width, height):
return height * scipy.stats.norm.pdf(x, position, width)
但是,模型中的高度变量不是曲线的真实高度或峰值。对于下面显示的示例,使用高度变量1.0和宽度0.1,高斯的峰值为4.0。
import numpy
import pylab
import scipy.stats, scipy
import matplotlib.pyplot as plt
x = numpy.linspace(0, 1, 400)
def model(position, width, height):
return height * scipy.stats.norm.pdf(x, position, width)
position = 0.5
height = 1.0
width = 0.1
gauss = model(position, width, height)
plt.plot(x,gauss, '+', color='red')
show()
有没有办法从模型中的宽度和高度变量确定高斯的峰值是什么?我意识到这可能更像是一个数学问题,而不是编码问题。尽管如此,任何帮助都表示赞赏!
编辑:我正在使用此模型来拟合需要比周围噪声高3 * sigma的曲线。我不清楚如何设置对应于峰值为3 * sigma的高斯模型的高度变量的下边界条件。例如,如果我知道3 * sigma是0.1,我该如何将其转换为高度变量值以正确定义我的下边界条件?干杯,
TFish13
答案 0 :(得分:0)
高斯在任何点x的高度恰好是scipy.stats.norm.pdf(x,position,width)。如果你想将整个高斯分布到某个值,那么峰值是一个值,比如4,然后尝试一下
def model(position, width, height):
return (height / scipy.stats.norm.pdf(position,position,width)) * scipy.stats.norm.pdf(x, position, width)
通过将整个分布除以峰值(发生在点'位置'),整个分布垂直拉伸,使峰值为1.然后乘以你的高度参数,您将对分布进行缩放,以使峰值具有值高度。
这确实是一个数学问题,而不是编程问题,但无论如何我们在这里看到很多问题。
答案 1 :(得分:0)
因此,事实证明我需要先将高斯标准化,然后再将其与高度变量相乘,以正确地将其缩放到数据的高度。因此,正确的模型是:
def model(position, width, height):
return height * sqrt(2*pi) * width * scipy.stats.norm.pdf(x, position, width)
现在模型中的高度变量将与绘制的高斯的峰值高度相匹配。