机器学习:算法简介

K-近邻算法

  • 作用:分类算法
  • 优点:最简单、不需要训练、容易理解
  • 缺点:计算复杂度高、空间复杂度高
  • 原理:计算新数据与样本集中所有数据的欧式距离,提取距离最近的 K 个样本的标签,取 K 个样本里出现次数最多的标签,作为新数据的分类标签

决策树 - ID3

  • 作用:分类算法
  • 优点:计算复杂度不高、容易理解、可处理不相关特征
  • 缺点:可能会过度匹配、实现较复杂、存在特征值太多的问题
  • 原理:
     首先构建一颗树,每个非叶子节点代表一个特征,每个分叉代表特征的一个值,每个叶子节点代表一个分类,然后从根节点的特征开始,取新数据的特征值,根据值走相应的分叉,直到叶子节点,得出分类结果
     创建节点时如何判断选取哪个特征?遍历所有特征,计算选取每个特征后系统的信息熵,取使得信息熵最小(既最有序)的那个特征
     当剩下的数据分类都一样时创建叶子节点,当所有特征已用完时以剩下数据中数量最多的分类为结果创建叶子节点

朴素贝叶斯

  • 作用:分类算法
  • 优点:数据较少时仍有效、可以给出分类的概率估计
  • 缺点:不一定满足朴素要求既特征之间相互独立且同等重要、对于输入数据的准备方式较为敏感(新数据的 \(\small P(x_{i}|C)\) 必须能在样本数据中找到)
  • 原理:
     贝叶斯准则
        \(\small P(C|X) = P(X|C)*P(C)/P(X)\)
         其中
             \(\small P(C)\) 是分类 \(\small C\) 的概率
             \(\small P(X|C)\) 是分类 \(\small C\) 里出现 \(\small X\) 的概率
             \(\small P(X)\) 是特征 \(\small X\) 出现的概率
             \(\small P(C|X)\) 是出现特征 \(\small X\) 时属于分类 \(\small C\) 的概率
     由于 \(\small P(X)\) 是一样的,只通过计算 \(\small P(X|C)*P(C)\) 就可以比较不同的 \(\small P(C|X)\) 既特征 \(\small X\) 属于不同的分类 \(\small C\) 的概率,取概率大的那个作为分类结果
    \(\small P(X|C) = P(x_{0}|C)*P(x_{1}|C)*...*P(x_{n}|C)\) 其中每个 \(\small P(x_{i}|C)\) 以及 \(\small P(C)\) 都通过样本计算好

逻辑回归

  • 作用:二元分类算法
  • 优点:计算代价不高、易于理解和实现
  • 缺点:容易欠拟合、分类精度可能不高、只用于二元分类
  • 原理:
     线性回归函数
        \(\small z = f(X) = WX\)
         其中
             \(\small W\) 是回归系数
             \(\small X\) 是特征值
             \(\small W\)\(\small X\) 都是向量
         可展开为
             \(\small z = WX = w_{0}*x_{0} + w_{1*}*x_{1} + \cdot\cdot\cdot + w_{n}*x_{n}\)
         线性方程其实应该是
             \(\small z = WX + b\)
         为此这里固定 \(\small x_{0}=1\),其他 \(\small X\) 值才是特征值,而 \(\small w_{0} = b\)
         这样变成两个向量相乘方便计算
     逻辑回归函数
        \(\small y = g(z) = \frac{1}{1+e^{-z}}\)
         满足
             1. \(\small g(z)+g(-z)=1\)
             2. \(\small z=0\)\(\small y=0.5\)
             3. \(\small z=-2\)\(\small y=0.12\)
             4. \(\small z=2\)\(\small y=0.88\)
         这样在 Z 轴比较长的情况下看起来就像跳跃点为 0 的阶跃函数
     结合两个函数,对特征向量进行计算,结果大于 0.5 属于分类 1,小于 0.5 属于分类 0
     如何取得合适的 W?可以使用 SGD 随机梯度下降算法

