2017-07-15 2 views
0

Die beiliegende Grafik finden Sie. Ich muss die Punkte "a" und "b" finden. Bitte alle Methoden in Python vorschlagen.So finden Sie die Datenpunkte aus einem Diagramm

Graph wird durch Erhalten Laufzeiten aufgetragen, die wie unten beachtet werden: x = ([1000, 2000, 3000, 4000, 5000, 6000,7000, 8000, 9000]) und y = ([2314,802,519,417,358,318,302,284,280])

Need „a“ und „b“ Punkte zu finden, so dass ich sie einzeln für andere Aufgaben verwenden kann

Voll Code:

def piecewise_linear(x, x0, y0, k1, k2): 
    return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0]) 

perr_min = np.inf 
p_best = None 
for n in range(100): 
    k = np.random.rand(10)*20 
    p , e = optimize.curve_fit(piecewise_linear, x, y) 
    perr = np.sum(np.abs(y-piecewise_linear(x, *p))) 
    if(perr < perr_min): 
     print "success" 
     perr_min = perr 
     p_best = p 

xd = np.linspace(min(x), max(x), 100) 
plt.figure() 
plt.plot(x, y, "bo") 
y_out = piecewise_linear(xd, *p_best) 
plt.plot(xd, y_out) 
plt.ylabel('Number of KeyFrames') 
plt.xlabel('Threshold Values') 
plt.show() 

Graph

+0

Unabhängig von der Programmiersprache müssen Sie den Punkt mathematisch definieren. Wie sind die grünen Linien definiert? Beschreibe den Punkt '(a, b)' ohne den Plot. – Gribouillis

+0

Als Sam, wie unten erwähnt, Datenpunkte würden wie folgt aussehen: (1000, 2314) (2000, 802) (3000, 519) (4000, 417) (5000, 358) (6000, 318) (7000, 302) (8000, 284) (9000, 280) – ashti

+0

Dies definiert nicht die grünen Linien, noch die Kurve, von der Sie sprechen. – Gribouillis

Antwort

1

Ich verstehe deine Frage nicht genau. Möchten Sie, dass der Code relevante Datenpunkte aus diesem Graphenbild mit einer Computer Vision extrahiert oder möchten Sie nur die Koordinaten der Datenpunkte mit den definierten Listen x und y? Wenn letzteres der Fall ist, können Sie so etwas wie tun:

change_points = [] # to store the points you want 
curr_slope = (y[1] - y[0])/(x[1]-x[0]) # to be used for comparision 
for i in range(2, len(y)): 
    prev_slope = curr_slope 
    curr_slope = (y[i]-y[i-1])/(x[i]-x[i-1]) 
    if not (0.2 <= (curr_slope/prev_slope) <= 5): 
     change_points.append((x[i-1], y[i-1])) 

for point in change_points: 
    print(point) 

Dieser druckt (2000, 802). Gibt es irgendetwas, das die grüne Linie definiert? Ansonsten habe ich hier einen Verhältnisschwellenwert gesetzt, um nur Punkte hinzuzufügen, die die Steigung um einen 'groß genug' (in diesem Fall um den Faktor 5) Betrag ändern.

Auch die Klammern in Ihren x und y Initialisierungen sind redundant. Verwenden Sie nur eckige Klammern.

+0

Ich brauche nicht alle Datenpunkte. Der Punkt (a, b) ist der Datenpunkt, an dem sich die Kurve ändert. Ich möchte die genauen Positionspunkte. – ashti

+0

Mit "Grafik ändert sich" meinen Sie "Steigung" ändert sich? –

+0

Sie können @ashtis Antwort anpassen, indem Sie numpy.where (condition ...) verwenden – mikey

Verwandte Themen