Wenn Sie die Probendaten mit Polypoly kurvenanpassen möchten, können Sie dies einfach mit polyfit of numpy tun. Die Kurve wird durch das folgende Polynom dargestellt. polyfit berechnet $ a_n $ in der folgenden Formel.
y = \sum^{N}_{n=0} a_n x^n
Die von polyfit zurückgegebenen Werte werden in absteigender Reihenfolge aufgelistet. Die Formel lautet wie folgt.
y = \sum^N_{n=0} a_n x^{N-n}
Wenn Sie ein Diagramm einer Kurve mit dem von polyfit erhaltenen Koeffizienten zeichnen möchten, bereiten Sie den Wert von x in numpy.linspace usw. vor und übergeben Sie den Koeffizienten und x an numpy.polyval, um y zu berechnen.
Die folgende Abbildung zeigt das Ergebnis der Kurvenanpassung mit Probendaten und linearer Gleichung. Der Koeffizient kann einfach durch Einstellen von numpy.polyfit (x, y, 1) erhalten werden. x und y sind Daten und 1 ist Ordnung.
w = np.polyfit(x,y,1)
xs = np.linspace(np.min(x),np.max(x),100)
ys = np.polyval(w,xs)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y,label='input')
ax.plot(xs, ys, 'r-', lw=2, label='polyfit')
ax.set_title('polyfit w = [%.2f, %.2f]' % (w[0],w[1]))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='best',frameon=False)
ax.grid(True)
Beispieldaten wurden wie folgt erstellt.
def getData1(numPoints, w,b, nstdev, xmin=0.0, xmax=1.0 ):
x = scipy.stats.uniform.rvs(loc=xmin, scale=xmax-xmin,size=numPoints)
n = scipy.stats.norm.rvs(size=numPoints, scale=nstdev)
y = w * x + b + n
return x, y
x, y = getData1(100, 1.5, 10, 10, xmin=0, xmax=100)
Ergebnis der Kurvenanpassung mit einem kubischen Polypoly
w = np.polyfit(x,y,3)
xs = np.linspace(np.min(x),np.max(x),100)
ys = np.polyval(w,xs)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y,label='input')
ax.plot(xs, ys, 'r-', lw=2, label='polyfit')
ax.set_title('polyfit w = [%.2f, %.2f, %.2f, %.2f]' % (w[0],w[1],w[2],w[3]))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='best',frameon=False)
ax.grid(True)
Beispieldaten wurden wie folgt erstellt.
def getData2(numPoints, Amp, freq, phase, nstdev, xmin=0.0, xmax=np.pi*2.0 ):
x = scipy.stats.uniform.rvs(loc=xmin, scale=xmax-xmin,size=numPoints)
n = scipy.stats.norm.rvs(size=numPoints, scale=nstdev)
y = Amp*np.sin(freq * x + phase) + n
return x, y
x, y = getData2(100, 10, 1.0, 0.0, 5, xmin=0, xmax=np.pi*2.0)
Referenz-URL https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval
Recommended Posts