统计学习方法读记(上)

 统计学习方法读记(上)

1、统计学习:是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科,统计学习也可以称为统计机器学习。统计学习的特征:1)以计算机及网络为平台,2)以数据为对象,3)目的是对数据进行预测和分析。4)以方法为中心。5)多个学科交叉。

2、统计学习的对象及目的:从数据中提取数据特征,抽象出模型,发现知识用于数据的分析与预测中,统计学习的对象可以是多样的。他的基本假设是同类数据具有一定的统计性规律,可以用随机变量描述数据中的特征或者用概率分布描述数据中的统计规律。目的就是数据预测和分析特别是未知新数据。

3、统计学习的方法:统计学习由监督学习、半监督学习、非监督学习、和强化学习组成。书中主要讲监督学习,即:从给定的、有限的、用于学习的训练数据,假设数据是独立同分布的,假设某个模型属于摸个函数的集合(因为模型就是输入输出的一种转换表达)使用某个评价准则从假设空间里选择最优的模型,使他对已知和未知的预测达到最好。这样统计学习就包含假设空间、模型选择的准则和模型学习的算法,即模型、策略和算法。统计学习方法的步骤:1)得到有限的训练集合。2)确定包含所有可能的模型的假设空间,即学习模型的集合。3)确定模型选择的准则即学习策略。4)确定最优模型,即学习算法。5)通过学习方法选择最优模型。6)利用学习模型对数据预测。

4、监督学习:基本概念之输入空间、特征空间与输出空间。输入空间与输出空间(输入与输出所有可能取值的集合),可以是有限元素集合也可以是整个欧式空间。每个具体输入是一个实例,通常用特征向量表示,所有特征向量所在的空间就是特征空间,空间的每一维代表一个特征,训练样本与训练集T可表示如下

输入与输出可以是连续的也可以是离散的,连续的就是回归问题,离散的就是分类问题。监督学习的假设是输入与输出的随机变量X与Y都遵循联合概率分布P(X,Y).最终的目的是找到输入到输出的一个映射关系,监督学习的模型可以是概率模型或者非概率模型,由条件概率函数或者决策函数y=f(x)表示。之所以称之为监督学习,是因为模型是通过训练已有数据,得到模型对未知数据进行预测。这些数据基本是人工给出和标注。

5、统计学习三要素:方法=模型+策略+算法。1)模型。(找到一个尽可能完美的表达输入到输出的表达)模型空间包含所有可能的条件概率分布或者决策函数。2)策略。评价你的模型好坏,目的还是为了找到最优模型。常用的损失函数(度量模型一次预测的好坏)与风险函数(度量平均意义下模型预测的好坏)。统计学习里常用的损失函数:1)0-1损失函数。2)平方损失函数。3)绝对损失,4)对数损失。损失函数的评估当然是函数值越小模型越好。关于经验风险和期望风险:

根据训练集计算经验风险(经验损失)是关于训练样本的平均损失,遵循的概率分布可以计算出期望风险,根据大数定律当n无穷是,期望风险和经验风险趋于一致。但是现实中的训练数据往往是有限制的,所以用经验风险评估期望风险就不理想,这就涉及到经验风险最小化,当样本有限经验风险最小化会带来过拟合现象,结构风险最小化就是为了防止过拟合而提出的策略。经验化风险最小化等价于正则化(就是防止你不至于对于过分认知加点调节,增加泛化能力,过分认知比如说你之前见过的苹果都是红色或接近于红色,当你看到未成熟的苹果青颜色就认为不是苹果忽略其他认知细节)。结构化风险在经验风险的基础上加上表示模型复杂度的正则化或惩罚项。3)算法:学习模型的具体方法,基于训练集根据学习策略,算法就是求解最优化问题的方法。

6、模型评估与模型选择:误差;期望得到的和实际得到的不一致,像是一条直线上的点y=x。(1,1),(2,2),预测(3,3)。得到值肯定是3,那这里误差就是为0(|3-3|),完美的函数,如果这条直线比较好的预测了数据的走势,下一个点实际上是(3,3.000001)那误差是多少呢|3-3.000001|,列举好多的损失函数就是让我们的预测误差能最好化,已得到好的预测模型进行数据预测。

