python中的优化块(scipy)-带有直方图的直方图
我需要通过一个模拟直方图来拟合一个实验直方图(以确定模拟直方图的几个参数,使其最适合)。我尝试了scipy.optimize中的curve_fit,但在这种情况下不起作用:返回一个错误“…不是python函数”。是否可以在scipy或其他python模块中自动执行此操作?如果没有,请您提供一些可能算法的链接,以便自己进行调整 根据您所说的,我认为以下几点应该有所帮助,您似乎试图以错误的方式使用曲线拟合: 您需要定义您试图适应的分布。例如,如果我有一些看起来像的数据,我想知道数据的拟合程度,以及哪些参数提供了最佳拟合,我将执行以下操作:python中的优化块(scipy)-带有直方图的直方图,python,scipy,approximation,Python,Scipy,Approximation,我需要通过一个模拟直方图来拟合一个实验直方图(以确定模拟直方图的几个参数,使其最适合)。我尝试了scipy.optimize中的curve_fit,但在这种情况下不起作用:返回一个错误“…不是python函数”。是否可以在scipy或其他python模块中自动执行此操作?如果没有,请您提供一些可能算法的链接,以便自己进行调整 根据您所说的,我认为以下几点应该有所帮助,您似乎试图以错误的方式使用曲线拟合: 您需要定义您试图适应的分布。例如,如果我有一些看起来像的数据,我想知道数据的拟合程度,以及哪
import numpy as np
import pylab as plt
from scipy.optimize import curve_fit
# Create fake data and run it though `histogram` to get the experimental distribution
experimental = np.random.normal(10.0, 0.4, size=10000)
n, bins = plt.histogram(experimental, bins=100, normed=True)
# This just gives the mid points of the bins, many different (and better) ways exist to
# do this I'm sure
bins_mid_points = (0.5*(bins + np.roll(bins, 1)))[1:]
# Define the normal distribution as a function
def normal(x, sigma, mu):
return np.exp(-(x - mu)**2 / (2 * sigma**2)) / (sigma * np.sqrt(2*np.pi))
# Fit the experimental data,
popt, pcov = curve_fit(normal, xdata=bins_mid_points, ydata=n)
# Plot both
plt.bar(bins[:-1], n, width=np.diff(bins))
plt.plot(bins_mid_points, normal(bins_mid_points, *popt), color="r", lw=3)
红线显示我们的模拟拟合,如果需要,您也可以将其绘制为直方图。popt
的输出给出了一个最适合数据的[sigma,mu]
数组,而pcov
可用于确定拟合程度
请注意,我将直方图中的数据标准化,这是因为我定义的函数是正态分布
您需要仔细考虑您期望的分布以及您希望从中获得的统计数据 请向我们展示(浓缩版)您的代码以及完整的错误消息。