2017-12-28 36 views
2

Ok, also habe ich vor ein paar Tagen mit Python angefangen. Ich benutze es hauptsächlich für DataScience, weil ich Student der Chemie bin. Nun, jetzt habe ich ein kleines Problem an meinen Händen, da ich eine Funktion extrapolieren muss. Ich weiß, wie man einfache Diagramme und Grafiken erstellt, also versuche es mir so einfach wie möglich zu erklären. Ich beginne mit:Wie extrapoliere ich eine Funktion anhand von x, y Werten?

from matplotlib import pyplot as plt 
from matplotlib import style 
style.use('classic') 
x = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715] 
y = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938] 
x2 = [0.707, 0.2, 0.057, 0.016, 0.00453] 
y2 = [2.086, 7.525, 26.59375,87.03125, 375.9765625] 

so mit diesen Werten Ich habe einen Weg zu erarbeiten, um einen extrapolieren y (oder y2) Wert zu erhalten, wenn mein x = 0. Ich weiß, wie man das mathematisch macht, aber ich würde gerne wissen, ob Python das kann und wie ich es in Python ausführe. Gibt es einen einfachen Weg? Kannst du mir vielleicht ein Beispiel mit meinen gegebenen Werten geben? Danke

+0

Vermischen Sie Extrapolieren und interpolieren? –

+0

Nein, ich brauche speziell Werte außerhalb meines Wertebereichs – TheChemist

+2

Ihre Frage ist unklar. Wonach fragst du? Können Sie einige Beispiel-Inputs/Outputs geben? – pault

Antwort

4

einen kurzen Blick auf Ihre Daten nehmen,

from matplotlib import pyplot as plt 
from matplotlib import style 
style.use('classic') 

x1 = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715] 
y1 = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938] 
plt.plot(x1, y1) 

enter image description here

x2 = [0.707, 0.2, 0.057, 0.016, 0.00453] 
y2 = [2.086, 7.525, 26.59375,87.03125, 375.9765625] 
plt.plot(x2, y2) 

enter image description here

Dies ist definitiv nicht linear. Wenn Sie wissen, welche Art von Funktion dies folgt, können Sie scipy's curve fitting verwenden, um eine Best-Fit-Funktion zu erhalten, die Sie dann verwenden können.

Edit:

Wenn konvertieren wir die Grundstücke zur Anmeldung log,

import numpy as np 

plt.plot(np.log(x1), np.log(y1)) 

enter image description here

plt.plot(np.log(x2), np.log(y2)) 

enter image description here

sie ziemlich linear aussehen (wenn Sie schielen ein Bi t). Die Suche nach einer Best-Fit-Linie,

np.polyfit(np.log(x1), np.log(y1), 1) 
# array([-0.05817402, 4.73809081]) 

np.polyfit(np.log(x2), np.log(y2), 1) 
# array([-1.01664659, 0.36759068]) 

wir können auf Funktionen zurück konvertieren,

# f1: 
# log(y) = -0.05817402 * log(x) + 4.73809081 
# so 
# y = (e ** 4.73809081) * x ** (-0.05817402) 
def f1(x): 
    return np.e ** 4.73809081 * x ** (-0.05817402) 

xs = np.linspace(0.01, 0.8, 100) 
plt.plot(x1, y1, xs, f1(xs)) 

enter image description here

# f2: 
# log(y) = -1.01664659 * log(x) + 0.36759068 
# so 
# y = (e ** 0.36759068) * x ** (-1.01664659) 
def f2(x): 
    return np.e ** 0.36759068 * x ** (-1.01664659) 

plt.plot(x2, y2, xs, f2(xs)) 

enter image description here

Die zweite verflixt gut aussieht; Die erste muss noch ein wenig verfeinert werden (dh eine repräsentativere Funktion finden und an die Kurve anpassen). Aber Sie sollten ein ziemlich gutes Bild des Prozesses haben ;-)

+0

ok ja, es ist nicht wirklich, dein Recht. Gibt es eine Möglichkeit, eine lineare Regression für die erste Menge von Werten (x, y) vorzunehmen? – TheChemist

+2

Woher kommen deine Zahlen? Weißt du, welcher Art von Gleichung sie folgen sollten? Scipys kubischer Spline-Fit https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html ist gut für die Interpolation, aber nicht so genau (dh normalerweise schrecklich) für die Extrapolation. –

+0

Ich stimme dem obigen Kommentar von @ HughBothwell zu - es wäre am besten zu verstehen, woher die Zahlen kommen und welche Art von Beziehung sie haben sollen. Davon abgesehen sieht log-log aufgrund dieser Plots sicherlich wie der Weg dorthin aus. – pault

2

Hier ist ein Beispielcode, der Ihnen hoffentlich helfen kann, ein lineares Modell für Ihre Zwecke zu erstellen.

import numpy as np 
from sklearn.linear_model import LinearRegression 
from matplotlib import pyplot as plt 

# sample data 
x = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715] 
y = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938] 

# linear model 
lm = LinearRegression() 
lm.fit(np.array(x).reshape(-1, 1), y) 

test_x = np.linspace(0.01, 0.7, 100) 
test_y = [lm.predict(xx) for xx in test_x] 

## try linear model with log(x) 
lm2 = LinearRegression() 
lm2.fit(np.log(np.array(x)).reshape(-1, 1), y) 

test_y2 = [lm2.predict(np.log(xx)) for xx in test_x] 

# plot 
plt.figure() 
plt.plot(x, y, label='Given Data') 
plt.plot(test_x, test_y, label='Linear Model') 
plt.plot(test_x, test_y2, label='Log-Linear Model') 
plt.legend() 

, das die folgenden erzeugt:

Model Comparison

Da die @Hugh Bothwell zeigte, die Werte, die Sie gaben hatte keine lineare Beziehung. Das Log von x scheint jedoch eine bessere Anpassung zu ergeben.

Verwandte Themen