Wenn Sie Daten mit einem Polypoly versehen möchten, aber bestimmte Datenpunkte passieren sollen, ist dies eine einfache Möglichkeit.
Wenn Sie das Polyfit von numpy verwenden, können Sie das Gewicht mit der Option w angeben. Erhöhen Sie also das Gewicht des Punkts, den Sie korrigieren möchten. Hier ist ein Beispiel, in dem die Daten nicht durch den Ursprung geleitet werden, sondern beim Anpassen durch den Ursprung erzwungen werden sollen. Daten werden zu den Originaldaten x, y mit te, numpy.append hinzugefügt, das Gewicht dieses Punktes wird auf 1e3 gesetzt und die anderen werden auf 1 gesetzt.
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)
Wenn Sie nichts einschränken, werden Sie den Ursprung nicht durchlaufen. Wenn Sie jedoch Einschränkungen haben, können Sie sehen, dass er den Ursprung durchlaufen hat.
Da es sich nicht um eine strikte bedingte Anpassung handelt, bleibt am Ursprung ein kleiner Wert, nicht Null. Wenn Sie am Ursprung genau 0 sein möchten, müssen Sie die Funktion für eingeschränkte Anpassung selbst schreiben. In diesem Fall Anpassen mit eingeschränkten Parametern in Python Bitte beziehen Sie sich auf.
Recommended Posts