2016-06-08 122 views
0

我有伪代码,但仍然努力在在线模式下实现岭回归。我使用双重形式,所以我不知道如何更新,以及其他困难。伪代码是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

你的意思是“不起作用”是什么意思?你如何测试这个功能?此外,如果您对统计方法有疑问,最好在[stats.se]处询问。 – MrFlick

+0

Ridge.Regression(m = 200,x = data)和a = 2,我在求解(A)%*%x [t,]中得到了不一致的参数。x我用了1列和200行,y也是一样。 – Waqas

回答

0

代码中有一些尺寸不匹配。 根据我的理解,您有一个样本规模nm预测变量或回归因子可供选择。

让我们一步一步来。

  1. 我把你的链接和伽玛是1×1值。 取而代之,你有pred [,t] as n X 1。你可以指pred[,t]作为pred[t]还具有尺寸米载体b 1中的 Ñ代替由1
  2. 还要注意您的矩阵A的初始选择是
    对角线。请不要使用solve来反转对角矩阵。 solve是理想的使用,如果你的矩阵没有任何 特殊结构。对于R 来说,solve是昂贵的操作。
  3. 接下来当更新A时,您需要认识到A是一个n乘n矩阵 初始矩阵值与调整参数是对角的。当 你写x[t,] %*% x[t,]你正在执行矩阵乘法 两个n乘1的向量订单不通勤。而不是尝试写 x[t,] %*% t(x[t, ])这可以确保您创建一个n乘n的矩阵。
  4. b没有以正确的方式更新。你正在做什么是 取代零的初始向量,并更新它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) 
    } 

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

+0

我仍然无法得到答案。我得到错误Ainv%*%x [t,]:不符合的参数! – Waqas

+0

我编辑它应该是第t列。 –

+0

嘿!工作正常,谢谢! – Waqas