r - 不使用 apriori() 函数在 R 语言中实现 Apriori 算法
问题描述
我正在尝试使用 R 语言实现 Apriori,但重要的部分是不使用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("###################################################################################")
}
}
你能给我一些建议吗?
解决方案
我已经尝试使用您的代码,但出现的情况是k==5
该行combn(c(1:ncol(data_mat)),k)
出现错误,因为 data_mat 只有 4 列。我并没有真正得到你所有的代码,但我认为这是因为你在循环期间修改了 data_mat 。我设置了一个名为 的新变量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("###################################################################################")
}
}
推荐阅读
- python - Numpy 无法导入模块 _get_ndarray_c_version
- hibernate - 由于 bytea 转换错误,使用 Kotlin 可空类型时,本机 JPA 查询不起作用
- angular - 如何在本机和网络之间共享 Firebase 服务?
- php - T-dah Webmail 允许的内存大小
- google-apps-script - Google Script:在新的相邻单元格中添加结果
- java - 将值添加到链表而不是特定值 - JAVA
- python-3.x - 用于确定 3 维矩阵中一组索引的平均值的 Numpy 功能
- r - sprintf 在本地运行,但在 shinyapps.io 服务器上中断
- angular - 如何使用列设置动态创建角剑道网格列?
- python - 为什么 pipenv 无法在 docker 容器中安装包