第三章 经典算法

第三章  经典算法

0  写在前面

本章介绍了 SVM,逻辑回归和决策树 三个经典算法。这三个算法在李航的《统计学习方法》中分别拿出了三章重点讲解。本节的提问需要有相应的基础,通过书中的提问发现自己基础太弱了,而基础知识最能考察一个人的学习能力。(记得考研时张宇说过,基础知识不等于简单知识,越是抽象的基础知识越困难,双手赞成!)《百面机器学习》是本很好的书,一遍远远不够,鉴于时间和需求不同,第一遍暂时快速浏览,从宏观把我覆盖的知识点。

1 支持向量机SVM

关于SVM的介绍,网上有很多博客对其进行了讲解。这里强烈推荐https://cuijiahua.com/blog/2017/11/ml_8_svm_1.html的博客,very nice  如果觉得还不够,可以结合七月的https://blog.csdn.net/v_JULY_v/article/details/7624837 和 李航的统计学习方法。这些个人绝对足够。言归正传,下面是本节所提问题

Q1:在空间上线性可分的两类点,分别向SVM分类的超平面上做投影,这些点在超平面上的投影仍然是线性可分的吗?

A1:首先得明确什么是线性可分,即通过一个超平面可以将两类点完全分开。对于任意线性可分的两组点,他们在SVM分类超平面上的投影都是线性不可分的(P52的图3.9与图3.10)。关于其证明需要用到KKT条件、拉格朗日对偶等一些列数学知识,这些知识点在推导SVM时都会用到,此处省略。

Q2:是否存在一组参数使SVM训练误差为0?

A2:一个使用高斯核()训练的SVM中,若训练集中不存在两个点在同一位置,则存在一组参数以及参数使得该SVM的训练误差为0。

Q3:训练误差为0的SVM分类器一定存在吗?

A3:一定存在。 详见P56

Q4:加入松弛变量的SVM的训练误差可以为0吗?

A4:并不一定能得到训练误差为0的模型。如果使用SMO算法来训练一个加入松弛变量的线性SVM模型,则我们的优化目标改变了,并不再是使训练误差最小。考虑带松弛变量的SVM模型优化的目标函数所包含的两项为:。当我们的参数选取较小的值时,后面的正则项将占据优化的较大比重。这样,一个带有训练误差,但是参数较小的点将成为更优的结果。当取0时,也取0时即可达到优化目标。(P57)

2 逻辑回归

这里再次推荐https://cuijiahua.com/blog/2017/11/ml_6_logistic_1.html/comment-page-1/#comments博主的,理论+实战讲解的很详细,通俗易懂,难得的好文!

Q1:逻辑回归相比于线性回归,有何异同?

A1:逻辑回归处理的是分类问题,线性回归处理的是回归问题。相同之处,二者都使用了极大似然估计来对训练样本进行建模。线性回归使用最小二乘法,而逻辑回归通过似然函数而学习到的。二者在求解超参数的过程中,都可以使用梯度下降的方法。

Q2:当使用逻辑回归处理多标签的分类问题时,有哪些常见做法,分别应用于哪些场景,它们之间又怎样的关系?

A2:使用哪一种算法处理多分类的问题取决于具体问题的定义。首先,如果一个样本只对应于一个标签,我们可以假设每个样本属于不同标签的概率服从于几何分布,使用多项逻辑回归来进行分类。多项逻辑回归实际上是二分类逻辑回归在多标签分类下的一种拓展。当存在样本可能属于多个标签的情况时,我们可以训练k个二分类的逻辑回归分类器。

3 决策树

还是推荐博主 https://cuijiahua.com/blog/2017/12/ml_13_regtree_1.html

Q1:决策树有哪些常用的启发函数?

A1:ID3 ---- 最大信息增益  P63

  C4.5 ---- 最大信息增益比   P64

  CART ---- 最大基尼指数(Gini)  P65

Q2:如何对决策树进行剪枝?

A2:决策树的剪枝通常由两种方法,预剪枝和后剪枝

  预剪枝:在生成决策树的过程中提前停止树的增长。特点:具有思想直接、算法简单、效率高等特点,适合解决大规模问题,缺点在于针对不同问题会有很大差别,需要一定经验判断,且预剪枝存在一定局限性,有欠拟合的风险。

  后剪枝:相对于预剪枝,后剪枝方法通常可以得到泛化能力更强的决策树,但时间开销会更大。

剪枝过程在决策树模型中占据着极其重要的地位!理解剪枝方法的理论,在实际应用中根据不同的数据类型,规模决定使用何种决策树以及对应的剪枝策略,灵活变通,找到最优选择。

原文地址:https://www.cnblogs.com/guohaoblog/p/11204519.html

时间: 2024-08-24 15:47:31

第三章 经典算法的相关文章

三白话经典算法系列 Shell排序实现

山是包插入的精髓排序排序.这种方法,也被称为窄增量排序,因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 由于直接插入排序在元素基本有序的情况下(接近最好情况),效率是非常高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97

第三章 经典场景设计

图片缓存: ImageLoader的知识点讲的比较老,暂不总结(题外话:推荐Glide或者Fresco,但是一定要进行二次封装,否则谁知道哪天心血来潮,想着换个框架试试呢) 图片加载利器Fresco: 配置文件配置: <uses-permissionandroid:name="android.permission.INTERNET"/> 在application中进行初始化: Fresco.initialize(context); 将程序中显示图片的ImageView替换为

【算法竞赛入门经典】【第三章】课后习题(第二部分)

自从蓝桥杯之后,都没写博客了.今天将之前第三章还差的一部分习题答案补上. 3-4整数相加 这一题题目有提示,说选择合适的输入方式,即可简化问题.刚开始没想到cin,结果还用字符串来做,多亏别人提醒我一下,我才想起cin.惭愧啊.. #include <iostream> using namespace std; int main() { int a,b; char op; while(cin>>a>>op>>b){ switch(op){ case '+':

算法竞赛入门经典第二版第三章习题

写这个的原因是看到一位大神的习题答案总结,于是自己心血来潮也想写一个这个,目的主要是督促自己刷题吧,毕竟自己太弱了. 习题3-1 得分 UVa 1585 大致就是设置一个变量记录到当前为止的连续的O的数量,碰到X就变0,水题. #include<stdio.h> #include<ctype.h> #include<string.h> char s[90]; int main(void) { int length,n,sum,num; scanf("%d&qu

【算法竞赛入门经典】【第三章】课后习题(第一部分)

课后习题第三波来了,到第三章之后代码之类的稍微变长了一些,所以我把这一章的答案分为几部分.这一章重点是字符串的处理,对于字符串问题,通常只要细心就没有问题了,下面不多说了直接上详解. 习题3-1 分数统计(stat) 任务1:这个比较简单就直接上代码了: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXN 100 + 10 int cmp(const void*a,const v

算法竞赛入门经典(刘汝佳)课后习题前三章答案

本文转载: 第一章习题1-1#include <stdio.h>int main(){int a,b,c;double d;scanf("%d%d%d",&a,&b,&c);d=(double)(a+b+c);printf("%.3lf\n",d/3.0);return 0;} 习题1-2#include <stdio.h>int main(){int f;double c;scanf("%d",&

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

算法第三章上机实验

算法第三章上机实验 数字三角形 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. #include <iostream> using namespace std; int maxsum(int a[100][100],int n){ int b[100][100]={0}; for(int i=n-1;i>=0;i--){ for(int j=i;j>=0;j--){