支持向量机

  • 作用:二元分类算法
  • 优点:泛化错误率低、计算开销不大、结果易解释
  • 缺点:对参数调节和核函数的选择敏感、不加修改仅适用于二分类
  • 原理:
     线性可分
       如果可以用一条直线将二维数据集分成两类,则该数据集线性可分
       该直线称为分隔超平面,也就是分类的决策边界
       同理如果存在 N-1 维超平面可对 N 维数据集划分,则该数据集线性可分
     支持向量
       数据集可能有多个分隔超平面
       找到离分隔超平面最近的点,这些点离分隔超平面越远,分隔超平面的分类准确性越高
       这些点就是支持向量,SVM 就是要最大化支持向量到分隔面的距离
     寻找最大间隔
       分隔超平面可表示为
         \(\small w_{1}*x_{1} + w_{2}*x_{2} + \cdot\cdot\cdot + w_{n}*x_{n} + b = 0\)
       写成矩阵形式为
         \(\small W^{T}*X + b = 0\)   其中 WX 都是 (n,1) 矩阵
       通过 SMO 算法寻找最合适的 Wb
       对新数据计算 \(\small W^{T}*X + b\),大于 0 属分类 1,小于 0 属分类 -1
     核函数
       对于非线性可分的情况,比如某些二维数据无法用直线划分而是用圆划分
       可以将数据从原始空间映射到更高维度的特征空间
       对于有限维空间,一定存在这样一个高维空间使得数据线性可分
       用于映射的函数就被称为核函数,径向基函数是 SVM 常用的核函数
       这里用的径向基函数的高斯版本,该函数将数据映射到更高维的空间
       具体来说是映射到一个无穷维的空间
     感知机
       \(\small y=\left\{\begin{matrix}1&w_{1}*x_{1}+w_{2}*x_{2}+\cdot\cdot\cdot+w_{n}*x_{n}+b>0\\-1&w_{1}*x_{1}+w_{2}*x_{2}+\cdot\cdot\cdot+w_{n}*x_{n}+b<=0 \end{matrix}\right.\)
       
       这个模型也被称为感知机模型

集成算法

  • 作用:分类算法
  • 特点:泛化错误率低、易编码、可以应用在大部分分类器上、无参数调整、对离群点敏感
  • 原理:
     将多个不同的弱分类器组合成一个强分类器,这称为集成算法或者元算法
       集成算法有多种形式:
         1. 不同算法
         2. 同一算法不同设置
         3. 数据集不同部分分配给不同分类器
    baggingBootstrap aggregating,引导聚集算法,又称装袋算法)
       随机采样
         大小为 m 的数据集,每次取一个,然后放回
         共取 m 个形成和原数据集大小相等的新数据集,重复 S 次得到 S 个新数据集
         这样原始数据集中有些样本被重复采集,有些不会被采集
         将某个学习算法分别作用于 S 个数据集就得到了 S 个分类器
         对新数据分类时,用这 S 个分类器进行分类,结果最多的类别作为最后的分类
       随机森林
         和普通的 bagging 差不多,在其基础上做了一点改进
           1. 使用 S 个 CART 决策树作为弱学习器
           2. 假设样本特征数为 a,则每次生成树都是随机选择 a 中的 k 个特征
    boosting(提升算法)
       每个分类器根据已训练出的分类器的性能来进行训练
       通过关注被已有分类器错分的数据训练新的分类器
       分类结果基于所有分类器的加权求和
         \(\small f(x) = \sum_{i=1}^{n}(a_{i}*f_{i}(x))\)
       adaboost (Adaptive Boosting,自适应增强算法)
         对每个样本赋予一个权重
         训练分类器并计算该分类器的错误率,基于错误率计算该分类器的权重
         降低正确分类的样本的权重,提高错误分类的样本的权重,再次训练新的分类器
         迭代直到总错误率为 0 或分类器的数目达到指定值
         adaboost 可以应用于任意分类器,只要将该分类器改造成能够处理加权数据即可
       GBDT(梯度提升决策树)
         弱学习器通常使用 CART 回归树
         每棵树学的是之前所有树的结论和的残差
         比如 A 的年龄 18 岁,训练第一棵树时预测 12 岁,差 6 岁,即残差为 6 岁
         那么训练第二棵树时就把 A 的年龄 Y 设为 6 岁,以此类推
         预测值为所有树的预测值的和 \(\small Y = f_{1}(X) + f_{2}(X) + \cdot\cdot\cdot + f_{n}(X)\)
       xgboost (eXtreme Gradient Boosting,极限梯度提升算法)
         在 GBDT 基础上做了改进
         基学习器除了用 tree(gbtree),也可用线性分类器 (gblinear)
         目标函数引入了二阶导数使收敛更快,增加了正则项,避免了过拟合
         寻找分割点时能并行计算

线性回归

  • 作用:回归分析(预测连续型数值)
  • 优点:易于理解、计算简单
  • 缺点:对非线性数据的拟合不好
  • 原理:
     回归方程
        \(\small y = x_{1}*w_{1} + x_{2}*w_{2} + \cdot\cdot\cdot + x_{n}*w_{n} + b\)
       写成矩阵形式
        \(\small Y = X^{T}*W + b\)
       其中 XW 都是 (n,1) 矩阵,X 是输入数据,W 是回归系数,Y 是预测结果
       添加 \(\small x_{0} = 1\),取 \(\small w_{0} = b\),将式子改写为方便计算的形式
        \(\small Y = X^{T}*W\)
     计算使方差的和最小的 W
        \(\small W = (X^{T}*X)^{-1} * X^T * Y\)
     线性回归容易欠拟合,一个解决方法是局部加权线性回归
       给待预测点附近的每个点赋予一定的权重
       然后在这个子集上基于最小均方差来进行普通的回归
       注意:与 kNN 一样,这种算法每次预测均需要事先选取出对应的数据子集
     缩减法
       岭回归、lasso、前向逐步回归

