全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
8408 1
2017-04-10
悬赏 1 个论坛币 未解决
apriori<-function(data,minsup){
  #找出频繁项集的函数
  freItem<-function(data,m1,minsup,k){
    m2<-matrix(0,ncol=k+3)
    k1<-k+2
    #候选集
    if(!is.null(m1))
    for(i in 1:(nrow(m1)-1))
      for(j in (i+1):nrow(m1))
        if(sum(m1[i,1:(k+1)]%in% m1[j,1:(k+1)])==k){
          a<-c(union(m1[i,1:(k+1)],m1[j,1:(k+1)]),0)
          #去掉可能出现的重复元组
          if(!all(a %in% m2))
           m2<-rbind(m2,a)
        }
    m2<-m2[-1,]
    #剪枝
    a<-array()
    num<-1
    if(!is.null(m2))
    for(i in 1:nrow(m2)){
      aa<-m2[i,1:k1]
      #combn:列出所有元素的组合
      combination<-combn(aa ,k1)
      for(t in 1:ncol(combination)){
        if(!any(combination[,t]!=m1)){
          a[num]=i
          num=num+1
        }
      }
    }
    if(is.numeric(a[1]))
      m2<-m2[-a,]
    #计算支持度
    if(is.null(m2))
      return(m2)
    else{
      for(i in 1:nrow(m2))
        for(j in 1:length(data)){
          b<-0
          for(t in 1:k1){
            b<-b+sum(m2[i,t] == data[[j]])
          }
          if(b==k1)
            m2[i,k+3]=as.numeric(m2[i,k+3])+1
        }
    }
    #提取大于最小支持度的行
    m2<-m2[m2[,(k+3)]>=minsup,]
    return(m2)
  }
  #频繁1项集
  m<-matrix(0,ncol=2,byrow=T)
  #找出频繁候选1项集
  for(i in 1:length(data))
    for(j in 1:length(data[]))
        if(any(m == data[][j]))
          m[which(m==data[][j]),2]<-as.numeric(m[which(m==data[][j]),2])+1
        else {
          #添加新元素
          a<-matrix(c(data[][j],1),nrow=1)
          m<-rbind(m,a)
        }
  #提取大于最小支持度的元素
  m<-m[-1,]
  m1<-m[m[,2]>=minsup,]
  #频繁n项集
  m2<-m1
  k<-0
'  while(!is.null(m2)){
    m2<-freItem(data,m2,2,k)
    k<-k+1
    }
'
  m2<-freItem(data,m2,2,0)  
  m2<-freItem(data,m2,2,1)
  return(m2)
}
list1<-list(T100=c("I1","I2","I5"),T200=c("I2","I4"),T300=c("I2","I3"),T400=c("I1","I2","I4"),T500=c("I1","I3"),
            T600=c("I2","I3"),T700=c("I1","I3"),T800=c("I1","I2","I3","I5"),T900=c("I1","I2","I3"))
result<-apriori(list1,2)
result

以上是我的代码,其中倒数几行的while被我注释掉了,如果使用while而不是后面的m2<-freItem(data,m2,2,0)  
  m2<-freItem(data,m2,2,1),就会出现Error in 1:nrow(m2) : argument of length 0       不使用while用手动的就正常运行。有大神可以帮忙看下是哪里错误吗?   

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-4-10 20:38:30
啊还有,前面两个m2<-freItem(data,m2,2,0)   m2<-freItem(data,m2,2,1)  分别是求2项频繁集,3项频繁集,如果我加入m2<-freItem(data,m2,2,2)也就是求4项频繁集后也会出现Error:Error in 1:nrow(m2) : argument of length 0    这个程序是关联规则里面Apriori算法:发现频繁项集
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群