统计学习方法读记(上)_第1张图片

数据预测存在完美的模型表达,那我们在学习过程中不知道完美的模型参数是怎样的,只能让模型更逼近与完美的模型,让我们的平均误差和真实差做到最小,但是针对于训练集我们学习得到的认为完美的模型是不是最好的呐,比如说如果从拟合度讲(上图)红线的拟合好于绿线的拟合表达,但是就可以说他对所有数据都优于对方吗?对于已有数据他确实拟合的很好,但是对于未知数据的预测并不一定是最好,就像上面举的例子,见得苹果都是红色,忽然绿色就认为不是了,最好的模型还要结合对未知数据(测试数据)综合评估。又回到结构化风险降低过拟合,常用正则化与交叉验证。交叉验证是选择模型一种常用方法,(一般数据充足时数据集分为训练、测试、验证),训练集当然是模型训练,验证集是用于模型选择,测试集用最终评估。但是数据一般不是充足的,所以数据集就会反复训练测试,那么关于数据重复划分有几种方法,不至于某一部分数据一直是用于测试或者训练。1)简单交叉验证:随机划分数据训练和测试(如70%训练剩下为测试),不同的参数设置经过训练得到不同的模型,得到测试模型误差最小的模型。2)S折交叉验证,数据集随机切分s个互不相交的子集选s-1个子集做训练模型剩余做测试,s种重复选择,选取s次测评中平均误差最小的模型。3)留一交叉验证是特殊情形s=N,往往是在数据缺乏时使用,N是给定的数据集的容量。

7、泛化能力及分类问题:泛化能力体现的对未知数据预测的准确度,通过测试误差大小评估泛化能力的强弱,泛化误差的上界趋于0。监督学习方法可以分为生成方法和判别方法,得到模型对应的就是生成模型和判别模型,生成方法由数据学习联合概率分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测模型,即生成模型P(X|Y)=P(X,Y)/P(X),之所以称之为生成方法,是因为模型表示的是给定输入产生指定输出,典型的算法有:朴素贝叶斯和隐马尔可夫模型。判别方法直接由数据学习决策函数f(x)或条件概率分布作为预测模型。典型的判别模型k临近,感知机,决策树。逻辑斯蒂回归,最大熵,支持向量机等,生成型模型的收敛速度较快,更多关注与算法的自学习而减少人为的干涉。关于分类就是训练所得到的模型对未知数据进行预测划分,通过已有模型训练一个黑盒子,输入新数据时数据通过黑盒子给出一个结果。评价分类器准则当然是数据分类正确的个数除以总的测试样本数。当然而分类中也可以用精确率和召回率,二分类中有正类和负类样本,分类器就有可能划分错误将正类划分为负类将负类划分为正类。TP:正预测为正,FN:正预测为负,FP:负预测为正,TN:负预测为负。精确率P=TP/(TP+FP),召回率:R=TP/(TP+FN)。书中的标记序列问题可以理解为分类问题的推广,简单二分类输出结果为1可以为人为是,为0人为不是,但不是简单二分类时可以用一个向量标注想要表达的问题,如单词预测的词性标记序列。最后的回归问题就是拟合已有数据对未知数据进行预测,又分为线性回归和非线性回归,一元和多元回归。找到合适的回归曲线其实也相当于一种数据表达的黑盒子。

二、感知机

2、1:二类分类的线性模型,求出训练数据划分的超平面。1、模型,假设输入空间是x输入n维的实集,输出y={-1,+1},输入到输出空间的函数如f(x)=sign(w*x+b),w与b感知机的模型参数,w是权值或者权值向量,b为偏置(bais),w*b是w和b的内积。f(x)=+1当x>=0,其他情况f(x)=-1。有的时候也可以分为1和0,求解合适的w和b划分出一个合适的分类超平面。

