Adaboost的python实现
不要总是掉包欧,真的丢人啊,一起码起来!
'''
函数的功能:单层决策树分类函数
参数说明:
xMat:数据矩阵
i:第i列,第几个特征
Q:阈值
返回分类结果:
re
'''
import numpy as np
import pandas as pd def classify0(xMat,i,Q,S):
re = np.ones((xMat.shape[0],1))
if S == 'lt':
re[xMat[:,i]<= Q] = -1
else:
re[xMat[:, i] >Q] = -1
return re '''
函数功能:找到数据集上最佳的单层决策树
xMat:特征矩阵
yMat:标签矩阵
D:样本权重
返回:
beststump:最佳单层决策树信息
minE:最小误差
bestClas:最佳的分类结果
'''
def get_Stump(xMat,yMat,D):
m,n = xMat.shape #m为样本数,n为特征数
Steps = 10 #初始化一个步长
bestStump = {} #用字典的形式存储树桩信息
bestClas = np.mat(np.zeros((m,1))) #初始化分类结果为1
minE = np.Inf
for i in range(-1,n): #遍历所有特征
Min = xMat[:,i].min() #找到特征中最小的值
Max = xMat[:,i].max() #找到特征中最大的值
stepSize = (Max-Min)/Steps #计算步长
for j in range(-1,int(Steps)+1): #
for S in ['lt','gt']: #大于或者小于的情况下
Q = (Min+j*stepSize) #计算阈值
re = classify0(xMat,i,Q,S) #计算分类结果
err = np.mat(np.ones((m,1)))
err[re==yMat]=0 #分类正确的赋值为0
eca = D.T*err #计算误差
if eca<minE: #找到误差最小的分类方式
minE = eca
bestClas = re.copy()
bestStump['特征列']=i
bestStump['阈值'] = Q
bestStump['标志'] = S
return bestStump,minE,bestClas
xMat = np.matrix([[1,2.1],[1.5,1.6],[1.3,1],[1,1],[2,1]])
yMat = np.matrix([[1],[1],[-1],[-1],[1]])
#print(yMat.shape)
m = xMat.shape[0]
D = np.mat(np.ones((m,1))/m)
bestStump,minE,bestClas = get_Stump(xMat,yMat,D)
#print(bestStump)
#print(minE)
#print(bestClas)
'''
函数功能:
maxC为最大迭代次数
weakClass弱分类信息
aggClass类别估计值
'''
def adaboost(xMat,yMat,maxC=4):
weakClass = []
m = xMat.shape[0]
D = np.mat(np.ones((m,1))/m) #初始化权重
aggClass = np.mat(np.zeros((m,1)))
for i in range(maxC):
Stump,error,bestClas = get_Stump(xMat,yMat,D) #构建单层分类器
alpha = float(0.5*np.log((1-error)/max(error,1e-6))) #计算弱分类器的权重衰减 max(error,1e-6)让坟墓不等于0
Stump['alpha'] = np.round(alpha,2) #存储弱学习算法的权重,保留两位小数
weakClass.append(Stump) #存储单层决策树
expon = np.multiply(-1*alpha*yMat,bestClas)
D = np.multiply(D,np.exp(expon))
D = D/D.sum() #更新样本权重
aggClass+= alpha+bestClas #更新累计类别的统计值
aggErr = np.multiply(np.sign(aggClass)!=yMat,np.ones((m,1)))
errRate = aggErr.sum()/m
if errRate==0:break #误差为0 推出循环
return weakClass,aggClass weakClass,aggClass = adaboost(xMat,yMat,maxC=4)
print(weakClass)
print(aggClass)
Adaboost的python实现的更多相关文章
- Adaboost 算法实例解析
Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...
- 【Supervised Learning】 集成学习Ensemble Learning & Boosting 算法(python实现)
零. Introduction 1.learn over a subset of data choose the subset uniformally randomly (均匀随机地选择子集) app ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】
转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...
- 机器学习&深度学习经典资料汇总,data.gov.uk大量公开数据
<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)(1)
原文:http://developer.51cto.com/art/201501/464174.htm 编者按:本文收集了百来篇关于机器学习和深度学习的资料,含各种文档,视频,源码等.而且原文也会不定 ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料汇总 (上)
转载:http://dataunion.org/8463.html?utm_source=tuicool&utm_medium=referral <Brief History of Ma ...
- 近200篇机器学习&深度学习资料分享【转载】
编者按:本文收集了百来篇关于机器学习和深度学习的资料,含各种文档,视频,源码等.而且原文也会不定期的更新,望看到文章的朋友能够学到更多. <Brief History of Machine Le ...
- 机器学习&深度学习资料分享
感谢:https://github.com/ty4z2008/Qix/blob/master/dl.md <Brief History of Machine Learning> 介绍:这是 ...
随机推荐
- NOIP2017tg【逛公园】 题解
先说点别的 emmm--,这是本蒟蒻的第一篇题解,大佬们勿喷QwQ(要不是看到写题解可以加贡献,我才--) 可以看到标签,是2017年提高的题目,好像是Day1T3,感觉提高考这样的题目挺好的,至少考 ...
- JAVA虚拟机:内存各个区介绍
概述:java应用程序由java虚拟机自动管理程序执行期间内存管理. 优势:1.不再需要程序员去为使用的内存在程序中手动编写释放内存代码. 2.由虚拟机管理内存不容易出现内存泄漏和内存溢出的问题. 缺 ...
- 发送短信-----用restful 校验规则
我们的需求如下 1. 获取手机号 . 手机格式校验 . 生成随机验证码 . 验证码发送到手机上 . 把验证码+手机号保留(30s过期) 复习 我们在有表的情况下的序列化 class MessageSe ...
- java 饮料换购
饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始 ...
- git使用问题一新建本地仓库添加远程合并推送
1,git远程新建仓库demo 2,git本地初始化仓库demo 3,git本地添加远程仓库 git remote add <name> <url> 4,git把远程仓库pul ...
- Easy_vb
拿到之后运行一下 之后使用ida打开先关键字搜索一下,结果就出来了
- netty权威指南学习笔记一——NIO入门(4)AIO
NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供以下两种方式获取操作结果. 1.通过java.util.concurrent.Future 类来表示异步操 ...
- tornado+peewee-async+peewee+mysql(一)
前言: 需要异步操作MySQL,又要用orm,使用sqlalchemy需要加celery,觉得比较麻烦,选择了peewee-async 开发环境 python3.6.8+peewee-async0.5 ...
- UVALive 4287 SCC-Tarjan 加边变成强连通分量
还是强连通分量的题目,但是这个题目不同的在于,问你最少要添加多少条有向边,使得整个图变成一个强连通分量 然后结论是,找到那些入度为0的点的数目 和 出度为0的点的数目,取其最大值即可,怎么证明嘛... ...
- JAVA中的指针
不同于CPP,JAVA中不需要程序员对指针进行操作.不过,这不代表JAVA没有指针,事实上,JAVA的指针操作都被底层代码封装了.笔者在初学Java时,虽然就了解了形参,实参,StringBuffer ...