自己用Python写的数据挖掘中的ID3算法,现在觉得Python是实现算法的最好工具:

  先贴出ID3算法的介绍地址http://wenku.baidu.com/view/cddddaed0975f46527d3e14f.html

  自己写的ID3算法

 from __future__ import division
import math table = {'age': {'young', 'middle', 'old'}, 'income': {'high', 'middle', 'low'},
'student': {'yes', 'no'}, 'credit': {'good', 'superior'}, 'buy computer': {'yes', 'no'}}
attrIndex = {'age': 0, 'income': 1, 'student': 2, 'credit': 3, 'buy computer': 4}
attrList = ['age', 'income', 'student', 'credit']
allDataSet = [
['young', 'high', 'no', 'good', 'no'], ['young', 'high', 'no', 'superior', 'no'],
['middle', 'high', 'no', 'superior', 'yes'], ['old', 'middle', 'no', 'good', 'yes'],
['young', 'middle', 'no', 'good', 'no'], ['young', 'low', 'yes', 'good', 'yes'],
['middle', 'high', 'yes', 'good', 'yes'], ['old', 'middle', 'no', 'superior', 'no'],
['young', 'high', 'yes', 'good', 'yes'], ['middle', 'middle', 'no', 'good', 'no']
] #求熵
def entropy(attr, dataSet):
valueCount = {v: {'yes': 0, 'no': 0, 'count': 0} for v in table[attr]}
for row in dataSet:
vName = row[attrIndex[attr]]
decAttrVal = row[attrIndex['buy computer']] # 'yes' or 'no'
valueCount[vName]['count'] = valueCount[vName]['count'] + 1
valueCount[vName][decAttrVal] = valueCount[vName][decAttrVal] + 1
infoMap = {v: 0 for v in table[attr]}
for v in valueCount:
if valueCount[v]['count'] == 0:
infoMap[v] = 0
else:
p1 = valueCount[v]['yes'] / valueCount[v]['count']
p2 = valueCount[v]['no'] / valueCount[v]['count']
infoMap[v] = - ((0 if p1 == 0 else p1 * math.log(p1, 2)) + (0 if p2 == 0 else p2 * math.log(p2, 2)))
s = 0
for v in valueCount:
s = s + valueCount[v]['count']
propMap = {v: (valueCount[v]['count'] / s) for v in valueCount}
i = 0
for v in valueCount:
i = i + infoMap[v] * propMap[v]
return i #定义节点的数据结构
class Node(object):
def __init__(self, attrName):
if attrName != '':
self.attr = attrName
self.childNodes = {v:Node('') for v in table[attrName]} #数据筛选
def filtrate(dataSet, condition):
result = []
for row in dataSet:
if row[attrIndex[condition['attr']]] == condition['val']:
result.append(row)
return result
#求最大信息熵
def maxEntropy(dataSet, attrList):
if len(attrList) == 1:
return attrList[0]
else:
attr = attrList[0]
maxE = entropy(attr, dataSet)
for a in attrList:
if maxE < entropy(a, dataSet):
attr = a
return attr
#判断构建是否结束,当所有的决策属性都相等的时候,就不用在构建决策树了
def endBuild(dataSet):
if len(dataSet) == 1:
return True
buy = dataSet[0][attrIndex['buy computer']]
for row in dataSet:
if buy != row[attrIndex['buy computer']]:
return False
#构建决策树
def buildDecisionTree(dataSet, root, attrList):
if len(attrList) == 0 or endBuild(dataSet):
root.attr = 'buy computer'
root.result = dataSet[0][attrIndex['buy computer']]
root.childNodes = {}
return
attr = root.attr
for v in root.childNodes:
childDataSet = filtrate(dataSet, {"attr":attr, "val":v})
if len(childDataSet) == 0:
root.childNodes[v] = Node('buy computer')
root.childNodes[v].result = 'no'
root.childNodes[v].childNodes = {}
continue
else:
childAttrList = [a for a in attrList]
childAttrList.remove(attr)
if len(childAttrList) == 0:
root.childNodes[v] = Node('buy computer')
root.childNodes[v].result = childDataSet[0][attrIndex['buy computer']]
root.childNodes[v].childNodes = {}
else:
childAttr = maxEntropy(childDataSet, childAttrList)
root.childNodes[v] = Node(childAttr)
buildDecisionTree(childDataSet, root.childNodes[v], childAttrList)
#预测结果
def predict(root, row):
if root.attr == 'buy computer':
return root.result
root = root.childNodes[row[attrIndex[root.attr]]]
return predict(root, row) rootAttr = maxEntropy(allDataSet, attrList)
rootNode = Node(rootAttr)
print rootNode.attr
buildDecisionTree(allDataSet, rootNode, attrList)
print predict(rootNode, ['old', 'low', 'yes', 'good'])