2、2:数据可分和感知机的学习策略,数据可分就是对数据集的正实例和负实例点正确的找到能划分两侧的平面,即对y=+1的实例有wx+b>0,所有负实例有wx+b<0,则称数据集可分。关于学习策略目的就是用什么样的方法求解出合适的参数,找一个合适的损失函数并将其极小化,损失函数的自然选择是所有误分类点的总数,但是不利于参数的优化,一点到超平面的距离,在分类错误不考虑1/||w||情况下,感知机的学习损失函数如下:

感知机的学习问题就转化为求解损失函数的问题,关于感知机的计算根据函数连续可微求解参数w和b,权值更新的时候有一个学习率的概念,也就是跨的步子大小,书中也给了具体计算的例子,具体和变种对偶形式参考https://blog.csdn.net/jaster_wisdom/article/details/78240949。对线性可分的数据集感知机算法原始形式收敛经过有限次的迭代可以得到一个将数据集完全正确划分超平面及感知机模型。

三、k临近算法

一种基本分类与回归算法,书中只讨论分类问题的k临近算法。算法的输入是特征向量对应于特征空间的点,输出为实例的类可以取多类,对新数据的预测是通过对训练中的已标注k个最临近的实例类别通过投票机制等方式进行预测,因此其不是显示的学习过程,实际上是对训练数据的特征空间进行划分并作为分类的“模型”。k值的选择、距离度量及分类决策规则是k临近算法的三个基本要素。

统计学习方法读记(上)_第2张图片

k值的选择:如上图假设k为5,则与绿色圆圈距离最近的5个样本中数量最多的为蓝色正方形,此时绿色圆圈的类别与蓝色正方形相同。同理,假设k为3,此时实线圆之内数量最多的为红色三角形,那么绿色圆圈的类别就与红色三角形的类别相同。k值小的话会对估计误差增大,对临近点实例特别敏感,容易发过拟合,k值增大当然可以减小估计误差,但是估计误差增大,即距离实例较远的实例在预测中也起了作用,使预测发生错误,k值增大意味着整体模型变得简单。极端的k为N选取所有训练样本中数目最多的划分,但忽略了实例中占比比较重的有用信息,所以k一般取较小的值通常采用交叉验证法选取最优的k值。距离度量:在特征空间中每个训练实例点x,距离该点比其他点更近的所有点所组成的一个区域叫做单元,每个训练实例点都有一个单元,那么所有的实例点构成特征空间的划分。最临近法将类型y标记为单元内所有点的类标记。特征空间就变成了一个类标记单元的区块划分。距离度量:特征空间中的两个实例的距离是两个实例点相似度的反映,k临近模型的距离根据特征空间的维度,一般选用欧式距离。简单可以从求平面空间两点的距离到n维空间的距离。不同的n距离度量确定的最邻近点不一定相同。分类规则:一般是投票机制多数产生结果,多数表决规则等价于经验风险最小化。实现k临近算法关键实现k临近搜索,最简单的方法是线性扫描计算输入实例与实例间的距离,但是实例较多时会比较复杂,所以为了提高效率可以使用特殊结构存储数据,来减少计算距离的次数

