12.19学习总结--基础算法

    那么这是第一篇CSDN文章,可能文笔不好,但没啥关系,主要是记录一下自己每天复习和学习了些啥。作为一个在交通专业的小混子,那么从今天开始好好记录一下自己零开始的编程生活。

呆绵羊 的图像结果

    今天呢,任务是回顾一下一些重要的算法。先上图:

 

 (转自知乎)

    所以本次文章涉及到的算法有:A*搜索算法、贝叶斯网络、决策树构建算法。

A*搜索算法

    A*搜索算法是一种启发式的搜索算法,算法中用于点与点之间比较的距离f(n)由两部分组成,分别为起始点到该点的距离g(n)、该点到目标点的预估距离h(n)(启发式最重要的一部分),公式如下:

f(n)=g(n)+h(n)

    其中h(n),也就是预估距离,需要我们自己预先设置一个预估函数,该函数设置的好坏会直接影响搜索结果的快慢和好坏。常见的点与点之间的预估距离设置可以设置为欧几里得距离、网格距离等,总之还是看个人的观察和想法。

    该搜索快就快在启发式的搜索比普通的枚举、深度优先、广度优先搜索要来得快得多;坏就坏在这个启发函数要能设置得适合具体实例。

贝叶斯网络

    贝叶斯网络的话,在概率论的相关书籍里面应该有所提到。主要分为朴素贝叶斯、贝叶斯和巴拉巴拉加强贝叶斯。

    贝叶斯的主要思路是通过已知先验概率和已知条件概率,推算出未知的条件概率。该方法基于先验数据库,来推算目标概率。

    先验分布 + 样本信息 后验分布

     有个例子很妙,就是搜索引擎使用的搜索字段查错。主要思想是利用已有的数据库,针对你所输入的搜索字段A,得到所有字段的概率P(B)乘上对应字段的相似度P(A|B),从而得到最相近的词,比较后推断你的输入有无出错。

决策树构建算法

参考决策树学习笔记(二):剪枝,ID3,C4.5 - 云+社区 - 腾讯云 (tencent.com)

    决策树的生成是一个不断向下构建决策树节点的过程。运用递归,设置递归结束的判断标准,得到一颗完整的决策树。

    具体伪代码如下:

Input:  训练集D={(x1, y1), (x2, y2), ..., (xm, ym)};
        属性集A={a1, a2, ..., ad}.
Output: 以node为根节点的一个决策树

Process:
## 通过给定样本集D和属性集A构建决策树
TreeGenerate(D, A){
    1: 生成结点node;
    2: if D 中样本全属于同一类别C then
    3:      将node标记为 C类 叶节点; return
    4: end if
    5: if A = ∅ OR D中样本在A上取值相同 then
    6:      将node标记为叶节点,其类别标记为D中样本数最多的类; return 
    7: end if
    8: 从 A 中选择最优化分属性 a*
    9: for a* 的每一值a[i] do
   10:      为node生成一个分支; 令Dv表示D中在 a* 上取值为 a[i] 的样本子集;
   11:      if Dv is empty then
   12:          将分支结点标记为叶节点,其类别为D中样本最多的类; return
   13:      else
   14:          以 TreeGenerate(Dv, A\{a*}) 为分支结点;
   15:      end if
   16: end for
}

   python代码:

def treeGrow(dataset,features):
    # 停止条件(1)(2)
    if  len(classList) == classList.count(classList[0]):  #no more feature
        return classifyMaxLabel(classList)
    if  len(dataSet[0]) == 1:  # pure dataset
        return classList[0]
    
    # 特征选择    
    bestFeature = findBestSplit(dataset) 
    del bestFeature
    
    # 划分特征并递归调用    
    SplitData = SplitDataset(dataset, bestFeature)
    tree = treeGrow(SplitData,features)
    return tree

    总的来说,这个建树的过程是十分清晰的。关键在于后面的建树过程,

    由于决策树很容易出现过拟合(当输入的样本特征很多的时候),所以需要有一定的限制放置其无限穷举,所以有了一些“量身打造”的构建决策树算法。决策树常用的构建算法有三种,分别为剪枝处理、ID3和C4.5。

剪枝处理:

    预剪枝:在决策树完全正确分类前较早地停止树地生长。方法有以下几种方法:

  • 决策树达到一定的高度时,终止。
  • 决策树节点下样本数过少时,终止。
  • 扩展当前节点不会改善信息增益,即信息增益小于指定阈值时,终止(主要)
  • ......

    后剪枝:在生成树后,未来防止过拟合,从顶部开始裁剪决策树。主要的方法有:

  • 降低错误剪枝REP
  • 悲观错误简直PEP
  • 基于错误剪枝ERP
  • ......

    后剪枝地过程也可以理解完全建树后,从树中找出一些与分类无关的冗余变量。

ID3建树

    其实我觉得和预剪枝很像......

# 统计学习方法:ID3生成决策树算法

输入:训练数据集D,特征集A,阈值e

输出:决策树T

1:若D中所有实例属于同一类Ck,则T为单结点树,并将类Ck作为该结点的类标记,返回T;

2:若A=空,则T为单结点树,将D中实例数最多的类Ck作为结点类标记,返回T;

3:否则,计算A中各特征对D的信息增益,选择信息增益值最大的特征Ag;

4:如果Ag的信息增益小于阈值e,则T为单结点树,将D中最多的类Ck作为结点类标记,返回T;

5:否则,对Ag的每一可能值ai,依Ag=ai将D分割为若干子集Di,将Di中实例数最大多的类作为类标记,构建子结点,由结点及其子结点构成树T,返回T;

6:对于第i个子结点,以Di为训练集,以A-Ag为特征集,递归调用步骤(1)~(5),得到子树Ti,返回Ti。

C4.5

    C4.5是ID3算法的改进版本,解决了以下几个不足:

  • 不能处理连续特征
  • 用信息增益作为标准容易偏向于取值较多的特征(这个确实是个大问题)
  • 不能处理缺失值(这也是个大问题)
  • 容易过拟合(加剪枝)

    对于连续数据:采用“二分法”,将a特征的连续值从小到大排列,选择一处中间位置作为二分点,故有n-1个区段划分选择,对每一个区段选择,计算信息增益率,选择信息增益率最大的划分位置划分处理原数据集(用区段中位数代替)。

    

     对于取值较多的特征:可以引入信息增益比,特征数越多的特征对应的特征熵越大,作为分母放入信息增益式子中,可以解决因为特征多导致的信息增益过大的问题。(有点类似于统计中的矫正R方)

    缺失值的处理:如果样本x在划分属性a上的取值未知,则将x同时划入所有子节点,要调整样本的权重值,要加上一个外加的权重因子。直观的来看,就是让样本以不同的概率划分到不同子节点中去,然后继续计算信息熵增益。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值