我以GA软件包中的示例为例,介绍了LM特征选择,但我想增加一个惩罚,以使选择的特征量不能超过某个阈值。
在此示例中,我添加了一个惩罚'sum(string * -1)* 100',因此对于每个选择的功能,惩罚都是100。
但是,如果我运行代码,则会出现错误: “ x [,ii]中的错误:下标超出范围”
我的代码或软件包有什么问题?
(如果将代码行“ -BIC(mod)+ sum(string * -1)* 100#健身功能值”更改为“ -BIC(mod)#健身功能值”,则一切正常。 )
library(GA)
data(fat, package = "UsingR")
mod <- lm(body.fat.siri ~ age + weight + height + neck + chest + abdomen + hip + thigh + knee + ankle + bicep + forearm + wrist, data = fat)
summary(mod)
x <- model.matrix(mod)[,-1]
y <- model.response(mod$model)
fitness <- function(string)
{
mod <- lm(y ~ x[,string==1])
-BIC(mod)+sum(string*-1)*100 # fitness function value
}
GA = ga("binary", fitness = fitness, nBits = ncol(x), popSize = 100, maxiter = 100, monitor = FALSE)
summary(GA)
答案 0 :(得分:0)
此错误实际上发生在上一行
mod <- lm(y ~ x[,string==1])
。
修改健身功能以打印出字符串
fitness <- function(string) {
mod <- lm(y ~ x[,string==1])
-BIC(mod)+sum(string*-1)*100 # fitness function value
}
并运行ga。您将看到,当字符串全为零时,会持续发生这种情况。
直接测试。
string = rep(0,13)
fitness(string)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0
Error in x[, ii] : subscript out of bounds
mod <- lm(y ~ x[,string==1])
Error in x[, ii] : subscript out of bounds
问题是您要尝试使用没有预测变量的线性模型进行拟合。当您包含此惩罚项时,它将变量数驱动为零。没有这个术语,您不可能测试所有零。