在R中应用SVD线性回归

时间:2016-03-26 10:20:19

标签: r linear-regression svd

我尝试在点云中应用SVD线性回归。我对点集的表示是一个有两个列的矩阵,其中第一列是' x'第二个是' y。所以,我得到了这个情节:

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

它没有用。

2 个答案:

答案 0 :(得分:4)

你只需要SVD来计算inverse of X的倒数,然后得到线性回归权重,如下所示:

Weights(这是X的伪逆)

因此,假设您的data格式为(x0, x1, x2),那么首先:

使用SVD获取inverse of X

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

希望它有所帮助。

答案 1 :(得分:-1)

如果你的问题是(实际上)绘制回归线,那么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