通常我使用以下代码进行线性拟合或二次拟合。有时需要使用weight = 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)
答案 0 :(得分:1)
对于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)
。