在线岭回归中的正则化参数

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有一个常量值是没有意义的。我们在批量学习中使用交叉验证。在线学习用什么?

您的代码中有些维度不匹配。 根据我的理解,您的样本量为 nm 个可供选择的预测变量或回归变量。

一步步来吧

  1. 我提到了你的 link 并且 gamma 是 1 X 1 值。 相反,您有 pred[t] as as as n X 1 。您可以将 pred[,t] 称为 pred[t] 您还有向量 b 的尺寸为 m x 1 而不是 n 乘以 1.
  2. 另请注意,您最初选择的矩阵A是
    对角线。请不要使用 solve 来反转对角矩阵。 solve 非常适合在您的矩阵没有任何 特殊结构。 solve 对 R 来说是一个昂贵的操作 执行。
  3. 接下来更新A的时候需要知道A是一个n×n的矩阵 初始矩阵值与调整参数成对角线。什么时候 你写 x[t,] %*% x[t,] 你正在执行矩阵乘法 两个 n x 1 向量的顺序不交换。而是尝试写作 x[t,] %*% t(x[t, ]) 这确保您创建一个 n × n 矩阵。
  4. 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)
  }

我希望这是一个好的答案。