#coding=utf-8
from numpy import *
def load_data(file_name):
data_mat=[]
fr=open(file_name)
for line in fr.readlines():
curline=line.strip().split('\t')
fltline=map(float,curline)
data_mat.append(fltline)
return data_mat
def regleaf(data):
'''平均数'''
return mean(data[:,-1])
def regerr(data):
'''方差'''
return var(data[:,-1])*shape(data)[0]
def split_data_set(data,feature,value):
'''以样本中某一值分类,大于这个值的为一类,小于等于的为另一类'''
mat0=data[nonzero(data[:,feature]>value)[0],:]
#nonzero返回非零元素行列中坐标
#data[nonzero]可根据坐标返回矩阵中的非零元素
mat1=data[nonzero(data[:,feature]<=value)[0],:]
return mat0,mat1
def choose_best_split(data,leaftype=regleaf,errtype=regerr,ops=(1,4)):#ops是自定义值,用于控制函数停止的时机。ops[0]定义了总体方差与平均方差的最小值,ops[1]集合长度。
'''选择最佳分类'''
tols=ops[0];toln=ops[1]
if len(set(data[:,-1].T.tolist()[0]))==1:
#数据最后一列转成列表,并判断是否只有一个元素
#如果是就返回None和列表的平均数
return None,leaftype(data)
m,n=shape(data)
s=errtype(data)
#数据最后一列的方差*行数=总体方差
min_var=inf;best_index=0;best_value=0
#min_var=正无穷,初始为正无穷是因为要让第一次判断无论如何都成立,这样才能继续下去
for feat_index in range(n-1):
#range(n-1)=0,样本只有两列
for split_value in set([float(i) for i in data[:,feat_index]]):
#分类值取自第一列数据的所组成的集合,集合具有互异性
mat0,mat1=split_data_set(data,feat_index,split_value)
#
if (shape(mat0)[0]<toln) or shape(mat1)[0]<toln:continue
#如果mat0的行数小于4或者mat1的行数小于4,则结束这次循环,下面代码不再执行
#
news=errtype(mat0)+errtype(mat1)
CART 分类回归树、模型树, 及REP后剪枝
最新推荐文章于 2024-05-14 17:05:40 发布