定义熵

#定义熵,结果保留小数点后四位有效数字
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