游戏设计中几种常用机器学习算法合集
当今,机器学习算法已广泛应用于日常生活,我们每天需要处理的数据也在不断增加。理解数据背后的真实含义,有助于人们认识事物本质,提高生产效率。机器学习算法主要用于分类、回归和聚类,以下是几种常用的算法:
一、算法分类概述
1. 监督分类算法
- K - 邻近算法
- 决策树(ID3 算法)
- 朴素贝叶斯分类器
- Logistic 回归
- 支持向量机(SVM)
- AdaBoost 元算法
2. 回归预测
- 线性回归
- 树回归
3. 无监督聚类
- K - 均值聚类
4. 关联分析
- Apriori 算法
- FP - growth 算法
5. 优化技术
- 降维:PCA 算法
- 降维:SVD 算法
- 大数据:MapReduce
本文作为《机器学习实战》(Peter Harrington)的读后感,列举了常用的机器学习算法。单看几篇文章难以充分理解机器学习,但可作为一个索引,让我们知道某种算法适合解决某一类问题,需要时再深入研究。
二、具体算法详解
1. K - 邻近算法
K - 邻近算法是一种简单有效的分类数据算法。其优点是易于实现,缺点是效率较低。该算法的原理是:选择与样本数据中前 K 个最相似的数据,将这 k 个最相似数据中出现次数最多的分类,作为新数据的分类。
例如,有几部电影里打斗镜头与接吻镜头出现次数的数据,现在要判断最后一部电影的类型。我们可以算出未知电影与各个电影的距离,若选择 K = 3,假设最近的三部电影是“He's Not Really into Dudes”“Beautiful Woman”和“California Man”,且这三部电影全是爱情片,那么就可以判断未知电影也是爱情片。
2. 决策树 ID3 算法
决策树是依照数据的不同特征进行分类的方法,其输出结果易于理解,能清晰看出各个特征的内在联系,但可能出现过度匹配的问题。
在构造决策树时,首要问题是确定当前数据集上哪个特征在划分数据类型时起决定性作用。为找到决定性特征,需要评估每个特征。ID3 算法是构造决策树的一种算法,它以信息熵的下降速度为选取测试属性的标准。即在每个节点选取还尚未被用来划分的具有最高信息增益(根据相关计算)的属性作为划分标准,然后持续这个过程,直到生成的决策树能完美分类训练样例。
例如,有动物的几种特征和是否属于鱼类的数据,先测试以“不浮出水面是否可以生存”和“是否有脚蹼”作为分类后信息熵的大小,计算后选取分类后信息熵较大的“不浮出水面是否可以生存”进行分类,接着递归处理剩余的特征,直到数据被完全分类。
3. 朴素贝叶斯分类器
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。假设一个数据集由 N 类组成,如果 $p(类型 c|x,y) > p(其他类型|x,y)$,那么类别为 c。
假如要对留言板的留言进行分类,屏蔽带有侮辱性的留言。样本留言已去除标点符号并统一大小写。对每个类(带有侮辱性、不带侮辱性)计算($c$ 是分类,$w$ 是词组向量),比较大小即可得出新留言的分类。根据朴素贝叶斯假设,将 $w$ 展开为一个个独立特征,那么 $p(w)=p(w_1)p(w_2)...p(w_n)$,$p(w|c_i)$ 可通过相应公式计算。接下来,只要统计各个词在样本中的出现频率,就能解出上述式子。
4. Logistic 回归
Logistic 回归根据现有数据对分类边界建立回归公式,以此进行分类。线性方程 $z = w_0x_0 + w_1x_1 +... + w_nxn$,即 $z = \sum{i = 0}^{n} w_ix_i$。只要确定参数 $w$,就可计算出回归公式,进而进行分类。
逻辑回归的思想是用一个超平面将数据集分为两部分,这两部分分别位于超平面的两边,且属于两个不同类别。梯度上升(下降)算法是计算方程参数的一种算法,其思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向搜寻。通过对相关公式进行多次迭代,即可找出方程参数。
5. 支持向量机(SVM)
支持向量机将问题转化为“求两个类的边界距离”的最优化问题。假设数据点分为两类,支持向量机试图寻找最优的一条线(超平面),使两类数据与该线的距离最大。离边界较近的点(如 Gap 内)称为支持向量,它们对超平面有较大影响,应给予较高权重。
如果数据并非线性可分,可以通过核函数将数据映射成高维线性可分的数据,例如使用径向核函数映射数据。还可以通过迭代计算 SMO,其中 Platt 的 SMO 算法通过每次只优化两个 alpha 值来加快 SVM 训练速度。
6. AdaBoost 元算法
元算法也叫集成方法,通过将其他算法组合形成更优的算法。组合方式包括:不同算法的集成、数据集不同部分采用不同算法分类后的集成或者同一算法在不同设置下的集成。
Adaboost 的目的是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。它给每个训练数据一个权重以优化分类器。每个训练样本最初被赋予相同的权重,若某个样本点已被准确分类,那么在构造下一个训练集中,它被选中的概率降低;反之,若未被准确分类,其权重提高。
判断分类器的效果,除了使用错误率(正确率)外,ROC 曲线也是一种评价方法。例如,“将正常邮件分类成垃圾邮件”的后果比“将垃圾邮件分类成正常邮件”严重,此时需要选择低 TN 值的模型。ROC 曲线是显示模型真正率和假正率之间折中的一种图形化方法,它引入了真正(True Positive, TP)、假负(False Negative, FN)、假正(False Positive, FP)、真负(True Negative, TN)等概念。
7. 线性回归
线性回归是中学就接触到的知识,一般使用最小二乘法求解,它通过最小化误差的平方($\sum_{i = 0}^{n}(y_i - \hat{y}_i)^2$)来寻找 $y = wx$ 的最佳参数 $w$。为了达到更好的拟合效果,可以使用局部加权线性回归。该算法给预测点附近的点赋予较高权重,远离的点赋予较低权重,常见的权重公式为($w(i) = exp(\frac{|x - x(i)|}{-2k^2})$),这时线性方程变成 $y = w_1w_2x$($w_1$ 为参数,$w_2$ 为权重)。
岭回归是一种改良的最小二乘估计法,它放弃了最小二乘法的无偏性,以损失部分信息、降低精度为代价,获得回归系数更符合实际、更可靠的回归方法,对病态数据的拟合效果优于最小二乘法。
8. 树回归
现实生活中很多问题是非线性的,难以用全局线性模型拟合数据。一种可行的方法是将数据集切分成易建模的数据,然后利用线性回归技术进行拟合。在这种切分方式下,树结构和回归法非常有用。分类回归树(CART)使用二元切分来处理连续型变量,其回归树的策略是:遍历所有的特征,对每个特征,遍历该特征里所有样例的取值,计算以这个取值作为切分时,生成的两个子数据集的平方误差,取子数据集平方误差最小的切分方式。
9. K - 均值聚类
K - 均值聚类算法是采用距离作为相似性评价指标的无监督聚类算法,两个对象的距离越近,相似度越大。算法过程如下:
- 随机选取 K 个数据作为初始质心;
- 测量数据到每个质心的距离,并归类到最近的质心所在的类;
- 重新计算各个类的质心;
- 迭代 2 - 3 步,直至新的质心变化小于指定阈值,算法结束。
K 均值算法的一个缺点是:如果初始质心选择不当,达到局部最优解后,不一定能达到全局最优解。二分 K 均值算法可以达到全局最优解,其主要思想是:首先将所有点作为一个簇,然后将该簇一分为二,之后不断将簇划分为两个簇,直到簇的数目等于用户给定的数目 k 为止。
10. Apriori 算法
关联分析旨在大规模数据集中寻找关系,例如确定商场里同时购买啤酒和尿布的人是否较多,以便在做优惠时决定是否将这两项捆绑销售。Apriori 算法是数据挖掘中挖掘关联规则的频繁项集算法,其核心是基于两阶段频集思想的递推算法。
假设有 0、1、2、3 共 4 种商品,要找出经常一起购买的组合。通过扫描所有数据,用某一组合的总数除以交易总数,得到支持度,支持度大于阈值即认为是频繁购买。但遍历 $2^N$ 次计算量过大,因此需要优化算法。根据 Apriori 原理:如果某个项是非频繁的,那么它的子项也是非频繁的,例如 {1, 3} 不频繁,那么 {1, 3, 4} 一定不频繁。利用这一原理可大大减少计算量。Apriori 算法使用逐层搜索的迭代方法,先找出频繁 1 - 项集的集合 $L_1$,$L_1$ 用于找频繁 2 - 项集的集合 $L_2$,$L_2$ 用于找 $L_3$,以此类推。
11. FP - growth 算法
Apriori 算法在产生频繁模式完全集前需要多次扫描数据,同时产生大量候选频繁集,导致时间和空间复杂度较大。FP - Growth 算法是一种只需遍历两次数据的计算频繁项算法。
FP - Growth 算法流程的基本思路是不断迭代 FP - tree 的构造和投影过程。对于每个频繁项,构造它的条件投影数据库和投影 FP - tree。对每个新构建的 FP - tree 重复这个过程,直到构造的新 FP - tree 为空,或者只包含一条路径。当构造的 FP - tree 为空时,其前缀即为频繁模式;当只包含一条路径时,通过枚举所有可能组合并与此树的前缀连接即可得到频繁模式。
12. 降维:PCA 算法
原始数据往往有很多特征,但这些特征不一定相互独立。通过某些算法降低数据的特征数,摒弃不重要的特征,可以降低算法开销。
PCA(Principal Component Analysis)是最常用的线性降维方法,它在原始空间中顺序地寻找一组相互正交的坐标轴,第一个轴是使方差最大的轴,第二个轴是在与第一个轴正交的平面中使方差最大的轴,第三个轴是在与第 1、2 个轴正交的平面中方差最大的轴。在 N 维空间中,我们可以找到 N 个这样的坐标轴,取前 r 个轴来近似这个空间,从而将 N 维空间压缩到 r 维空间,且选择的 r 个坐标轴能使空间压缩时数据的损失最小。
13. 降维:SVD
SVD(奇异值分解)是一种强大的降维工具,可利用它逼近矩阵并提取重要特征。通过保留矩阵 80% - 90% 的能力,就能得到重要特征并去除噪声。
SVD 给出一个与原始数据 A 同大小的对角矩阵 S(由 $\Sigma$ 的特征值组成),两个酉矩阵 U 和 V,且满足 $A = USV'$。若 A 为 m×n 阵,则 U 为 m×m 阵,V 为 n×n 阵。奇异值在 S 的对角线上,非负且按降序排列。对于方阵 $\Sigma$,有 $\Sigma = USV'$,$\Sigma\Sigma' = USV'VS'U' = U(\Sigma\Sigma')U'$,$\Sigma'\Sigma = VS'U'USV' = V(\Sigma'\Sigma)V'$,其中 U 是 $\Sigma\Sigma'$ 的特征向量矩阵,V 是 $\Sigma'\Sigma$ 的特征向量矩阵,都是 n×n 的矩阵。由于方阵的 SVD 相当于特征值分解,所以事实上 U = V,即 $\Sigma = USU'$,U 是特征向量组成的正交矩阵。我们的目的是从 n 维降维到 k 维,即选出这 n 个特征中最重要的 k 个,也就是选出特征值最大的 k 个。
14. 大数据:MapReduce
当数据量过大,一台机器无法计算时,可以使用分布式计算。一个典型的 MapReduce 分布式作业流程是:先使用 map 阶段并行处理数据,之后将这些数据在 Reduce 阶段合并。