2009-02-09 14 views
17

mam kilka danych, zwykle w postaci A, B, C, ..., yprosty wielowymiarowy dopasowanie krzywej

gdzie y = f (a, b, c, ...)

Większość z nich to trzy i cztery zmienne oraz rekordy 10k - 10M. Moje ogólne założenie, że są one algebraiczna w charakterze, coś jak:

y = P1 a^E1 + P2 b^E2 + P3 c^E3

Niestety, mój ostatni statystyczny klasa analizy było 20 lat temu. Jaki jest najłatwiejszy sposób uzyskania dobrego przybliżenia f? Narzędzia open source z bardzo minimalną krzywą uczenia się (tj. Coś, co dałoby mi przyzwoitą aproksymację w ciągu godziny) byłyby idealne. Dzięki!

+5

Co jest prostego w dopasowaniu krzywej wielowymiarowej w odniesieniu do tytułu? :-) –

+0

http://www.prz.rzeszow.pl/~janand/Theory_of_LSM.pdf – jfs

+1

Ortogonalna regresja odległości może być wykorzystana do rozwiązania problemu. – jfs

Odpowiedz

2

Podstawy dopasowania danych obejmują przyjęcie ogólnej formy rozwiązania, zgadywanie pewnych wartości początkowych dla stałych, a następnie iterowanie w celu zminimalizowania błędu odgadywanego rozwiązania w celu znalezienia konkretnego rozwiązania, zwykle w sensie najmniejszych kwadratów.

Zajrzyj do R lub Octave dla narzędzi open source. Oba są zdolne do analizy metodą najmniejszych kwadratów, z kilkoma samouczkami po prostu z wyszukiwarki Google.

Edit: Kod oktawy szacowania współczynniki dla 2nd celu wielomianu

x = 0:0.1:10; 
y = 5.*x.^2 + 4.*x + 3; 

% Add noise to y data 
y = y + randn(size(y))*0.1; 

% Estimate coefficients of polynomial 
p = polyfit(x,y,2) 

Na moim komputerze, otrzymuję:

ans = 

    5.0886 3.9050 2.9577 
+0

Dzięki, mam ... właśnie dlatego powiedziałem "bardzo minimalna krzywa uczenia się"! Oba są doskonałymi językami statystycznymi ogólnego przeznaczenia, ale mają dość mocną krzywą uczenia się (IMHO). – user64258

+0

Rozumiem. Sądzę, że dzięki prostym funkcjom nie powinno zająć zbyt dużo czasu, aby przyspieszyć działanie dowolnego z tych narzędzi, a nawet zrobić to w Pythonie lub Perlu. –

+0

Sądzę, że są względnie proste (dodałem szczegóły do ​​pytania), a ja spędziłem już około godziny w Google, dlatego tu się odwróciłem ;-) – user64258

0

Jeśli masz przypuszczenia w postaci f , [*] potrzebujesz minimalizatora, aby znaleźć optymalne parametry. The tools Scottie T suggests będzie działać, podobnie jak ROOT i wiele innych.

Jeśli nie masz pojęcia, jaką formę możesz przyjąć, masz poważne kłopoty.


[*] Oznacza to, że, że

f = F (x, y, z, w, ..., P1, P2, P3 ...)

gdzie z p s są parametry i współrzędne są x, y ...

3

jest to narzędzie do montażu 1D i 2D krzywych w zunzun.com, ale nie sądzę, że wykracza poza dwiema zmiennymi. Podobnie, Matlab nie obsługuje więcej niż dwóch wymiarów pasujących (o ile wiem) i na pewno nie jest za darmo.

W przeciwnym razie możesz znaleźć część rozwiązania w wersji Numerical Recipes.

Jednak, jak wskazano na innych plakatach, prawdopodobnie będziesz potrzebować przynajmniej podstawowej idei swojego modelu funkcji (która, mam nadzieję, jest liniowa lub może być linearyzowana, w takim przypadku będziesz miał znacznie szerszą gamę rozwiązań na poziomie do dyspozycji)

+0

