python-3.x - 无法使用 Python 拟合正态分布。scipy包缺陷?
问题描述
import numpy as np
from astropy import modeling
import matplotlib.pyplot as plt
from scipy import optimize
def gaussian(x, amplitude, mean, stddev):
return amplitude * np.exp(-((x - mean)/4/stddev)**2)
# the data
m = modeling.models.Gaussian1D(amplitude=10, mean=100, stddev=10)
x = np.linspace(0, 400, 400)
data = m(x)
# fitting
popt, _ = optimize.curve_fit(gaussian, x, data)
plt.figure(0)
plt.plot(x, data)
plt.plot(x, gaussian(x, *popt))
plt.show()
我运行它来进行正态分布拟合。但它给了我一条线。想不通为什么。
但是,如果我将平均值降低到 45 以下,它将给出一个很好的拟合。这是 scipy 包的设计缺陷吗?
解决方案
当您使用 scipy.optimize.curve_fit 时,模型参数的初始估计(在这种情况下是幅度、平均值和标准差)会产生很大的不同。您没有提供任何初步猜测。提供猜测(带有实际值),那么拟合是完美的(因为高斯是完美的高斯,没有添加噪声):
import numpy as np
from astropy import modeling
import matplotlib.pyplot as plt
from scipy import optimize
def gaussian(x, amplitude, mean, stddev):
return amplitude * np.exp(-((x - mean)/4/stddev)**2)
# the data
m = modeling.models.Gaussian1D(amplitude=10, mean=100, stddev=10)
x = np.linspace(0, 400, 400)
data = m(x)
# fitting
popt, _ = optimize.curve_fit(gaussian, x, data, p0 = [10, 100, 10])
plt.figure(0)
plt.plot(x, data)
plt.plot(x, gaussian(x, *popt))
plt.show()
你得到:高斯拟合
您可以通过向数据添加一些噪音来确保拟合有效,例如:
from astropy import modeling
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
def gaussian(x, amplitude, mean, stddev):
return amplitude * np.exp(-((x - mean)/4/stddev)**2)
# the data
m = modeling.models.Gaussian1D(amplitude=10, mean=100, stddev=10)
x = np.linspace(0, 400, 400)
data = m(x)
noise = np.random.normal(len(m))
data = data + noise
# fitting
popt, _ = optimize.curve_fit(gaussian, x, data, p0 = [10, 100, 10])
plt.figure(0)
plt.plot(x, data, 'o', label = 'data')
plt.plot(x, gaussian(x, *popt), label = 'fit')
plt.legend()
plt.show()
你得到:适合嘈杂的高斯
推荐阅读
- c# - 升级到 net5.0 后 Blazor WebAssembly 项目出错
- jira - 我是 Confluence 的新手,我有一个任务
- python - 为什么使用多进程时追加列表速度较慢?
- node.js - 需要帮助编写对多个字段进行分组的聚合查询
- python - Python,无法从url下载文件,为每个文件获取一种主页
- angular - 如何在 Angular 中自动播放 youtube 组件?
- python - 我的票务系统中的 Discord.py 表情符号反应不起作用?
- typescript - TypeScript Compiler API:如何在没有绝对路径的情况下获取类型的完全限定名称?
- api - 有没有更好的方法在 Flutter 中的服务器上上传多个大文件
- verilog - 如何使用组合逻辑中的内存合成verilog代码。?