【带标准差的参数误差拟合】和【bootstrap算法】一种更加科学的等概率取点方法

文章介绍了如何利用Bootstrap算法进行多次数据抽样以获取更准确的拟合参数。首先展示了带标准差的参数拟合方法,指出当误差sigma较小会导致权重过大影响拟合。接着,通过Bootstrap算法进行多次拟合,计算参数的标准差来估计误差,这种方法能更好地处理数据不确定性问题。
摘要由CSDN通过智能技术生成

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这个限制,可以尽可能的使用更加天文的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值