bootstrap算法一种经典的有放回等概率随机取法(更多原理请百度)
我这边使用的目的是为了得到更加准确的拟合参数,对你没听错bootstrap算法可以去优化你的拟合参数,在此之前我们先来看看一般的拟合参数的方法如何
【带标准差的参数拟合】
拟合最终总是要给一个误差的,我们常用的带标准差的拟合。代码如下
import numpy as np
from astropy.modeling import models, fitting
# 假设你有一组数据x和y以及它们的误差sigma
x = np.array([1, 2, 3, 4, 5])
y = np.array([2.1, 3.9, 6.1, 7.9, 10.1])
sigma = np.array([0.1, 0.2, 0.5, 0.01, 0.3])
# 创建一个线性模型
linear_model = models.Linear1D()
# 使用LevMarLSQFitter进行拟合
fitter = fitting.LevMarLSQFitter()
best_fit = fitter(linear_model, x, y, weights=1/sigma)
# 输出拟合参数和它们的误差
print("拟合参数:", best_fit.parameters)
print("参数误差:", np.sqrt(np.diag(fitter.fit_info['param_cov'])))
这种我们可以看到误差sigma被作为权重传递到拟合函数里面了,这样的话,对拟合函数进行协方差矩阵的计算就可以得到参数的误差(以后会考虑写一个博客如何自定义拟合函数,这边为了示范,用的是线性函数)。
但是这样的话,有一个问题,就是如果误差sigma在某些地方特别的小,那么权重就会变大,这样会导致拟合参数发生变化。(具体要判断这种影响有多大,你可以对比一下,不带误差和带误差两种情况下的拟合参数,如果相差比较大,那就要考虑这个问题了)
【bootstrap算法】
下面就要引出使用这个算法去做一个多次的拟合,然后计算多次拟合参数的标准差,从而得到参数误差了。
import numpy as np
from astropy.modeling import models, fitting
# 假设你有一组数据x和y以及它们的误差sigma
x = np.array([1, 2, 3, 4, 5])
y = np.array([2.1, 3.9, 6.1, 7.9, 10.1])
y_err = np.array([0.1, 0.2, 0.5, 0.01, 0.3])
data = np.random.normal(y, y_err, (1000,len(x)))
# 创建一个线性模型
linear_model = models.Linear1D()
# 使用LevMarLSQFitter进行拟合
fitter = fitting.LevMarLSQFitter()
fit_p = []
for y_fit in data:
#进行多次拟合
m = fitter(linear_model, x, y_fit)
fit_p.append(m.parameters[0])
fit_p = np.array(fit_p)
print(np.mean(fit_p), np.std(fit_p))
#输入的两个值即为拟合参数以及参数对应的标准差
以上的代码均在chatGTP的协助下弄成。chatGTP强大的地方在于,他是有astropy这个库的,这意味着你提问的时候加上astropy这个限制,可以尽可能的使用更加天文的代码。