李航 统计学机器学习_周志华的机器学习和李航的统计学习 - CSDN
  • 感知器 他是二类分类的线性分类模型,输出的是实例的...并且感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法,有原始形式和对偶形式,算法简单易实现,在原始形式中,首先任意选取一个超平面,然后用梯度

    感知器
    他是二类分类的线性分类模型,输出的是实例的特征向量,而输出的是实例的类别。
    数据集是线性可分数据集和线性不可分的区别就是
    是否可以将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,也就是对所有y=1的实例都有wx+b>0,对y=-1的实例,都有wx+b<0
    感知机学习算法在采用不同的初值或者选取不同的误分类点的时候,解可以不同。

    并且感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法,有原始形式和对偶形式,算法简单易实现,在原始形式中,首先任意选取一个超平面,然后用梯度下降法不断极小化目标函数,在这个过程中一次随机选取一个误分类点使其梯度下降。

    K近邻法
    是一种基本分类与回归方法,输入是实例的特征向量,输出是实例的类别。有三个基本要素:k值的选择,距离度量和分类决策规则。
    并且在k=1的情形之下,称为最近邻算法。
    k近邻模型有三个基本要素:距离度量,k值的选择和分类决策规则决定。
    距离度量
    特征空间中两个实例点的距离是两个实例点相似程度的反应
    k值的选择
    如果选较小的k的话,相当于用较小的邻域中的训练实例进行预测,“学习”的相似误差就会减少,但“学习”的估计误差就会增大。
    也就是k值减少的话,会让整体模型变复杂,容易发生过拟合
    如果选较大的k值的话,就是用较大领域中的训练实例进行预测,优点就是减少学习的估计误差,相对应的就会增大学习的近似误差,也就是k值增大的话,整体的模型会变简单。
    所以一般是采取一个较小的值。
    分类决策规则
    是多数表决的,也就是输入实例的k个邻近的训练实例中的多数类决定输入实例的类。根据公式可知,多数表决规则等价于经验风险最小化。

    k近邻法的实现:kd树
    一般来说,进行搜索的方法就是使用线性扫描,但这个方法在训练集很大的情况之下,是不可行的,所以为了提高效率,引进了kd树方法。
    构造kd树的方法:

    构造kd树,使根节点对应于k维空间中包含所有实例点的超矩形区域,再使用递归方法,不断对k维空间进行切分,生成子结点,并在这个结点上选择一个坐标值和坐标轴的一个切分点,这样就将实例分成两个子区域了,这个过程直到子区域内没有实例才终止。

    搜索kd树:

    给定一个目标,搜索其最近邻,首先找到包含目标点的叶结点,然后从该叶结点出发,依次回退到父结点,不断查找与目标点最邻近的结点,确定不可能存在更近的结点时终止,这样搜索就被限制在空间的局部区域上,效率大为提高。

    朴素贝叶斯法
    是基于贝叶斯定理和特征条件假设的分类方法。
    它的基本方法就是:通过训练数据集学习联合概率分布,具体是学习先验概率分布以及条件概率分布。
    决策树
    在这里插入图片描述

    它是由结点和有向边组成的,结点有两种类型,内部结点和叶结点,内部结点表示一个特征或属性,叶结点表示一个类。
    决策树主要优点就是模型有可读性,分类速度快,根据损失函数最小化的原则建立决策树模型,主要有以下三个步骤:特征选择,决策树的生成和决策树的修剪。
    决策树学习的本质
    是从训练数据集中归纳出一组分类规则,与训练数据集不相矛盾的决策树可能有很多,也可能一个也没有。
    特征选择
    在于选择对训练数据具有分类能力的特征,其中有一个能表示得知特征X的信息而使得类Y的信息不确定性减少的程度的信息增益。
    所以对于信息增益准侧的特征选择方法是:对训练数据集D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
    决策树的生成
    有两种生成算法,分别是ID3算法和C4.5.
    ID3算法
    核心是在决策树各个结点上应用信息增益准则选择特征,递归构建决策树,具体方法就是从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点,再对子结点递归调用以上方法,构建决策树。

    C4.5算法
    输入训练数据集D,特征集A,阈值&,输出的是决策树。有以下几种判别类型:
    1.如果D中所有实例都同属于同一类,那就置T为单结点树,并将C作为结点的类并返回T
    2.如果A是空的,那么置T为单结点树,并将D中实例数最大的类C作为该结点的类并返回T
    3.除却两种方法,就是计算A中各个特征对D的消息增益比,选择增益比最大的特征
    4. 如果A8的纤细增益比小于阈值,那么置T为单结点树,并将D中实例树最大的类作为该节点的类,返回T
    5. 再次是对每一个可能性,分割开,并将实例数最大的类作为标记,构建子结点,由结点及其子节点构成树T
    6. 对结点递归调用以上步骤得到树

    决策树的剪纸
    再决策树学习中将已生成的树进行简化的过程称为剪枝。具体就是从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
    一种简单的决策树学习的算法:
    通过极小化决策树整体的损失函数或代价函数来实现。
    在这里插入图片描述

    先计算每个结点的经验熵 递归地从树的叶结点向上回缩, 再返回前面的操作,直到不能继续为止,就可以得到损失函数最小的子树了。

    CART算法
    是分类与回归树算法的缩写,同样由特征选择,树的生成以及剪纸组成,也可用作分类,也可用作回归。
    它是在给定输入随机变量x条件下,输出随机变量Y的条件概率分布的学习方法。由以下两步组成:
    1.决策树生成:基于训练数据集生成决策树,需要它尽可能大
    2.决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

    展开全文
  • #机器学习-机器视觉 学习心得 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和...

    说明:代码参考的博客链接为(http://www.pkudodo.com),隆重推荐! 同时也参考了这位大牛的博客(https://blog.csdn.net/eeeee123456/article/details/79927128);在Markdown中输入数学公式(MathJax),参考的博客是(https://www.jianshu.com/p/a0aa94ef8ab2)。若文章有错误,希望各位不吝赐教!我会及时修正!


    目录


    1、KNN介绍

    KNN,也称K近邻法(k-nearest neighbor)。是一种基本的分类和回归方法,与感知机不一样,感知机是二分类,KNN可以多分类吼!这个算法的做法:给定样本点,基于某种距离度量公式找出训练集中与其最靠近的K个点,然后对这最近的K个最邻近点进行预测。
    那么分类和回归有什么不同呢?一般,在分类任务中可使用“投票法”,即选择这k个实例中出现最多的标记类别作为预测结果;在回归任务中可使用“平均法”,即将这k个实例的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或加权投票,距离越近的实例权重越大。此类学习只是把样本全部保存起来,给一个测试样本,然后进行测试。

    下面直观了解一下:
    在这里插入图片描述
    感知机,是使用一条直线,即划分超平面的方式来划分数据。而KNN是另一种方式来划分数据。
    假设黄点和蓝点表示两种不同的数据。一批零件,黄色表示合格的零件,蓝色表示不合格的零件。那么合格与合格的零件在很多属性上都类似,所以它们会在超平面上“抱团取暖”。那么我们可以看看提供的样本测试点属于哪一堆来判断合格还是不合格。
    在这里插入图片描述
    由上图,我们可以确信前面所写的一句话,KNN可以做多分类,但个人认为这个多分类的方法可以说是“穷举”。因为最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。那如何判断出一个特征点与训练集里面“抱团取暖”的点团的距离大小来进行分类?

    ①找到离这个特征点最近的点就为其所属类。稍微一想,这个方法肯定有问题噻,来个噪声就GG了。随机性太大,你敢保证正确吗?我可不敢保证。。。。。!
    ②也是看到网友的博客上,计算这个测试点与点团中心的距离。距离最小的类就是所属类。和①一样,不太好,随机性太大。
    ③找到离这个特征点最近的K个点,选择这k个实例中出现最多的标记类别作为预测结果。怎么说呢,比上面两种好多了,也是K近邻使用的方法。


    2、KNN算法三要素

    KNN算法的三要素是:分类决策规则K值的选取距离的度量方式
    分类决策规则:就是上诉所示:③种方法,OK,解决~
    K值的选取:额----EMMMMM , 对于k值的选择,没有一个固定的经验,一般根据样本的分布,选择一个较小的值,或者交叉验证选择一个合适的k值,以后接触到的卷积神经网络都不咋用交叉验证,训练时间太慢了。
    那么最重要的的就是距离的度量方式

    距离的度量方式

    距离度量方式一般分为:欧式距离(Euclidean distance)曼哈顿距离(Manhattan distance)

    2.1 欧式距离(Euclidean distance)

    在这里插入图片描述

    2.2 曼哈顿距离(Manhattan distance)

    在这里插入图片描述


    3、KNN算法剖析

    在这里插入图片描述
    在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
    1)计算测试数据与各个训练数据之间的距离;
    2)按照距离的递增关系进行排序;
    3)选取距离最小的K个点;
    4)确定前K个点所在类别的出现频率;
    5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

    4、代码块

    代码参考链接:(http://www.pkudodo.com/2018/11/19/1-2/)

    # coding=utf-8
    # Author:Dodo
    # Date:2018-11-16
    # Email:lvtengchao@pku.edu.cn
    
    '''
    数据集:Mnist
    训练集数量:60000
    测试集数量:10000(实际使用:200)
    ------------------------------
    运行结果:(邻近k数量:25)
    向量距离使用算法——欧式距离
        正确率:97%
        运行时长:308s
    向量距离使用算法——曼哈顿距离
        正确率:14%
        运行时长:246s
    '''
    
    import numpy as np
    import time
    
    
    def loadData(fileName):
        '''
        加载文件
        :param fileName:要加载的文件路径
        :return: 数据集和标签集
        '''
        print('start read file')
        # 存放数据及标记
        dataArr = []
        labelArr = []
        # 读取文件
        fr = open(fileName)
        # 遍历文件中的每一行
        for line in fr.readlines():
            # 获取当前行,并按“,”切割成字段放入列表中
            # strip:去掉每行字符串首尾指定的字符(默认空格或换行符)
            # split:按照指定的字符将字符串切割成每个字段,返回列表形式
            curLine = line.strip().split(',')
            # 将每行中除标记外的数据放入数据集中(curLine[0]为标记信息)
            # 在放入的同时将原先字符串形式的数据转换为整型
            dataArr.append([int(num) for num in curLine[1:]])
            # 将标记信息放入标记集中
            # 放入的同时将标记转换为整型
            labelArr.append(int(curLine[0]))
        # 返回数据集和标记
        return dataArr, labelArr
    
    
    def calcDist(x1, x2):
        '''
        计算两个样本点向量之间的距离
        使用的是欧氏距离,即 样本点每个元素相减的平方  再求和  再开方
        欧式举例公式这里不方便写,可以百度或谷歌欧式距离(也称欧几里得距离)
        :param x1:向量1
        :param x2:向量2
        :return:向量之间的欧式距离
        '''
        return np.sqrt(np.sum(np.square(x1 - x2)))
    
        # 曼哈顿距离计算公式
        # return np.sum(x1 - x2)
    
    
    def getClosest(trainDataMat, trainLabelMat, x, topK):
        '''
        预测样本x的标记。
        获取方式通过找到与样本x最近的topK个点,并查看它们的标签。
        查找里面占某类标签最多的那类标签
        (书中3.1 3.2节)
        :param trainDataMat:训练集数据集
        :param trainLabelMat:训练集标签集
        :param x:要预测的样本x
        :param topK:选择参考最邻近样本的数目(样本数目的选择关系到正确率,详看3.2.3 K值的选择)
        :return:预测的标记
        '''
        # 建立一个存放向量x与每个训练集中样本距离的列表
        # 列表的长度为训练集的长度,distList[i]表示x与训练集中第i个样本的距离
        distList = [0] * len(trainLabelMat)
        # 遍历训练集中所有的样本点,计算与x的距离
        for i in range(len(trainDataMat)):
            # 获取训练集中当前样本的向量
            x1 = trainDataMat[i]
            # 计算向量x与训练集样本x的距离
            curDist = calcDist(x1, x)
            # 将距离放入对应的列表位置中
            distList[i] = curDist
    
        # 对距离列表进行排序
        # argsort:函数将数组的值从小到大排序后,并按照其相对应的索引值输出
        # 例如:
        #   >>> x = np.array([3, 1, 2])
        #   >>> np.argsort(x)
        #   array([1, 2, 0])
        # 返回的是列表中从小到大的元素索引值,对于我们这种需要查找最小距离的情况来说很合适
        # array返回的是整个索引值列表,我们通过[:topK]取列表中前topL个放入list中。
        # ----------------优化点-------------------
        # 由于我们只取topK小的元素索引值,所以其实不需要对整个列表进行排序,而argsort是对整个
        # 列表进行排序的,存在时间上的浪费。字典有现成的方法可以只排序top大或top小,可以自行查阅
        # 对代码进行稍稍修改即可
        # 这里没有对其进行优化主要原因是KNN的时间耗费大头在计算向量与向量之间的距离上,由于向量高维
        # 所以计算时间需要很长,所以如果要提升时间,在这里优化的意义不大。(当然不是说就可以不优化了,
        # 主要是我太懒了)
        topKList = np.argsort(np.array(distList))[:topK]   # 升序排序
        # 建立一个长度时的列表,用于选择数量最多的标记
        # 3.2.4提到了分类决策使用的是投票表决,topK个标记每人有一票,在数组中每个标记代表的位置中投入
        # 自己对应的地方,随后进行唱票选择最高票的标记
        labelList = [0] * 10
        # 对topK个索引进行遍历
        for index in topKList:
            # trainLabelMat[index]:在训练集标签中寻找topK元素索引对应的标记
            # int(trainLabelMat[index]):将标记转换为int(实际上已经是int了,但是不int的话,报错)
            # labelList[int(trainLabelMat[index])]:找到标记在labelList中对应的位置
            # 最后加1,表示投了一票
            labelList[int(trainLabelMat[index])] += 1
        # max(labelList):找到选票箱中票数最多的票数值
        # labelList.index(max(labelList)):再根据最大值在列表中找到该值对应的索引,等同于预测的标记
        return labelList.index(max(labelList))
    
    
    def test(trainDataArr, trainLabelArr, testDataArr, testLabelArr, topK):
        '''
        测试正确率
        :param trainDataArr:训练集数据集
        :param trainLabelArr: 训练集标记
        :param testDataArr: 测试集数据集
        :param testLabelArr: 测试集标记
        :param topK: 选择多少个邻近点参考
        :return: 正确率
        '''
        print('start test')
        # 将所有列表转换为矩阵形式,方便运算
        trainDataMat = np.mat(trainDataArr)
        trainLabelMat = np.mat(trainLabelArr).T
        testDataMat = np.mat(testDataArr)
        testLabelMat = np.mat(testLabelArr).T
    
        # 错误值技术
        errorCnt = 0
        # 遍历测试集,对每个测试集样本进行测试
        # 由于计算向量与向量之间的时间耗费太大,测试集有6000个样本,所以这里人为改成了
        # 测试200个样本点,如果要全跑,将行注释取消,再下一行for注释即可,同时下面的print
        # 和return也要相应的更换注释行
        # for i in range(len(testDataMat)):
        for i in range(200):
            # print('test %d:%d'%(i, len(trainDataArr)))
            print('test %d:%d' % (i, 200))
            # 读取测试集当前测试样本的向量
            x = testDataMat[i]
            # 获取预测的标记
            y = getClosest(trainDataMat, trainLabelMat, x, topK)
            # 如果预测标记与实际标记不符,错误值计数加1
            if y != testLabelMat[i]:
                errorCnt += 1
    
        # 返回正确率
        # return 1 - (errorCnt / len(testDataMat))
        return 1 - (errorCnt / 200)
    
    
    if __name__ == "__main__":
        start = time.time()
    
        # 获取训练集
        trainDataArr, trainLabelArr = loadData('../Mnist/mnist_train.csv')
        # 获取测试集
        testDataArr, testLabelArr = loadData('../Mnist/mnist_test.csv')
        # 计算测试集正确率
        accur = test(trainDataArr, trainLabelArr, testDataArr, testLabelArr, 25)
        # 打印正确率
        print('accur is:%d'%(accur * 100), '%')
    
        end = time.time()
        # 显示花费时间
        print('time span:', end - start)
    
    
    
    
    展开全文
  • 李航&amp;amp;amp;lt;&amp;amp;amp;lt;统计学方法&amp;amp;amp;gt;&amp;amp;amp;gt;之 感知机 学习心得 重要说明:本篇博客大多数参考Dodo大牛的博客,这位大牛写的很具体,通俗易懂,代码几乎每行...

    重要说明:本篇博客大多数参考Dodo大牛的博客,这位大牛写的很具体,通俗易懂,代码几乎每行都有注释,本系列博客跟随大牛的脚步,在其基础上记录小白学习统计学方法的过程,心得及理解。大牛的博客链接为(http://www.pkudodo.com),隆重推荐! 同时也参考了另外一篇博客,出处是(https://www.cnblogs.com/huangyc/p/9706575.html)在Markdown中输入数学公式(MathJax),参考博客是(https://www.jianshu.com/p/a0aa94ef8ab2)若文章有错误,希望各位不吝赐教!我会及时修正!


    目录


    感知机的定义

    感知机是机器学习应用中分类的最简单的一种算法。如下图所示:感知机划分超平面
    在这里插入图片描述
    感知机是二分类的线性模型,输入是实例的特征向量,输出是实例的类别;假设训练的数据集是线性可分的,感知机的目标就是求一个能够将训练集的正负样本完全正确分离开的超平面(也就是上图中所示的那些将蓝、黄数据点完全分离开的直线)。但是如果这些数据是非线性可分的,这个超平面是无法获取的。上图的坐标轴,横坐标为X1X_1,纵坐标为X2X_2。图中的每一个点都由(X1,X2)(X_1,X_2)所决定。举个实例:有一批零件,判断零件是否合格有两个重要点,长度和重量。X1X_1表示长度,X2X_2表示重量,上图的两条黑线表示零件的长度均值和重量均值。只有当长度和重量都满足一定条件,该零件才为合格品。都不满足一定条件,视为不可修复的劣质品,直接丢弃。那么机器学习如何学习到这个规则呢?我们在代码实现的时候,拿到手的是所有样本的信息(X1,X2)(X_1,X_2)和标签(01)(0或1),标签里面0表示不合格品,1表示合格品。简单的说就是图片上黄色和蓝色的点。根据我们手上的这些点,我们需要找到一条直线将上面的点完美的分开。这样的直线我们可以找到很多条,那么哪一条才是最好的呢?实际上,感知机只是一个二分类的问题,无法找到一条最佳的直线,只需要能把所有的点都分开就好。我们设定损失函数为所有分错的点和直线的距离求和,然后训练,使这段求和的数值最小(最优的情况是0,因为0代表完全分开了),那么这条直线就满足我们的条件,就是我们所找的。


    感知机的数学原理

    首先,点 P(x0,y0)P(x_0,y_0) 到直线 Ax+By+C=0Ax+By+C=0 的距离为:
    在这里插入图片描述
    类似的:设超平面公式h=wx+bh=wx+b,其中w=(w0,w1,w2,...wn),x=(x0,x1,x2,...xn)w=(w_0,w_1,w_2,...w_n),x=(x_0,x_1,x_2,...x_n),其中样本点x&quot;x^&quot;到超平面的距离为:
    在这里插入图片描述
    那么这个超平面为什么设置为 wx+bwx+b 呢?它和我们常见的 ax+bax+b 有什么区别呢?
    本质没啥区别,ax+bax+b是二维中的,wx+bwx+b是高维中的。就看你的理解啦,简单的来说,wx+b是一个n维空间中的超平面S,其中w是超平面的法向量,b是超平面的截距,这个超平面将特征空间划分成两部分,位于两部分的点分别被分为正负两类,所以,超平面S称为分离超平面。其中w=(w0,w1,w2,...wn),x=(x0,x1,x2,...xn)w=(w_0,w_1,w_2,...w_n),x=(x_0,x_1,x_2,...x_n)
    细节:
    w是超平面的法向量:对于一个平面来说w就是这么定义的。数学上就这么定义的。很简单的哦!
    b是超平面的截距:可以按照二维中的ax+b理解
    特征空间:也就是整个n维空间,样本的每个属性都叫一个特征,特征空间的意思就是在这个空间中可以找到样本所有的属性组合。


    感知机的模型

    在这里插入图片描述
    感知机的模型:输入空间—>输出空间:
    在这里插入图片描述 在这里插入图片描述
    sign函数很简单,当x大于等于0,sign输出1,否则输出-1。那么往前想一下,wx+bwx+b 如果大于等于0,f(x)f(x)就等于1,反之f(x)f(x)等于-1。


    感知机的损失函数

    我们定义样本 (xi,yi)(x_i,y_i),如果上面的距离 d&gt;0d&gt;0,则yi=1y_i=1;如果 d&lt;0d&lt;0,则yi=1y_i=-1,这样取 yy 有一个好处,就是方便定义损失函数。优化的目标:期望使误分类的所有样本,到超平面的距离之和最小
    所以定义损失函数为:

    其中M集合就是误分类点的集合。
    不考虑前面系数,感知机模型的损失函数为:在这里插入图片描述
    那么问题来了,为啥可以不考虑那么“归一化”的前缀呢?
    下面贴出一个解释,个人觉得很贴切:
    在这里插入图片描述


    感知机学习算法

    感知机学习算法是对于上述损失函数进行极小化,求得wbw和b。这里使用随机梯度下降法(SGD),因为误分类的M集合里面的样本才能参加损失函数的优化。
    目标函数如下:
    在这里插入图片描述
    感知机学习算法有两种,一种是原始形式,一种是对偶形式,下面分别介绍:


    原始形式算法

    在这里插入图片描述


    对偶形式算法

    在这里插入图片描述


    原始形式与对偶形式的选择

    1.在向量维数(特征数)过高时,计算内积非常耗时,应选择对偶形式算法加速。
    2.在向量个数(样本数)过多时,每次计算累计和就没有必要,应选择原始算法。


    代码块阅读

    代码块:这一块我还是隆重推荐Dodo大牛,理由嘛!很简单,因为我的代码都是跟着他后面一个一个码的!稍微改改!特此感谢大牛!大牛的博客链接为(http://www.pkudodo.com)!

    # coding=utf-8
    # Author:Dodo
    # Date:2018-11-15
    # Email:lvtengchao@pku.edu.cn
    
    '''
    数据集:Mnist
    训练集数量:60000
    测试集数量:10000
    ------------------------------
    运行结果:
    正确率:81.72%(二分类)
    运行时长:68.1s
    '''
    
    import numpy as np
    import time
    
    
    def loadData(fileName):  # 这边加载数据
        '''
        加载Mnist数据集
        :param fileName:要加载的数据集路径
        :return: list形式的数据集及标记
        '''
        print('start to read data')
        # 存放数据及标记的list
        dataArr = []
        labelArr = []
        # 打开文件
        fr = open(fileName, 'r')
        # 将文件按行读取
        for line in fr.readlines():
            # 对每一行数据按切割福','进行切割,返回字段列表
            curLine = line.strip().split(',')
    
            # Mnsit有0-9是个标记,由于是二分类任务,所以将>=5的作为1,<5为-1
            if int(curLine[0]) >= 5:
                labelArr.append(1)  # 标签的列表
            else:
                labelArr.append(-1)
            # 存放标记
            # [int(num) for num in curLine[1:]] -> 遍历每一行中除了以第一哥元素(标记)外将所有元素转换成int类型
            # [int(num)/255 for num in curLine[1:]] -> 将所有数据除255归一化(非必须步骤,可以不归一化)
            dataArr.append([int(num)/255 for num in curLine[1:]])  # 将里面的数据进行归一化,1:1到最后
    
        # 返回data和label
        return dataArr, labelArr  # 返回归一化的数据 以及对应的标签
    
    
    def perceptron(dataArr, labelArr, iter=50):
        '''
        感知器训练过程
        :param dataArr:训练集的数据 (list)
        :param labelArr: 训练集的标签(list)
        :param iter: 迭代次数,默认50
        :return: 训练好的w和b
        '''
        print('start to trans')
        # 将数据转换成矩阵形式(在机器学习中因为通常都是向量的运算,转换称矩阵形式方便运算)
        # 转换后的数据中每一个样本的向量都是横向的
        dataMat = np.mat(dataArr)  # (60000, 784)
        # 将标签转换成矩阵,之后转置(.T为转置)。
        # 转置是因为在运算中需要单独取label中的某一个元素,如果是1xN的矩阵的话,无法用label[i]的方式读取
        # 对于只有1xN的label可以不转换成矩阵,直接label[i]即可,这里转换是为了格式上的统一
        labelMat = np.mat(labelArr).T
        # 获取数据矩阵的大小,为m*n
        m, n = np.shape(dataMat)  # m:6000 n:784
        # 创建初始权重w,初始值全为0。
        # np.shape(dataMat)的返回值为m,n -> np.shape(dataMat)[1])的值即为n,与
        # 样本长度保持一致
        w = np.zeros((1, np.shape(dataMat)[1]))  # (1,784)
        # 初始化偏置b为0
        b = 0
        # 初始化步长,也就是梯度下降过程中的n,控制梯度下降速率
        h = 0.0001
    
        # 进行iter次迭代计算
        for k in range(iter):
            # 对于每一个样本进行梯度下降
            # 李航书中在2.3.1开头部分使用的梯度下降,是全部样本都算一遍以后,统一进行一次梯度下降
            # 在2.3.1的后半部分可以看到(例如公式2.6 2.7),求和符号没有了,此时用的是随机梯度下降,即计算一个样本
            # 就针对该样本进行一次梯度下降。
            # 两者的差异各有千秋,但较为常用的是随机梯度下降。
            for i in range(m):
                # 获取当前样本的向量
                xi = dataMat[i]
                # 获取当前样本所对应的标签
                yi = labelMat[i]
                # 判断是否是误分类样本
                # 误分类样本特诊为: -yi(w*xi+b)>=0,详细可参考书中2.2.2小节
                # 在书的公式中写的是>0,实际上如果=0,说明改点在超平面上,也是不正确的
                if -1 * yi * (w * xi.T + b) >= 0:
                    # 对于误分类样本,进行梯度下降,更新w和b
                    w = w + h * yi * xi  # 求导的梯度
                    b = b + h * yi
            # 打印训练进度
            print('Round %d:%d training' % (k, iter))
    
        # 返回训练完的w、b
        return w, b
    
    
    def test(dataArr, labelArr, w, b):
        '''
        测试准确率
        :param dataArr:测试集
        :param labelArr: 测试集标签
        :param w: 训练获得的权重w
        :param b: 训练获得的偏置b
        :return: 正确率
        '''
        print('start to test')
        # 将数据集转换为矩阵形式方便运算
        dataMat = np.mat(dataArr)
        # 将label转换为矩阵并转置,详细信息参考上文perceptron中
        # 对于这部分的解说
        labelMat = np.mat(labelArr).T
    
        # 获取测试数据集矩阵的大小
        m, n = np.shape(dataMat)
        # 错误样本数计数
        errorCnt = 0
        # 遍历所有测试样本
        for i in range(m):
            # 获得单个样本向量
            xi = dataMat[i]
            # 获得该样本标记
            yi = labelMat[i]
            # 获得运算结果
            result = -1 * yi * (w * xi.T + b)
            # 如果-yi(w*xi+b)>=0,说明该样本被误分类,错误样本数加一
            if result >= 0:
                errorCnt += 1
        # 正确率 = 1 - (样本分类错误数 / 样本总数)
        accruRate = 1 - (errorCnt / m)
        # 返回正确率
        return accruRate
    
    
    if __name__ == '__main__':
        # 获取当前时间
        # 在文末同样获取当前时间,两时间差即为程序运行时间
        start = time.time()
    
        # 获取训练集及标签
        trainData, trainLabel = loadData('../Mnist/mnist_train.csv')
        # 获取测试集及标签
        testData, testLabel = loadData('../Mnist/mnist_test.csv')
    
        # 训练获得权重
        w, b = perceptron(trainData, trainLabel, iter=30)
        # 进行测试,获得正确率
        accruRate = test(testData, testLabel, w, b)
    
        # 获取当前时间,作为结束时间
        end = time.time()
        # 显示正确率
        print('accuracy rate is:', accruRate)
        # 显示用时时长
        print('time span:', end - start)
    
    展开全文
  • 机器学习实战代码 阅读目录 知识点 感知机 k近邻法 朴素贝叶斯 决策树 logistic回归和最大熵...因为要准备面试,本文以李航的《统计学习方法》为主,结合西瓜书等其他资料对机器学习知识做一个整理. 知识点...

    机器学习实战代码

    阅读目录

    因为要准备面试,本文以李航的《统计学习方法》为主,结合西瓜书等其他资料对机器学习知识做一个整理.

    知识点

    • 进程和线程:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同.进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文.线程是共享了进程的上下文环境的更为细小的CPU时间段。
    • 判别式模型和生成式模型:
    1. 判别式模型直接学习决策函数f(X)条件概率分布P(Y|X)作为预测的模型.往往准确率更高,并且可以简化学习问题.如k近邻法/感知机/决策树/最大熵模型/Logistic回归/线性判别分析(LDA)/支持向量机(SVM)/Boosting/条件随机场算法(CRF)/线性回归/神经网络,根据样本差异进行判定。
    2. 生成式模型由数据学习联合概率分布P(X,Y), 然后由P(Y|X)=P(X,Y)/P(X)求出条件概率分布作为预测的模型,即生成模型.当存在隐变量时只能用生成方法学习.如混合高斯模型和其他混合模型/隐马尔可夫模型(HMM)/朴素贝叶斯/依赖贝叶斯(AODE)/LDA文档主题生成模型, HMM  EM  NB 
    • 概率质量函数,概率密度函数,累积分布函数:
    1. 概率质量函数 (probability mass function,PMF)是离散随机变量在各特定取值上的概率。
    2. 概率密度函数(p robability density function,PDF )是对 连续随机变量 定义的,本身不是概率,只有对连续随机变量的取值进行积分后才是概率。
    3. 累积分布函数(cumulative distribution function,CDF) 能完整描述一个实数随机变量X的概率分布,是概率密度函数的积分。对於所有实数x ,与pdf相对。
    • 极大似然估计:已知某个参数能使这个样本出现的概率最大,我们当然不会再去选择其他小概率的样本,所以干脆就把这个参数作为估计的真实值
    • 最小二乘法:二乘的英文是least square,找一个(组)估计值,使得实际值与估计值之差的平方加总之后的值最小.求解方式是对参数求偏导,令偏导为0即可.样本量小时速度快.
    • 梯度下降法:负梯度方向是函数值下降最快的方向,每次更新值都等于原值加学习率(步长)乘损失函数的梯度.每次都试一个步长看会不会下降一定的程度,如果没有的话就按比例减小步长.不断应用该公式直到收敛,可以得到局部最小值.初始值的不同组合可以得到不同局部最小值.在最优点时会有震荡.
    1. 批量梯度下降(BGD):每次都使用所有的m个样本来更新,容易找到全局最优解,但是m较大时速度较慢
    2. 随机梯度下降(SGD):每次只使用一个样本来更新,训练速度快,但是噪音较多,不容易找到全局最优解,以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升.注意控制步长缩小,减少震荡.
    3. 小批量梯度下降(MBGD):每次使用一部分样本来更新.
    • 牛顿法:牛顿法是二次收敛,因此收敛速度快.从几何上看是每次用一个二次曲面来拟合当前所处位置的局部曲面,而梯度下降法是用一个平面来拟合.红色的是牛顿法的迭代路径,绿色的是梯度下降法的迭代路径.牛顿法起始点不能离极小点太远,否则很可能不会拟合.从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
    1. 黑塞矩阵是由目标函数f(x)在点X处的二阶偏导数组成的n*n阶对称矩阵。
    2. 牛顿法:将f(x)在x(k)附近进行二阶泰勒展开:,其中gk是f(x)的梯度向量在x(k)的值,H(x(k))是f(x)的黑塞矩阵在点x(k)的值.牛顿法利用极小点的必要条件f(x)处的梯度为0,每次迭代中从点x(k)开始,假设,对二阶泰勒展开求偏导有,代入得到,即,以此为迭代公式就是牛顿法.
    • 拟牛顿法:用一个n阶正定矩阵Gk=G(x(k))来近似代替黑塞矩阵的逆矩阵就是拟牛顿法的基本思想.在牛顿法中黑塞矩阵满足的条件如下:,令,则有,称为拟牛顿条件.根据选择Gk方法的不同有多种具体实现方法.
    1. DFP算法:假设每一步,为使Gk+1满足拟牛顿条件,可使Pk和Qk满足,,例如取,,就得到迭代公式
    2.  BFGS算法: 最流行的拟牛顿算法.考虑用Bk逼近黑塞矩阵,此时相应的拟牛顿条件是,假设每一步,则Pk和Qk满足,,类似得到迭代公式.

    • 先验概率和后验概率:
    1. 先验概率 就是事情发生前的预测概率.
    2. 后验概率 是一种条件概率,它限定了事件为隐变量取值,而条件为观测结果。一般的条件概率,条件和事件可以是任意的.
    3. 贝叶斯公式P(y|x) = ( P(x|y) * P(y) ) / P(x)中,P(y|x)是后验概率,P(x|y)是条件概率,P(y)是先验概率.
    • 偏差,方差,噪声:
    1. 偏差: 度量了学习算法的期望预测和真实结果偏离程度
    2. 方差: 度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
    3. 噪声: 可以认为是数据自身的波动性,表达了目前任何学习算法所能达到泛化误差的下限
    4. 泛化误差 可以分解为偏差、方差与噪声之和
    • 对偶原理:  一个优化问题可以从主问题和对偶问题两个方面考虑.在推导对偶问题时,通过将拉格朗日函数对x求导并使导数为0来获得对偶函数.对偶函数给出了主问题最优解的下界,因此对偶问题一般是凸问题,那么只需求解对偶函数的最优解就可以了.
    • KKT条件:  通常我们要求解的最优化条件有如下三种:
    1. 无约束优化问题:通常使用求导,使导数为零,求解候选最优值
    2. 有等式约束的优化问题:通常使用拉格朗日乘子法,即把等式约束用拉格朗日乘子和优化问题合并为一个式子,通过对各个变量求导使其为零,求解候选最优值.拉格朗日乘数法其实是KKT条件在等式约束优化问题的简化版.
    3. 有不等式约束的优化问题:通常使用KKT条件.即把不等式约束,等式约束和优化问题合并为一个式子.假设有多个等式约束h(x)和不等式约束g(x),则不等式约束引入的KKT条件如下:,实质是最优解在g(x)<0区域内时,约束条件不起作用,等价于对μ置零然后对原函数的偏导数置零;当g(x)=0时与情况2相近.结合两种情况,那么只需要使L对x求导为零,使h(x)为零,使μg(x)为零三式即可求解候选最优值.
    • 性能度量:
    1. 准确度, 最常用,但在数据集不平衡的情况下不好
    2. Precision(精确度/查准率): P=TP/(TP+FP)
    3. Recall(召回率/查全率): R=TP/(TP+FN)
    4. Fβ度量:,当β=1时退化为 F1 度量,是精确率和召回率的调和均值.
    5. TPR(真正例率):TPR=TP/(TP+FN)
    6. FPR(假正例率):FPR=FP/(TN+FP)
    7. PR曲线: 纵轴为Precision,横轴为Recall, 一般使用平衡点(BEP,即Precsion=Recall的点)作为衡量标准.
    8. ROC(接受者操作特征)曲线:纵轴为TPR,横轴为FPR,在绘图时将分类阈值依次设为每个样例的预测值,再连接各点.ROC曲线围住的面积称为 AOC, AOC 越大则学习器性能越好.
    • 损失函数和风险函数:
    1. 损失函数度量模型一次预测的好坏.常用的损失函数有:0-1损失函数,平方损失函数,绝对损失函数,对数似然损失函数.
    2. 损失函数的期望是理论上模型关于联合分布P(X,Y)的平均意义下的损失,称为风险函数,也叫期望风险.但是联合分布是未知的,期望风险不能直接计算.
    3. 当样本容量N趋于无穷时经验风险趋于期望风险,但现实中训练样本数目有限.
    • 经验风险最小化和结构风险最小化:
    1. 模型关于训练数据集的平均损失称为经验风险.经验风险最小化的策略就是最小化经验风险.当样本数量足够大时学习效果较好.比如当模型是条件概率分布,损失函数是对数损失函数时,经验风险最小化就等价于极大似然估计.但是当样本容量很小时会出现过拟合.
    2. 结构风险最小化等于正则化.结构风险在经验风险上加上表示模型复杂度的正则化项.比如当模型是条件概率分布,损失函数是对数损失函数,模型复杂度由模型的先验概率表示时,结构风险最小化就等价于最大后验概率估计.
    • 过拟合 是指学习时选择的模型所包含的参数过多,以致于对已知数据预测得很好,但对未知数据预测很差的现象.模型选择旨在避免过拟合并提高模型的预测能力.
    • 正则化 是模型选择的典型方法.正则化项一般是模型复杂度的单调递增函数,比如模型参数向量的范数.
    • 交叉验证 是另一常用的模型选择方法,可分为简单交叉验证,K折交叉验证,留一交叉验证等.

     

    感知机

    • 感知机是二类分类的线性模型,属于判别模型.感知机学习旨在求出将训练数据进行线性划分的分离超平面.是神经网络和支持向量机的基础.
    • 模型:,w叫作权值向量,b叫做偏置,sign是符号函数.

       

    • 感知机的几何解释:wx+b对应于特征空间中的一个分离超平面S,其中w是S的法向量,b是S的截距.S将特征空间划分为两个部分,位于两个部分的点分别被分为正负两类.
    • 策略:假设训练数据集是线性可分的,感知机的损失函数是误分类点到超平面S的总距离.因为误分类点到超平面S的距离是,且对于误分类的数据来说,总有成立,因此不考虑1/||w||,就得到感知机的损失函数:,其中M是误分类点的集合.感知机学习的策略就是选取使损失函数最小的模型参数.
    • 算法:感知机的最优化方法采用随机梯度下降法.首先任意选取一个超平面w0,b0,然后不断地极小化目标函数.在极小化过程中一次随机选取一个误分类点更新w,b,直到损失函数为0.,其中η表示步长.该算法的直观解释是:当一个点被误分类,就调整w,b使分离超平面向该误分类点接近.感知机的解可以不同.

    • 对偶形式:假设原始形式中的w0和b0均为0,设逐步修改w和b共n次,令a=nη,最后学习到的w,b可以表示为.那么对偶算法就变为设初始a和b均为0,每次选取数据更新a和b直至没有误分类点为止.对偶形式的意义在于可以将训练集中实例间的内积计算出来,存在Gram矩阵中,可以大大加快训练速度.

     

    k近邻法

    • k近邻法根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测.k值的选择,距离度量及分类决策规则是k近邻法的三个基本要素.当k=1时称为最近邻算法.
    • 模型:当训练集,距离度量,k值以及分类决策规则确定后,特征空间已经根据这些要素被划分为一些子空间,且子空间里每个点所属的类也已被确定.
    • 策略:
    1. 距离: 特征空间中两个实例点的距离是相似程度的反映,k近邻算法一般使用欧氏距离,也可以使用更一般的Lp距离或Minkowski距离.
    2. k值: k值较小时,整体模型变得复杂,容易发生过拟合.k值较大时,整体模型变得简单.在应用中k一般取较小的值,通过交叉验证法选取最优的k. 3?  5? 
    3. 分类决策规则:k近邻中的分类决策规则往往是多数表决,多数表决规则等价于经验风险最小化.
    • 算法:根据给定的距离度量,在训练集中找出与x最邻近的k个点,根据分类规则决定x的类别y.
    • kd树:
    1. kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构.kd树更适用于训练实例数远大于空间维数时的k近邻搜索.
    2. 构造:可以通过如下递归实现:在超矩形区域上选择一个坐标轴和此坐标轴上的一个切分点,确定一个超平面,该超平面将当前超矩形区域切分为两个子区域.在子区域上重复切分直到子区域内没有实例时终止.通常依次选择坐标轴和选定坐标轴上的中位数点为切分点,这样可以得到平衡kd树.
    3. 搜索:从根节点出发,若目标点x当前维的坐标小于切分点的坐标则移动到左子结点,否则移动到右子结点,直到子结点为叶结点为止.以此叶结点为"当前最近点",递归地向上回退,在每个结点:(a)如果该结点比当前最近点距离目标点更近,则以该结点为"当前最近点"(b)"当前最近点"一定存在于该结点一个子结点对应的区域,检查该结点的另一子结点对应的区域是否与以目标点为球心,以目标点与"当前最近点"间的距离为半径的超球体相交.如果相交,移动到另一个子结点,如果不相交,向上回退.持续这个过程直到回退到根结点,最后的"当前最近点"即为最近邻点.

     

    朴素贝叶斯

    • 朴素贝叶斯是基于 贝叶斯定理 和 特征条件独立假设 的分类方法.首先学习输入/输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y.属于生成模型.
    • 模型:首先学习先验概率分布,然后学习条件概率分布.如果估计实际,需要指数级的计算,所以朴素贝叶斯法对条件概率分布作了条件独立性的假设,上式变成.在分类时,通过学习到的模型计算后验概率分布,由贝叶斯定理得到,将条件独立性假设得到的等式代入,并且注意到分母都是相同的,所以得到朴素贝叶斯分类器:
    • 朴素贝叶斯将实例分到后验概率最大的类中,这等价于期望风险最小化.
    • 算法:使用 极大似然估计法 估计相应的先验概率和条件概率,计算条件独立性假设下的实例各个取值的可能性,选取其中的最大值作为输出.
    • 用极大似然估计可能会出现所要估计的概率值为0的情况,在累乘后会影响后验概率的计算结果,使分类产生偏差.可以采用贝叶斯估计,在随机变量各个取值的频数上赋予一个正数..Sj为j属性可能取值数量,当λ=0时就是极大似然估计.常取λ=1,称为拉普拉斯平滑.
    • 如果是连续值的情况,可以假设连续变量服从高斯分布,然后用训练数据估计参数.

       

    决策树

    • 决策树是一种基本的分类与回归方法.它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布.主要优点是模型具有可读性,分类速度快.
    • 模型: 分类决策树由结点有向边组成.结点分为内部结点(表示一个特征或属性)和叶结点(表示一个类).决策树的路径具有互斥且完备的性质.
    • 策略: 决策树学习本质上是从训练数据集中归纳出一组分类规则.我们需要的是一个与训练数据矛盾较小,同时具有很好的泛化能力的决策树.从所有可能的决策树中选取最优决策树是NP完全问题,所以现实中常采用启发式方法近似求解.
    • 算法: 决策树学习算法包含 特征选择、决策树的生成、决策树的剪枝过程.生成只考虑局部最优,剪枝则考虑全局最优.
    • 特征选择:如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的.扔掉这样的特征对决策树学习的精度影响不大.
    1. 信息熵: 熵是衡量随机变量不确定性的度量.熵越大,随机变量的不确定性就越大.信息熵是信息量的期望.条件熵表示在已知随机变量X的条件下随机变量Y的不确定性.
    2. 信息增益: 表示得知特征X的信息而使得类Y的信息的不确定性减少的程度.定义为集合D的经验熵与特征A在给定条件下D的经验条件熵之差,也就是训练数据集中类与特征的互信息.
    3. 信息增益算法: 计算数据集D的经验熵,计算特征A对数据集D的经验条件熵,计算信息增益,选取信息增益最大的特征.
    4. 信息增益比: 信息增益值的大小是相对于训练数据集而言的,并无绝对意义.使用信息增益比可以对这一问题进行校正.

       

    • 决策树的生成:
    1. ID3算法:核心是在决策树各个结点上应用信息增益准则选择信息增益最大且大于阈值的特征,递归地构建决策树.ID3相当于用极大似然法进行概率模型的选择.由于算法只有树的生成,所以容易产生过拟合.
    2. C4.5算法:C4.5算法与ID3算法相似,改用信息增益比来选择特征.
    • 决策树的剪枝:
    1. 在学习时过多考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,产生过拟合现象.解决方法是对已生成的决策树进行简化,称为剪枝.
    2. 设树的叶结点个数为|T|,每个叶结点有Nt个样本点,其中k类样本点有Ntk个,剪枝往往通过极小化决策树整体的损失函数来实现,其中经验熵.剪枝通过加入a|T|项来考虑模型复杂度,实际上就是用正则化的极大似然估计进行模型选择.
    3. 剪枝算法:剪去某一子结点,如果生成的新的整体树的损失函数值小于原树,则进行剪枝,直到不能继续为止.具体可以由动态规划实现.
    • CART算法:
    1. CART既可以用于分类也可以用于回归.它假设决策树是 二叉树,内部结点特征的取值为"是"和"否".递归地构建二叉树,对回归树用平方误差最小化准则,对分类数用 基尼指数 最小化准则.
    2. 回归树的生成: 在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域.选择第j个变量和它取的值s作为切分变量和切分点,并定义两个区域,遍历变量j,对固定的j扫描切分点s,求解.用选定的对(j,s)划分区域并决定相应的输出值,直到满足停止条件.
    3. 基尼指数:假设有K个类,样本属于第k类的概率为pk,则概率分布的基尼指数为,表示不确定性.在特征A的条件下集合D的基尼指数定义为,表示分割后集合D的不确定性.基尼指数越大,样本集合的不确定性也就越大.
    4. 分类树的生成:从根结点开始,递归进行以下操作:设结点的训练数据集为D,对每个特征A和其可能取的每个值a,计算A=a时的基尼指数,选择基尼指数最小的特征及其对应的切分点作为最优特征最优切分点,生成两个子结点,直至满足停止条件.停止条件一般是结点中的样本个数小于阈值,或样本集的基尼指数小于阈值,或没有更多特征.

    5. CART剪枝:
      Tt表示以t为根结点的子树,|Tt|是Tt的叶结点个数.可以证明当时,Tt与t有相同的损失函数值,且t的结点少,因此t比Tt更可取,对Tt进行剪枝.自下而上地对各内部结点t计算,并令a=min(g(t)),自上而下地访问内部节点t,如果有g(t)=a,进行剪枝,并对t以多数表决法决定其类,得到子树T,如此循环地生成一串子树序列,直到新生成的T是由根结点单独构成的树为止.利用交叉验证法在子树序列中选取最优子树.
    • 如果是连续值的情况,一般用二分法作为结点来划分.

     

    logistic回归和最大熵模型

    • 逻辑斯谛分布:分布函数f(x)以点(μ,1/2)为中心对称,γ的值越小,曲线在中心附近增长得越快.
    • 逻辑斯谛回归模型:对于给定的输入x,根据计算出两个条件概率值的大小,将x分到概率值较大的那一类.将偏置b加入到权值向量w中,并在x的最后添加常数项1,得到.如果某事件发生的概率是p,则该事件发生的几率(此处几率指该事件发生概率与不发生概率之比)是p/1-p,对数几率是log(p/1-p),那么,也就是说在逻辑斯谛回归模型中,输出Y=1的对数几率是输入x的线性函数,线性函数值越接近正无穷,概率值就越接近1,反之则越接近0.
    • 似然估计:给定x的情况下参数θ是真实参数的可能性.
    • 模型参数估计:对于给定的二分类训练数据集,对数似然函数为,也就是损失函数.其中P(Y=1|x)=π(x),对L(w)求极大值,就可以得到w的估计值.问题变成了以对数似然函数为目标函数的最优化问题.
    • 多项逻辑斯谛回归: 当问题是多分类问题时,可以作如下推广:设Y有K类可能取值,,,实际上就是one-vs-all的思想,将其他所有类当作一个类,问题转换为二分类问题.

    • 最大熵原理:学习概率模型时,在所有可能的概率模型中,熵最大的模型是最好的模型.直观地,最大熵原理认为模型首先要满足已有的事实,即约束条件.在没有更多信息的情况下,那些不确定的部分都是"等可能的".

    • 最大熵模型: 给定训练数据集,可以确定联合分布P(X,Y)的经验分布和边缘分布P(X)的经验分布,其中v表示频数,N表示样本容量.用特征函数f(x,y)=1描述x与y满足某一事实,可以得到特征函数关于P(X,Y)的经验分布的期望值和关于模型P(Y|X)与P(X)的经验分布的期望值,假设两者相等,就得到了约束条件.定义在条件概率分布P(Y|X)上的条件熵为,则条件熵最大的模型称为最大熵模型.
    • 最大熵模型的学习就是求解最大熵模型的过程.等价于约束最优化问题,将求最大值问题改为等价的求最小值问题. 引入拉格朗日乘子将原始问题转换为无约束最优化的对偶问题. 首先求解内部的极小化问题, 即求L(P,W)对P(y|x)的偏导数,并令偏导数等于0,解得.可以证明对偶函数等价于对数似然函数,那么对偶函数极大化等价于最大熵模型的极大似然估计.之后可以用最优化算法求解得到w.

    • 最大熵模型逻辑斯谛回归模型 有类似的形式,它们又称为对数线性模型.模型学习就是在给定的训练数据条件下对模型进行极大似然估计或正则化的极大似然估计.

    • 算法:似然函数是光滑的凸函数,因此多种最优化方法都适用.
    1. 改进的迭代尺度法(IIS):假设当前的参数向量是w,如果能找到一种方法w->w+δ使对数似然函数值变大,就可以重复使用这一方法,直到找到最大值.
    2. 逻辑斯谛回归 常应用梯度下降法,牛顿法或拟牛顿法。 主要是 公式的推导,高数理解。

    支持向量机

    • 模型: 支持向量机(SVM)是一种强二类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器.支持向量机还包括核技巧,使它成为实质上的非线性分类器.分离超平面,分类决策函数.
    • 策略间隔最大化,可形式化为一个求解  二次规划的问题,也等价于正则化的合页损失函数的最小化问题. (切线法线乘积= -1)
    • 当训练数据线性可分时,通过硬间隔最大化,学习出线性可分支持向量机.当训练数据近似线性可分时,通过软间隔最大化,学习出线性支持向量机.当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机.
    • 核技巧:当输入空间为欧式空间或离散集合,特征空间为希尔伯特空间时,核函数表示将输入从输入空间映射到特征空间得到的特征向量之间的内积.通过核函数学习非线性支持向量机等价于在高维的特征空间中学习线性支持向量机.这样的方法称为核技巧.
    • 考虑一个二类分类问题,假设输入空间与特征空间为两个不同的空间,输入空间为欧氏空间或离散集合,特征空间为欧氏空间或希尔伯特空间.支持向量机都将输入映射为特征向量,所以支持向量机的学习是在特征空间进行的.
    • 支持向量机的最优化问题一般通过对偶问题化为凸二次规划问题求解,具体步骤是将等式约束条件代入优化目标,通过求偏导求得优化目标在不等式约束条件下的极值.
    • 线性可分支持向量机:
    1. 当训练数据集线性可分时,存在无穷个分离超平面可将两类数据正确分开.利用间隔最大化得到唯一最优分离超平面和相应的分类决策函数称为线性可分支持向量机.
    2. 函数间隔: 一般来说,一个点距离分离超平面的远近可以表示分类预测的确信程度.在超平面确定的情况下,|wx+b|能够相对地表示点x距离超平面的远近,而wx+b与y的符号是否一致能够表示分类是否正确.所以可用来表示分类的正确性及确信度,这就是 函数间隔.注意到即使超平面不变,函数间隔仍会受w和b的绝对大小影响.
    3. 几何间隔: 一般地,当样本点被超平面正确分类时,点x与超平面的距离是,其中||w||是w的l2范数.这就是几何间隔的定义.定义超平面关于训练数据集T的几何间隔为超平面关于T中所有样本点的几何间隔之最小值.可知,当||w||=1时几何间隔和函数间隔相等.

    4. 硬间隔最大化: 对线性可分的训练集而言,这里的间隔最大化又称为硬间隔最大化.直观解释是对训练集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类.求最大间隔分离超平面即约束最优化问题:,将几何间隔用函数间隔表示,并且注意到函数间隔的取值并不影响最优化问题的解,不妨令函数间隔=1,并让最大化1/||w||等价为最小化||w||^2/2,问题变为凸二次规划问题.

    5. 支持向量和间隔边界:与分离超平面距离最近的样本点的实例称为支持向量.支持向量是使最优化问题中的约束条件等号成立的点.因此对y=+1的正例点和y=-1的负例点,支持向量分别在超平面H1:wx+b=+1和H2:wx+b=-1.H1和H2平行,两者之间形成一条长带,长带的宽度称为间隔,H1和H2称为间隔边界.在决定分离超平面时只有支持向量起作用,所以支持向量机是由很少的"重要的"训练样本确定的.由对偶问题同样可以得到支持向量一定在间隔边界上.

    6. 对偶算法:  引进拉格朗日乘子, 定义拉格朗日函数,根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:.先求对w,b的极小值.将L(w,b,a)分别对w,b求偏导数并令其等于0,得,代入拉格朗日函数得

      ,这就是极小值.接下来对极小值求对a的极大,即是对偶问题.将求极大转换为求极小.由KKT条件成立得到,其中j为使aj*>0的下标之一.所以问题就变为求对偶问题的解a*,再求得原始问题的解w*,b*,从而得分离超平面及分类决策函数可以看出 w* 和 b* 都只依赖训练数据中 ai*>0 的样本点(xi,yi),这些实例点xi被称为支持向量.

    • 线性支持向量机:
    1. 如果训练数据是线性不可分的,那么上述方法中的不等式约束并不能都成立,需要修改硬间隔最大化,使其成为 软间隔最大化.
    2. 线性不可分意味着某些特异点不能满足函数间隔大于等于1的约束条件,可以对每个样本点引进一个 松弛变量,使函数间隔加上松弛变量大于等于1,约束条件变为,同时对每个松弛变量,支付一个代价,目标函数变为,其中C>0称为惩罚参数,C值越大对误分类的惩罚也越大.新目标函数包含了两层含义:使间隔尽量大,同时使误分类点的个数尽量小.
    3. 软间隔最大化:学习问题变成如下凸二次规划问题:,可以证明w的解是唯一的,但b的解存在一个区间.线性支持向量机包含线性可分支持向量机,因此适用性更广.

    4. 对偶算法: 原始问题的对偶问题是,构造拉格朗日函数,先求对 w,b,ξ 的极小值,分别求偏导并令导数为0,得,代入原函数,再对极小值求a的极大值,得到,利用后三条约束消去μ,再将求极大转换为求极小,得到对偶问题.由KKT条件成立可以得到, j 是满足 0<aj*<C 的下标之一.问题就变为选择惩罚参数 C>0 ,求得对偶问题(凸二次规划问题)的最优解a*,代入计算w*和b*,求得分离超平面和分类决策函数.因为b的解并不唯一,所以实际计算 b* 时可以取所有样本点上的 平均值.

    5. 支持向量:在线性不可分的情况下,将对应与ai*>0的样本点(xi,yi)的实例点xi称为支持向量.软间隔的支持向量或者在间隔边界上,或者在间隔边界与分类超平面之间,或者再分离超平面误分一侧.

    6. 合页损失函数:可以认为是0-1 损失函数的上界,而线性支持向量机可以认为是优化合页损失函数构成的目标函数.

      1)0-1损失  当样本被正确分类时,损失为0;当样本被错误分类时,损失为1。

      2)感知机损失函数  当样本被正确分类时,损失为0;当样本被错误分类时,损失为-y(wx+b)。

      3)合页损失函数  当样本被正确分类且函数间隔大于1时,合页损失才是0,否则损失是1-y(wx+b)。
       


    • 非线性支持向量机:
    1. 如果分类问题是 非线性 的,就要使用 非线性支持向量机.主要特点是使用核技巧.
    2. 非线性分类问题: 用线性分类方法求解非线性分类问题分为两步:首先使用一个变换将原空间的数据映射到新空间,然后在新空间里用线性分类学习方法从训练数据中学习分类模型.
    3. 核函数: 设X是输入空间(欧式空间的子集或离散集合),H为特征空间(希尔伯特空间),一般是高维甚至无穷维的.如果存在一个从X到H的映射使得对所有x,z属于X,函数K(x,z)满足条件,点乘代表内积,则称K(x,z)为核函数.
    4. 核技巧: 基本思想是通过一个非线性变换将输入空间对应于一个特征空间,使得在输入空间中的超曲面模型对应于特征空间中的超平面模型(支持向量机).在学习和预测中只定义核函数K(x,z),而不显式地定义映射函数.对于给定的核K(x,z),特征空间和映射函数的取法并不唯一.注意到在线性支持向量机的对偶问题中,目标函数和决策函数都只涉及输入实例与实例之间的内积,xi`xj可以用核函数K(xi,xj)=Ф(xi)`Ф(xj)来代替.当映射函数是非线性函数时,学习到的含有核函数的支持向量机是非线性分类模型.在实际应用中,往往依赖领域知识直接选择核函数.
    5. 正定核: 通常所说的核函数是指正定核函数.只要满足正定核的充要条件,那么给定的函数K(x,z)就是正定核函数.设K是定义在X*X上的对称函数,如果任意xi属于X,K(x,z)对应的Gram矩阵半正定矩阵,则称K(x,z)是正定核.这一定义在构造核函数时很有用,但要验证一个具体函数是否为正定核函数并不容易,所以在实际问题中往往应用已有的核函数.
    6. 算法: 选取适当的核函数K(x,z)和适当的参数C,将线性支持向量机对偶形式中的内积换成核函数,构造并求解最优化问题,选择最优解a*的一个正分量0<aj*<C计算,构造决策函数.
    • 常用核函数:
    1. 多项式核函数(polynomial kernel function):,对应的支持向量机是一个p次多项式分类器,分类决策函数为.
    2. 高斯核函数(Gaussian krenel function):,对应的支持向量机是高斯径向基函数(RBF)分类器.分类决策函数为.

    3. 字符串核函数(string kernel function): 核函数不仅可以定义在欧氏空间上,还可以定义在离散数据的集合上.字符串核函数给出了字符串中长度等于n的所有子串组成的特征向量的余弦相似度.

    • 序列最小最优化(SMO)算法:
    1. SMO是一种快速求解凸二次规划问题的算法.基本思路是:如果所有变量都满足此优化问题的KKT条件,那么解就得到了.否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题.不断地将原问题分解为子问题并对子问题求解,就可以求解原问题.注意子问题两个变量中只有一个是自由变量,另一个由等式约束确定.
    2. 两个变量二次规划的求解方法:假设选择的两个变量是a1,a2,其他变量是固定的,于是得到子问题,ε是常数,目标函数式省略了不含a1,a2的常数项.考虑不等式约束和等式约束,要求的是目标函数在一条平行于对角线的线段上的最优值,问题变为单变量的最优化问题.假设初始可行解为aold,最优解为anew,考虑沿着约束方向未经剪辑的最优解anew,unc(即未考虑不等式约束).对该问题求偏导数,并令导数为0,代入原式,令,得到, 经剪辑后a2的解是,L与H是a2new所在的对角线段端点的界.并解得.
    3. 变量的选择方法:在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的.第一个变量的选取标准是违反KKT条件最严重的样本点, 第二个变量的选取标准是希望能使该变量有足够大的变化,一般可以选取使对应的|E1-E2|最大的点.在每次选取完点后,更新阈值 b 和差值 Ei.

     

    提升方法

    • 提升(boosting)是一种常用的统计学习方法,是集成学习的一种.它通过改变训练样本的权重(概率分布),学习多个弱分类器(基本分类器),并将这些分类器线性组合来构成一个强分类器提高分类的性能.
    • AdaBoost:
    1. AdaBoost 提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值.然后采取 加权多数表决的方法组合弱分类器.
    2. 算法:首先假设训练数据集具有均匀的权值分布D1,使用具有权值分布Dm的训练数据集学习得到基本分类器Gm(x),计算分类误差率和Gm(x)的系数,更新训练数据集的权值分布,其中Zm是使Dm+1成为概率分布的规范化因子.重复上述操作M次后得到M个弱分类器,构建线性组合得到最终分类器。 线性叠加,前输出为后输入。.
    3. AdaBoost 算法 也可以理解成 模型为加法模型, 损失函数为指数函数, 学习算法为前向分步算法的二类分类学习方法.
    • 前向分步算法:考虑加法模型,其中b(x,γm)为基函数,γm为基函数的参数,βm为基函数的系数.在给定损失函数L(y,f(x))的条件下,学习加法模型就是求解损失函数极小化问题前向分步算法求解的想法是:从前往后,每一步只学习一个基函数及其系数,优化,得到参数βm和γm,更新,逐步逼近优化目标.最终得到加法模型.
    • 提升树:
    1. 提升树是模型为加法模型,算法为前向分布算法,基函数为决策树的提升方法.第m步的模型是,通过经验风险极小化确定下一棵决策树的参数.不同问题的提升树学习算法主要区别在于使用的损失函数不同.
    2. 二类分类问题: 只需将AdaBoost算法中的基本分类器限制为二类分类数即可.

    3. 回归问题:如果将输入空间划分为J个互不相交的区域,并且在每个区域上确定输出的常量Cj,那么树可表示为,其中. 提升树采用前向分步算法:.当采用平方误差损失函数时,损失变为,其中 r 是当前模型拟合数据的残差.每一步都只需 拟合残差 学习一个回归树即可.

    4. 梯度提升树(GBDT): 利用最速下降法的近似方法来实现每一步的优化,关键在于用损失函数的负梯度在当前模型的值作为回归问题中提升树算法中的残差的近似值,每一步以此来估计回归树叶结点区域以拟合残差的近似值,并利用线性搜索估计叶结点区域的值使损失函数最小化,然后更新回归树即可.

    • AdaBoost 产生的基础学习器有好有坏,因此加入权重.提升树产生的基础学习器是一个不断减少残差的过程,并不是一个单独的分类器,因此一般不加权重.
    • XGBoost: 相比传统GBDT有以下优点:
    1. 在优化时用到了二阶导数信息.
    2. 在代价函数里加入了正则项.
    3. 每次迭代后都将叶子结点的权重乘上一个系数,削弱每棵树的影响.
    4. 列抽样.
    5. 在训练前对数据进行排序,保存为block结构,并行地对各个特征进行增益计算.

     

    EM算法

    • EM算法是一种迭代算法,用于含有 隐变量 的概率模型参数的 极大似然估计. 每次迭代由两步组成:E步,求期望(expectation),M步,求极大值(maximization),直至收敛为止.
    • 隐变量:不能被直接观察到,但是对系统的状态和能观察到的输出存在影响的一种东西.
    • 算法:
    1. 选择参数的初始值θ(0),开始迭代.注意EM算法对初值是敏感的.
    2. E步:θ(i)为第i次迭代参数θ的估计值,在第i+1次迭代的E步,计算,P(Z|Y,θ(i))是在给定观测数据Y和当前参数估计θ(i)下隐变量数据Z的条件概率分布.
    3. M步:求使Q(θ,θ(i))极大化的θ,确定第i+1次迭代的参数的估计值
    4. 重复2和3直到收敛,一般是对较小的正数ε1和ε2满足则停止迭代.
    • EM算法是通过不断求解下界的极大化逼近求解对数似然函数极大化的算法.可以用于生成模型的非监督学习.生成模型由联合概率分布P(X,Y)表示.X为观测数据,Y为未观测数据.
    • 高斯混合模型(GMM):高斯混合模型是指具有如下形式的概率分布模型:.其中,称为第k个分模型.
    • 高斯混合模型参数估计的EM算法:

    1.  取参数的初始值开始迭代

    2. E步:计算分模型k对观测数据yj的响应度

    3.  

      M步:计算新一轮迭代的模型参数

    4.  重复2和3直到对数似然函数收敛.

     

    隐马尔可夫模型(HMM)

    • 隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态序列,再由各个状态生成一个观测而产生观测随机序列的过程.
    • 设Q是所有可能的状态的集合,V是所有可能的观测的集合,I是长度为T的状态序列,O是对应的观测序列,A是状态转移概率矩阵,aij表示在时刻t处于状态qi的条件下在时刻t+1转移到状态qj的概率.B是观测概率矩阵,bij是在时刻t处于状态qj的条件下生成观测vk的概率.π是初始状态概率向量,πi表示时刻t=1处于状态qi的概率.隐马尔可夫模型由初始状态概率向量π,状态转移概率矩阵A以及观测概率矩阵B确定.π和A决定即隐藏的马尔可夫链,生成不可观测的状态序列.B决定如何从状态生成观测,与状态序列综合确定了观测序列.因此,隐马尔可夫模型可以用三元符号表示.
    • 隐马尔可夫模型作了两个基本假设:

    1. 齐次马尔可夫性假设:假设隐藏的马尔可夫链在任意时刻t的状态只依赖于其前一时刻的状态.
    2. 观测独立性假设:假设任意时刻的观测只依赖于该时刻的马尔可夫链的状态.
    • 隐马尔可夫模型有三个基本问题,即概率计算问题,学习问题,预测问题.
    • 概率计算问题:给定模型和观测序列,计算在模型λ下观测序列O出现的概率P(O|λ).
    1. 直接计算法:最直接的方法是列举所有可能长度为T的状态序列,求各个状态序列I与观测序列O的联合概率,但计算量太大,实际操作不可行.
    2. 前向算法:定义到时刻t部分观测序列为o1~ot且状态为qi的概率为前向概率,记作.初始化前向概率,递推,对t=1~T-1,,得到.减少计算量的原因在于每一次计算直接引用前一个时刻的计算结果,避免重复计算.
    3. 后向算法:定义在时刻t状态为qi的条件下,从t+1到T的部分观测序列为oi+1~oT的概率为后向概率,记作.初始化后向概率,递推,对t=T-1~1,,得到.

    • 学习算法:已知观测序列,估计模型的参数,使得在该模型下观测序列概率P(O|λ)最大.根据训练数据是否包括观察序列对应的状态序列分别由监督学习与非监督学习实现.

    1. 监督学习:估计转移概率和观测概率.初始状态概率πi的估计为S个样本中初始状态为qi的频率.
    2. 非监督学习(Baum-Welch算法):将观测序列数据看作观测数据O,状态序列数据看作不可观测的隐数据I.首先确定完全数据的对数似然函数.求Q函数,用拉格朗日乘子法极大化Q函数求模型参数,,.

    • 预测问题:也称为解码问题.已知模型和观测序列,求对给定观测序列条件概率P(I|O)最大的状态序列.

    1. 近似算法: 在每个时刻t选择在该时刻最有可能出现的状态it*,从而得到一个状态序列作为预测的结果.优点是计算简单,缺点是不能保证状态序列整体是最有可能的状态序列.

    2. 维特比算法:用动态规划求概率最大路径,这一条路径对应着一个状态序列.从t=1开始,递推地计算在时刻t状态为i的各条部分路径的最大概率,直至得到时刻t=T状态为i的各条路径的最大概率.时刻t=T的最大概率即为最优路径的概率P*,最优路径的终结点it*也同时得到,之后从终结点开始由后向前逐步求得结点,得到最优路径.

     

    统计学习方法总结

    •  

    ------------------------------------------------- 以下内容并非出自《统计学习方法》-------------------------------------------------

    神经网络

    • 神经元(感知器)接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元将接收到的总输入值与神经元的阈值进行比较,然后通过激活函数处理以产生神经元的输出.把许多个这样的神经元按一定的层次结构连接起来就得到了神经网络.一般使用反向传播(BP)算法来进行训练.
    • 反向传播(BP)算法:
    1. 前向传播:将训练集数据输入,经过隐藏层,到达输出层并输出结果.
    2. 计算估计值与实际值之间的误差,并将该误差从输出层向输入层反向传播.
    3. 在反向传播的过程中,根据误差使用梯度下降链式法则调整各种参数的值.
    4. 不断迭代直至收敛.
    • 深度神经网络(DNN):可以理解为有很多隐藏层的神经网络.DNN内部分为输入层(第一层),隐藏层,输出层(最后一层).层与层之间是全连接的.
    • 卷积神经网络(CNN):一般用于图像识别.通过卷积核感受野的乘积形成卷积后的输出.在每一个卷积层之后,通常会使用一个ReLU(修正线性单元)函数来把所有的负激活都变为零.在几个卷积层之后也许会用一个池化层(采样层)来输出过滤器卷积计算的每个子区域中的最大数字或平均值.
    • 循环神经网络(RNN):如果训练样本输入是连续序列,则DNN和CNN不好解决.RNN假设样本是基于序列的,对应的输入是样本序列中的x(t),而模型在序列索引号t位置的隐藏状态h(t)由x(t)和h(t-1)共同决定.在任意序列索引号t有对应的模型预测输出o(t).也就是说,RNN是包含循环的网络,允许信息的持久化.

       

    • 长短期记忆网络(LSTM):一种特殊的RNN,可以学习长期依赖信息.

     

    K-Means

    • K-Means是无监督聚类算法.思想是对于给定的样本集,按照样本之间的距离大小将样本集划分为K个簇,让簇内的点尽量紧密地连在一起,而让簇间的距离尽量的大.
    • 传统算法:
    1. 用先验知识或交叉验证选择一个合适的k值.
    2. 随机选择k个样本作为初始的质心.注意初始化质心的选择对最后的聚类结果和运行时间都有很大的影响.
    3. 计算每个样本点和各个质心的距离,将样本点标记为距离最小的质心所对应的簇.
    4. 重新计算每个的质心,取该簇中每个点位置的平均值.
    5. 重复2,3,4步直到k个质心都没有发生变化为止.
    • K-Means++:用于优化随机初始化质心的方法
    1. 从输入样本点中随机选择一个点作为第一个质心.
    2. 计算每一个样本点到已选择的质心中最近质心的距离D(x).
    3. 选择一个新的样本点作为新的质心,选择原则是D(x)越大的点被选中的概率越大.
    4. 重复2和3直到选出k个质心.
    • Elkan K-Means:利用两边之和大于第三边以及两边之差小于第三边来减少距离的计算.不适用于特征稀疏的情况.
    • Mini Batch K-Means:样本量很大时,只用其中的一部分来做传统的K-Means.一般多用几次该算法,从不同的随即采样中选择最优的聚类簇.

     

    Bagging

    • Bagging的弱学习器之间没有boosting那样的联系,它的特点在于"随机采样",也就是有放回采样.因此泛化能力很强.一般会随机采集和训练集样本数一样个数的样本.假设有m个样本,且采集m次,当m趋向无穷大时不被采集到的数据占1/e,也就是36.8%,称为袋外数据,可以用来检测模型的泛化能力.Bagging对于弱学习器没有限制,一般采用决策树和神经网络.
    • 算法:
    1. 对于t=1~T,对训练数据进行第t次随机采样,共采集m次,得到包含m个样本的采样集Dm.
    2. 用采样集Dm训练第m个弱学习器Gm(x)
    3. 如果是分类,则用简单投票法.如果是回归,则取T个弱学习器结果的平均值.
    • 随机森林:使用CART决策树作为弱学习器,然后每次不从n个样本特征中选择最优特征,而是从随机选择的nsub个样本特征中来选择.一般用交叉验证来获取合适的nsub值.

    Apriori

    • Apriori是常用的挖掘出数据关联规则的算法,用于找出数据值中频繁出现的数据集合.一般使用支持度或者支持度与置信度的组合作为评估标准.
    • 支持度:几个关联的数据在数据集中出现的次数占总数据集的比重
    • 置信度:一个数据出现后.另一个数据出现的概率
    • Apriori算法的目标是找到最大的K项频繁集.假设使用支持度来作为评估标准,首先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集.然后对剩下的频繁1项集进行连接,得到候选的频繁2项集......以此类推,不断迭代,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为输出结果.

    降维方法

    • 主成分分析(PCA):降维,不断选择与已有坐标轴正交且方差最大的坐标轴.
    • 奇异值分解(SVD):矩阵分解,降维,推荐系统.  
    • 线性判别分析(LDA)

    引用

    1. 如何理解神经网络里面的反向传播算法? - 陈唯源的回答 - 知乎
    2. 刘建平Pinard-博客园
    展开全文
  • 说明:代码参考的博客链接为(http://www.pkudodo.com),隆重推荐! 同时也参考了这两位大牛的博客;若文章有错误,希望各位不吝赐教!我会及时修正! 目录 文章目录目录1、决策树的直观理解代码块 ...Markdown...
  • 统计学学习方法,李航老师作品,值得一读。
  • 首先使用一个变换将原空间的数据映射到新空间,再在新空间里用线性分类学习方法从训练数据中学习分类模型,核技术就是这个方法。 有一些常用的核函数: 1.多项式核函数 2.高斯核函数 3.字符串核函数 序列最小最优化...
  • 李航统计学方法

    2020-07-30 23:31:59
    统计学习方法 ,机器学习必备良药,没事翻两页,神清气爽
  • 李航—统计学习方法

    2017-12-08 10:46:09
    今天分享的是李航老师的统计学习方法 链接:http://pan.baidu.com/s/1bL3LVo 密码:c272 内容简介 · · · · · · 《统计学习方法》是计算机及其应用领域的一门重要的学科。《统计学习方法》全面...
  • 一、原理 什么是K近邻?就是KNN,当N=1的时候就是最近邻了。 k近邻算法简单、直观:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例多数属于某个类,就把该输入实例...
  • 百度网盘: ...errmsg=Auth Login Sucess&&bduss=&ssnerror=0&traceid= 提取码:ffxy 作者袁春:清华大学深圳研究生院,提供了第一版全书 12 章的 PPT 课件。 ...
  • 感知机(perception):二类分类的线性模型,输入为实例的特征向量,输出为实例的类别,取+1,-1。 对应于输入空间中将样本实例分成正负两类的分离超平面,属于判别模型。 其损失函数为:所有误分类点到分类超平面...
  • 《统计学习方法》全面系统地介绍了统计学习的主要方法,特别是监督学习方法,包括感知机、k近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归与最大熵模型、支持向量机、提升方法、EM算法、隐马尔可夫模型和条件随机场等...
  • (文末可在线听人美声甜的数学系博士小姐姐带你读李航《统计学习方法》)众所周知,AI行业里的技术大牛,微软亚洲研究院、华为诺亚方舟实验室等知名机构有着丰富的从业经历的李航博...
  • 机器学习的三种不同方法: 一、监督学习(supervised learning)——对未来事件进行预测。使用有类标的数据构建数据模型。然后使用经训练得到的模型对未来的数据进行预测。 主要分为两类: 1.利用分类对类标进行...
  • 本文为博主学习李航老师《统计学习方法》和周志华老师《机器学习》及相关内容的读书笔记,相关表述仅代表个人理解,恳请相互学习讨论。另:强烈推荐以上两本著作。 一、统计学习 统计学习是关于计算机基于数据构建...
  • 李航《统计学习方法》第二版-第二章 感知机 浅见2.1 感知机模型2.2 感知机学习策略2.3 感知机学习方法总结 2.1 感知机模型 感知机是二分类线性模型,输入为实例的特征向量,输出为类别,-1和1。 目的是求出将数据...
  • #机器学习-机器视觉 学习心得 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和...
  • PaperWeekly推荐炼丹入门课程:算法推导+作业讲解+教学指导众所周知,AI行业里的技术大牛,微软亚洲研究院、华为诺亚方舟实验室等知名机构有着丰富的从业经历的李航博...
  • 有些博主分享的文件里面还要压缩密码 我这里直接分享 没有压缩密码 一点都没有套路 那些忽悠的人请少点套路 谢谢(微笑)
1 2 3 4 5 ... 20
收藏数 1,816
精华内容 726
关键字:

李航 统计学机器学习