定义熵
#定义熵,结果保留小数点后四位有效数字
c<-vector()
entropy<-function(c) {
E<-vector()
for(i in 1:length(c)){
if (c[i]==0){
E[i]<-0
}else {
E[i]<--log2(c[i]/sum(c))*c[i]/sum(c)
}
}
return(round(sum(E),4))
}
定义list型变量求和函数
# 定义list型变量求和函数
a<-list()
sum_list<-function(a){
s<-vector()
for(i in 1:length(a))
{
s[i] <-sum(a[[i]])
}
return(sum(s))
}
定义属性值划分样本所获得的熵函数
#定义属性值划分样本所获得的熵函数,结果保留小数点后四位有效数字
entropy_1<-function(a){
e<-vector()
for(i in 1:length(a)){
e[i]<- entropy(a[[i]])*sum(a[[i]])/sum_list(a)
}
return(round(sum(e),4))
}
定义信息增益函数
#定义信息增益函数,并保留小数点后4位有效数字
x<-vector()
a<-list()
gain<-function(x,a){
round(entropy(x)-entropy_1(a),4)
}
计算根节点的熵和各个属性划分样本所获得的信息增益
t<-vector()
#计算目标变量的熵和年龄属性的信息增益
x<-c(4,12)
c1<-c(1,5)
c2<-c(3,7)
a<-list(c1,c2)
entropy(x)
## [1] 0.8113
t[1]<-gain(x,a)
#计算性别的信息增益
c1<-c(1,8)
c2<-c(3,4)
a<-list(c1,c2)
t[2]<-gain(x,a)
#计算家庭所得的信息增益
c1<-c(1,5)
c2<-c(2,5)
c3<-c(1,2)
a<-list(c1,c2,c3)
t[3]<-gain(x,a)
names(t)<-c("年龄","性别","家庭所得")
t
## 年龄 性别 家庭所得
## 0.0167 0.0972 0.0178
t[which.max(t)]
## 性别
## 0.0972
计算 性别=male 的分支属性
t1<-vector()
x<-c(3,4)
entropy(x)
## [1] 0.9852
c1<-c(0,4)
c2<-c(3,0)
a<-list(c1,c2)
t1[1]<-gain(x,a)
c1<-c(1,1)
c2<-c(0,3)
c3<-c(2,0)
a<-list(c1,c2,c3)
t1[2]<-gain(x,a)
names(t1)<-c("年龄","家庭所得")
t1
## 年龄 家庭所得
## 0.9852 0.6995
t1[which.max(t1)]
## 年龄
## 0.9852
计算 性别=female 的分支属性
t2<-vector()
x<-c(1,8)
entropy(x)
## [1] 0.5033
c1<-c(1,1)
c2<-c(0,7)
a<-list(c1,c2)
t2[1]<-gain(x,a)
c1<-c(0,4)
c2<-c(0,4)
c3<-c(1,0)
a<-list(c1,c2,c3)
t2[2]<-gain(x,a)
names(t2)<-c("年龄","家庭所得")
t2
## 年龄 家庭所得
## 0.2811 0.5033
t2[which.max(t2)]
## 家庭所得
## 0.5033