Risolvere un sistema di equazioni con dati sparsi


11

Sto tentando di risolvere un insieme di equazioni che ha 40 variabili indipendenti (x1, ..., x40) e una variabile dipendente (y). Il numero totale di equazioni (numero di righe) è ~ 300 e voglio risolvere l'insieme di 40 coefficienti che minimizza l'errore totale di somma dei quadrati tra y e il valore previsto.

Il mio problema è che la matrice è molto scarsa e non conosco il modo migliore per risolvere il sistema di equazioni con dati sparsi. Di seguito è mostrato un esempio del set di dati:

   y    x1  x2 x3 x4 x5 x6 ... x40
87169   14  0  1  0  0  2  ... 0 
46449   0   0  4  0  1  4  ... 12
846449  0   0  0  0  0  3  ... 0
....

Attualmente sto usando un algoritmo genetico per risolvere questo problema e i risultati stanno ottenendo circa un fattore di due differenze tra osservato e atteso.

Qualcuno può suggerire diversi metodi o tecniche che sono in grado di risolvere un insieme di equazioni con dati sparsi.


2
Errore di battitura nel titolo: spare => sparse.
Aleksandr Blekh,

Risposte:


11

Se ti capisco correttamente, questo è il caso della regressione lineare multipla con dati sparsi ( regressione sparsa ). Supponendo che, spero che troverai utili le seguenti risorse .

1) Conferenza della NCSU sulla regressione sparsa con panoramica di algoritmi, note, formule, grafici e riferimenti alla letteratura: http://www.stat.ncsu.edu/people/zhou/courses/st810/notes/lect23sparse.pdf

2) l' Recosistema offre numerosi pacchetti , utili per l'analisi di regressione sparsa, tra cui:

3) Un post sul blog con un esempio di soluzione di regressione sparsa , basato su SparseM: http://aleph-nought.blogspot.com/2012/03/multiple-linear-regression-with-sparse.html

4) Un post sul blog sull'uso di matrici sparse in R , che include un'anteprima sull'uso di glmnet: http://www.johnmyleswhite.com/notebook/2011/10/31/using-sparse-matrices-in-r

5) Altri esempi e alcune discussioni sull'argomento sono disponibili su StackOverflow : /programming/3169371/large-scale-regression-in-r-with-a-sparse-feature-matrix

AGGIORNAMENTO (basato sul tuo commento):

Se stai cercando di risolvere un problema LP con vincoli, potresti trovare utile questo documento teorico : http://web.stanford.edu/group/SOL/papers/gmsw84.pdf .

Inoltre, controlla il pacchetto R limSolve : http://cran.r-project.org/web/packages/limSolve . E, in generale, controlla i pacchetti nella Visualizzazione attività CRAN "Ottimizzazione e programmazione matematica" : http://cran.r-project.org/web/views/Optimization.html .

Infine, controlla il libro "Usare la R per l'analisi numerica in scienza e ingegneria" (di Victor A. Bloomfield). Ha una sezione sulla risoluzione dei sistemi di equazioni, rappresentata da matrici sparse (sezione 5.7, pagine 99-104), che include esempi, basati su alcuni dei pacchetti sopra menzionati: http://books.google.com/books? id = 9ph_AwAAQBAJ & pg = PA99 & LPG = PA99 & dq = r + limsolve + sparse + matrice & source = bl & ots = PHDE8nXljQ & sig = sPi4n5Wk0M02ywkubq7R7KD_b04 & hl = it & sa = X & ei = FZjiU-ioIcjmsATGkYDAAg & ved = 0CDUQ6AEwAw # v = onepage & q = r% 20limsolve% 20sparse% 20matrix & f = false .


3
Grazie per l'ottima risposta! Sono titubante nel classificare il problema come regressione sparsa poiché non sto davvero cercando di modellare e prevedere, ma piuttosto di risolvere per un insieme di coefficienti. Il motivo per cui sto usando gli algoritmi genetici è perché posso anche impiegare vincoli sull'equazione. Se non arrivano altre risposte, accetterò volentieri questo.
mike1886,

1
@ mike1886: Piacere mio! Ho aggiornato la mia risposta, in base al tuo commento. Spero che sia d'aiuto.
Aleksandr Blekh,

7

La risposta di Aleksandr è completamente corretta.

Tuttavia, il modo in cui viene posta la domanda implica che si tratta di una semplice domanda di regressione dei minimi quadrati ordinari: ridurre al minimo la somma dei residui quadrati tra una variabile dipendente e una combinazione lineare di predittori.

Ora, sebbene ci possano essere molti zeri nella matrice di progettazione, il sistema in quanto tale non è eccessivamente grande: 300 osservazioni su 40 predittori non sono altro che di medie dimensioni. È possibile eseguire una regressione di questo tipo utilizzando R senza particolari sforzi per dati sparsi. Basta usare il lm()comando (per "modello lineare"). Utilizzare ?lmper vedere la pagina di aiuto. E nota che lmper impostazione predefinita aggiungerai silenziosamente una colonna costante di quelle alla tua matrice di design (l'intercettazione) - includerai una -1sul lato destro della tua formula per sopprimerlo. Nel complesso, supponendo che tutti i tuoi dati (e nient'altro) siano contenuti in una data.framechiamata foo, puoi farlo:

model <- lm(y~.-1,data=foo)

E quindi puoi guardare le stime dei parametri ecc. In questo modo:

summary(model)
residuals(model)

Se il tuo sistema è molto più grande, diciamo sull'ordine di 10.000 osservazioni e centinaia di predittori, guardando i risolutori sparsi specializzati secondo la risposta di Aleksandr potrebbe iniziare a dare un senso.

Infine, nel tuo commento alla risposta di Aleksandr , menzioni i vincoli sulla tua equazione. Se questo è in realtà il tuo problema chiave, ci sono modi per calcolare i minimi quadrati vincolati in R. Mi piace personalmente pcls()nel mgcvpacchetto. Forse vuoi modificare la tua domanda per includere il tipo di vincoli (vincoli di casella, vincoli di non negatività, vincoli di integralità, vincoli lineari, ...) che devi affrontare?


1
Stephan, apprezzo le tue parole gentili! Hai votato la tua bella risposta. Potresti essere interessato all'aggiornamento che ho apportato alla mia risposta, in base al commento dell'autore della domanda.
Aleksandr Blekh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.