Code fait pour comprendre la gamme d'insertion interne et externe.
Il faut faire attention au surapprentissage, mais dans le cadre de l'extrapolation, Il est nécessaire d'examiner en profondeur si la formule d'approximation obtenue est applicable.
Aussi, si le but de l'approximation est "l'analyse" plutôt que la "prédiction" Si vous augmentez le nombre de variables ou l'ordre plus que nécessaire, il sera difficile à interpréter. Le défi est de savoir à quel point c'est facile ou si simple peut être adapté.
Partie de ligne brisée rouge </ font>: Plage d'extrapolation, Partie de ligne continue bleue </ font>: Plage d'interpolation.
interpolation_and_extrapolation
import numpy as np
import matplotlib.pyplot as plt
x = np.array([2.0, 3.5, 4.0, 4.5, 5.0, 5.5])
y = np.array([3.0, 3.2, 3.9, 5.2, 8.4, 10.5])
xp = np.linspace(2, 5.5, 100)
xp1 = np.linspace(0, 2, 100)
xp2 = np.linspace(5.5, 8, 100)
for val in range(1, 6):
fx = np.poly1d(np.polyfit(x, y, val))
plt.rcParams["font.size"] = 20
fig, ax = plt.subplots(figsize=(15, 10))
ax.plot(xp, fx(xp), '-', color='blue')
ax.plot(xp1, fx(xp1), '-', color='red', linestyle='dashed')
ax.plot(xp2, fx(xp2), '-', color='red', linestyle='dashed')
ax.scatter(x, y, color='deepskyblue', s=32)
s = '$y =$'
for idx, deg in enumerate(reversed(range(0, val+1))):
if (fx.coef[idx] > 0) & (idx != 0):
s += '$ +$'
if deg > 1:
s += f' ${fx.coef[idx]:.2f} x^{deg}$'
if deg == 1:
s += f' ${fx.coef[idx]:.2f} x$'
if deg == 0:
s += f' ${fx.coef[idx]:.2f}$'
# ax.text(0.05, 0.8, s=s, size='x-large', transform=ax.transAxes)
ax.axhline([0], color='black')
ax.axvline([2], color='gray', linestyle='dotted')
ax.axvline([5.5], color='gray', linestyle='dotted')
ax.set_xlim(0, 8)
ax.set_ylim(-3, 14)
ax.set_title(s)
ax.set_ylabel('response variable')
ax.set_xlabel('explanatory variables')
fig.savefig(f'./data/img/inter_and_extrapolation{val}.png')
Approximation du premier ordre Approximation du second ordre Approximation du troisième ordre Approximation du 4e ordre Approximation du 5ème ordre
Recommended Posts