如何使用numy linalg lstsq拟合具有相同斜率但截距不同的两个数据集?

问题描述 投票:0回答:1

我正在尝试进行加权最小二乘拟合,并遇到了numpy.linalg.lstsq。我需要拟合加权最小二乘。因此,以下作品:

# Generate some synthetic data from the model.
N = 50
x = np.sort(10 * np.random.rand(N))
yerr = 0.1 + 0.5 * np.random.rand(N)
y = 10.0 * x + 15
y += yerr * np.random.randn(N)
#do the fitting
err = 1/yerr**2
W = np.sqrt(np.diag(err))
x = x.flatten()
y = y.flatten()
A = np.vstack([x, np.ones(len(x))]).T
xw = np.dot(W,A)
yw = np.dot(W,y)
m, b = np.linalg.lstsq(xw, yw)[0]

这为我提供了最适合的坡度和截距。现在,假设我有两个具有相同斜率但截距不同的数据集?我将如何进行接头拟合,以得到最合适的斜率加上两个截距。我仍然需要加权最小二乘版本。对于不加权的情况,我发现以下工作有效:

(m,b1,b2),_,_,_ = np.linalg.lstsq(np.stack([np.concatenate((x1,x2)),
                                        np.concatenate([np.ones(len(x1)),np.zeros(len(x2))]),
                                        np.concatenate([np.zeros(len(x1)),np.ones(len(x2))])]).T, 
                              np.concatenate((y1,y2)))
python numpy curve-fitting least-squares data-fitting
1个回答
0
投票

我不认为最后一个块按预期工作,结果可能会意外产生您要查找的拦截。

您可以做的一件事就是像上面那样,使用一些现成的lstsq,例如np.linalg.lstsq作为第一个拟合。

第二步使用simple optimization,也许使用this one

作为目标函数,您可以像正常的lstsq一样估计错误大小,并尝试将其最小化。目标函数使用第一步中的固定斜率,而free参数是您要查找的第二个截距。 This answer显示如何将参数(在您的情况下为第一个斜率)传递给目标函数。

您可以在this answerthis answer中找到有关局部和全局优化的一些提示。

© www.soinside.com 2019 - 2024. All rights reserved.