在 R 中应用 SVD 线性回归

Apply SVD Linear Regression in R

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

如何使用函数将 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)
}

没用。

如果您的问题(实际上)是绘制回归线,这适用于 lm():

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

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

(这是 X 的伪逆)

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

通过 SVD 获得

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

进行奇异值分解后,x^-1 计算为

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

现在,将 X 的伪逆计算为

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

现在您可以使用权重

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

希望对您有所帮助。