1

Ich möchte eine kubische Bezier-Kurve an einem Satz von 500 zufälligen Punkten anpassen.Kleinste Quadrate passen auf kubische Bezier-Kurve

Hier ist der Code, den ich für die Bezier-Kurve haben:

import numpy as np 
from scipy.misc import comb 

def bernstein_poly(i, n, t): 
    """ 
    The Bernstein polynomial of n, i as a function of t 
    """ 

    return comb(n, i) * (t**(n-i)) * (1 - t)**i 


def bezier_curve(points, nTimes=1000): 

    nPoints = len(points) 
    x = np.array([p[0] for p in points]) 
    y = np.array([p[1] for p in points]) 

    t = np.linspace(0.0, 1.0, nTimes) 

    polynomial_array = np.array([ bernstein_poly(i, nPoints-1, t) for i in range(0, nPoints) ]) 

    xvals = np.dot(x, polynomial_array) 
    yvals = np.dot(y, polynomial_array) 

    return xvals, yvals 


if __name__ == "__main__": 
    from matplotlib import pyplot as plt 

    nPoints = 4 
    points = np.random.rand(nPoints,2)*200 
    xpoints = [p[0] for p in points] 
    ypoints = [p[1] for p in points] 

    xvals, yvals = bezier_curve(points, nTimes=1000) 
    plt.plot(xvals, yvals) 
    plt.plot(xpoints, ypoints, "ro") 
    for nr in range(len(points)): 
     plt.text(points[nr][0], points[nr][1], nr) 

    plt.show() 

Ich bin mir bewusst, dass Numpy und Scipy Methode der kleinsten Quadrate haben: numpy.linalg.lstsq und scipy.optimize.least_squares

Aber ich bin nicht sicher, wie kann ich Verwenden Sie sie zum Anpassen der Kurve an die 500 Punkte. Kann jemand etwas Hilfe anbieten?

Danke

+0

Welcher Teil Ihrer Daten rechtfertigt die Verwendung einer Bezier-Kurve, im Gegensatz zu etwas, das viel besser für die Anpassung von verrauschten Daten geeignet ist? Denn bevor jemand Ihre Frage beantwortet, sollten Sie in der Lage sein zu beantworten, warum Sie denken, dass Sie eine Bezier-Kurve brauchen anstatt etwas Angemessener. –

+0

Ich verwende in diesem Fall speziell eine Bezier-Kurve, weil ich den Anweisungen aus einem Buch folge und das möchte ich gerne umsetzen. Ich weiß, dass es viel bessere Möglichkeiten gibt, aber in diesem speziellen Beispiel muss ich Bezier-Kurven verwenden. – stepp0

+0

Das deutet darauf hin, dass Sie in Ihrer Frage noch nicht ganz ehrlich waren. Ich bin sicher, das zu sagen, was Sie gerade in Ihrem Post gesagt haben, und zu sagen, welches Buch, ist das Gegenteil von unnötigen Informationen. –

Antwort

1

Verwenden Sie die Funktion curve_fit in scipy, https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

import numpy as np 
from scipy.optimize import curve_fit 
def func(x, a, b, c): 
    return a * np.exp(-b * x) + c 

xdata = np.linspace(0, 4, 50) 
y = func(xdata, 2.5, 1.3, 0.5) 
ydata = y + 0.2 * np.random.normal(size=len(xdata)) 

popt, pcov = curve_fit(func, xdata, ydata) 

#Constrain the optimization to the region of 0 < a < 3, 0 < b < 2 and 0 < c < 1: 


popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 2., 1.])) 
0

Die scipy Dokumentation selbst ein trefflichsten Tutorial hat hier Splines auf mit:

https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

mit vielen von Code, Beispielen und coolen Graphen, die verschiedene Arten von Splines vergleichen.

+0

Sind Bezier-Kurven und Bezier-Splines nicht unterschiedlich? Danke für Ihre Referenz, aber ich kann nicht sehen, wie ich das in meinem Fall verwenden kann – stepp0

+0

Entschuldigung. Wie wäre es mit dieser Referenz von Pypi? Das Codebeispiel und das angezeigte Diagramm sehen aus wie das, wonach Sie suchen ... https://pypi.python.org/pypi/bezier/0.3.0 –

Verwandte Themen