AdaBoost算法原理剖析与实现(附源码)

本文深入探讨了MIMO技术在无线通信中的应用及其原理,同时介绍了集成学习的概念,包括Boosting和Bagging方法,以及Adaboost算法在SVM基学习器上的实现。

算法概述

原理

在无线通信领域,有一种“MIMO”技术。

“MIMO”是什么呢? 它是 多输出多输入  “Multi Iuput Multi Output”的缩写。

它可以用来解决来降低误码率并提升信道容量的问题。

其原理是:通过多个发射机发送的信号,并在多个接收机端接收信号,这些信号经历的衰减是相互独立的。这样一来,在接收端多个信号同时被严重衰减的概率就会以指数形式减小,通过获得分集增益带来误码率的下降与信道容量的提升。

无线通信中的分集思想在机器学习中的对应就是集成学习。集成学习正是使用多个个体学习器来获得比每个单独学习器更好的预测性能。

生成方法

由于机器学习中的个体学习器是为了解决相同的问题而训练出来的,因此要让他们的性能完全独立实在是很强人所难。

并且,当集成结果叠加后,如果仅仅只有某一个个体学习器准确性较高的话,那么集成后的学习器的选择就会陷到一点无法自拔,对其它较弱的学习器的选择就会视而不见。但这就与我们希望集成各种学习器优势的美好愿望相悖。因此,集成学习的核心问题就在于多样性和准确性之间做出折中,来选出具优势的个体学习器,并将他们结合起来。

那么,在选择如何训练个体生成器时,目前的集成学习提供的方法大致可以分为两大类:序列化方法和并行化方法。即就是,如果个体学习器间存在强依赖方式的话,就必须串行训练个体学习器,即就是序列化方法;若个体学习器间不存在强依赖关系、可并行训练个体学习器、即就是并行化方法。

序列化生成方法的代表算法就是Boosting,其中的典型为:AdaBoost。并行化生成方法的代表就是Bagging、随机森林。

序列化生成方法是一种迭代训练的过程,通过在每一次迭代中通过重新赋予权重对基学习器继续训练,最后将每次改变权值后的训练的学习机结合。并行化生成方法,一般是基于自主采样法,即就是随机从数据集中抽取出一定的样本,再将数据放回,得到多个采样集,然后基于每个采样集训练出一个基学器,再将这些基学习器进行结合(集成)。

不管是序列化生成中所使用的重赋权值,还是并行化生成方法中的随机采样,其目的都是在于,通过人为干预来使个体学习机达到提取不同维度特征的功能,在一定程度上保持基学习器每次训练过程中的独立性

集成方法

在个体学习器训练完后,我们就要考虑,将基学习器进行集成。

学习器的集成会从三个方面带来好处:首先,降低学习空间过大的情况下,单个学习器因种种愿意可能导致的泛化性能不佳的问题。其次,通过多次训练之后进行结合,可降低在计算过程中陷入糟糕局部极小点的风险;最后,集成后,学习任务的假设空间有所扩大,有可能会学得对真是空间更好的近似。

平均法、投票法、学习法都是对学习器集成常见的策略。这里就先不提。

集成以后,我们可以对集成学习器的做多样性度量,若是多样性不足,我们还可以采用数据样本扰动等方法来进行多样性增强。

代码设计

接下来,我们将会使用一个集成学习的方法Adaboost来实现一个使用SVM作为基学习器的二分类的集成学习。

数据处理

测试数据集使用MUSK麝香数据集。数据集地址连接: http://archive.ics.uci.edu/ml/datasets/Musk+(Version+2)

使用以下代码对其进行处理:、

def loadData2(filename):
    fr = open(filename)
    numFeat = len(fr.readline().strip().split(','))-1  # 读取行数 并做处理 返回的值 是各方数据的个数的列表
    dataMat = []
    labelMat = []
    for line in fr.readlines():
        lineArr = []
        curline = line.strip().split(',')  # 数据的操作
        for i in range(numFeat):
            lineArr.append(float(curline[i+1]))  # 行向量
        dataMat.append(lineArr)
        labelMat.append(float(curline[0]))
    return dataMat, labelMat   # 生成数据和标签

基学习器的实现

基学习器使用支持向量机来实现,,基于skit-learn分别使用3个不同的核函数 linear、RBF、SIGMOD。

定义不同的核函数,来尝试提取不同方向上的特征。

class svmLearn:
    def __init__(self, x, y):
        # x和y的矩阵
        self.xArr = x
        self.yArr = y
        # 根据集合分开训练集和测试集
        rowNum = len(y)
        singleNum = math.ceil(rowNum / 5)
        testNum = singleNum * 4
        self.TestXarr = []
        self.TestYarr = []
        self.TrainXarr = []
        self.TrainYarr = []
        trainNu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值