在 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
希望对您有所帮助。
我正在尝试在点云中应用 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来计算
假设您的 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
希望对您有所帮助。