Mam zestaw danych symulacyjnych, w których chciałbym znaleźć najniższe nachylenie w n wymiarach. Rozmieszczenie danych jest stałe wzdłuż każdego wymiaru, ale nie wszystkie takie same (mogłem to zmienić ze względu na prostotę).numpy druga pochodna wielowymiarowej tablicy
Mogę żyć z pewną niedokładnością numeryczną, szczególnie w kierunku krawędzi. Wolałbym nie generować splajnu i używać tej pochodnej; tylko na surowych wartościach byłoby wystarczające.
Możliwe jest obliczenie pierwszej pochodnej za pomocą numpy
przy użyciu funkcji numpy.gradient()
.
import numpy as np
data = np.random.rand(30,50,40,20)
first_derivative = np.gradient(data)
# second_derivative = ??? <--- there be kudos (:
To uwagi odnośnie Laplace stosunku do matrycy juty; to już nie jest pytanie, ale ma pomóc zrozumieć przyszłych czytelników.
Jako funkcję testową stosuję funkcję 2D w celu określenia obszaru "najbardziej płaskiego" poniżej progu. Poniższe wyniki pokazują różnicę między wynikami przy użyciu minimum second_derivative_abs = np.abs(laplace(data))
i co najmniej następujące elementy:
second_derivative_abs = np.zeros(data.shape)
hess = hessian(data)
# based on the function description; would [-1] be more appropriate?
for i in hess[0]: # calculate a norm
for j in i[0]:
second_derivative_abs += j*j
Skala kolorów przedstawia wartości funkcji, strzałki pokazują pierwszą pochodną (gradientu), Czerwony kropka punkt najbliższy zeru, a linia czerwona próg.
Funkcja generatora dla danych to (1-np.exp(-10*xi**2 - yi**2))/100.0
z XI, yi generowane z np.meshgrid
.
Laplace'a:
Heskie:
Zastanawiam się; Interesuje mnie tylko wielkość nachylenia, a nie tyle kierunków.Czy może to być wystarczające, jeśli obliczę gradient na sumie absolutnych pierwszych pozycji na liście pochodnej? 'second_derivative = np.gradient (suma ([df * df dla d in first_derivative]))' (z 'sum' zachowującym kształt ze względu na argument) – Faultier
OK, myślę, że rozumiem, co chcesz teraz. Po prostu chcesz uzyskać najbardziej płaski region lub cokolwiek "najlżejszego" w N wymiarach. Spróbowałbym nie używać w ogóle jakiejś drugiej pochodnej, ale obliczyć absolutny gradient we wszystkich punktach (suma na kwadratach pierwszego wymiaru wyniku 'np.gradient', jak powiedziałeś w swoim komentarzu), a następnie odszukaj region progu i znajdź minimum wewnątrz obszaru progu (jeśli funkcja jest wystarczająco skomplikowana, znalezienie globalnych minimów może być naprawdę trudne). Spróbuję trochę i opublikuję kolejną odpowiedź, jeśli coś znajdę. – Carsten
@Carsten Suma wszystkich gradientów nie da najbardziej płaskiej powierzchni; na tym obrazie przypadku testowego dałoby to centrum 2-gausowego. nie jest to w żadnym wypadku najbardziej płaski obszar. Dlatego myślę, że należy to zrobić z drugą propped propper zamiast z pierwszą. – Faultier