欢迎大家提出建议

Python实现ID3算法的更多相关文章

  1. 机器学习笔记----- ID3算法的python实战

    本文申明:本文原创,如有转载请申明.数据代码来自实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. Hell ...

  2. 决策树之ID3算法实现(python)

    决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树: 基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>3 ...

  3. 决策树ID3算法--python实现

    参考: 统计学习方法>第五章决策树]   http://pan.baidu.com/s/1hrTscza 决策树的python实现     有完整程序     决策树(ID3.C4.5.CART ...

  4. 决策树---ID3算法(介绍及Python实现)

    决策树---ID3算法   决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no ...

  5. 机器学习之决策树(ID3)算法与Python实现

    机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...

  6. Python四步实现决策树ID3算法,参考机器学习实战

    一.编写计算历史数据的经验熵函数 from math import log def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCo ...

  7. 机器学习决策树ID3算法,手把手教你用Python实现

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第21篇文章,我们一起来看一个新的模型--决策树. 决策树的定义 决策树是我本人非常喜欢的机器学习模型,非常直观容易理解 ...

  8. 决策树-预测隐形眼镜类型 (ID3算法,C4.5算法,CART算法,GINI指数,剪枝,随机森林)

    1. 1.问题的引入 2.一个实例 3.基本概念 4.ID3 5.C4.5 6.CART 7.随机森林 2. 我们应该设计什么的算法,使得计算机对贷款申请人员的申请信息自动进行分类,以决定能否贷款? ...

  9. ID3算法 决策树的生成(2)

    # coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...

随机推荐

  1. 带你一分钟理解 JavaScript 闭包

    什么是闭包? 先看一段代码: function a(){ var n = 0; function inc() { n++; console.log(n); } inc(); inc(); } a(); ...

  2. JavaScript交换两个变量值的七种解决方案

    前言 这篇文章总结了七种办法来交换a和b的变量值 1 2 var a = 123; var b = 456; 交换变量值方案一 最最最简单的办法就是使用一个临时变量了,不过使用临时变量的方法实在是太l ...

  3. greenplum和postgresql

    想着要不要写,两个原因"懒"和"空".其实懒和空也是有联系的,不是因为懒的写,而是因为对PostgreSQL和Npgsql的知识了解匮乏,也就懒得写.好了,开头 ...

  4. openresty安装lua和nginx相关

    server{ listen ; server_name a.com; index index.php; root /usr/share/nginx/html; location / { if (!- ...

  5. NuGet 无法连接到远程服务器-解决方法

    一. Entity Framework以下简称EF 安装EF4.3的步骤是首先安装VS扩展 NuGet,然后再使用NuGet安装EF程序包 安装完NuGet就可以安装EF了,有两种方式可以安装EF: ...

  6. 小胖学PHP总结1-----PHP的数据类型

    PHP一共支持8种原始类型.包含4中标量类型,即:boolean(布尔型).integer(整形).float/double(浮点型)和string(字符串型):两种复合类型,即:array(数组)和 ...

  7. 互联网TCP/IP五层模型(一)

    转载自:阮一峰 我们每天使用互联网.你是否想过,它是怎样实现的? 全世界几十亿台电脑,连接在一起,两两通信. 上海的某一块网卡送出信号,洛杉矶的还有一块网卡竟然就收到了.两者实际上根本不知道对方的物理 ...

  8. 再探java基础——对面向对象的理解(2)

    对象.类和抽象类的区别 对象是一个具体的事物,类是对具有相同属性和行为的一组对象的抽象,对象是类的一个一个人的具体实例:抽象类是一种特殊的类,是对类的进一步抽象,抽象类不能被实例化. 类.抽象类和接口 ...

  9. 查看linux系统状态

    就类似你装完xp后,或者你拿到一台新的机器的时候,你通常都是进入系统,看看他的cpu,内存,硬盘使用情况.我也按照这个来看看linux的系统状态.1:top 退出按q,这个就类似windows的任务管 ...

  10. 根据IP地址获取IP的详细信息

    <?php header('Content-Type:text/html; charset=utf-8'); function ip_data() { $ip = GetIP(); $url = ...