【问题标题】:Implementing Kernel Ridge Regression in R在 R 中实现核岭回归
【发布时间】:2016-02-25 02:21:41
【问题描述】:

我想在 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 内核和多项式内核进行岭回归。

【问题讨论】:

    标签: r


    【解决方案1】:

    以下是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 函数有时会返回奇异矩阵。您可能需要编写自己的函数来避免这种情况。

    【讨论】:

    • 要使这个顺序为 3,我是否只需将度数更改为 3?
    • 只需在函数poly.kernel中设置参数p=3即可。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2016-09-10
    • 2016-10-21
    • 2017-02-12
    • 2012-10-07
    • 2015-08-13
    相关资源
    最近更新 更多