import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
pd.set_option('float_format', lambda x: '%.2f' % x)
plt.style.use('seaborn')
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['Simhei']
plt.rcParams['axes.unicode_minus'] = False
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()
numpy.polyfit(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()
两种方法都能得到下图结果
判断拟合曲线拟合的程度,引入评估指标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
# 方法一:利用函数手动输入
a=''
i=1
while i<=len(parameter):
b=round(parameter[i-1],2)
c=b
if b>0:
b='+'+str(b)
else:
b=str(b)
if i==len(parameter):
a=a+b
else:
a=a+b+'x^'+str(len(parameter)-i)
i=i+1
if a.find('+',1):
a.lstrip('+')
print(a)
# 方法二:利用poly1d()函数封装
p = np.poly1d(parameter,variable='x')
print(p)