我从这篇论文中得到了这个算法:
我尝试在R中实现它,但在与(第i个标准基向量)相乘时,维度不正确,
这是我目前的代码:
#initializing matricesBoston <- 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 epsilonbeta=as.matrix(rep(0,13))epsilon=0.1#defining a matrix for the standard basis vecore=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
文件(波士顿数据集)可以在这里找到。
回答:
你得到的错误是因为当你计算sign(t(x)[i,]%*%(y-x%*%beta))
时,你得到的不是一个数值,而是一个大小为1的矩阵。你可以通过添加[1,1]
来从矩阵中提取符号值。这样,你就可以计算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 matricesBoston=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 epsilonbeta=as.matrix(rep(0,13))epsilon=0.1#defining a matrix for the standard basis vecore=matrix(0,13,13)for(t in 1:13){ e[t,t]=as.matrix(1) }n_iterations <- 10for(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}