繁体   English   中英

等效于numpy.linalg.lstsq,它允许加权

[英]equivalent to numpy.linalg.lstsq that allows weighting

我正在用numpy函数linalg.lstsq拟合2d多项式:

coeffs = np.array([y*0+1, y, x, x**2, y**2]).T
coeff_r, r, rank, s =np.linalg.lstsq(coeffs, values)

我要适应的某些观点比其他观点更可靠。 有没有办法以不同的方式衡量这些观点? 谢谢

lstsq就足够了; 权重可以应用于方程式。 也就是说,如果在一个超定的系统中

3*a + 2*b = 9
2*a + 3*b = 4
5*a - 4*b = 2

您更关心第一个方程,而不是其他方程,将其乘以大于1的某个数字。例如,乘以5:

15*a + 10*b = 45
2*a + 3*b = 4
5*a - 4*b = 2

在数学上,系统是相同的,但是最小二乘解将有所不同,因为它使残差的平方和最小化,并且第一个方程式的残差乘以5。

这是一个基于您的代码的示例(进行了一些细微的调整以使其更加NumPythonic)。 首先,未加权拟合:

import numpy as np
x, y = np.meshgrid(np.arange(0, 3), np.arange(0, 3))
x = x.ravel()
y = y.ravel()
values = np.sqrt(x+y+2)   # some values to fit
functions = np.stack([np.ones_like(y), y, x, x**2, y**2], axis=1)
coeff_r = np.linalg.lstsq(functions, values, rcond=None)[0]
values_r = functions.dot(coeff_r)
print(values_r - values)

这会将残差显示为

[ 0.03885814 -0.00502763 -0.03383051 -0.00502763  0.00097465  0.00405298
 -0.03383051  0.00405298  0.02977753]

现在,我给第一个数据点更大的权重。

weights = np.ones_like(x)
weights[0] = 5
coeff_r = np.linalg.lstsq(functions*weights[:, None], values*weights, rcond=None)[0]
values_r = functions.dot(coeff_r)
print(values_r - values)

残差:

[ 0.00271103 -0.01948647 -0.04828936 -0.01948647  0.00820407  0.0112824
 -0.04828936  0.0112824   0.03700695]

现在,第一个残差要小一个数量级,这当然是以其他残差为代价的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM