一、使用的数据集为:
二、《统计学习方法》中列出的算法:
1. 算法5.1(信息增益的算法)
(1)算法思想:
(2)python实现:
# author yuxy
#求信息增益的算法
#结果为:各个特征对应的信息增益为:[0.08300749985576883, 0.32365019815155627, 0.4199730940219749, 0.36298956253708536]
import numpy as np
def information_gain(dataSet, ASet):
"""
求一个数据集的信息增益
:param dataSet: 数据集
:param ASet: 特征集
:return: 返回各个特征对应的信息增益
"""
ig=[0]*len(ASet)
#1 经验熵H(D)
k=set(dataSet[4]) #记录类别
mark=[0]*len(k)
for i in range(len(k)):
p=k.pop()
sum = 0
for j in range(len(dataSet[0])):
if dataSet[4][j] ==p :
sum=sum+1
mark[i] = sum
hd=0
for i in range(len(mark)):
p = (mark[i]*1.0)/len(dataSet[0])
hd = hd -p * np.log2(p)
#2 经验条件熵
A = [] #记录各个特征的取值情况
for i in range(len(ASet)):
A1 = set(dataSet[i])
list1=list(A1)
A.append(list1)
for t in range(len(A)):
s=0.0
for q in range(len(A[t])):
p = A[t][q]
sum=0.0
ck=0.0
for j in range(len(dataSet[t])):
if dataSet[t][j] == p:
sum=sum+1
if dataSet[4][j]==1:
ck=ck+1
t1 = sum / len(dataSet[4])
if (sum-ck) == 0:
t2=0
else:
t2 = (ck / sum) * np.log2(ck / sum) + ((sum - ck) / sum) * np.log2((sum-ck)/sum)
s=s-t1*t2
ig[t] =hd-s
return ig
if __name__=='__main__':
dataSet=[[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],[2,2,1,1,2,2,2,1,2,2,2,2,1,1,2],
[2,2,2,1,2,2,2,1,1,1,1,1,2,2,2],[1,2,2,1,1,1,2,2,3,3,3,2,2,3,1],
[2,2,1,1,2,2,2,1,1