CART - 分类回归树

  • 作用:既用于分类也用于回归分析
  • 特点:可以处理连续型数值、可以处理非线性数据、结果不易理解
  • 原理:
    线性回归无法拟合非线性数据
    ID3-决策树无法处理连续型数值,而且按特征切分后该特征将不会再起作用
    CART 将解决这些问题
     CART
       将数据集切分成很多份易建模的数据,然后利用线性回归来建模
       如果切分后仍然难以拟合就继续切分
       非叶子节点代表一个特征并记录用于切分的特征值
       节点最多两个分叉,将数据分为两个子集
       一边小于等于该特征值,一边大于该特征值
       这样就能处理连续型数值,且按特征切分后该特征仍然在数据集中
     如何决定特征和特征值
       遍历每个特征的每个值,按该特征值切分为两个子集
       计算每个子集的方差,取使得方差总和最小的特征和特征值
     何时决定构建叶子节点
       1. 数据集中所有数据的 Y 值相同
       2. 两个子集的均方差的和与原数据集的均方差相比没多少改进
       3. 切分后的子数据集太小
     构建叶子节点
       回归树:
         保存数据集的平均值
         当特征向量为 X 的数据来到该叶子节点后,直接返回该平均值
       模型树:
         保存数据集的线性回归函数的回归系数 W
         当特征向量为 X 的数据来到该叶子节点后,返回 XW 作为结果
     树剪枝
       节点过多可能导致过拟合,减少节点来避免过拟合称为剪枝(pruning)
       预剪枝:
         创建树过程中,切分后方差改进少或数据集小,则停止切分,这就是预剪枝
       后剪枝:
         用测试集对 CART 进行测试,取预测结果和实际结果的方差
         对比叶子节点合并后的预测结果和实际结果的方差
         合并后的方差更小则合并叶子节点,新的叶子节点继续看能不能合并

K-Mean(K-均值聚类)

  • 作用:无监督学习,用于聚类
  • 优点:容易实现、可能收敛到局部最小值
  • 缺点:在大规模数据集上收敛较慢
  • 原理:
     假设希望将数据分为 k 个簇,先初始化 k 个点作为簇中心点
     每个点的每个特征值是在所有数据该特征的最大值和最小值之间随机取一个
     对数据集的每个数据,计算与 k 个簇中心点的距离,归入距离最小的那个簇,并记录该距离
     更新 k 个簇中心点,每个点的每个特征值,都是该簇的所有数据在该特征上的平均值
     重新计算距离,重新划分簇,重复这个过程直到所有数据所属的簇都不再变化
     簇中心点随机初始化容易导致效果不好
     二分 K-Mean 算法
       先取一个簇中心点,特征值是所有数据的平均值,将所有数据分到该簇,并记录距离
       遍历每个簇,用普通的 K-Mean 算法将该簇分为两个簇
       计算两个簇总的方差和,计算剩下的簇总的方差和
       相加得到总和,取总和最小的那个簇的划分
       重复,每次增加一个簇,直到产生 k 个簇

Apriori(先验算法,关联规则挖掘算法)

  • 作用:Apriori 从数据集中寻找物品间的频繁项集、关联规则
  • 特点:易编码实现、大数据集上可能较慢
  • 原理:
     频繁项集
       比如顾客购买了 {葡萄酒、尿布、豆奶、莴苣}
       则可称 {葡萄酒,尿布, 豆奶}、{豆奶} 等集合为项集
       如果一个项集在所有购买记录中达到一定比例则称为频繁项集
     Apriori 原理
       如果某个项集是频繁的,那么它的所有子集也是频繁的
       反过来说如果一个项集是非频繁集,那么它的所有超集也是非频繁的
       先把所有记录的每个项都取出来,得到集合 \(\small C_{1}\),集合的每个元素是只有单个项的项集
       取\(\small C_{1}\)中出现次数达到阀值的项集记为\(\small L_{1}\)\(\small L_{1}\)的每个元素是只有单个项的频繁项集
       基于\(\small L_{1}\)\(\small C_{2}\)\(\small C_{2}\)每个元素是有两个项的项集,且该项集是\(\small L_{1}\)的某个项集的超集
       取\(\small C_{2}\)中出现次数达到阀值的项集记为\(\small L_{2}\)\(\small L_{2}\)的每个元素是有两个项的频繁项集
       重复该过程直到无法构造新的 \(\small C_{k}\)\(\small L_{k}\)
     关联规则
       物品之间的关联性,比如如果购买尿布的人经常会同时购买葡萄酒
       那么可以说存在 {尿布}->{葡萄酒} 的关联规则
       基于频繁项集 L 计算各个关联性的概率,达到要求的既为关联规则

