,一天一个小demo!

匿名 (未验证) 提交于 2019-12-03 00:18:01
#!/usr/bin/env python # -*- coding: utf-8 -*- # @createTime    : 18-5-22 下午4:44 # @author  : nn import numpy as np import math  data=[[0,1,0],[1,0,0],[0,1,0],[1,1,1]] print(type(data)) data = np.array(data) print(type(data)) for each_data in data:     print each_data **(1)计算给定数据集的信息熵的代码如下**: def calcshan(data):     lendata = len(data)     p={}     H=0     for each_data in data:         current_label = each_data[-1]         if current_label not in p.keys():             p[current_label] = 0  #此处初始化很重要,否则p[current_label] = p[current_label]+1会出现keyerror错误;         p[current_label] += 1     for keys in p.keys():         px = float(p[keys])/float(lendata)         H_1 = - px * math.log(px,2)         H=H+H_1     return H H=calcshan(data) print(H) **(2)划分数据集,计算完信息熵后,我们便可以得到数据集的无序程度。我们将对每个特征划分数据集的结果计算一次信息熵,然后判断哪个特征划分数据集是最好的划分方式(根据信息熵判断,信息熵越小,说明划分效果越好)。**: def splitData(data,axis,value):     subDataSet = []     for each_data in data:         subData = []         if each_data[axis] == value:             subData = list(each_data[:axis])             print subData             subData.extend(each_data[axis+1:])             print subData             subDataSet.append(subData)     return subDataSet # subDataSet=splitData(data,0,1) # print subDataSet # subDataSet=splitData(data,0,0) # print subDataSet  **(3)选择最好的数据集划分方式,代码如下:** def chooseBestFeature(data):     lenFeature = len(data[0])-1 #随便取一个样本的长度即为维度;     shanInit = calcshan(data)     feature = []     inValue = 0     bestFeature = 0     for i in range(lenFeature):#以所有特征维度数遍历,逐步遍历以当前特征维度划分数据         shanCarry = 0         feature = [example[i] for example in data]         feature = set(feature)         for feat in feature :#遍历每一个特征的取值情况,第i个维度上取值为feat(遍历所有可能的取值)的数量             subData = splitData(data,i,feat)  #遍历每一个特征的,splitData(data,i,feat),第i个维度上取值为feat的数量             prob = float(len(subData)/float(len(data)))  #len(data)有多少行,即有多少个样本             shanCarry += prob * calcshan(subData)          outValue = shanInit - shanCarry #遍历当前划分属性得到的增益         if (outValue > inValue):             inValue = outValue             bestFeature = i     return bestFeature feature = chooseBestFeature(data) print(feature) **(4)创建决策树。选择好最好的划分特征后,接下来,可以开始创建决策树了。其工作原理如下:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。第一次划分后,数据将被向下传递到树分支的下一个节点,在这个节点上,我们可以再次划分数据。因此我们可以使用递归的原则处理数据集。递归结束的条件是:程序遍历完所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类。** def createTree(data,label):     classList = [example[-1] for example in data]     if classList.count(classList[0]) == len(classList):         return classList[0]     featBest = chooseBestFeature(data)     feature = [example[featBest] for example in data]     featValue = set(feature)     newLabel = label[featBest]     del(label[featBest])     Tree= {newLabel:{}}     for value in featValue:         subLabel = label[:]         Tree[newLabel][value] = createTree(splitData(data,featBest,value),subLabel)     return Tree Tree = createTree(data,[0,1]) print(Tree) **(5)验证数据集分类结果。依靠训练数据构造了决策树之后,我们可以将它用于实际数据的分类。在执行数据分类时,需要使用决策树以及用于构造树的标签向量。然后,程序比较测试数据与决策树上的数值,递归执行该过程直到进入叶子节点;最后将测试数据定义为叶子节点所属的类型。** def classify(tree,label,testVec):     firstFeat =tree.keys()[0]     secondDict = tree[firstFeat]     labelIndex = label.index(firstFeat)     for key in secondDict.keys():         if testVec[labelIndex] == key:             if type(secondDict[key]).__name__ == 'dict':  #如果是字典-相当于如果当前不是叶节点,还是一棵树,需进一步区分                 classLabel = classify(secondDict[key],label,testVec)             else:#当前节点是叶节点;                 classLabel = secondDict[key]     return classLabel print classify(Tree,[0,1],[0,1]) print classify(Tree,[0,1],[1,0]) print classify(Tree,[0,1],[0,0]) print classify(Tree,[0,1],[1,1])  参考:[决策树原理及Python代码实现](https://blog.csdn.net/flying_sfeng/article/details/62424225)
文章来源: ,一天一个小demo!
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!