【问题标题】:customized ridge regression function自定义岭回归函数
【发布时间】:2013-08-12 09:11:52
【问题描述】:

我正在研究 Ridge 回归,我想创建自己的函数。它尝试了以下方法。它适用于 k 的单个值,但不适用于值序列的数组。

dt<-longley
attach(dt)
library(MASS) 
X<-cbind(X1,X2,X3,X4,X5,X6)
X<-as.matrix(X)
Y<-as.matrix(Y)

sx<-scale(X)/sqrt(nrow(X)-1)
sy<-scale(Y)/sqrt(nrow(Y)-1)
rxx<-cor(sx)
rxy<-cor(sx,sy)

for (k in 0:1){
res<-solve(rxx+k*diag(rxx))%*%rxy
k=k+0.01
}

也需要优化代码方面的帮助。

【问题讨论】:

  • 你能清理一下你的例子吗?我们不知道输入数据是什么,没有Y,但是使用了Yrid是由not used创建的,你的解释中没有提到k。也许这会有用:stackoverflow.com/q/5963269
  • @Bryan Hanso:代码已更新。 Longley 是默认数据集,但我使用的名称不同。您可以考虑任何数据集。
  • @itfeature.com 我们不想考虑任何数据集,我们想考虑你的。如果您需要帮助,如果我们能够运行您的示例,而无需代表我们花费任何额外的不必要的努力,那么您就有更好的机会。请对其进行编辑以使其正常工作。
  • 需要优化哪些部分?您认为瓶颈是什么?
  • for (k in 0:1) 将在第一遍使用 0,然后使用 1。k = k + 0.01 不会按照您编写的方式执行任何操作,因为 k 来自 for 语句。也许您想要更多类似for (k in seq(0, 1, by = 0.01) 的东西?并取出k = k + 0.1 顺便说一句,您提供的是脚本而不是函数。

标签: r regression


【解决方案1】:
poly.kernel <- function(v1, v2=v1, p=1) {   
    ((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))

}

p=1 的内核,将为您提供岭回归。

求解内置 R 函数有时会返回奇异矩阵。您可能需要编写自己的函数来避免这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2018-11-17
    • 2016-06-28
    • 2019-07-13
    • 2014-06-17
    • 2016-10-21
    • 2019-10-11
    相关资源
    最近更新 更多