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

时间:2018-09-22 00:41:40

标签: python numpy

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

    profileImageView.layoutIfNeeded()
    profileImageView.layer.cornerRadius = profileImageView.frame.size.height / 2
    profileImageView.layer.masksToBounds = true

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

1 个答案:

答案 0 :(得分:0)

try{ await db.runTransaction(async transaction => { const doc = await transaction.get(ref); if(!doc.exists){ throw "Document does not exist"; } const newCount = doc.data().count + 1; transaction.update(ref, { count: newCount, }); }) } catch(e){ console.log('transaction failed', e); } 就足够了;权重可以应用于方程式。也就是说,如果系统超定

lstsq

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

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

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

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

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

这会将残差显示为

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)

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