Próbuję wykreślić kilka wizualizacji za pomocą matplotlib, aw jednej z moich funkcji sprawdzam, czy fale są logarytmiczne. To jest moja aktualna wersja robocza:Alternatywa dla scipy.optimize.curve_fit
import numpy as np
def is_logarithmic(waves):
def expfunc(x, a, b, c):
return a*np.exp(b*x) + c
wcopy = list(waves)
wcopy.sort()
# If the ratio of x-max : x-min < 10, don't use a logarithmic scale
# (at least in matplotlib)
if (wcopy[-1]/wcopy[0]) < 10:
return False
# Take a guess at whether it is logarithmic by seeing how well the x-scale
# fits an exponential curve
diffs = []
for ii in range(len(wcopy) - 1):
diffs.append(wcopy[ii + 1] - wcopy[ii])
# Fit the diffs to an exponential curve
x = np.arange(len(wcopy)-1)
try:
popt, pcov = curve_fit(expfunc, x, diffs)
except Exception as e:
print e
popt = [0.0, 0.0, 0.0]
pcov = np.inf
# If a > 0.5 and covsum < 1000.0
# use a logarithmic scale.
if type(pcov) == float:
# It's probably np.inf
covsum = pcov
else:
covsum = pcov.diagonal().sum()
res = (covsum < 1000.0) & (popt[0] > 0.5)
return res
Próbuję znaleźć alternatywę do scipy na curve_fit()
, ponieważ nie chcę, aby zainstalować taką dużą bibliotekę prostu w obsłudze, że jednej funkcji. Czy jest coś innego, czego mogę użyć, lub kombinację innych funkcji, używając idealnie tylko numpy i matplotlib, aby uzyskać podobny rezultat?
Cóż, 'curve_fit' używa algorytmu [Levenberg-Marquardt] (https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm) do minimalizacji błędów. Zawsze możesz to zaimplementować samodzielnie. – hitzg
Jeśli nie pracujesz z systemami wbudowanymi, "46 MB" (zainstalowane na Linuksie) dla scipy to niewiele. Matplotlib ma w porównaniu '72 MB'. – rth