2016-02-05 11 views
5

Biorąc pod uwagę zestaw zmiennych, x. Chcę znaleźć wartości współczynników tego równania:Jak dostosować współczynnik równań, aby uzyskać wysoką korelację między yi X_i?

y = a_1*x_1 +... +a_n*x_n + c 

gdzie a_1,a_2,...,a_n są wszystkie niewiadome. Myśląc o tym z perspektywy ramki danych, chcę utworzyć tę wartość y dla każdego wiersza w danych.

Moje pytanie brzmi: na y, a_1...a_n i c są nieznane, czy jest jakiś sposób dla mnie, aby znaleźć zbiór rozwiązań a_1,...,a_n pod warunkiem, że wszyscy są corr(y,x_1), corr(y,x_2) .... corr(y,x_n) większy niż 0,7. Dla uproszczenia bierzemy korelację tutaj jako korelację Pearsona. Wiem, że nie byłoby wyjątkowego rozwiązania. Ale jak mogę zbudować zestaw rozwiązań dla a_1,...,a_n, aby spełnić ten warunek?

Spędziłem dzień, aby przeszukać pomysł, ale nie mogłem uzyskać z niego żadnych informacji. Każdy język programowania służący rozwiązaniu tego problemu jest mile widziany lub przynajmniej ma na to pewne odniesienie.

+0

Na pierwszy rzut oka wygląda to na optymalizację opartą na multiplikatorze Lagrange, ale istnieją aspekty tego pytania, które nie są dla mnie jasne. Czy możesz to wyjaśnić, szczególnie w odniesieniu do sposobu powiązania modelu i danych? Możesz mieć więcej szczęścia z tym na stronie matematyki, ale wróć tutaj z wszelkimi problemami napotkanymi podczas implementacji. – Bathsheba

+0

Osobiście uważam za dziwne robić to, co chcesz robić. Aby uzyskać dodatkową pomoc dotyczącą pytań związanych ze statystyką/uczeniem maszynowym, ludzie z http://stats.stackexchange.com/ chętnie Ci pomogą. – Ruben

+1

@Ruben "Uważam, że to dziwne, co chcesz robić" - podejrzewam, że te dokładne słowa zostały użyte do próby zamknięcia wielu rozsądnych pomysłów w przeszłości! –

Odpowiedz

4

Nie, nie jest możliwe ogólnie. Może to być możliwe w niektórych szczególnych przypadkach.

Biorąc x₁, x₂ ... chcesz znaleźć y = a₁x₁ + a₂x₂ + ... + c tak, że wszystkie korelacje między Y i X są większe niż jakiegoś docelowego R. Ponieważ korelacja jest

Corr(y, xi) = Cov(y, xi)/Sqrt[ Var(y) * Var(xi) ] 

Twój ograniczeniem jest

Cov(y, xi)/Sqrt[ Var(y) * Var(xi) ] > R 

które można przekształcić do

Cov(y, xi)² > R² * Var(y) * Var(xi) 

i to musi być prawdziwe dla wszystkich.

Rozważmy prosty przypadek, w którym są tylko dwie kolumny x₁ i x₂, i dalej zakładamy, że oba mają średnią zero (więc możesz zignorować stałą c) i wariancję 1, i że są one nieskorelowane. W tym przypadku y = a₁x₁ + a₂x₂ i kowariancji i wariancje są

Cov(y, x₁) = a₁ 
Cov(y, x₂) = a₂ 
Var(x₁) = 1 
Var(x₂) = 1 
Var(y)  = (a₁)² + (a₂)² 

więc trzeba jednocześnie spełniać

(a₁)² > R² * ((a₁)² + (a₂)²) 
(a₂)² > R² * ((a₁)² + (a₂)²) 

Dodanie tych nierówności razem, otrzymasz

(a₁)² + (a₂)² > 2 * R² * ((a₁)² + (a₂)²) 

co oznacza, Żeby zadowolić obie nierówności, musisz mieć R < Sqrt (1/2) (przez anulowanie wspólnych czynników po obu stronach nierówności). Tak więc najlepsze, co można zrobić w tym prostym przypadku, to wybrać a₁ = a₂ (dokładna wartość nie ma znaczenia, o ile są równe) i obie korelacje Corr (y, a₁) i Corr (y, a₂) będzie równa 0.707. W tym przypadku nie można uzyskać korelacji wyższej niż ta między y i wszystkimi znakami x jednocześnie.

