Реализовать алгоритм Apriori на языке R без использования функции apriori () - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь реализовать Apriori с использованием языка R, но важная часть не использует функцию Apriori() Я должен построить его с нуля. поэтому я сделал код, но в моем коде есть проблема, и я не смог ее решить. то, что я сделал в коде, это: я реализую Fk−1 × F1 методы. но моя проблема в том, что когда я пытался ввести двоичный файл, он выдает ошибку с отсутствующим значением !! я заменил недостающее значение на 0, но все равно оно выдает ошибку! Я думаю, что проблема в преобразовании оригинальной корзины в двоичную форму!

и вот мой код:

    multi_col = function(data_frame) {
  multivec = data.frame(val = rep(1,nrow(data_frame)))
  for(q in 1:ncol(data_frame)){
    multivec = multivec*data_frame[q]
  }
  return(multivec)
}

item = c("onion","potato","milk","burger","beer")
t1 = c(1,1,0,1,0)
t2 = c(0,1,1,1,0)
t3 = c(1,1,1,0,0)
t4 = c(1,1,1,0,0)
t5 = c(1,1,1,1,0)
t6 =c(1,1,1,1,1)

data_mat= rbind(t1,t2,t3,t4,t5,t6)
data_mat
colnames(data_mat)=item
data_mat # this is the example data frame i used to develop the code

data_mat = as.data.frame(data_mat)
data_mat

min.sup.thresh = 2
max.item = ncol(data_mat)
max.item

for(k in 1:max.item){

  if(ncol(data_mat)>1){

    Candi = list()
    Freq =  list()

    rm_col = numeric(0)

    C_seq = combn(c(1:ncol(data_mat)),k)

    for(i in 1:ncol(C_seq)){

      Candi[[i]] = colnames(data_mat[C_seq[,i]])

      if(sum(multi_col(data_mat[C_seq[,i]]))>=min.sup.thresh){
        Freq[[i]] = colnames(data_mat[C_seq[,i]])
      }else{
        rm_col = c(rm_col,i)
      }

    }
    data_mat=data_mat[(-rm_col)]
    print(paste("number of generated candidate itemsets","in C",k,"is",length(Candi)))
    print(Candi)
    print("****************************")
    print(paste("total number of frequent itemsets","in F",k,"is",length(Freq)))
    print(Freq)
    print("###################################################################################")


  }


}

Не могли бы вы дать мне какое-нибудь предложение о том, как это сделать !?

1 Ответ

0 голосов
/ 26 февраля 2020

Я пытался использовать ваш код, и, по-видимому, с k==5 в строке combn(c(1:ncol(data_mat)),k) выдается ошибка, поскольку в data_mat есть только 4 столбца. Я на самом деле не понимаю весь ваш код, но думаю, что это потому, что вы изменяете data_mat во время вашего l oop. Я установил новую переменную с именем tmp_data_mat, чтобы ошибка не возникала.

Другим вариантом может быть изменение data_mat за пределами for-loop

Также обратите внимание, что в молоке отсутствует значение, и оно работает путем добавления na.rm = TRUE в sum функция, которую вы используете.

# I create data_mat on another way
data_mat <( data.frame(onion = c(1,0,rep(1,4)), 
                       potato = rep(1,6), 
                       milk = c(NA,rep(1,5)), 
                       burger = c(1,1,0,0,1,1), 
                       beer = c(rep(0,5),1)))
data_mat

min.sup.thresh = 2
max.item = ncol(data_mat)
max.item

for(k in 1:max.item){

  if(ncol(data_mat)>1){

    Candi = list()
    Freq =  list()

    # modification here about rm_col, so it don't eat all your memory.
    rm_col = seq(ncol(data_mat))

    # here is the issue I think
    C_seq = combn(c(1:ncol(data_mat)),k)

    for(i in 1:ncol(C_seq)){

      # don't think you need a function multi_col so I put it inside
      data_frame <- data_mat[C_seq[,i]]

      Candi[[i]] = colnames(data_frame)

      multivec = data.frame(val = rep(1,nrow(data_frame)))
      for(q in 1:ncol(data_frame)){
        multivec = multivec*data_frame[q]
      }

      # the missing value error was because you missed the na.rm = TRUE in the sum function !
      if(sum(multivec, na.rm = TRUE) >= min.sup.thresh){
        Freq[[i]] = colnames(data_mat[C_seq[,i]])
      }else{

        # follow the modification of rm_col
        rm_col = rm_col[-i]
      }

    }

    # here is the BIG modification of your code it don't show error.
    tmp_data_mat=data_mat[rm_col]
    print(paste("number of generated candidate itemsets","in C",k,"is",length(Candi)))
    print(Candi)
    print("****************************")
    print(paste("total number of frequent itemsets","in F",k,"is",length(Freq)))
    print(Freq)
    print("###################################################################################")

  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...