这是代码
'''非线性回归'''
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
from numpy import pi
from sklearn.metrics import mean_squared_error, r2_score
def func(x,a,b,c):
return a*np.sin(2*pi*x/12+b)+c
x=np.linspace(1,12,12)
y_max=[17, 19, 21, 28, 33, 38, 37, 37, 31, 23, 19, 18]
y_min=[-62, -59, -56, -46, -32, -18, -9, -13, -25, -46, -52, -58]
print('时间与最高温度的相关系数矩阵:\n',np.corrcoef(x,y_max)) #计算相关系数
print('时间与最低温度的相关系数矩阵:\n',np.corrcoef(x,y_min)) #计算相关系数
plt.figure(1)
plt.scatter(x,y_max,color='red',marker='.',label='Max')
plt.scatter(x,y_min,color='blue',marker='*',label='Min')
plt.legend(loc=2)
plt.xlabel('Month')
plt.ylabel('Temperature')
plt.show()
popt1,pcov1=curve_fit(func,x,y_max)
print('最高温度的拟合系数=',popt1)
popt2,pcov2=curve_fit(func,x,y_min)
print('最高温度的拟合系数=',popt2)
xt=np.linspace(1,12,120)
yhat1=func(xt,*popt1)
yhat2=func(xt,*popt2)
yh1=func(x,*popt1)
yh2=func(x,*popt2)
er1=mean_squared_error(y_max,yh1) #计算均方差
er2=mean_squared_error(y_min,yh2) #计算均方差
print('最高温度的均方差=',er1)
print('最高温度的均方差=',er2)
rt1=r2_score(y_max,yh1) #计算R方
rt2=r2_score(y_min,yh2) #计算R方
print('最高温度的R2=',rt1)
print('最低温度的R2=',rt2)
plt.figure(2)
plt.scatter(x,y_max,color='red',marker='.',label='Max')
plt.scatter(x,y_min,color='blue',marker='*',label='Mix')
plt.xlabel('Month')
plt.ylabel('Temperature')
plt.plot(xt,yhat1,color='red',linestyle='dashed',label='Max regression')
plt.plot(xt,yhat2,color='blue',label='Min regression')
plt.legend(loc=2)
plt.show()