统计学习方法 习题5.2 python实现

根据表5.2所示的数据,用平方误差损失准则生成二叉回归树


二叉回归树的算法为:


其中公式5.21中的c1,c2分别为R1和R2上数据的平均值

代码仿照机器学习实战上关于决策树实现(递归的建立一棵树)保存为cart.py:

#coding:utf-8
import numpy as np

#数据集
def createDataSet():
    dataSet = [4.5,4.75,4.91,5.34,5.8,7.05,7.9,8.23,8.7,9]
    datalabel = [1,2,3,4,5,6,7,8,9,10]
    return dataSet,datalabel

#计算数据集的平方误差
def calcMSE(dataSet):
    means = np.mean(dataSet)
    sums = sum([(i-means)*(i-means) for i in dataSet])*1.0
    return sums

#选择最优的划分点
def chooseBestFeatureToSplit(dataSet):
    nums = len(dataSet)-1
    if nums == 0:
        return 0
    best = 0
    bestMES = 100000
    for i in range(nums):
        temp = calcMSE(dataSet[:i+1]) + calcMSE(dataSet[i+1:])
        if temp <= bestMES:
            bestMES = temp
            best = i
    return best

# def getkeyofromvalue(dataSet,value):
#     u = -1
#     for i in range(len(dataSet)):
#         if dataSet[i] == value:
#             u = i
#     return u

#建树过程
def createTree(dataSet,datalabel,left,right):
    if right-left == 1:
        #return dataSet[left]
        return datalabel[left]
    if left >= right:
        return -1
    #最优划分函数加上left为原数据集上的最优划分下标
    bestchoose = left + chooseBestFeatureToSplit(dataSet[left:right])
    #print bestchoose+1
    mytree = {datalabel[bestchoose]:{}}
    mytree[datalabel[bestchoose]]['left'] = createTree(dataSet,datalabel,left,bestchoose)
    mytree[datalabel[bestchoose]]['right'] = createTree(dataSet,datalabel,bestchoose+1,right)
    return mytree

调用方法:

import cart
mydat,myla = cart.createDataSet()
myt = cart.createTree(mydat,myla,0,len(mydat))
print myt
结果(没有进行可视化操作):



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值