2017-02-24 1 views
3

Gibt es eine Möglichkeit, die beste Anpassungslinie für ein Streudiagramm zu finden, wenn ich die Beziehung zwischen zwei Achsen nicht kenne (sonst hätte ich scipy.optimize verwenden können) so etwas wie diesBeste Anpassungslinie für ein Streudiagramm

scatterplot

ich mag würde eine Linie haben, wie diese expected_result und ich brauche die Punkte der am besten passenden Linie für meine weitere Berechnung erhalten

for j in lat : 
l=94*j 
i=l-92 
for lines in itertools.islice(input_file, i, l): 
    lines=lines.split() 
    p.append(float(Decimal(lines[0]))) 
    vmr.append(float(Decimal(lines[3]))) 
    plt.scatter(vmr, p) 
+0

Haben Sie nicht mehr Variablen zur Verfügung ?. Sie können sich [scikit] (http://scikit-learn.org/stable/) ansehen. –

+0

auf der Suche nach so etwas? https://en.wikipedia.org/wiki/Local_Regression – cel

+0

mein Vorschlag wäre, die allgemeine Form der Gleichung zu erraten und scipy.optimize zu verwenden, um die beste Anpassung zu finden. –

Antwort

2

Sie können LOWESS (Locally Weighted Scatterplot Smoothing), eine nichtparametrische Regressionsmethode verwenden.

Statsmodels hat eine Implementierung here, die Sie verwenden können, um Ihre eigenen reibungsloser zu passen.

Siehe StackOverflow question on visualizing nonlinear relationships in scatter plots für ein Beispiel mit der Statsmodels Implementierung.

Sie können auch die Implementierung in Seaborn visuzalization Bibliothek regplot() Funktion mit dem Schlüsselwort Argument lowess=True verwenden. Einzelheiten finden Sie unter Seaborn documentation.

Der folgende Code ist ein Beispiel Seaborn und die Daten von der Frage über Stackoverflow mit:

import numpy as np 
import seaborn as sns 
sns.set_style("white") 

x = np.arange(0,10,0.01) 
ytrue = np.exp(-x/5.0) + 2*np.sin(x/3.0) 

# add random errors with a normal distribution      
y = ytrue + np.random.normal(size=len(x)) 

sns.regplot(x, y, lowess=True, color="black", 
      line_kws={"color":"magenta", "linewidth":5}) 

resulting figure

+0

Danke, vielen Dank Es hat funktioniert .... – caty

1

Das ist wahrscheinlich keine Matplotlib-Frage, aber ich denke, Sie können so etwas mit Pandas machen, indem Sie einen rollenden Median verwenden.

smoothedData = dataSeries.rolling(10, center = True).median() 

Eigentlich können Sie einen rollenden Median mit allem tun, aber Pandas hat eine eingebaute Funktion. Numpy kann auch.