##计算利用信息增益作为分类属性的ID3算法
x
'd', 'c', 'd', 'a', 'a', 'a', 'b', 'b'), byrow = F,
ncol=3)
#计算一列数据的信息熵
CalculateEntropy1
function(data){
temp
table(data)
temp
temp[temp!=0]
return(-sum(log2(temp/sum(temp))*(temp/sum(temp))))
}
#计算两列的信息熵 第二列作为分类目标的列
CalculateEntropy2
function(data){
temp
1])
name
names(temp)
entropy
for ( i in name){
temp1
2]
entropy
}
return(sum((temp/sum(temp))*entropy))
}
#信息增益率的分裂度量值
Split_Entropy
return(CalculateEntropy1(data[,
1]))
}
ID3
#分类变量唯一
if(length(unique(data$result)) ==
1){
tmp
sep=""),paste(table(data$result), collapse=":"),
sep=",")
cat(paste(paste(rep(" ", k+2), collapse=""),"分类结果:",data$result[1],
tmp,"*\n"))
return(0)
}
#设置节点最少的值 默认设置为3
if(length(data$result)<5){
max_result
T))[1]
tmp
sep=""),paste(table(data$result), collapse=":"),
sep=",")
cat(paste(paste(rep(" ", k+2), collapse=""),"分类结果:",max_result,
tmp, "*\n"))
return(0)
}
##没有变量了 但是分类结果不是唯一, 选择次数最多的一个
if((length(names(data)) ==
1)){
max_result
T))[1]
tmp
sep=""),paste(table(data$result), collapse=":"),
sep=",")
cat(paste(paste(rep(" ", k+2), collapse=""),"分类结果:",max_result,
tmp, "*\n"))
return(0)
}
cat("\n")
## 信息熵
entropy
CalculateEntropy1(data$result)
lables
names(data)
lable
temp
entropy1
##开始遍历 寻找最小熵值的列
for( i in 1:(ncol(data)-1)){
# 信息增益
# temp1
ncol(data))])
# 信息增益率
temp1
ncol(data))])/Split_Entropy(data[,c(i, ncol(data))])
if(temp1
< temp)
{
temp
lable
}
}
# cat(paste(
paste(rep(" ", k),
collapse=""),lable,"="))
#cat("[\n") 将已利用的分类变量
nextlables
lables[lables != lable]
for(value in
unlist(unique(data[lable]))){
#
cat(paste(paste(rep(" ", k+1),
collapse=""), value, "---"))
cat(paste( paste(rep(" ", k),
collapse=""),lable,"=", value, sep=""))
ID3(subset(data,
data[lable]==value, select = nextlables), k+2)
}
# cat("]")
}
测试数据查看:
存在的问题:1)如过选取的某一个分类列时存在多个值,则会简单的分裂为多个子树,结果还需优化剪枝,剪枝函数需要添加
2)虽然后信息增益比的计算,但是不适合用于连续性值,只适合于简单的离散型变量分类,只能作为简单实现用
参考资料1)http://blog.csdn.net/crystal_tyan/article/details/42130851
2)http://xy.tuxi.com.cn/167/1677903.html