由于上一例的实现中只针对了离散数据,为了扩充处理范围,我实现了一下对线性数据的简单处理,在其中我选择用中位数作为指标,平均数、众数等等其他数据在我看来异曲同工,最终也都会有较相似的结构。

  • 求连续数据的香农熵
def calcLinerData(dataSet):
num=len(dataSet)
count={1:0,0:0}
shannonEnt=0.0
for i in range(num):
feature = [ example[-1] for example in dataSet]
feature2 = sorted( feature )
flag = feature[int(num/2)]
for i in range(num):
if feature[i]>= flag:
feature[i]=1
count[1]+=1
else:
feature[i]=0
count[0]+=1
for i in [0,1]:
prob = float(count[i])/num
shannonEnt -= prob * log(prob,2)
return shannonEnt

与离散数据的处理极其相似,不过在我看来使用上并不会太多,毕竟我们在分类的时候一般不会还是在用如此繁琐连续的数据进行比对。

简单来说,就是建立一个字典,把通过指标分类的数据分别计数(在这里是大于等于指标一类,剩余为另一类),最后再使用计算香农熵的方法正常计算,变化并不大,只是有了中间一步分类的过度。

  • 求连续数据指标:中位数
def getLinerFlag(dataSet,axis):
num=len(dataSet)
for i in range(num):
feature = [ example[axis] for example in dataSet]
feature2 = sorted( feature )
flag = feature[int(num/2)]
return flag

这个函数并不重要启示,毕竟实际上有更多更好的衡量分类指标,这里只是一个简单和偷懒的衡量方法。其他方法在我看来整体结构上应该类似,可能只是公式不同。

  • 线性划分
def splitDataSet(dataset, axis, value):
retDataSet = []
for featVec in dataset:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet

依旧有着相似的性质,主要取决于采取的衡量方法,我觉得连续数据的划分方法比较不同的可能就是指标选取的数目,这里只有一个,所以较轻松。如果有多个,可以从低到高依次抽取,并删除选取过的,当然或许有更多的,需要完全不同方式的衡量方式,我目前还没有考虑到。

  • 加入判断连续以及离散数据的最优划分求解
def chooseLinerSplit(dataSet):
numFeatures = len(dataSet[0]) - 1
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeature = -1
for i in range(numFeatures):
featList = [example[i] for example in dataSet]
uniqueVals=set(featList)
newEntropy = 0.0
if len(uniqueVals)>5:
f=getLinerFlag(dataSet,i)
datah,datal=LinerSplit(dataSet,i,f)
newEntropy = len(datal)/float(len(dataSet))*calcShannonEnt(datah)+\
len(datah)/float(len(dataSet))*calcShannonEnt(datal)
else:
for value in uniqueVals:
subDataSet = splitDataSet(dataSet,i,value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy
if(infoGain>bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature

毕竟离散数据连续数据混用应该是常态,这里我索性就综合的进行了架构。其中我对于连续以及离散的判断非常简单,就是一个属性的分类如果超过了5个,就判定为线性(或者说还得是数字?),可能不是那么的科学,不过...先这样吧。

f=getLinerFlag(dataSet,i)
datah,datal=LinerSplit(dataSet,i,f)
newEntropy = len(datal)/float(len(dataSet))*calcShannonEnt(datah)+\
len(datah)/float(len(dataSet))*calcShannonEnt(datal)

理解起来应该也非常通俗易懂,先求得大于等于以及小于划分指标的两个集合,之后计算此划分的香农熵,就可以正常比对了。

Python实现——决策树(部分函数/连续数据)的更多相关文章

  1. Python实现——决策树实例(离散数据/香农熵)

    决策树的实现太...繁琐了. 如果只是接受他的原理的话还好说,但是要想用代码去实现比较糟心,目前运用了<机器学习实战>的代码手打了一遍,决定在这里一点点摸索一下该工程. 实例的代码在使用上 ...

  2. Python 数据处理之对 list 数据进行数据重排(为连续的数字序号)

    Python 数据处理之对 list 数据进行数据重排(为连续的数字序号) # user ID 序号重新排,即,原来是 1,3,4,6 ,排为 1,2,3,4 # item ID 序号重新排,too ...

  3. python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

  4. python操作txt文件中数据教程[2]-python提取txt文件

    python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...

  5. Python调用matplotlib实现交互式数据可视化图表案例

    交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...

  6. python利用决策树进行特征选择

    python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...

  7. 用python+sklearn(机器学习)实现天气预报数据 模型和使用

    用python+sklearn机器学习实现天气预报 模型和使用 项目地址 系列教程 0.前言 1.建立模型 a.准备 引入所需要的头文件 选择模型 选择评估方法 获取数据集 b.建立模型 c.获取模型 ...

  8. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  9. Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据

    背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...

随机推荐

  1. [原创]Java项目统一UTC时间方案

    Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考 ...

  2. LoadRunner 关联和集合点、检查点

    1)关联的定义 很多时候,当时录完之后,没有问题.过一段时间再跑脚本,就不会成功.比如session,过期了,再一次使用,就会出错.这个时候,需要在每次访问的时候动态的拿到session,这种情况就需 ...

  3. 448. Find All Numbers Disappeared in an Array 寻找有界数组[1,n]中的缺失数

    [抄题]: Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice ...

  4. Python学习笔记_Python向Excel写入数据

    实验环境 1.OS:Win 10 64位 2.Python 3.7 3.如果没有安装xlwt库,则安装:pip install xlwt 下面是从网上找到的一段代码,网上这段代码,看首行注释行,是在L ...

  5. Solidity 合约调用合约

    原文地址:https://medium.com/@k3no/making-a-birthday-contract-858fd3f63618 先将datetime合约部署:https://github. ...

  6. Linux tmux

    一.简介 Tmux是一个用于终端复用的软件,它允许一个用户在一个终端窗口或远程终端会话中使用多个不同的终端会话.在同一个命令行接口处理多个程序,以及将程序从已经开始运行另外的程序的Unix shell ...

  7. Flask框架 之 路由和视图详解

    路由+视图 我们之前了解了路由系统是由带参数的装饰器完成的. 路由本质:装饰器和闭包实现的. 路由设置的两种方式 来看个例子. @app.route('/index') def index(): re ...

  8. Entity Framework Tutorial Basics(42):Colored Entity

    Colored Entity in Entity Framework 5.0 You can change the color of an entity in the designer so that ...

  9. Ubuntu 12.04 LTS 中文输入法的安装 (转载)

    第一步:安装语言包 进入 “System Settings” 找到 “Language Support” 那一项,点击进入 选择 “Install/Remove Languages” 找到 “Chin ...

  10. Java基础语法(二)<运算符>

    运算符: 下面的都是相关的练习: 1.键盘录入一个三位整数数,请分别获取该三位数上每一位的数值 import java.util.Scanner; public class Test02 { publ ...