dla bardziej ogólnym przypadku z n kolumn (z których każdy ma oznaczać zero, wariancji 1 i zero korelacja między kolumnami) nie można jednocześnie osiągnąć korelacji większy niż 1/sqrt(n) (jak wskazano w komentarzach przez @kazemakase).

Ogólnie rzecz biorąc, im więcej zmiennych niezależnych, tym niższa korelacja, jaką można uzyskać między yi x. Również (chociaż nie wspominałem o tym powyżej) korelacje między materią x. Jeśli są one ogólnie dodatnio skorelowane, będziesz w stanie osiągnąć wyższą korelację celu między y i x. Jeśli są one ogólnie nieskorelowane lub ujemnie skorelowane, będziesz w stanie uzyskać jedynie niskie korelacje między Y i X.

+0

Warto dodać, że dolna granica korelacji to "1/sqrt (n)", co jest teoretyczną korelacją y i n całkowicie nieskorelowanych x-ów. – kazemakase

+0

Dziękuję, dodałem! –

+0

Dzięki. Nic, co mogę wymyślić, by sprzeciwić się twojemu podejściu. Kudos do tego, a więc myślę, że powinienem zaoszczędzić sobie kilka razy na myśleniu, jak rozwiązać ten problem = D – skw1990

0

Nie jestem ekspertem w tej dziedzinie, więc czytaj z ogromnym uprzedzeniem!

  1. jestem trochę zdezorientowany przez y

    swojej y jest jeden stały i chcesz mieć korelację między nim a wszystkimi wartościami x_i być > 0.7? Nie jestem ekspertem w dziedzinie matematyki/statystyki, ale moim odczuciem jest to, że jest to możliwe tylko wtedy, gdy korelacja między x_i,x_j podtrzymuje ten sam warunek. w takim przypadku można po prostu zrobić średnią x_i takiego:

    y=(x_1+x_2+x_3+...+x_n)/n 
    

    więc a_i=1.0/n i c=0.0 Ale nadal pytanie brzmi:

    Jakie znaczenie ma korelacji pomiędzy zaledwie 2 numery?

  2. bardziej uzasadnione byłoby, gdyby y to funkcja zależna od x

    na przykład tak:

    y(x) = a_1*(x-x_1)+... +a_n*(x-x_n) + c 
    

    lub inny równanie (ciężko, aby każdy, nie wiedząc gdzie jest pochodził i w jakim celu). Następnie można obliczyć korelację pomiędzy dwoma zestawami

    X = { x_1 , x_2 ,..., x_n } 
    Y = { y(x_1),y(x_2),...y(x_n) } 
    

    W takim przypadku dałbym spróbować approximation searchc,a_i dla stałych zmaksymalizować korelację między X,Y, ale wyniki dla całej złożoności byłoby szaleństwo. Zamiast tego poprawiłbym tylko jedną stałą. w czasie

    1. ustawić kilka bezpiecznych c,a_1,a_2,... stałe
    2. uszczypnąć a_1

      więc obliczenia korelacji dla (a_1-delta) i (a_1+delta) a następnie wybrać kierunek, który jest zwolennikiem korelacji. następnie idź dalej w tym kierunku, aż współczynnik korelacji zacznie spadać.

      Następnie można rekurencyjnie do tego ponownie z mniejszą delta. Btw to właśnie robi moja klasa approx z powyższego linku.

    3. pętla nr 2 przez całą pętlę a_i

    4. cała ta kilka razy w celu poprawy precyzja

    Może można obliczyć c po każdym biegu, aby zminimalizować odległość między X,Y zestawy.

+0

Powinieneś pomyśleć o każdym xi jako kolumnie liczb (po jednym dla każdego wiersza w zbiorze danych). Lub podobnie, pomyśl o każdym xi jako zmiennej losowej. –

+0

@ChrisTaylor więc coś jak: 'y (i) = a1 * x1 (i) + a2 * x2 (i) + ... an * xn (i)'? Gdzie 'i' jest wierszem lub kolumną. to ma sens, ale ** # 1 ** nadal obowiązuje ... 'corr (Xi, Xj)> 0.7', więc możesz zrobić średnią zamiast ... lub ustawić a1 = 1.0, a wszystkie pozostałe na zero ... – Spektre

+0

@ChrisTaylor, ale twoja odpowiedź mówi bardziej mniej szczegółowo o tym samym ... – Spektre

Powiązane problemy