K - 近邻算法可以完成很多分类任务
但是它最大的缺点就是无法给出数据的内在含义
决策树的主要优势就在于数据形式非常容易理解
1、熵:度量数据集的无序程度
计算数据集的香农熵:
# coding=utf-8
from math import log
#计算数据集的香农熵
def calcShannonEnt(dataSet):
#获得数据集的个数
numEntries = len(dataSet)
#定义字典
labelCounts = {}
#对每一个数据
for featVec in dataSet:
#标签值
currentLabel = featVec[-1]
#如果标签没有在字典里,那么加进去
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
#对每一个标签
for key in labelCounts:
#每个标签出现的频率
prob = float(labelCounts[key])/numEntries
#计算总体香农熵
shannonEnt -= prob * log(prob, 2)
return shannonEnt
测试以下:
# coding=utf-8
import ML_Tree_xn_shang as xn
#创建数据集
def createDataSet():
dataSet = [
[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0