Si vous souhaitez adapter des données à un polypole, mais que vous souhaitez que certains points de données passent, voici un moyen simple de le faire.
Lorsque vous utilisez le polyfit de numpy, vous pouvez spécifier le poids avec l'option w, augmentez donc le poids du point que vous souhaitez corriger. Voici un exemple où les données ne passent pas par l'origine, mais vous voulez les forcer à travers l'origine lors de l'ajustement. Les données sont ajoutées aux données d'origine x, y avec te, numpy.append, le poids de ce point est défini sur 1e3 et les autres sur 1.
qiita_polyfit_limited.py
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
x = np.array([-10, -8,-6,-4,-2,0,2,4,6,8,10])
y = np.array([-15,-10,-3,-2,-1,3,1,3,4,8,12])
weight = np.ones(len(x))
npoly=4
x_add = np.append(x,0)
y_add = np.append(y,0)
weight_add = np.append(weight,1e3)
coef=np.polyfit(x, y, npoly, w=weight)
yfit = np.poly1d(coef)(x)
coef_add=np.polyfit(x_add, y_add, npoly, w=weight_add)
yfit_add = np.poly1d(coef_add)(x)
F = plt.figure(figsize=(7,7))
ax = plt.subplot(1,1,1)
plt.errorbar(x,y,fmt="o",label="data",alpha=0.8,ms=3)
plt.errorbar(x,yfit,fmt="--",label="fit (no limit), order = " +str(npoly),alpha=0.8,ms=3)
plt.errorbar(x,yfit_add,fmt="--",label="fit (fixed at 0,0), order = " +str(npoly),alpha=0.8,ms=3)
plt.grid(linestyle='dotted',alpha=0.5)
plt.legend(numpoints=1, frameon=False, loc="best")
outfile = "qiita_polyfitlimited.png "
plt.savefig(outfile)
Si vous ne limitez rien, vous ne passerez pas par l'origine, mais si vous avez des restrictions, vous pouvez voir qu'il est passé par l'origine.
Puisqu'il ne s'agit pas d'un ajustement conditionnel strict, une petite valeur reste, et non zéro, à l'origine. Si vous voulez être exactement 0 à l'origine, vous devez écrire vous-même la fonction d'ajustement restreint. Dans ce cas, Comment faire l'ajustement avec des paramètres restreints en python Prière de se référer à.
Recommended Posts