import java.util.*;
public class knn {
    // KNN数据模型
    public static class knnModul implements Comparable {
        public double x;
        public double y;
        public double z;
        public double L;//距离
        String type;  //划分类别
        public knnModul(double x, double y, double z, String type) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.type = type;
        }
        //按距离排序
        public int compareTo(knnModul arg) {
            return Double.valueOf(this.L).compareTo(Double.valueOf(arg.L));
        }
    }
    // 计算距离
    private static void calL(List knnModulList, knnModul k) {
        double distince;
        for (knnModul m : knnModulList) {
            distince = Math.sqrt((k.x - m.x) * (k.x - m.x) + (k.y - m.y) * (k.y - m.y) + (k.z - m.z) * (k.z - m.z));
            m.L = distince;
        }
    }
 
    // 找出前k个数据中分类最多的数据
    private static String findMostK(List knnModulList) {
        Map count = new HashMap();
        String type = "";
        Integer tempVal = 0;
        // 统计分类个数
        for (knnModul model : knnModulList) {
            if (count.containsKey(model.type)) {
                count.put(model.type, count.get(model.type) + 1);
            } else {
                count.put(model.type, 1);
            }
        }
        for (Map.Entry entry : count.entrySet()) {
            if (entry.getValue() > tempVal) {
                tempVal = entry.getValue();
                type = entry.getKey();}
        }
        return type;
    }
 
    // KNN 算法的实现
    public static String calKNN(int k, List knnModulList, knnModul input) {
        calL(knnModulList, input);//计算
        Collections.sort(knnModulList);//距离排序
        System.out.println("距离大小排序结果如下:");
        for(int i=0;i k) {
            knnModulList.remove(k);
        }
        //找出出现频率最大
        String type = findMostK(knnModulList);
        return type;
    }
 
    // 测试KNN算法
    public static void main(String[] args) {
        // 准备数据
        List knnModelList = new ArrayList();
        knnModelList.add(new knnModul(1.0, 1.0, 1.0, "赵"));
        knnModelList.add(new knnModul(2.0, 2.0, 2.0, "钱"));
        knnModelList.add(new knnModul(3.0, 3.0, 3.0, "孙"));
        knnModelList.add(new knnModul(1.5, 1.5, 1.5, "赵"));
        knnModelList.add(new knnModul(2.1, 2.0, 3.0, "钱"));
        knnModelList.add(new knnModul(2.4, 2.5, 3.0, "孙"));
        knnModelList.add(new knnModul(6.0, 6.0, 6.0, "李"));
        // 预测数据
        knnModul prediction = new knnModul(4.0, 3.1, 4.5, "未知");
        String result = calKNN(4, knnModelList, prediction);
        System.out.println("预测结果为:"+result);
    }
}

四、朴素贝叶斯法

是一种基于贝叶斯定理与特征条件独立假设的分类方法,根据训练集基于特征条件独立假设学习输入输出的联合概率分布,然后基于此模型对给定的x利用贝叶斯定理求出后验概率最大的输出。朴素贝叶斯定理如下:

P(B|A)-在事件B下事件A发生的概率,P(B)或P(A)独立事件发生的概率。朴素贝叶斯先假定各数据相互独立,在这种强假设下,给出待分类项,求解在此项出现的条件下其他各个类别的出现的概率,哪个概率较大就认为待分类项属于哪个类别。在独立假设的情况下就可以让计算变得简单,只是单纯的用概率论的公式去计算,不用考虑事件间内部的影响因子,那么朴素贝叶斯分类基本公式可以表示为

Y是输出类别的空间集合c是Y集合中的某一类。贝叶斯分类是将实例分到后验概率最大类中,等价于期望风险最小化。在朴素贝叶斯估计中学习意味着估计P(Y=c)和P(X=x|Y=c),可以用极大似然估计计算相应概率,先验概率P(Y=c)的极大似然估计(1)及(2)条件概率的极大似然估计公式为:

            

极大似然估计的一个可能是会出现所要估计的概率值为0的情况,这时会影响到后验概率的计算结果,贝叶斯估计与极大似然估计的一个主要不同就在于,贝叶斯估计有一个先验概率,而极大似然估计没有,准确说是每种可能的先验估计都相等,也就忽略了。贝叶斯实例假设一个学校里有60%男生和40%女生。女生穿裤子的人数和穿裙子的人数相等,所有男生穿裤子。一个人在远处随机看到了一个穿裤子的学生。那么这个学生是女生的概率是多少?使用贝叶斯定理,事件A是看到女生,事件B是看到一个穿裤子的学生。我们所要计算的是P(A|B)。P(A)是忽略其它因素,看到女生的概率,在这里是40%,P(A')是忽略其它因素,看到不是女生(即看到男生)的概率,在这里是60%,P(B|A)是女生穿裤子的概率,在这里是50%,P(B|A')是男生穿裤子的概率,在这里是100%,P(B)是忽略其它因素,学生穿裤子的概率,P(B) = P(B|A)P(A) + P(B|A')P(A'),在这里是0.5×0.4 + 1×0.6 = 0.8。
根据贝叶斯定理,我们计算出后验概,率P(A|B)P(A|B)=P(B|A)*P(A)/P(B)=0.25可见,后验概率实际上就是条件概率。


你可能感兴趣的:(机器学习)