2016-03-26 183 views
2

我在嘗試在點雲中應用SVD線性迴歸。我對點集的表示是一個有兩列的矩陣,其中第一列是'x',第二列是'y'。所以,我得到這個情節:在R中應用SVD線性迴歸

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

如何我可以申請SVD線性迴歸,我的觀點與功能? 我試過這個:

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) 
} 

它不起作用。

+0

有沒有理由認爲lm'不適合你? –

+0

問題是'lm'符合線性迴歸。它使用QR分解,而不是SVD,但這對最終結果應該無關緊要。 –

+0

是的,你是對的,但我需要學會使用SVD和pseudoinverses來獲得我的'abline'係數。命令'lm'起作用,但我不知道它是如何工作的。所以,我知道如何獲得自變量的僞逆,但我不知道如何使用它來獲取我的係數。 – Carlos

回答

4

你只需要SVD計算的inverse of X倒數,然後你得到的線性迴歸的權重如下:

Weights(這是X的僞逆)

所以因爲你有你的data與格式(x0, x1, x2),第一:

獲取inverse of X與SVD:

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

一旦你的奇異值分解,X^-1被計算爲inverse

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

現在,計算x的僞逆爲pseudoinverse

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

現在你可以做w

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

權重希望它能幫助。

0

如果你的問題是(實際上)獲得迴歸線繪圖時,這正常工作與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

感謝您的回覆。我知道'lm()'起作用,但我需要知道SVD是如何工作的。我試圖用'svd()'函數得到矩陣的svd值,這會返回三個矩陣:'U','V'和'D'。它被認爲是'M = U%*%D%*%t(V)',但是這個矩陣乘法不起作用。爲什麼?我不知道... – Carlos