在R中实现核岭回归

4

我希望在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核和多项式核执行岭回归。

1个回答

5
以下是二次多项式核函数的代码,希望对您有所帮助!
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吗? - DeeeeRoy
只需在函数poly.kernel中设置参数p=3即可。 - Waqas
1
跳过M.inv <- solve(M),改为计算 y.hat <- t(Labels) %*% solve(M, rbind(0,k)) 可能会更加数值稳定。请参阅此文:http://civilstat.com/2015/07/dont-invert-that-matrix-why-and-how/。 - adviksh
是的,您的建议似乎更有效。谢谢。 - Waqas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接