Python :将曲线拟合到整数列表
Python : fit a curve to a list of integers
我有一个整数列表。
intList = [96, 98, 120, 163, 158, 166, 201, 201, 159, 98, 93, 73, 77, 72]
这些数字表示 14 个像素条带的灰度值,我想对分布拟合一条曲线并保存顶点的 x 位置。
为了上下文:我真的在处理一个(多更大的)列表列表,每个列表包含图像中一行像素的灰度值.对于每一行像素,我想绘制一条数据曲线并将顶点的 x 位置附加到不断增长的列表中。每行像素都会有一些噪声,但只有一个宽而清晰的像素强度峰值(下图示例)
我有 NumPy、SciPy、matplotlib 和 pillow,但我对每个函数中的 many 函数知之甚少。任何人都可以向我指出可能执行此操作的模块或功能吗?
拟合多项式,例如二次方,使用 polyfit
:
from pylab import *
x = arange(len(intList))
p = polyfit(x, intList, 2)
a, b, c = p
x0 = -0.5*b/a # x coordinate of vertex
# plot
x = arange(len(intList))
plot(x, intList)
plot(x, polyval(p, x))
axvline(x0, color='r', ls='--')
拟合更复杂的函数,例如一个高斯,你可以使用 curve_fit
:
from scipy.optimize import curve_fit
# define function to fit
ffunc = lambda x, a, x0, s: a*exp(-0.5*(x-x0)**2/s**2)
# fit with initial guess a=100, x0=5, s=2
p, _ = curve_fit(ffunc, x, intList, p0=[100,5,2])
x0 = p[1] # location of the mean
# plot
plot(x, intList)
plot(x, ffunc(x, *p))
axvline(x0, color='r', ls='--')
(尽管要拟合高斯分布,您最好直接计算分布的均值和方差。)
我有一个整数列表。
intList = [96, 98, 120, 163, 158, 166, 201, 201, 159, 98, 93, 73, 77, 72]
这些数字表示 14 个像素条带的灰度值,我想对分布拟合一条曲线并保存顶点的 x 位置。
为了上下文:我真的在处理一个(多更大的)列表列表,每个列表包含图像中一行像素的灰度值.对于每一行像素,我想绘制一条数据曲线并将顶点的 x 位置附加到不断增长的列表中。每行像素都会有一些噪声,但只有一个宽而清晰的像素强度峰值(下图示例)
我有 NumPy、SciPy、matplotlib 和 pillow,但我对每个函数中的 many 函数知之甚少。任何人都可以向我指出可能执行此操作的模块或功能吗?
拟合多项式,例如二次方,使用 polyfit
:
from pylab import *
x = arange(len(intList))
p = polyfit(x, intList, 2)
a, b, c = p
x0 = -0.5*b/a # x coordinate of vertex
# plot
x = arange(len(intList))
plot(x, intList)
plot(x, polyval(p, x))
axvline(x0, color='r', ls='--')
拟合更复杂的函数,例如一个高斯,你可以使用 curve_fit
:
from scipy.optimize import curve_fit
# define function to fit
ffunc = lambda x, a, x0, s: a*exp(-0.5*(x-x0)**2/s**2)
# fit with initial guess a=100, x0=5, s=2
p, _ = curve_fit(ffunc, x, intList, p0=[100,5,2])
x0 = p[1] # location of the mean
# plot
plot(x, intList)
plot(x, ffunc(x, *p))
axvline(x0, color='r', ls='--')
(尽管要拟合高斯分布,您最好直接计算分布的均值和方差。)