2016-03-26 17 views
2

Ich versuche SVD Lineare Regression in einer Punktewolke anwenden. Meine Darstellung der Punktmenge ist eine Matrix mit zwei Spalten, wobei die erste Spalte "x" und die zweite Spalte "y" ist. So erhalte ich diese Handlung:Apply SVD Lineare Regression in R

myplot http://oi65.tinypic.com/msoyl5.jpg

Wie kann ich SVD lineare Regression, um meinen Standpunkt gilt mit einer Funktion gesetzt? Ich habe mit dieser versucht:

Regress_Lin<-function(data,label){ 
    #Calculating pseudomatrix of data  
    data<-cbind(data,rep(1,nrow(data))) 
    data.svd <- svd(data) 
    ds <- diag(1/data.svd$d) 
    u <- data.svd$u 
    v <- data.svd$v 
    us <- as.matrix(u) 
    vs <- as.matrix(v) 
    #Calculating abline coefficients y=mx+b 
    weights<-(vs%*%solve(ds)%*%t(u))%*%label 
    m <- -(weights[1,1]/weights[2,1]) 
    b <- -(weights[3,1]/weights[2,1]) 
    c(m,b) 
} 

Es funktioniert nicht.

+0

Gibt es einen Grund, dass 'lm' nicht für Sie funktioniert? –

+0

Der Punkt ist, dass "lm" linearen Regressionen entspricht. Es verwendet die QR-Zerlegung, nicht die SVD, aber das sollte für das Endergebnis keine Rolle spielen. –

+0

Ja, Sie haben Recht, aber ich muss lernen, SVD und Pseudoinverse zu verwenden, um meine 'abline' Koeffizienten zu erhalten. Der Befehl 'lm' funktioniert, aber ich weiß nicht, wie es funktioniert. Ich weiß also, wie ich meine unabhängige Variable pseudoinvertieren kann, aber ich weiß nicht, wie ich sie benutzen soll, um meine Koeffizienten zu erhalten. – Carlos

Antwort

4

Sie nur SVD müssen die Inverse inverse of X berechnen und dann erhalten Sie die Gewichte für die lineare Regression, wie folgt:

Weights (Dies ist die Pseudoinverse von X ist)

So gegeben, dass Sie Ihre data mit dem Format haben (x0, x1, x2) zuerst:

Erhalten inverse of X mit SVD:

x <- t(data) %*% data 
duv <- svd(x) 

Sobald Sie haben die Einzelwertzerlegung, x^-1 als inverse berechnet

x.inv <- duv$v %*% diag(1/duv$d) %*% t(duv$u) 

Nun berechnet die Pseudoinverse von X als pseudoinverse

x.pseudo.inv <- x.inv %*% t(data) 

Und jetzt können Sie die Gewichte, es hilft dabei w

w <- x.pseudo.inv %*% labels 

bekommen.

0

Wenn Ihr Problem ist (eigentlich) bekommen die Regressionslinie aufgetragen, das funktioniert gut mit lm():

# simulate some data: 
x = (1:100) + runif(100)*20; x = (1:100) + runif(100)*20 
plot(x,y) 
abline(lm(y~x)) 

enter image description here

+0

Danke für Ihre Antwort. Ich weiß, dass 'lm()' funktioniert, aber ich muss wissen, wie SVD funktioniert. Ich habe versucht, die SVD-Werte einer Matrix mit 'svd()' -Funktion zu erhalten, das gibt drei Matrizen zurück: 'U',' V' und 'D'. Es steht fest: M = U% *% D% *% t (V) 'aber diese Matrixmultiplikation funktioniert nicht. Warum? Ich weiß es nicht... – Carlos