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

  • 求连续数据的香农熵
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. Linux系统SCSI磁盘扫描机制解析及命令实例(转)

    转载请在文首保留原文出处:EMC中文支持论坛 介绍 Linux系统扫描SCSI磁盘有几种方式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命 ...

  2. Java面向对象-构造方法,this关键字

    Java面向对象-构造方法,this关键字 构造方法 概念:构造方法是一个特殊的方法,这个特殊方法用于创建实例时执行初始化操作: 上代码: package com.java1234.chap03.se ...

  3. PHP 取网页变量

    $_POST["test"]; $_GET["test"];isset();  if(isset($_GET["yyuid"]))

  4. 【289】◀▶ Python I/O & 读写文本文件

    参考:Python 文件 I/O 参考:Python OS 文件/目录方法 目录: 01   open 函数 用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写. 02   F ...

  5. js监听文本框内容变化

    js监听文本框内容变化 原理很简单,就是在外部先声明一个用来记录input值的变量,然后每0.1秒比较这个值与input的值,如果发生改变,则运行自己的代码,同时改变变量.从而实现对input值改变的 ...

  6. 正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  7. 使用Nuget发布自己的类库包

    NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件,同时也可以通过NuGet来安装一些V ...

  8. char(10)、varchar(10)、nchar(10)、nvarchar(10)的区别

    CHAR CHAR是定长的,当输入的字符小于10时,会在后面补空值,如果长度大于10,则会截取超出的字符 CHAR字段上的索引效率级高 VARCHAR 存储边长数据,但存储效率没有CHAR高 从空间上 ...

  9. resolve或reject之后还需要return吗

    答案: 需要 今日碰到一个问题, 是我的同事发现的,如果不说的话可能一直没有注意到 这个代码 在reject 后还会执行, 但是谁也没有注意到, 但是不会报错, 因为当一个promise是resolv ...

  10. 266. Palindrome Permutation 重新排列后是否对称

    [抄题]: Given a string, determine if a permutation of the string could form a palindrome. For example, ...