FP-growth(Frequent Pattern Growth,用于发现频繁项集)

  • 作用:比 Apriori 更高效的发现频繁项集
  • 特点:快于 Apriori、实现比较困难
  • 原理:
     遍历所有记录的所有项,计算每个单项的出现次数(第一次遍历)
     取达到阀值的单项,记为频繁项集 \(\small L_{1}\),并记录每个单项的总的出现次数
     构建 FP 树
       空集作为树的根节点
       遍历每一条记录(第二次遍历)
         取该记录中存在于\(\small L_{1}\)的单项,并按\(\small L_{1}\)记录的总次数降序排序
         取第一个既次数最多的单项
         如果根节点没有该单项的子节点,则创建子节点并记录该记录出现的次数
         如果有相应的子节点则只增加计数
         再取第二个单项,同样,将其作为第一个单项的子节点,或对已有节点增加计数
         以此类推创建其他节点
       创建 header 链接所有相同元素节点
     从 FP 树寻找频繁项集
       从根节点到叶子节点的每条路径上的元素可以任意组合(该路径必须包括根节点)
       该组合中最下层节点的数字就是该组合出现的次数,达到阀值的既为频繁项集

协同过滤(Collaborative Filtering,推荐算法)

  • 作用:用于推荐用户可能感兴趣的内容
  • 特点:不关心物品属性而是按照所有用户观点的相似度来计算
  • 原理:
     取目标用户未评分过的物品 unratedItems
     遍历 unratedItems 的每个物品 item,预测该用户对 item 的评分

     预测方法 1:
       对每个物品 j,取该用户对 j 的评分 \(\small rating\),没有评分则取下一个
       有则找出所有既对 item 有评分,又对 j 有评分的用户
       计算这些用户对 item 评分和对 j 评分的相似度 \(\small sim\)
       累加相似度
         \(\small simTotal = simTotal + sim\)
       累加评分
         \(\small ratSimTotal = ratSimTotal + sim * rating\)
       所有物品计算完毕,返回预测分数
         \(\small est = ratSimTotal/simTotal\)
       
     预测方法 2:
       通过 \(\small np.linalg.svd(dataMat)\) 求解数据集的奇异值矩阵,取 r 个最大的奇异值
       用新的奇异值矩阵将原数据集转换为只有 r 个最重要的用户信息的新数据集
       对每个物品 j,取该用户对 j 的评分 \(\small rating\),没有评分则取下一个
       有则计算 r 个用户对 j 和 item 的评分的相似度 \(\small sim\)
       累加相似度
         \(\small simTotal = simTotal + sim\)
       累加评分
         \(\small ratSimTotal = ratSimTotal + sim * rating\)
       所有物品计算完毕,返回预测分数
         \(\small est = ratSimTotal/simTotal\)

     取评分最高的 N 个物品推荐给用户
     相似度的计算主要有:欧氏距离、皮尔逊相关系数、余弦相似度

极大似然估计(Maximum Likelihood Estimate,MLE)

  • 由于样本数据,是实实在在发生的数据,有理由相信该样本出现的概率本来就比较大,极大似然估计假设该样本出现的概率是最大的,然后通过该样本寻找一组参数,该参数使得该样本出现的概率最大
  • 比如:班里有 50 个男生,50 个女生,我们拥有所有男生的身高数据,也拥有所有女生的身高数据,假定男生的身高服从正态分布,女生的身高服从另一个正态分布,这时可以用极大似然法,通过 50 个男生和 50 个女生的样本来估计这两个正态分布的参数,该参数使得样本数据出现的概率最大

EM 算法(Expectation Maximization 期望最大化)

  • EM 是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计
  • 比如:班里有 100 个学生,我们拥有所有人的身高数据,但不知道哪些是男生,哪些是女生,未知的性别就是隐变量
     1. 先自己假设男生的正态分布的参数、女生的正态分布的参数
     2. 依据这两个正态分布,判断每个学生数据
     3. 是男生的概率大就假定是男生,是女生的概率大就假定是女生
     4. 依据求出的男女生数据,再通过极大似然估计,再计算两个正态分布的参数
     5. 重复第 2 步和第 3 步,其中第 2 步又被称为 E Step,第 3 步又被称为 M Step
     6. 数学上可以证明这样做可以靠近正确值,但不一定能得到正确值




猜你喜欢

转载自www.cnblogs.com/moonlight-lin/p/12286039.html