NR byłby jedną z najpotężniejszych ścieżek do naśladowania, ale nie jest to prawdopodobnie minimalna krzywa uczenia się. –

+0

Zgadzam się. Ale nie sądzę, że jest to problem, w którym istnieje proste wyjście. – Kena

1

Czy wiesz, do jakiej mocy chcesz ograniczyć swój wielomian?

Jeśli nie ma limitu, zawsze można uzyskać dokładne dopasowanie dla N punktów, dopasowując je do wielomianu, który ma współczynniki N.Aby to zrobić, podłączasz N różnych punktów do równania, uzyskując N równań i N niewiadomych (współczynników), które możesz następnie użyć albo prostej algebry szkolnej albo macierzy do rozwiązania dla niewiadomych.

+0

+1, Czytałem gdzieś, że rzadkie dane siatki mogą być używane do osiągnięcia tej samej dokładności wielomianowej z mniejszą liczbą węzłów niż jest to wymagane w regularnych danych siatki. Czy wiesz, jak to możliwe? – owari

11

W przypadku, jest to przydatne, oto Numpy/scipy (Python) szablon robić to, co chcesz:

from numpy import array 
from scipy.optimize import leastsq 

def __residual(params, y, a, b, c): 
    p0, e0, p1, e1, p2, e2 = params 
    return p0 * a ** e0 + p1 * b ** e1 + p2 * c ** e2 - y 

# load a, b, c 
# guess initial values for p0, e0, p1, e1, p2, e2 
p_opt = leastsq(__residual, array([p0, e0, p1, e1, p2, e2]), args=(y, a, b, c)) 
print 'y = %f a^%f + %f b^%f %f c^%f' % map(float, p_opt) 

Jeśli naprawdę chcesz, aby zrozumieć, co się dzieje, chociaż, będziesz musiał zainwestuj czas, aby skalować krzywą uczenia się dla jakiegoś narzędzia lub środowiska programistycznego - naprawdę nie sądzę, żeby było jakikolwiek sposób obejścia tego. Ludzie zazwyczaj nie piszą specjalistycznych narzędzi do robienia wyłącznie 3-okresowych regresji energii.

+0

scipy.ODR (regresja ortogonalna) może być przydatna, jeśli a, b, c nie mają nieskończonej precyzji (najmniejszy kwadrat zakłada nieskończoną dokładność współrzędnych). – jfs

+0

Z pewnością funkcja wymaga niektórych próbek wyjściowych, aby zminimalizować w kierunku np. Niektóre próbki y wartości, biorąc pod uwagę zestaw wartości a, b, c? – Brendan

0

Krótka odpowiedź: to nie jest takie proste. Rozważ nieparametryczne podejście do podzbiorów danych.

Są 2 główne kwestie, które musisz zadecydować o (1) Czy naprawdę dbasz o parametry funkcji, tj. Twój P1, E1, ..., czy byłbyś w porządku z samą oceną średniej funkcji (2) czy naprawdę potrzebujesz oszacować funkcję na wszystkich danych?

Pierwszą rzeczą, o której powiem, że twoja określona funkcja jest nieliniowa (w parametrach do oszacowania), więc zwykłe najmniejsze kwadraty nie będą działać. Udawajmy, że określono funkcję liniową. Nadal masz problem z wartościami 10M. Regresję liniową można przeprowadzić w efektywny sposób przy użyciu współczynnika QR, ale nadal pozostaje się algorytmem O (p * n^2), gdzie p jest liczbą parametrów, które próbujesz oszacować. Jeśli chcesz oszacować nieliniową średnią funkcję, staje się ona znacznie gorsza.

Jedynym sposobem na oszacowanie czegokolwiek w tak dużym zbiorze danych jest użycie podzbioru do przeprowadzenia estymacji. Zasadniczo losowo wybierasz podzbiór i używasz go do oszacowania funkcji.

Jeśli nie interesują Cię wartości parametrów i chcesz po prostu oszacować średnią funkcję, prawdopodobnie lepiej będzie, jeśli zastosujesz nieparametryczną technikę szacowania.

Mam nadzieję, że to pomoże.

leif