散点图拟合曲线
1 导入库2 构造散点2 利用polyfit拟合图形3 拟合评估(R方)4 输出拟合方程1 导入库
import numpy as npimport matplotlib.pyplot as pltimport seaborn as snssns.set()pd.set_option('float_format', lambda x: '%.2f' % x)plt.style.use('seaborn')%matplotlib inlineplt.rcParams['font.sans-serif'] = ['Simhei']plt.rcParams['axes.unicode_minus'] = False
2 构造散点
np.random.seed(0)X = np.linspace(-1,1,50) # 也可以利用np.arange构建y = 3 * np.sin(x * 2) + np.random.rand(len(x))plt.scatter(x, y)plt.show()
2 利用polyfit拟合图形
numpy.polyfit(x, y, deg)
x:拟合点的横坐标y:拟合点的纵坐标deg:自由度
# 利用X,y拟合一个三元函数parameter = np.polyfit(x, y, 3)parameter
此时输出的是拟合函数的自由度参数。
array([-3.30760789, -0.09234456, 5.80750986, 0.57000303])
# 方法一:手动拼接拟合函数y2 = parameter[0] * x ** 3 + parameter[1] * x ** 2 + parameter[2] * x + parameter[3]plt.scatter(x, y)plt.plot(x, y2, color='r')plt.show()
# 方法二:利用poly1d函数自动拟合函数p = np.poly1d(parameter)plt.scatter(x, y)plt.plot(x, p(x), color='r')plt.show()
两种方法都能得到下图结果
3 拟合评估(R方)
判断拟合曲线拟合的程度,引入评估指标R方。感兴趣的可以了解一下关于最小二乘中相关系数与R方的关系推导
# 利用np.corrcoef()函数得到相关矩阵np.corrcoef(y, y2)
输出得到一个相关矩阵
array([[1. , 0.99333342], [0.99333342, 1. ]])
correlation = np.corrcoef(y, y2)[0,1] #相关系数correlation**2
输出R方
0.966508101562565
4 输出拟合方程
# 方法一:利用函数手动输入a=''i=1while i<=len(parameter):b=round(parameter[i-1],2)c=bif b>0:b='+'+str(b)else:b=str(b)if i==len(parameter):a=a+belse:a=a+b+'x^'+str(len(parameter)-i)i=i+1if a.find('+',1):a.lstrip('+')print(a)
# 方法二:利用poly1d()函数封装p = np.poly1d(parameter,variable='x')print(p)
- END -