【问题标题】:R: Stagewise regression, multiplying with a basis vectorR:逐阶段回归,与基向量相乘
【发布时间】:2018-02-25 18:39:40
【问题描述】:

我从this 论文中获得了这个算法:

我尝试在 R 中实现它,但是当我乘以

中的 i-th 标准基向量时尺寸不正确

到目前为止,这是我的代码:

#initializing matrices
Boston <- read.csv("train.csv")
Boston=na.omit(Boston)
x=model.matrix(crim~.,Boston)[,-c(1,2)]
rownames(x)=c()
y=as.matrix(Boston$crim)
value1=matrix(0,13,1)
value=matrix(0,13,1)

#defining a 0 beta vector 13x1 and epsilon
beta=as.matrix(rep(0,13))
epsilon=0.1

#defining a matrix for the standard basis vecor
e=matrix(0,13,13)
for(t in 1:13){
  e[t,t]=as.matrix(1)
}

for(k in 1:13){
 #Finding the maximum i
  for(j in 1:13){
    value[j]=t(x)[j,]%*%(y-x%*%beta)
    value=abs(value)
    i=which.max(value)
  }
  #defining the standard basis vector
  e_basis=matrix(e[,i],13,1)

  value1[k]=epsilon*sign(t(x)[i,]%*%(y-x%*%beta))
  beta=beta+value1
}

代码可以编译,但我不确定我是否正确实现了除基向量之外的所有其他内容。

train.csv 文件(波士顿数据集)可在此处找到:https://www.kaggle.com/c/boston-housing

【问题讨论】:

    标签: r machine-learning regression


    【解决方案1】:

    你得到的错误来自这样一个事实,当你计算sign(t(x)[i,]%*%(y-x%*%beta))时,你没有得到一个数值,你实际上得到了一个大小为1的矩阵。你可以通过添加@987654322从矩阵中提取符号值@ 例如。通过这样做,您将能够计算epsilon*sign(t(x)[i,]%*%(y-x%*%beta))[1,1]*e_basis

    现在让我感到惊讶的另一件事是,在您的代码中,k 从 1 循环到 13,这是预测变量的数量,但 k 与这个数字完全无关,因为 k 代表迭代步骤你的算法。

    话虽如此,value1(不是value1[k])应该存储向量epsilon*sign(t(x)[i,]%*%(y-x%*%beta))[1,1]*e_basis

    现在为了让你的代码按照论文中的描述工作,如果我没有理解错,我会像这样重写你的解决方案:

    Boston <- read.csv("../train.csv")
    #initializing matrices
    Boston=na.omit(Boston)
    x=model.matrix(crim~.,Boston)[,-c(1:2)]
    rownames(x)=c()
    y=as.matrix(Boston$crim)
    value1=matrix(0,13,1)
    value=matrix(0,13,1)
    
    #defining a 0 beta vector 13x1 and epsilon
    beta=as.matrix(rep(0,13))
    epsilon=0.1
    
    #defining a matrix for the standard basis vecor
    e=matrix(0,13,13)
    for(t in 1:13){
      e[t,t]=as.matrix(1) 
    }
    
    n_iterations <- 10
    
    for(k in 1:n_iterations){
      #Finding the maximum i
      for(j in 1:13){
        value[j]=t(x)[j,]%*%(y-x%*%beta)
        value=abs(value)
      }
    
      i=which.max(value)
    
      #defining the standard basis vector
      e_basis=matrix(e[,i],13,1)
    
      value1=epsilon*sign(t(x)[i,]%*%(y-x%*%beta))[1,1]*e_basis
      beta=beta+value1
    }
    

    【讨论】:

    • 谢谢你,但有了你的解决方案,我最终得到的 beta 都是零
    • 您需要为您的步长选择一个合适的值。看来epsilon = 0.1 在这里太高了。您可以尝试更小的epsilon 值(例如epsilon = 0.00001)。您还可以设置大量迭代(例如n_iterations = 25000)并查看它是如何工作的。然后,您可以将您的 beta 与通过套索选择程序获得的 beta 进行比较 glmnet(x, y, alpha = 1, lambda = 0.25)$beta
    • 谢谢,我尝试了较小的 epsilon 值和较大的迭代次数,现在我得到了一些 beta 系数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多