在线岭回归中的正则化参数
Regularisation parameter in On-line ridge regression
我有伪代码,但我仍然难以在在线模式下实现岭回归。我正在使用双重形式,所以我不知道如何更新 a,以及其他困难。伪代码是here.
到目前为止,我已经写了以下内容:
输入是:x(1),...,x(m) m 个向量和 y(1),...,y(m) 个目标。
输出为:f(x1),...,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有一个常量值是没有意义的。我们在批量学习中使用交叉验证。在线学习用什么?
您的代码中有些维度不匹配。
根据我的理解,您的样本量为 n
和 m
个可供选择的预测变量或回归变量。
一步步来吧
- 我提到了你的 link 并且 gamma 是 1 X 1 值。
相反,您有 pred[t] as as as n X 1 。您可以将
pred[,t]
称为 pred[t]
您还有向量 b
的尺寸为 m x 1 而不是
n 乘以 1.
- 另请注意,您最初选择的矩阵A是
对角线。请不要使用 solve
来反转对角矩阵。
solve
非常适合在您的矩阵没有任何
特殊结构。 solve
对 R 来说是一个昂贵的操作
执行。
- 接下来更新A的时候需要知道A是一个n×n的矩阵
初始矩阵值与调整参数成对角线。什么时候
你写
x[t,] %*% x[t,]
你正在执行矩阵乘法
两个 n x 1 向量的顺序不交换。而是尝试写作
x[t,] %*% t(x[t, ])
这确保您创建一个 n × n 矩阵。
- b 没有以正确的方式更新。你正在做的是
替换零的初始向量并更新为
y[t] * x[t,]
然后您将再次更新 b 。你的第三行
loop 在我看来是多余的。
你为什么不试试这段代码
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)
}
我希望这是一个好的答案。
我有伪代码,但我仍然难以在在线模式下实现岭回归。我正在使用双重形式,所以我不知道如何更新 a,以及其他困难。伪代码是here.
到目前为止,我已经写了以下内容:
输入是:x(1),...,x(m) m 个向量和 y(1),...,y(m) 个目标。
输出为:f(x1),...,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有一个常量值是没有意义的。我们在批量学习中使用交叉验证。在线学习用什么?
您的代码中有些维度不匹配。
根据我的理解,您的样本量为 n
和 m
个可供选择的预测变量或回归变量。
一步步来吧
- 我提到了你的 link 并且 gamma 是 1 X 1 值。
相反,您有 pred[t] as as as n X 1 。您可以将
pred[,t]
称为pred[t]
您还有向量b
的尺寸为 m x 1 而不是 n 乘以 1. - 另请注意,您最初选择的矩阵A是
对角线。请不要使用solve
来反转对角矩阵。solve
非常适合在您的矩阵没有任何 特殊结构。solve
对 R 来说是一个昂贵的操作 执行。 - 接下来更新A的时候需要知道A是一个n×n的矩阵
初始矩阵值与调整参数成对角线。什么时候
你写
x[t,] %*% x[t,]
你正在执行矩阵乘法 两个 n x 1 向量的顺序不交换。而是尝试写作x[t,] %*% t(x[t, ])
这确保您创建一个 n × n 矩阵。 - b 没有以正确的方式更新。你正在做的是
替换零的初始向量并更新为
y[t] * x[t,]
然后您将再次更新 b 。你的第三行 loop 在我看来是多余的。
你为什么不试试这段代码
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)
}
我希望这是一个好的答案。