[英]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.