如何使用GFC.GCCL方法解决R的frbs包中的错误?

时间:2016-01-06 08:59:50

标签: r rule fuzzy

我在frbs中使用R包在我的数据集上使用5倍分层交叉验证。我已经实施了分层简历。我在每个折叠中使用GFS.GCCL方法用于frbs.learn函数,并使用测试数据预测结果。我收到此错误以及30条相同的警告消息:

错误:未找到对象'temp.rule.degree'

警告:在max(MF.temp [m,],na.rm = TRUE):   max没有非缺失的参数;返回-Inf

我的代码写在下面:

    library(frbs)
    data<-read.csv(file.address)
    data[,30] <- unclass(data[,30]) #column 30 has the class of samples
    data <- data[,c(1,14,20,26,27, 30)] # I choose to have 5 attr. since
                                         #my data is high dimensional    

    k <- 5 # 5-fold 
    seed <- 1
    folds <- strf.cv(data, k, seed) #stratification function for CV


    range.data.inp <- matrix(apply(data[,-ncol(data)], 2, range), nrow=2)

    data<-norm.data(as.matrix(data[,-ncol(data)]),range.data.
            inp,min.scale = 0.1, max.scale = 1)

    ctrl <- list(popu.size = 30, num.class = 2, num.labels= 3,
            persen_cross = 0.9, max.gen = 200, persen_mutant = 0.3,
         name="sim-1")
    for(i in 1:k){

    str <- paste("fold",i)
    print(str)
    test.ind <- folds[[str]]
    test.data <- data[test.ind,]
    train.data <- data[-test.ind,]

    obj <- frbs.learn(train.data , method.type="GFS.GCCL",
                 range.data.inp , ctrl)


    pred <- predict(obj, test.data)
    print("Predicted classes:")
    print(pred)
    }

我对错误和警告一无所知。请让我知道我应该做些什么。

3 个答案:

答案 0 :(得分:1)

我有类似的问题(和其他人)试图从虹膜示例数据开始重现SLAVE学习。在使用我的人工数据运行之前,我有2个格式项要解决:

  • 我的数据帧导入给了我整数,其中learn至少需要numeric
  • 我的标准分布并不平坦。当我弄平分布时(3个值,每个值n / 3个样本)一切都很顺利。

这就是我所知道的。 希望它有所帮助。

答案 1 :(得分:1)

在运行SLAVE和GFS.GCCL时遇到了相同的问题。当我查看库的源代码时。我发现在frbs.learn()中,每种方法都有一个实现来计算输入数据的范围。因此,我认为输入数据范围可能存在问题。例如,在GFS.GCCL的源代码中,用于设置参数的样子如下:

range.data.input <- range.data
data.train.ori <- data.train
popu.size <- control$popu.size
persen_cross <- control$persen_cross
persen_mutant <- control$persen_mutant
max.gen <- control$max.gen
name <- control$name
n.labels <- control$num.labels
n.class <- control$num.class

num.labels <- matrix(rep(n.labels, ncol(range.data)), nrow = 1)
num.labels <- cbind(num.labels, n.class)

## normalize range of data and data training
range.data.norm <- range.data.input
range.data.norm[1, ] <- 0
range.data.norm[2, ] <- 1   
range.data.input.ori <- range.data.input
data.tra.norm <- norm.data(data.train[, 1 : ncol(data.train) - 1], range.data.input, min.scale = 0, max.scale = 1)
data.train <- cbind(data.tra.norm, matrix(data.train[, ncol(data.train)], ncol = 1))

在第一行中,range.data来自您的规范或frbs.learn()的默认设置。对于默认设置,它将获取每一行的最大值和最小值。在源代码中:

range.data <- rbind(dt.min, dt.max)

之后,GFS.GCCL所获取的数据范围为

range.data.norm <- range.data.input
range.data.norm[1, ] <- 0
range.data.norm[2, ] <- 1

,介于0到1之间。GFS.GCCL还将range.data.input作为参数。因此,它需要range.data.norm和range.data.input。

因此,我认为如果在内部,有一些与range.data.input相对应的计算(需要将其设置为每一行的min,max),但实际上它的设置不是每一行的min和max 。错误生成。

但是,总之,当我从frbs.learn()中删除“ range.data”之后,GFS.GCCL和SLAVE都对我有用。

您可以从此处下载源代码:

https://cran.r-project.org/web/packages/frbs/index.html

您可以在以下位置找到GFS.GCCL和SLAVE的代码:

FRBS.MainFunction.R

GFS.Methods.R

答案 2 :(得分:0)

除了@ Pilip38的好建议之外,我还有其他三个想法在使用frbs软件包时为我修复了类似的错误。

  1. 最重要:确保您的输出变量永远不等于0。看起来您有一个二进制输出变量,因此我希望仅向其添加1,以便它是1/2而不是0/1即可。< / li>
  2. 尝试将range.data.inp矩阵设置为第一行全为0,第二行全为1。自然,最好将范围缩小一些,但这可能会导致您的错误。
  3. 尝试将标签数量减少到2。

这可能是一个脆弱的过程。