常见算法介绍
常见算法分类
算法是利用计算机解决特定问题的处理步骤,是有限操作的集合。
以机器学习下西洋跳棋为例,其问题描述如下:
任务T:下西洋跳棋
性能标准P:赢棋的概率
经验E:和自己对弈
目标函数V
对棋盘上的棋子进行评分,并将棋子所在位置和对应目标函数V的值描述为当前棋盘局面。在棋子、局面和性能标准P之间建立联系,将P描述成一个和棋子、局面相关的函数,根据已有的数据(经验E)去求解P中各相关参数的最优值。
算法分类
按照学习方式不同进行分类:根据学习样本数据不同,对问题有不同的建模方式。
-
监督式学习:学习样本中有结果标记
-
无监督学习:学习样本中无结果标记
-
半监督学习:学习样本中部分记录有结果标记
有监督学习(Supervised Learning)
利用一组已知类别的样本来训练模型,使其达到性能要求。特点为输入数据(训练数据)均有一个明确的标识或结果(标签)。即我们提供样例“教”计算机如何学习。
分类(Classification)
通过已有数据集(训练集)的学习,得到目标函数f(模型),把每个属性集x映射到目标属性y(类),且y必须是离散的(若y为连续的,则属于回归算法)。通过对已知类别训练集的分析,从中发现分类规则,以此预测新数据的类别。
分类算法通过对已知类别训练集的分析,从中发现分类规则,以此预测新数据的类别。分类算法的应用非常广泛,银行风险评估、客户类别分类、文本检索和搜索引擎分类、安全领域中的入侵检测以及软件项目中的应用等。
按原理分类
基于统计的:如贝叶斯分类
基于规则的:如决策树算法
基于神经网络的:神经网络算法
基于距离的:KNN(K最近邻)
常用评估指标
精确率:预测结果与实际结果的比例
召回率:预测结果中某类结果的正确覆盖率
F1-Score:统计量,综合评估分类模型,取值0-1之间
KNN
KNN(k-Nearest Neighbour),分类算法中最简单的算法之一,其核心思想是如果离某一个样本最近的 k k k个样本中的大多数属于某一个类别,并具有这个类别上样本的特性。KNN不但可以预测分类,还可以做回归分析(预测具体的值)。
有 N N N个已知分类结果的样本点,对新纪录 r r r使用KNN将其分类的步骤:
Step 1:确定 k k k值(不宜过大,使用交叉验证确定),确定计算距离的公式
常用距离计算公式
- 欧式距离: d i j = ( x i − x j ) 2 − ( y i − y j ) 2 d_{ij}=\sqrt{(x_i-x_j)^2-(y_i-y_j)^2} dij=(xi−xj)2−(yi−yj)2
- 曼哈顿距离: d i j = ∣ x i − x j ∣ + ∣ y i − y j ∣ d_{ij}=\left| x_i-x_j \right| + \left| y_i-y_j\right| dij=∣xi−xj∣+∣yi−yj∣
- 余弦相似度: d i j = cos ( ( x i , y i ) , ( x j , y j ) ) d_{ij}=\cos((x_i,y_i),(x_j,y_j)) dij=cos((xi,yi),(xj,yj))
Step 2:计算r和其他样本点之间的距离 d i r d_{ir} dir,其中 i ∈ ( 1 , N ) i\in(1, N) i∈(1,N)
Step 3:得到目前和 r r r最接近的 k k k个样本,作为KNN的训练样本
- 利用欧氏距离公式确定符合条件的
k
k
k条记录:
d r 1 = ( x r − x 1 ) 2 − ( y r − y 1 ) 2 d_{r1}=\sqrt{(x_r-x_1)^2-(y_r-y_1)^2} dr1=(xr−x1)2−(yr−y1)2
d r 2 = ( x r − x 2 ) 2 − ( y r − y 2 ) 2 d_{r2}=\sqrt{(x_r-x_2)^2-(y_r-y_2)^2} dr2=(xr−x2)2−(yr−y2)2
…
d r N = ( x r − x N ) 2 − ( y r − y N ) 2 d_{rN}=\sqrt{(x_r-x_N)^2-(y_r-y_N)^2} drN=(xr−xN)2−(yr−yN)2
将距离升序排序,得到top k小的值,选入KNN样本
Step 4:将 k k k个样本中最多归属类别的分类标签赋予新纪录 r r r,分类结束
伪码实现
repeat
计算已知类别数据集中的点与当前之间的距离
按照距离递增次序排序
until 样本点遍历完成
返回前k个样本点
统计k个样本点中出现频率最高的类别标签
KNN优缺点
优点
-
原理简单,容易理解,容易实现
-
重新训练代价较低
-
时间、空间复杂度取决于训练集(一般不算太大)
缺点
-
KNN属于lazy-learning算法,得到结果的及时性差
-
k值对结果影响大(试想一下k=1和k=N的极端情况)
-
不同类记录相差较大时容易误判
-
样本点较多时,计算量大
-
相对于决策树,结果可解释性不强
决策树
- 准备工作,明确自变量和因变量,确定信息度量的方式,确定终止的条件
- 选择特征,得到当前待处理子集,计算所有特征信息度量,得到当前最佳分类途径
- 创建分支,根据选中特征将当前记录分成不同分支,分支个数取决于算法
- 是否终止,判断是否满足终止条件,满足则退出循环,不满足则继续递归调用(回到2)
- 生成结果,判断是否需要剪枝,需要则进行适当修剪,不需要则为最终结果
熟悉数据,明确目标
(1)观察数据,明确自变量和因变量
(2)明确信息度量方式:信息增益
- 熵
- 基尼系数
(3)明确分支终止条件
- 纯度
- 记录条数
- 循环次数
信息熵
信息熵由香农提出,是信息论里的概念。它是描述混乱程度的度量,取值范围0~1,值越大,越混乱。
计算公式: H ( U ) = E [ − log p i ] = − ∑ i = 1 n p i log p i H(U)=E[-\log p_i]=-\sum_{i=1}^np_i\log p_i H(U)=E[−logpi]=−∑i=1npilogpi,式中对数一般取2为底,单位为比特。
例:有一堆苹果和梨子共100个,随机拿出一个,拿出的是哪一种?
- 50个苹果,50个梨子
- 100个梨子
- 80个苹果,20个梨子
E 1 = − ( 50 / 100 ) ∗ log 2 ( 50 / 100 ) − ( 50 / 100 ) ∗ l o g 2 ( 50 / 100 ) = 1 E1=-{(50/100)}*\log_2{(50/100)}-{(50/100)}*log_2{(50/100)}=1 E1=−(50/100)∗log2(50/100)−(50/100)∗log2(50/100)=1
E 2 = − ( 100 / 100 ) ∗ l o g 2 ( 100 / 100 ) = 0 E2=-{(100/100)}*log_2{(100/100)}=0 E2=−(100/100)∗log2(100/100)=0
E 3 = − ( 20 / 100 ) ∗ log 2 ( 20 / 100 ) − ( 80 / 100 ) ∗ l o g 2 ( 80 / 100 ) = 0.722 E3=-{(20/100)}*\log_2{(20/100)}-{(80/100)}*log_2{(80/100)}=0.722 E3=−(20/100)∗log2(20/100)−(80/100)∗log2(80/100)=0.722
信息增益
- 信息是确定性增加的
- 从一个状态到另一个状态信息的变化
- 信息增益越大,对确定性贡献越大
例:搜集了几种果实的颜色和味道,根据这两个信息确定是否为水果。
果实名称 | 什么颜色? | 味道甜吗? | 是否为水果? |
---|---|---|---|
西红柿 | 红色 | 否 | 否 |
黄瓜 | 绿色 | 否 | 否 |
苹果 | 红色 | 是 | 是 |
提子 | 红色 | 是 | 是 |
- 不考虑任何特征,直接估算结果
其中两个是水果,两个不是水果,概率均为2/4。其信息熵为 E = − ( 2 / 4 ) ∗ log 2 ( 2 / 4 ) − ( 2 / 4 ) ∗ log 2 ( 2 / 4 ) = 1 E=-{(2/4)}*\log_2{(2/4)}-{(2/4)}*\log_2{(2/4)}=1 E=−(2/4)∗log2(2/4)−(2/4)∗log2(2/4)=1。
信息增益为0。 - 考虑以颜色为参考信息,判断是否为水果
其中红色的有3个,2个为水果,1个不是;绿色的都不是。概率为2/3、1/3、1和0。其信息熵为 E = 3 / 4 ∗ ( − ( 2 / 3 ) ∗ log 2 ( 2 / 3 ) − ( 1 / 3 ) ∗ log 2 ( 1 / 3 ) ) + 1 / 4 ∗ ( − 1 ∗ log 2 1 ) = 0.689 E=3/4*(-{(2/3)}*\log_2{(2/3)}-{(1/3)}*\log_2{(1/3)})+1/4*(-1*\log_21)=0.689 E=3/4∗(−(2/3)∗log2(2/3)−(1/3)∗log2(1/3))+1/4∗(−1∗log21)=0.689。
信息增益为0.311。 - 考虑以味道为参考信息,判断是否为水果
其中味道甜的有2个,均为水果,味道不甜的有2个,均不为水果。概率为1、0和0、1。其信息熵为 E = ( 2 / 4 ) ∗ ( − ( 2 / 2 ) ∗ log 2 ( 2 / 2 ) ) + ( 2 / 4 ) ∗ ( − ( 2 / 2 ) log 2 ( 2 / 2 ) ) = 0 E=(2/4)*(-{(2/2)}*\log_2{(2/2)})+{(2/4)}*(-(2/2)\log_2{(2/2)})=0 E=(2/4)∗(−(2/2)∗log2(2/2))+(2/4)∗(−(2/2)log2(2/2))=0。
信息增益为1。
即选择最佳特征首先需要计算信息熵,根据信息熵计算信息增益,信息增益最大的特征为当前最佳特征。
ID3系列算法
-
ID3(迭代树三代,Iterative Dichotomiser 3)
核心是信息熵,根据信息增益决定树的结点
存在以下问题:- 信息度量不合理,倾向于选择取值多的字段
- 输入类型单一,为离散型
- 不做剪枝,容易过拟合
-
C4.5,与ID3相比的改进
- 用信息增益率代替信息增益
- 能对连续属性进行离散化,对不完整数据进行处理
- 进行剪枝
-
C50,和C4.5相比的改进
- 使用了boosting
- 前修剪,后修剪
CART(Classification and Regression Tree)
- 核心是基尼系数
- 分类是二叉树
- 支持连续值和离散值
- 后剪枝进行修剪
- 支持回归,可以预测连续值
算法 | 支持模型 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|---|
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分类 | 多叉树 | 信息增益率 | 支持 | 支持 | 支持 |
CART | 分类、回归 | 二叉树 | 基尼系数 | 支持 | 支持 | 支持 |
回归(Regression)
由身高预测体重,收集一些人的身高和体重,基于这些已知信息,去预测一个身高已知的人的体重。
两个变量之间的关系(设身高为 x x x,体重为 y y y)可用最简单的线性关系描述: y = a x + b (1) y=ax+b \tag{1} y=ax+b(1)
需要根据已有数据,去求解该模型中的两个参数: a a a和 b b b,然后利用该公式去预测。
两个未知参数,对于任意两条已知记录,即可求出两者的值。为了能得到更普遍可信度更高的模型,需尽可能的使用已有的样本数据,即越多的记录参与到求解的过程中,求出的结果更具普遍性。
将所有的记录依次带入(1)式得到公式计算结果 y ^ \hat y y^,每一个计算值 y ^ \hat y y^和真实值 y y y的差即为预测误差,预测误差 ▽ \triangledown ▽实际上是一个关于参数 a a a、 b b b函数: ▽ ( a , b ) \triangledown(a,b) ▽(a,b),我们要做的是找到某一组参数 ( a , b ) (a,b) (a,b)使得误差值 ▽ ( a , b ) \triangledown(a,b) ▽(a,b)最小即可。
例:读取数据集dataset ( h , w ) (h,w) (h,w),定义变量: d e l t a = 0 delta=0 delta=0
-
求所有记录的误差的平方和
对每一条数据进行如下处理,从1到n:
将 h i h_i hi带入 y = a x + b y=ax+b y=ax+b,计算得到预测值: y i = a h i + b y_i=ah_i+b yi=ahi+b
计算预测值和实际值的误差: w i − y i = w i − ( a h i + b ) w_i-y_i=w_i-(ah_i+b) wi−yi=wi−(ahi+b)
将误差的平方累加起来: d e l t a = d e l t a + ( w i − ( a h i + b ) ) 2 delta=delta+(w_i-(ah_i+b))^2 delta=delta+(wi−(ahi+b))2
-
求 d e l t a delta delta最小时的 a a a、 b b b的取值
a = ∑ i = 1 n ( h i − h ‾ ) ( w i − w ‾ ) ∑ i = 1 n ( h i − h ‾ ) 2 a = \frac {\sum_{i=1}^n{(h_i-\overline h)(w_i-\overline w)}}{\sum_{i=1}^n{(h_i-\overline h)^2}} a=∑i=1n(hi−h)2∑i=1n(hi−h)(wi−w)
b = y ‾ − a x ‾ b=\overline y - a\overline x b=y−ax
其他常见有监督学习算法
分类算法
- NB(朴素贝叶斯,Naive Bayes)
- SVM(支持向量机,Support Machine Learning)
- …
回归预测
- 线性回归(Linear Regression)
- 逻辑斯蒂回归(Logistic Regression)
- 岭回归(Ridge Regression)
- 拉索回归(Lasso Regression)
- …
无监督学习(Unsupervised Learning)
从无标记的训练数据中推断结论。其特点为输入数据(训练数据)不存在明确的标识或结果(标签)。常见的无监督学习为聚类,即发现隐藏的模式或者对数据进行分组。即计算机根据我们提供的材料“自动”学习,给定数据,寻找隐藏的结构或模式。
聚类算法(Clustering)
聚类就是将相似的事物聚集在一起,而将不相似的事物划分到不同类别的过程。它是一种探索性的分析,不必事先给出一个分类的标准,聚类分析能够从样本数据出发,自动进行分类。聚类分析所使用的方法不同,常常会得到不同的结论。
常见算法:层次聚类、划分聚类、基于密度的聚类。
K-Means
K-Means即K均值聚类,属于划分聚类。其工作原理为根据初始化的聚类中心信息,计算每个样本到这些中心的距离,可以判断每个样本均归属于某个类簇,更新聚簇中心信息,重新计算每个样本到新的聚类中心的距离,重新划分样本到新的聚类中心对应的类中,重复进行,直到满足终止条件。
有N个样本点,使用K-Means将其聚类的步骤:
Step 1:确定聚类的个数 k k k(观察法、枚举法,交叉验证等),并指定 k k k个聚类的中心 C 1 , C 2 , . . . . . . , C k C_1, C_2, ......, C_k C1,C2,......,Ck
Step 2:计算每个样本 S i S_i Si点到 k k k个中心的距离,并将该点归入最近的 C j C_j Cj类中,其中 i ∈ ( 1 , N ) , j ∈ ( 1 , k ) i∈(1, N), j∈(1, k) i∈(1,N),j∈(1,k)
Step 3:重新计算 k k k个类簇的中心点,更新原有中心点的位置 C 1 , C 2 , . . . . . . , C k C_1, C_2, ......, C_k C1,C2,......,Ck
Step 4:重复Step 2、Step 3,直到中心点位置不再变化或者变化幅度小于约定阈值,或者达到预定义的最大循环次数,结束,得到最终聚类结果
伪码实现
选择k个点作为初始类簇中心
repeat
将每个样本点指派到最近的类簇中心,形成k个类簇
重新计算每个类簇的中心
until 类簇不发生变化 or 达到最大迭代次数
优缺点
优点:
- 原理简单,容易理解,容易实现
- 聚类结果相对较好,且容易解释
缺点:
- 分类个数k需要事先指定,且指定的k值不同,聚类结果相差较大
- 初始的k个类簇中心对最终结果有影响,选择不同,结果可能会不同
- 能识别的类簇仅为球状,非球状的聚类效果很差
- 样本点多时,计算量较大
- 对异常值敏感,对离散值需要特殊处理
关联规则(Association Rule)
关联规则是反映事物与事物间相互的依存关系和关联性。如果两个或多个事物间存在一定的关联关系,其中一个事物能够通过其他事物预测到。最常见的场景就是购物篮分析(Market Basket)。通过分析顾客购物篮中的不同商品之间的关系,来分析顾客的购买习惯。经典案例就是啤酒与尿布。
其他常见无监督学习算法
聚类算法
- DBScan
- 最大期望(Exception Maximization, EM)
- 降维:PCA(主成分分析)、PLS(偏最小二乘回归)、MDS(多维尺度分析)…
- …
关联规则
- Apriori
- Eclat
- …
半监督学习(Semi-Supervised Learning)
半监督学习模型中的训练数据有部分被标识,部分没有被标识,这种模型首先需要学习数据的内在结构,以便合理的组织数据来进行预测。旨在避免数据和资源的浪费,解决监督学习模型泛化能力不强、无监督学习模型不精确等问题。
常见学习方法
- 半监督分类:在无类标签的样例的帮助下训练有类标签的样本,弥补有类标签样本不足的缺陷
- 半监督回归:在无输出的输入的帮助下训练有输出的输入,获得性能更好的回归器
- 半监督聚类:在有类标签的样本的信息帮助下获得比只用无类标签的样例得到的结果更好的簇
- 半监督降维:在有类标签的样本的信息帮助下找到高维输入数据的低维结构,同时保持原始高维数据和成对约束的结构不变
集成学习(Ensemble Learning)
集成学习针对同一数据集,训练多种学习器,解决同一问题。
Bagging
- 有放回抽样构建多个子集
- 训练多个分类器
- 最终结果由各分类器结果投票得出
- 实现简单
Boosting
- 重复使用一类学习器来修改训练集
- 每次训练后根据结果调整样本的权重
- 每个学习器加权后的线性组合即为最终结果
通俗的说,相当于将错题总结在错题集上,然后专门训练错题。
Stacking
- 由两级组成,第一级为初级学习器,第二级为高级学习器
- 第一级学习器的输出作为第二级学习器的输入
深度学习(Deep Learning)
深度学习的概念源于人工神经网络的研究,含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合底层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。属于机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。
常见深度学习算法
- 受限玻尔兹曼机(Restricted Boltzmann Machine, RBM)
- 深度信念网络(Deep Belief Networks, DBN)
- 卷积网络(Convolutinal Network)
- 栈式自编码(Stacked Auto-Encoders)
增强学习(Reinforcement Learning)
一个能感知环境的自治agent通过学习,选择能达到其目标的最优动作。本质就是解决“决策(decision making)”问题,即学会自动进行决策,比如控制移动机器人、在工厂中学习最优操作工序、学习棋类对弈等。
常见增强学习算法
- Q-Learning
- 时间差学习 Temporal difference learning
迁移学习(Transfer Learning)
迁移学习是要把已训练好的模型参数迁移到新的模型来帮助新模型训练数据集。初衷是节省人工标注样本的时间,让模型可以通过已有的标记数据向未标记数据迁移。换言之,就是运用已有的知识来学习新的知识,核心是找到已有知识和新知识之间的相似性。