Ошибка в обучении модели ANFIS с использованием frbs.learn () в R - PullRequest
0 голосов
/ 12 октября 2018

Я строю модель ANFIS с использованием frbs.learn () в R. Вот мой код:

library(readxl)
library(anfis)
library(parallel)
library(frbs)
Yamuna_final <- read_excel("F:/Downloads/Yamuna_final.xlsx",    
                         col_names = FALSE)
data.train <- as.matrix(Yamuna_final)

frbs_obj <- frbs.learn(data.train , range.data = NULL, method.type = 
    c("ANFIS"), list(num.labels = 13, max.iter= 10, step.size = 0.01, 
    type.tnorm = "MIN",                                                       
    type.implication.func = "ZADEH" , name = "Sim-0"))

test <- read_excel("F:/Downloads/test.xlsx",    
                       col_names = FALSE)
res <- predict(frbs_obj, test)

Сейчас.когда выполняется frbs.learn (), я получаю сообщение об ошибке:

Ошибка в матрице (nrow = nrow (rule.data.num), ncol = 2 * ncol (rule.data.num) -: недопустимое значение 'ncol' (<0) </p>

В моем наборе данных (data.train) 1539 строк и 12 столбцов, показаны несколько его экземпляров:

         X__1 X__2 X__3      X__4      X__5      X__6       X__7     X__8        X__9    X__10      X__11        X__12
    [1,] 1999    1    1  7.720000  11.00000  1.000000  0.0500000  0.92000        85.0 14.00000        210   8.60000000
    [2,] 1999    1    2  7.700000  10.00000  1.000000  0.0500000  2.00000        50.0 14.50000       3700  10.80000000
    [3,] 1999    1    3  8.400000  10.00000  1.000000  0.0400000  0.92000       120.0 23.00000        400   8.60000000
    [4,] 1999    1    4  8.270000   6.00000  1.000000  0.0500000  0.56000        80.0 22.00000       4600  12.50000000
    [5,] 1999    1    5  8.180000   6.00000  1.000000  0.0500000  0.80000       140.0 22.00000      23000   8.70000000

Теперь моя модель не проходит обучение, и я получаю вышеуказанную ошибку. Не знаю, что случилось.: (

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Другое решение может заключаться в ручном вводе ваших минимальных / максимальных пределовВот это с 0 с для минут:

range.data=matrix(c(0,1999,0,1,0,5,0,8.4,0,11,0,1,0,0.05,0,2,0
   ,140,0,23,0,23000,0,12.5),ncol=12)

Это также позволяет frbs_learn работать без ошибок.

0 голосов
/ 13 октября 2018

Ошибка может быть связана с наличием столбцов с одним уникальным значением в наборе данных.
В приведенном ниже коде после удаления этих столбцов frbs.learn выполняется без ошибок.

library(frbs)
data.train <- read.table(text="
         X__1 X__2 X__3      X__4      X__5      X__6       X__7     X__8        X__9    X__10      X__11        X__12
    [1,] 1999    1    1  7.720000  11.00000  1.000000  0.0500000  0.92000        85.0 14.00000        210   8.60000000
    [2,] 1999    1    2  7.700000  10.00000  1.000000  0.0500000  2.00000        50.0 14.50000       3700  10.80000000
    [3,] 1999    1    3  8.400000  10.00000  1.000000  0.0400000  0.92000       120.0 23.00000        400   8.60000000
    [4,] 1999    1    4  8.270000   6.00000  1.000000  0.0500000  0.56000        80.0 22.00000       4600  12.50000000
    [5,] 1999    1    5  8.180000   6.00000  1.000000  0.0500000  0.80000       140.0 22.00000      23000   8.70000000
", header=T)

# Find columns with only one unique value and delete them.
delete_cols <- apply(data.train, 2, function(x) length(unique(x))!=1)
data.train <- data.train[,delete_cols]

frbs_obj <- frbs.learn(data.train, range.data = NULL, method.type =c("ANFIS"), 
  list(num.labels = 13, max.iter= 10, step.size = 0.01, 
    type.tnorm = "MIN",                                                       
    type.implication.func = "ZADEH" , name = "Sim-0"))

В противном случае ошибка может быть связана с наличием NA s в наборе данных.
Подсчитав количество отсутствующих данных в столбцах вашего набора данных, вы можете увидеть, что во втором столбце есть 1 пропущенное значение

apply(data.train,2,function(x) sum(is.na(x)))

# X1  X2  X3  X4  X5  X6  X7  X8  X9 X10 X11 X12 
#  0   1   0   0   0   0   0   0   0   0   0   0

в строке 277

posNA <- which(apply(data.train,1,function(x) any(is.na(x))))
data.train[posNA, ]

#       X1 X2 X3   X4 X5 X6    X7    X8   X9 X10     X11 X12
# 277 2000 NA  1 7.49 77 25 13.17 19.26 5000  20 2.1e+07   0

Вот окончательный код:

library(frbs)
data.train <- read_excel("F:/Downloads/Yamuna_final.xlsx", col_names=FALSE)

posNA <- which(apply(data.train,1,function(x) any(is.na(x))))
data.train <- data.train[-posNA, ]
data.train <- as.matrix(data.train)

frbs_obj <- frbs.learn(data.train , range.data = NULL, method.type = 
    c("ANFIS"), list(num.labels = 13, max.iter= 10, step.size = 0.01, 
    type.tnorm="MIN", type.implication.func="ZADEH" , name="Sim-0"))
...