2016-06-08 43 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