我有伪代码,但我仍然在努力在在线模式下实现岭回归。我使用双重形式,所以我不知道如何更新a,以及其他困难。伪代码是here。
到目前为止,我已经写了以下内容:
输入为:x(1),...,x(m)m个向量和y(1),...,y(m)个目标。
输出为:f(x 1),...,f(x [m])模型预测
Ridge.Regression<-function(m,x){
b<- rep(0,m)
A<- a * diag(nrow(x))
for (t in 1:m){
pred[,t]<- b * (solve(A) %*% x[t,])
A<- A + x[t,] %*% x[t,]
b<- y[t] * x[t,]
b<- b + (y[t] * x[t,])
return(pred)}}
我上面所做的不起作用。输入向量b和矩阵A的初始化有什么问题?
具有参数a的常量值是没有意义的。我们在批量学习中使用交叉验证。什么在在线学习中使用?
答案 0 :(得分:0)
您的代码中存在一些维度不匹配。
根据我的理解,您的样本大小为n
和m
预测变量或回归量可供选择。
pred[,t]
称为pred[t]
您还有向量b
,其尺寸为m乘以1而不是
n乘1。solve
反转对角矩阵。
如果您的矩阵没有任何矩阵,solve
是理想的选择
特殊结构。 solve
对于R来说是一项昂贵的操作
表演。x[t,] %*% x[t,]
两个n乘1向量的顺序不通勤。而不是尝试写作
x[t,] %*% t(x[t, ])
这可确保您创建一个n×n矩阵。y[t] * x[t,]
更新它
然后,您再次更新b。你的第三行
循环看起来多余。set.seed(54) # a random seed
n <- 100 # sample size
m <-40 # number of predictors
# create n X m design matrix
x <- matrix(runif(n), nrow = n, ncol = m)
# Initialize b with zero vector
b <- rep(0, n)
y <- rnorm(m) # m by 1 vector
a <- 5 # choice of tuning parameter depends on user
A <- diag(a, n)
pred <- rep(0, n) #initialize output
Ridge.Regression<-function(m, x, b, a, n){
#Arguments X must be a design matrix
# m is the number of predictors
# b is n X 1 vector
# n is the sample size
# a is the tuning parameter
# Function returns predicted values.
ainv <- (1/a)
Ainv <- diag(ainv, n)
for (t in 1:m){
pred[t] <- t(b) %*% (Ainv %*% x[,t])
A <- A + x[,t] %*% t(x[, t])
Ainv <- solve(A) # using solve since A may not have special sturcture
b <- b + (y[t] * x[,t]) # update b
}
return(pred)
}
我希望这对你来说是一个很好的答案。