2015-11-23 80 views
3

我想在R中實現內核嶺迴歸。我的問題是,我不知道如何生成內核值,我不知道如何使用它們進行嶺迴歸。我想用下面的內核函數:在R中實現內核嶺迴歸

kernel.eval <- function(x1,x2,ker) { k=0 if (kertype == 'RBF') { 
    # RBF kernel 
    k=exp(-sum((x1-x2)*(x1-x2)/(2*kerparam^2))) } else { # polynomial kernel k=(1+sum(x1*x2))^ker$param } return(k) } 

而且,我知道,嶺迴歸公式爲:

myridge.fit <- function(X,y,lambda) { w= solve((t(X) %% X) +(lambdadiag(dim(X)[2])), (t(X) %*% y)) return(w) } 

實例訓練數據:

  [,1]  [,2] 
[1,] -1.3981847 -1.3358413 
[2,] 0.2698321 1.0661275 
[3,] 0.3429286 0.8805642 
[4,] 0.5210577 1.1228635 
[5,] 1.5755659 0.2230754 
[6,] -1.2167197 -0.6700215 

例測試數據: (我不知道現在是否需要這些)

 [,1] [,2] 
[1,] -2.05 -2.050 
[2,] -2.05 -2.009 
[3,] -2.05 -1.968 
[4,] -2.05 -1.927 
[5,] -2.05 -1.886 
[6,] -2.05 -1.845 

有沒有人能夠幫助我完成第一步。我必須爲RBF內核和多項式內核做Ridge迴歸。

回答

2

以下是具有2級多項式內核的代碼,希望有所幫助!

poly.kernel <- function(v1, v2=v1, p=2) { 
    ((as.matrix(v1) %*% t(v2))+1)^p 
} 

KernelRidgeReg <- function(TrainObjects,TrainLabels,TestObjects,lambda){ 

    X <- TrainObjects 
    y <- TrainLabels      
    kernel <- poly.kernel(X) 

    design.mat <- cbind(1, kernel) 

    I <- rbind(0, cbind(0, kernel)) 

    M <- crossprod(design.mat) + lambda*I 
    #crossprod is just x times traspose of x, just looks neater in my openion 

    M.inv <- solve(M) 
    #inverse of M 

    k <- as.matrix(diag(poly.kernel(cbind(TrainObjects,TrainLabels)))) 
    #Removing diag still gives the same MSE, but will output a vector of prediction. 

    Labels <- rbind(0,as.matrix(TrainLabels)) 

    y.hat <- t(Labels) %*% M.inv %*% rbind(0,k) 

    y.true <- Y.test 

    MSE <-mean((y.hat - y.true)^2) 

    return(list(MSE=MSE,y.hat=y.hat)) 

} 

解決內置R函數有時返回奇異矩陣。你可能想編寫自己的函數來避免這種情況。