通常我使用以下代码来进行线性拟合或二次拟合。有时需要使用权重=2 对模型进行 1/x2 加权。我想知道是否可以通过添加一些矩阵代数来强制模型通过原点(显然如果权重=0)。谢谢。
import numpy
from pylab import *
data=loadtxt('...')
degree=1
weight=0
x,y,w=data[:,0],data[:,1],1/data[:,0]**weight
n=len(data)
d=degree+1
f=zeros(n*d).reshape((n,d))
for i in range(0,n):
for j in range(0,d):
f[i,j]=x[i]**j
q=diag(w)
fT=dot(transpose(f),q)
fTx=dot(fT,f)
fTy=dot(fT,y)
coeffs=dot(inv(fTx),fTy)
最佳答案
对于weight=0
在这种情况下,通过改变来消除特征向量中的常数项
for j in range(0,d)
至for j in range(1,d)
.
对于 weight
的较大值术语,与 1/x^p
相关的权重项必须为零,这在普通最小二乘解中可能不会发生。
为了获得最佳的 numpy 实践,我建议您替换 zeros(n*d).reshape((n,d))
与 zeros( (n,d) )
和dot(inv(fTx),fTy)
与 linalg.solve(fTx,fTy)
.
关于python - 通过矩阵代数拟合原点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852079/