那么这是第一篇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同时划入所有子节点,要调整样本的权重值,要加上一个外加的权重因子。直观的来看,就是让样本以不同的概率划分到不同子节点中去,然后继续计算信息熵增益。