2012-11-13 5 views
7

Ho cercato lo stack overflow e non ho trovato nessuna domanda che sia realmente uguale alla mia perché nessuno ha davvero più di una variabile indipendente. Fondamentalmente ho una serie di punti dati e voglio essere in grado di trovare un'equazione di regressione per quei punti dati. Il codice che ho sembra finora così: (w, x, z sono le variabili indipendenti ed y è la variabile dipendente)Come trovare l'equazione di regressione multivariabile in javascript

var dataPoints = [{ 
"w" : 1, "x" : 2, "z" : 1, "y" : 7 
}, { 
"w" : 2, "x" : 1, "z" : 4, "y" : 5 
}, { 
"w" : 1, "x" : 5, "z" : 3, "y" : 2 
}, { 
"w" : 4, "x" : 3, "z" : 5, "y" : 15 
}]; 

desidero una funzione che restituisce un oggetto formula in questo modo:

var regressionEquation = [{ 
"var" : "w", "power" : 1, "coeff" : "1.5" 
}, { 
"var" : "x", "power" : 1, "coeff" : "2" 
}, { 
"var" : "z", "power" : 1, "coeff" : "1" 
}]; 

C'è un modo per elaborare un'equazione di regressione come questa senza utilizzare un ciclo per eseguire il passo e collegare i valori? C'è un modo per elaborare l'equazione di regressione per poteri che sono più di 1? Grazie in anticipo.

EDIT

Molte persone hanno suggerito la soluzione di un sistema di equazioni realizzati inserendo nei poteri. Il problema che ho con questo è quando ci sono più di punti dati sufficienti per risolvere un sistema di equazioni. Negli esempi nella domanda, ho 3 variabili per risolvere il sistema di equazioni che le persone suggeriscono, avrei bisogno di 3 punti dati ma ne ho 4. Questo porta ad un problema perché c'è più di una soluzione. Ci sono 4 possibili soluzioni perché ci sono 4 modi per combinare le 4 equazioni in diversi gruppi di 3. Questo mi lascerebbe con 4 risposte con possibilmente nessuna di loro la migliore adatta a tutti e 4 i punti.

+0

Stai pensando a qualcosa come l'interpolazione polinomiale? (https://en.wikipedia.org/wiki/Polynomial_interpolation) Ho scritto alcuni js per farlo prima attraverso le operazioni su una matrice Vandermonde. – sgcharlie

+0

No Vorrei trovare un'equazione di regressione e quindi estrapolare –

+0

in modo da avere la funzione w = ax^k1 + per^k2 + cz^k3 in cui si desidera trovare a, b, c, k1, k2 e k3 adatti al proprio dati? –

risposta

1

Il problema, come hai affermato, è equivalente, in fase di trasformazione, a un problema di regressione lineare. Nei commenti hai affermato che hai corretto gli esponenti k_1, k_2 e k_3. La trasformazione prende una tupla {w, x, z ,y} nella tupla {w^k_1, x^k_2, z^k_2, y} = {w', x', z' ,y}. Usa la regressione lineare sulle variabili innescate per ottenere i tuoi coefficienti.

Per esempio, se k_1 = 2, k_2 = 3, e k_3 = 1, quindi ecco un solo esempio della trasformazione:

{"w" : 4, "x" : 3, "z" : 5, "y" : 15} 
==> {"w*" : 16, "x*" : 27, "z*" : 5, "y" : 15} 

Questo è solo un caso particolare di come si converte un problema polynomial regression in una regressione lineare uno. Nel tuo caso le forme polinomiali che stai considerando sono particolarmente semplici.

Utilizzare qualsiasi libreria JavaScript che ti piace per risolvere il problema di regressione lineare; ce ne sono un numero.

+0

si prega di guardare la modifica per il mio problemi con la tua risposta –

1

Penso che se ci sono quattro equazioni e solo 3 variabili (come hai già determinato i poteri, plug-in e renderlo un'equazione lineare), l'equazione lineare è finita e non esiste risposta esatta che soddisferà tutte e quattro le equazioni.

Quello che puoi fare è ridurre al minimo l'errore residuo e ottenere la migliore approssimazione.

supponga di avere coefficienti, B e C per la WX e z,

definire matrice

M=[w1,x1,z1;w2,x2,z2;w3,x3,z3;w4,x4,z4]. 

e definire il vettore

v=[a;b;c], 

definire vettore

r=[y1;y2;y3;y4]. 

Quindi il p roblem è

M*v=r solve v. 

1. Se rango (M)> numero variabile, è necessario ridurre al minimo l'errore residuo

||M*v-r||_2. 

Poiché questo è convessa, prendere derivata su di esso e renderlo a zero:

M^T*M*v-M^T*r=0 => v=(M^T*M)\M^T*r. 

(M^T * M) \ M^T è MP-inversa di M, se rango (M)> numero variabile, quindi (M^T * M) è inversible.

2. Se il numero (M) < = numero variabile, è possibile ottenere infinitamente molte soluzioni esatte all'equazione.

M*v=r. 

Let decomposizione ai valori singolari di M:

M=U*S*V^T, 

poi

v=V*S^-1*U^T*r 

è una delle soluzioni.

V * S^-1 * U^T è pseudo inversa di M.

Se si utilizza una libreria di algebra lineare, è molto facile da ottenere soluzione in forma chiusa senza l'iterazione. http://sylvester.jcoglan.com/

+0

Se il primo caso http://sylvester.jcoglan.com/api/matrix.html#inverse può già risolvere. Ma se il secondo caso, non ho visto alcuna libreria javascript che può restituire una pseudo inversa. Forse questa libreria http://www.numericjs.com/ può essere d'aiuto perché può calcolare svd di una matrice, e puoi ottenere una pseudo inversa usando US e V. –

+0

Non capisco veramente tutti i calcoli matematici usati nella spiegazione quello che capisco è che nel primo caso (che è l'unico a cui tengo) per trovare la soluzione avrei bisogno di usare la libreria che hai fornito per trovare l'inverso della M e poi scoprire che * r usa quella libreria. Ho ragione? –

+0

Ho provato questo e ha causato un errore perché M non è inversibile perché non è un quadrato –

0

Suggerirei di usare i minimi quadrati per ottenere un'equazione lineare. Inoltre, è possibile utilizzare i minimi quadrati non lineari, dato che è sapere in anticipo la funzione che si desidera adattare.

(http://en.wikipedia.org/wiki/Least_squares)

Ci sono diversi link per LS lineari in javascript e si può probabilmente adattare questi a 3 dimensioni (ad esempio http://dracoblue.net/dev/linear-least-squares-in-javascript/159/ da una rapida ricerca su Google). Per il caso non lineare , tuttavia, sarebbe necessario un po 'più di lavoro.

+0

Il modo in cui ho capito il collegamento che hai postato non funzionava per più variabili, il che è un grosso problema –

+0

Beh, può funzionare per qualsiasi numero di variabili o qualsiasi funzione (vedi ad esempio http://en.wikipedia.org/ wiki/Least_squares # Solving_the_least_squares_problem) - il fatto è che è principalmente usato per y = ax + b, quindi la maggior parte del codice che troverai troverà come target questo tipo di funzione. Per il caso lineare con più variabili vedi http://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#The_general_problem. Ma in generale, per problemi non lineari probabilmente dovrai calcolare un po 'di matematica da solo. – nvlass

+0

Modifica/aggiunta: poiché, tuttavia, il sistema è sovradeterminato, probabilmente è la strada da percorrere. – nvlass