【问题标题】:how to solve errors in frbs package of R using GFC.GCCL method?如何使用 GFC.GCCL 方法解决 R 的 frbs 包中的错误?
【发布时间】:2016-04-10 07:20:13
【问题描述】:

我在我的数据集上使用R 中的frbs 包,使用5 倍分层交叉验证。我已经实施了分层简历。我在每个折叠中对frbs.learn 函数使用 GFS.GCCL 方法,并使用测试数据预测结果。我收到此错误以及 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)
    }

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

【问题讨论】:

    标签: r rule fuzzy


    【解决方案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】:

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

      1. 最重要的是:确保你的输出变量永远不等于 0。看起来你有一个二进制输出变量,所以我希望只给它加 1,这样它是 1/2 而不是 0/1 就可以了。
      2. 尝试将 range.data.inp 矩阵设置为第一行全为 0,第二行全为 1。当然,范围越窄越好,但这可能会导致您的错误。
      3. 尝试将标签数量减少到 2 个。

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-18
          • 2019-08-03
          • 2020-05-19
          • 2015-05-23
          • 1970-01-01
          相关资源
          最近更新 更多