擬合曲線
多項式擬合
np.ployfit(x, y, deg)
import matplotlib.pyplot as plt
import numpy as np
x = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8]
y = [33.40, 79.50, 122.65, 159.05, 189.15, 214.15, 238.65, 252.2, 267.55, 280.50, 296.65, 301.65, 310.4, 318.15, 325.15]
coef = np.polyfit(x, y, 2) # 返回擬合引數
fn = np.poly1d(coef) # 利用引數生成多項式函式
plt.scatter(x, y)
plt.plot(x, fn(x), color='red')
plt.show()
任意擬合
scipy.optimize.curve_fit
import scipy.optimize as opt
from scipy.optimize import curve_fit
# 已有資料點
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 4, 9, 16, 25])
# 定義擬合方程(任意)
def func(x1, a, b, c):
return a*x1**2 + b*x1 + c
p_opt, p_cov = curve_fit(func, x, y) # p0 = 1是因為只有a一引數
print("方程引數最佳值為:", p_opt.astype(np.int64)) # 引數最佳值,np.round(popt, 4)
print("擬合方程協方差矩陣:\n", p_cov) # 協方差矩陣,popt[0],popt[1],popt[2]分別代表引數a b c
y_predict = func(x, p_opt[0], p_opt[1], p_opt[2])
plt.scatter(x, y, marker='x', lw=1, label='原始資料')
plt.plot(x, y_predict, c='r', label='擬合曲線')
plt.legend() # 顯示label
plt.show()