id3与软件测试,ID3算法的实现

##计算利用信息增益作为分类属性的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("]")

}

测试数据查看:​

a4c26d1e5885305701be709a3d33442f.png

存在的问题:1)如过选取的某一个分类列时存在多个值,则会简单的分裂为多个子树,结果还需优化剪枝,剪枝函数需要添加

2)虽然后信息增益比的计算,但是不适合用于连续性值,​只适合于简单的离散型变量分类,只能作为简单实现用

参考资料1)http://blog.csdn.net/crystal_tyan/article/details/42130851​

2)http://xy.tuxi.com.cn/167/1677903.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值