import numpy as np
def fit(x,y,m,w):
if len(x)<=m:
return False
xishu = np.polyfit(x,y,m,w=w)
p = np.poly1d(xishu) # 构造多项式
yfit = p(x) # 拟合的y值
yresid = y - yfit # 残差
SSresid = sum(pow(yresid, 2)) # 残差平方和
SStotal = len(y) * np.var(y) # 总体平均方差
if SStotal==0:#水平线
r2=1
else:
r2 = 1 - SSresid/SStotal # 拟合优度
return (xishu,r2,yfit)
if __name__=="__main__":
x = np.arange(0,5,0.1)
z = [2+3*x+4*x**2 for x in x]
y = np.array([np.random.normal(z,3) for z in z])
weight=[1 for one in x]
print(fit(x,y,2,weight))
polyfit(x,y,m,w) 参数m为多项式的次数+1,w为权重。权重的含义是这个数据点的误差要乘以权重,低点给予高权重可以减少低点的误差,避免低点的相对误差过大。
自定义函数fit(x,y,m,w)的返回值 (xishu,r2,yfit)分别为系数、相关系数、拟合Y值。
过原点也可以通过权重实现。代码如下:
if must00:
x=np.append(x,0)#.append(0)
y=np.append(y,0)#y.append(0)
w=np.append(w,100000000)#.append(10000)
fit_r=fit(x,y,m,w)
if fit_r:
(xishu,r,y_fitted)=fit_r
else:
#fit error
xishu=[0,1,0]
y_fitted=x
r=0