【发布时间】:2019-11-29 00:57:23
【问题描述】:
我想基于对任意数据集的最小二乘线性拟合在 Python 中生成置信区间等高线图。我将 polyfit 函数应用于由 x、y、yerr 数组上的误差加权的线性拟合(即 y = mx + c),并获得其对应的线性拟合的最小卡方值和系数。
从这一点来看,我不知道如何绘制椭圆,使其与最佳系数值有 1 sigma 的偏差。我想在 x 轴上绘制 c,在 y 轴上绘制 m,以及单个 1 sigma 轮廓。我一直在想我需要找到卡方函数的逆函数(在代码中明确定义),但这在逻辑上没有意义。
最终,我需要一个 chi^2(m, c) = chi^2_min + 1 形式的椭圆。知道我需要使用什么工具吗?
import numpy as np
import matplotlib.pyplot as plt
# set of x,y values (with y errors) to which a linear fit will be applied
x = np.array([1, 2, 3, 4, 5])
y = np.array([1.7, 2.1, 3.5, 3.2, 4.4])
erry = np.array([0.2, 0.2, 0.2, 0.3, 0.3])
# apply fit to x,y array weighted by 1/erry^2
p2, V = np.polyfit(x, y, 1, w=1/erry, cov=True)
# define a chi square function into which parameter estimates are passed
def chisq(param1, param0):
csq = np.sum(((param1*x + param0 - y)/erry) ** 2)
return csq
# arrange labels for the coefficients so matches form y = theta1*x + theta0
theta1 = p2[0]
theta0 = p2[1]
# show coeffs with corresponding stat errors
print("a1 = ",theta1,"+-",np.sqrt(V[0][0]))
print("a0 = ",theta0,"+-",np.sqrt(V[1][1]))
# define arrays for the parameters running between (arbitrarily) parameter +/- 0.3
run1 = np.array([theta1-0.3, theta1-0.2, theta1-0.1, theta1, theta1+0.1, theta1+0.2, theta1+0.3])
run0 = np.array([theta0-0.3, theta0-0.2, theta0-0.1, theta0, theta0+0.1, theta0+0.2, theta0+0.3])
# define the minimum chi square value readily
chisqmin = chisq(run1[4],run0[4])
# Would like to produce a contour at one sigma from min chi square value,
# i.e. obeys ellipse eqn. chi^2(theta0, theta1) = chisqmin + 1
# add lines one sigma away from the optimal parameter values that yield the min chi square value
plt.axvline(x=theta0+np.sqrt(V[1][1]),color='k',linestyle='--')
plt.axvline(x=theta0-np.sqrt(V[1][1]),color='k',linestyle='--')
plt.axhline(y=theta1+np.sqrt(V[0][0]),color='k',linestyle='--')
plt.axhline(y=theta1-np.sqrt(V[0][0]),color='k',linestyle='--')
plt.xlabel(r'$\theta_{0}$')
plt.ylabel(r'$\theta_{1}$')
【问题讨论】:
标签: python numpy data-visualization