机器学习学习笔记

python机器学习

  1. 图灵测试

    一个人和一台机器,二者在隔离的情况下,机器通过一些装置向被测试者随意提问

    考察人能否识别出对面是人还是机器

    如果有超过30%的人不能确定对方身份,则这台机器通过测试 —— 具有人工智能

  2. 达特茅斯会议

    1956 人工智能元年

  3. 人工智能 –> 机器学习 –> 深度学习

    机器学习是人工智能的一个实现途径

    深度学习是机器学习中,由神经网络方法发展而来

  4. 人工智能主要分支介绍

    通讯 – 计算机视觉

    感知 – 自然语言处理

    行动 – 机器人

    • 计算机视觉(CV):

      指机器感知环境的能力

      经典任务有:图像形成、图像处理、图像提取、图像的三维推理…人脸识别和物体检测比较成熟

    • 自然语言处理(NLP):

      覆盖 文本挖掘/分类、机器翻译、语音识别…

    • 机器人(Robotics):

      研究机器人设计、制造、应用。关注它们的计算机系统、传感反馈和信息处理

  5. 人工智能必备三要素

    • 数据
    • 算法
    • 算力
  6. CPU与GPU简单对比

    image-20231226163216184

    CPU用于处理IO密集+计算密集,GPU纯粹为了计算

    • 内部缓存空间:CPU > GPU

    • 线程数:GPU > CPU

    • CPU需要面对各种不同的数据类型、操作各种逻辑判断、分支跳转、中断…这导致CPU内部结构异常复杂;而GPU面对的是类型高度统一的、相互没有依赖的大规模数据,计算过程也很纯粹

    • GPU采用数量众多的计算单元和超长的流水线,只有简单的控制逻辑,并省略了cache,而CPU不仅被cache占了大量空间,还有复杂的控制逻辑和许多优化电路,为之省去了部分计算能力

      image-20231226164407095

  7. 什么类型的程序适合在GPU上运行?

    1. 计算密集 - 指大部分运行时间花在了寄存器的运算上
    2. 易于并行的程序 - GPU内部是一种SIMD(Single Instruction Multiple Data)架构,内部有成百上千个核,每个核在同一时间能做独立的事情

    image-20231226164355331

  8. 特征工程:

    使用专业技巧处理数据,使得特征能够被机器识别 / 发挥更好的作用

  9. 机器学习 – 算法分类

    基本分类:

    • 监督学习
    • 无监督学习
    • 半监督学习
    • 强化学习
  10. 监督学习

    定义:

    输入数据是由输入特征值和目标值所组成

    • 连续的、函数的输出 —— 回归
    • 离散的输出 —— 分类

    回归问题

    分类问题

  11. 无监督学习

    定义:

    输入数据是由输入特征值组成,没有被标记,也没用确定的结果

    需要根据样本间的相似性对样本进行分类/聚类Clustering,试图使得类内的差距最小化、类间的差距最大化

  12. 半监督学习

    训练集同时包括有标记样本和未标记样本

    目的:减少工作量,其中一部分数据不用人为标记

  13. 强化学习

    动态过程 —— 前一步数据的输出是下一步数据的输入

    智能体(agent)在与环境的交互中学习如何做出决策以达到最大化某种累积奖励的目标。

    四要素:

    • Agent:进行决策
    • Action:具体的决策
    • Environment:Agent与其进行交互的外部系统,环境对Agent的行为做出响应,并提供奖励或惩罚
    • Reward:数值反馈,目的是最大化积累奖励来学习优化策略
  14. 没有免费午餐定理

    指:机器学习中,对于同一种问题的不同算法都有好有劣,有的算法在解决这种问题的某个场景时十分精妙,但代价就是在解决另一场景的问题会十分糟糕

    即:对于所有可能问题的集合,所有算法的平均性能都类似

    内含:针对具体的学习问题选取合适的算法:根据算法设计的归纳偏好 / 假设

  15. 奥卡姆剃刀原则

    贪心咯

    是一种科学和哲学原则:

    指:在解释现象是,应该采用最简单的理论或解释

  16. 极大似然法

    思路:基于观测到的样本数据,试图找到最能观测到数据出现的概率最大的参数值

    极大似然法根据结果反推条件,很贴近人类思维:异常已经发生了,想想到底之前发生了什么最有可能导致这个异常呢?

  17. 模型评估与选择

    • 模型?

      机器学习所做的事就是:

      1. 研究一种从已有数据中产生模型的算法 —— 学习算法

      2. 从已有数据 / 训练样本中,找到适用于所有潜在样本的 普遍规律

      学习算法

      这个学习算法接受已有的数据,形成一个模型[工厂],当有新数据产生时,模型给出相应的计算结果

      普遍规律

      所谓过拟合,就是把样本自身特征误以为是所有潜在样本的普遍规律

      所谓欠拟合,就是没有关注到样本内的普遍性质 / 准普遍规律

    • 样本 & 样本空间

      机器学习中,把一个样本当做一个向量,整个样本空间当做一个高维空间

      将原本数之间的关系问题在空间内尝试解决

    • 场景1

      如何将1000个样本合理分成训练集和测试集?

      • 如果预先直到样本的分布(比如300正,700负 或者 200老人,500青年,300小孩…)应该理性地选择等比例分出测试集
      • 那怎么在200个老人中选出200*30%的测试样本呢?随即咯
      • 随机就意味着结果有偶然性,降低偶然事件概率的策略:多次重复随机

      于是给出的策略是:进行一百次随即划分,每个都来实验,将预测结果平均,作为最后的结果

      K折交叉验证的优化思路也类似

      解决方案2:

      自助法:

      基本思路是:从m个样本中有放回地抽取m次,其中有大约36%的样本没有被抽到,其他64%的样本中有的样本存在多次重复,使用这个抽取出来的样本,既能留下36%测试集,也是随机抽的,还能有m个训练集

      感觉不靠谱

    • 场景2:

      如何调参?

      1. 暴力遍历

      2. 限定范围,确认步长的遍历

      3. 随即搜索,满意即可

      4. 在多个变量的场景下可能使用网格搜索

      5. 贝叶斯优化:

        整体感觉是通过上次的结果反馈给下次调优

        具体是:

        先预设了一个先验模型

        通过此模型决定下次怎么优化

        优化结果反馈给模型进行迭代

      6. 绘制学习曲线,观测变化决定下一步

算法

  1. K近邻算法KNN

    通过你的邻居来判断你的类别是什么

    是根据所有已知类别的实例类型,来判断位置实例

    方法:

    • 分类任务:投票法
    • 回归任务:平均法 / 加权平均

    思路:

    k表示需要多少近邻来判断自身身份,当k = 1,在点周围找出最近的一个点,根据此点的数据决定自身属性...

    距离度量:

    1. 欧氏距离
    2. 余弦值距离
    3. 相关度correlation
    4. 曼哈顿距离

    缺点:

    1. 算法的复杂度较高

      在每个未知点计算最近邻居时都需要遍历求取和所有已知点的距离

    2. 当其样本分布不平衡时,比如其中一类样本过大,新的未知实例容易被归类为这个主导样本

    维数灾难问题:

    问题描述:在高维空间中,许多事物的行为迥然不同。例如:在一个10000维的单位超立方体中随机选取一个点,这个点离边界的距离小于0。001的概率是99.999999% —— 高维超立方体中大多数点都非常接近边界

    问题描述:当维数不断增大,内接球的体积会趋于0,而超立方体的体积还是1 —— 大部分空间都是边缘

    导致在模型训练中:大部分数据都位于定义的特征空间立方体的拐角处

    问题描述:为了避免一个点附近没有参照物;当数据维度很高时,KNN算法对于伊普西隆的选取也不能太低;假如一维样本空间边长 = 1,伊普西隆 = 0.01,则要求至少1000个样本分布在空间内 ; 假如是20维样本空间边长 = 1,伊普西隆 = 0.01,则要求至少1000的20次方个样本

    问题描述:随着维度增高,两点间平均距离会增大(由于点分布越来越靠近边缘,导致距离越来越大)就导致伊普西隆的选取不能是定死的 / 样本点和实例之间的距离越来越大;但逆天的是:当数据是100w维时,平均距离约等于408.25

    降维方法:

    1. 直接降维:直接删除某些属性 例如LASSO

    2. 线性降维:例如PCA

    3. 非线性降维:

      KPCA

      流形降维

      IsoMap

      LLE

    4. 分类

      • 投影 Projection

        直接把三位点分布投影到二维平面

      • 流形学习 manifold Learning

        按某种流的方式扫描+展开空间内的点分布

  2. 线性回归

    • 代价函数(Cost Function):

      自变量是模型中要估计的参数,因变量是要最小化的代价

      当只有一个参数要估计时,常常是:

      image-20231226202026309

      当有两个参数要估计时:

      image-20231226202047985

    • 梯度下降法

      用于优化代价函数的一个优化算法

      思路:

      • 给定一个初始位置,在每个位置判断梯度最小的方向为下降方向;即代价函数减少最快的方向

      考虑的问题:

      • 学习率:确定方向后,步长如何选择

      问题:

      • 可能会陷入局部最小值

      过程:

      每一步通过偏导确认在各个坐标轴方向的程度,再在这个方向上推进α

      image-20231226203800018

    • 标准方程法:

      直接将代价函数对sita列向量求导

      image-20231226230724137

      image-20231226230847284

      对比:

      • 梯度下降法:

        缺点:

        需要选择合适的学习率

        需要迭代多个周期

        只能得到最优解的近似值

        优点:

        当特征值非常多时也能行

      • 标准方程法:

        优点:

        不需要学习率

        不需要迭代

        可以得到全局最优解

        缺点:

        需要计算(X的转置*X)的逆

        时间复杂度较高

    • 特征缩放:

      当多个特征间取值范围的数量级差别很大,导致梯度下降法无法选择中间合适的学习率

      就是标准化

    • 交叉验证法:

      某些时刻由于样本数目不多,分成训练集和测试集比较寒酸

      交叉验证:试图用样本中能训练的都训练,同时还要能分出测试集

      将样本分成十份,一共十波训练+测试,每一波用不同的测试集,十波得到的结果(测试集测试得到的误差)取平均数作为最后结果

    • 过拟合:

      image-20231226232537255

      image-20231226232819053

      欠拟合:拟合程度不足

      过拟合:

      • 当模型在训练集表现很好,测试集很拉 – 可能过拟合
      • 模型过分地适应了训练数据的噪声和细节,而失去了对新数据的泛化能力
      • 过拟合通常发生在模型具有过多的参数或复杂度过高的情况下。

      避免过拟合:

      1. 减少样本特征
      2. 增加数据量
      3. 正则化
    • 正则化

      在模型的损失函数中添加额外项来惩罚模型复杂度

      image-20231226233507573

    • 岭回归 Ridge Regression

      原本多元回归方案中:

      image-20231226234123617

      但当数据的特征比样本数量还多时,(X转置*X)不满秩 –> 不可逆

      所以提出岭回归:但需要解释为什么可以加这个对角矩阵

      image-20231226234259467

      岭回归其实来自正则化(双方都是为了避免过多解释变量)

      image-20231226234439385

      • 但是岭回归改变了代价函数,导致是有偏估计
      • 岭系数λ怎么选择:
        • 较大的λ会导致模型参数较少,比较简单,但也就导致拟合优度较低
    • LASSO回归算法:

      image-20231228102636834

      λ的限制作用:

      • 整个代价函数要最小化,当λ较大就限制了θ较小,λ较小即允许θ变大

        image-20231228103123526

        不同惩罚函数,λ允许θ变化范围

  3. 多元线性回归

    思路类似一元线性回归

    构造线性函数,构造代价函数,梯度下降求解极小值对应的目标参数

  4. 逻辑回归 / 回归用于分类

    用来处理分类问题:是否为垃圾邮件,判断某人信用…

    逻辑回归预测函数:

    image-20231227145447155

    其中θ转X表示多个X的线性组合 –> 加权求和,决定了如何评价X

    对数几率函数:

    image-20231230202215608

    此函数有点东西

    ln(y/1-y) = θX ==等价于== y = g(θX)

    其中y在 0到1,表示X参与计算后为正的概率,1-y表示为负的概率

    由ln(y/1-y) = θX 积回去得到g(x),恰巧长这个样子——在0到1

    此函数估计的y:可以直接得到预测是某一类的概率;提供概率而不是直接的判定结果往往携带更多信息

    决策边界:

    在此边界上的点都恰好使得g(x) == 0.5 即θX == 0

    简单的评价函数:

    image-20231227150132642

    复杂的评价函数:

    image-20231227150235335

    新代价函数:

    image-20231228104300647

    ==>

    image-20231228105101669

    image-20231228104840345

    原本最小回归的代价函数,可能并非凸函数,导致不适合梯度下降

image-20231228105940565

本身无论θX怎样,h(x)都是凸函数,外加log后也能保证是凸函数 – 凸优化问题

原本外层没包很多层…

新代价函数:

  • 天生适应逻辑回归函数 —— 考察回归结果和0 / 1的差距

  • 相当于原本由(h(x) - x)^2描述,变成由log(h(x))描述

分类结果评估:

正确率、召回率、F值

image-20231228110754260

正确率 Precision:一次操作中,命中目标群体的概率

召回率 Recall:一次操作中,命中目标群体的范围

F值:二者均衡

  • 通常:提高正确率会降低召回率;提高召回率会降低正确率

    暂不明

  • 极端情况:当只搜索出一个结果但是正确的,P为1.R巨低;当需要把所有目标都检索出来,R很高,但对P需求更高


分类

  1. 线性判别

    思路:

    对于在高维中离散的点,怎么能合理的在低位观察并区分?

    保留尽可能多的信息(方差最大),将点投影到低维;在低维进行观测

  2. 多分类问题:

    要将离散的点分成多个类,直接的想法就是怎么转化成多个二分类问题

    1. 一对一

      一共有n个类,每次尝试将样本分类成这两个类,一共会分n(n-1)/2次;

      一个点会被分n(n-1)/2次,会到达n(n-1)/2个模型中,其中出现次数最多的一个模型就是它的归属

      有点暴力

    2. 一对多

      一共有n个类,每次尝试将其中一个类和其余所有类分成两类,一共会分n次;

      一个点会被分n次,其中分到哪个单独的类中就属于哪个,一个样本点属于多个,要么根据置信度,要么设置偏好;一个样本点一个都不属于,可以另外处理:标记unKnown

      人类正常逻辑,但也有点暴力

    3. 多对多

      我选择国王试酒算法

  3. 神经网络

    深度学习

    如何理解深度学习?

    整个学习过程就是为了准确预测输入值对应的输出,即拟合一条直线

    每个神经元接收输入【以变量形式】,经过加权叠加后形成新的变量 / 曲线(可能还需要一次sigmoid标准化一下),传递给下一个神经元

    所谓深度学习,意思就是任何一个传入的变量都可以再递归探索其深度构建

    • 单层感知器:

      image-20231228125032929

      感知器学习规则:

      • 感知器接受输入X,输出y;y为sign函数

        image-20231228125137157
      • 模型本身用来评判某个样本的属性是否满足要求,在训练过程中是通过有标记的样本进行训练

        已知X,已知Y,如何确定W使得感知器能够较好的将不同类型的X分类 ——> 就是估计加权比例

      • 模型提出一种算法:

        根据当前的预测值y’和真实值Y的差距,迭代更新W;直到预测值等于真实值

        更新W的速度目前人为设置,添加了参数 -- 学习率

  4. BP神经网络

    误差反向传播过程

    以上简单神经网络通过判断预测值和真实值是否一致来实现W的调优

    当神经网络模型由多层构成,只有最后一层才有y的真实值

    于是要么设法正向调整输入靠近输出,要么根据输出回馈输入

    BP反向传播即:根据最后一层的ΔWk(误差),一层一层反向计算ΔWk-1 … ΔW1 完成对输入层的调整

    最后一层:

    image-20231228142907653 image-20231228142919677

    根据预测值和真实值的差别算出学习信号,准备向上传递

    前几层:

    image-20231228143051839

    根据上层的学习信号和本层的某些信息归纳得出

    在每层误差ΔW调整时,都乘了当前层激活函数的导数,当激活函数是传统sigmoid时,导数很容易很小,导致前面多层ΔW太小无法实现调整

    即:对层的高低有限制,只有五层以内可以实现有效调整

    具体流程:输出层的某个结果的误差对上层某个影响因素求偏导(通过链式),表示输出层和隐藏层一个影响关系的误差的梯度方向,隐藏层按此方向更新步长为学习率的误差;

    • 激活函数

      1. Sigmoid函数

        image-20231228142358464

      2. 双曲正切Tanh函数和SoftSign

        image-20231228142439467

      3. ReLU函数

        image-20231228142636263

  5. 决策树

    比较适合分析离散数据、对于连续数据需要先转变成离散数据

    模拟人类思维:分治【将高层的问题分到底层】| 递归【高层只关注以高层属性怎么分类,剩下的子问题交给低层】

    • 算法发展:

      ID3 –> C4.5 –> CART

    • 决策树的构建需要考虑的问题:哪个属性先考虑(在树的上层);是否有些属性不用在考虑

      通过信息熵解释针对某个属性的分类有效程度 – 最大化信息增益

    • 信息熵

      信息量的大小 == 其能消除的不确定性的大小

      image-20231228161832640

      公式的理性理解:为了使信息熵最小,应该让概率紧凑分不到一个事件里[log一个大数并不会太大],而不是多个事件[直接相加比log内相加大很多]

      image-20231228161847852

    • ID3过程:

      在多个具有标记的样本的数据集中(14个),如果只知道有9个1,5个0,则当前的信息熵为:

      image-20231228162448353

      尝试用样本属性信息降低信息熵

      • 用age初步分类:

        尝试用年龄分布为youth、middle_aged、senior区分样本集 —— 确定年龄,计算信息熵;最理想的情况是:所有youth全是1,所有其他年龄都是0,即在年龄确认时信息熵为0;

        image-20231228163309059

      • 计算信息增益:

        image-20231228163331400

  • C4.5算法:

    在ID3中,计算信息增益的方法更倾向于首先选择因子数较多的变量 [通过log后求和的弊端]

    C4.5的改进方法 —— 同时除以增益率 【类似标准化】

    image-20231228164020460

  • CART算法

    CART算法 递归地构建二叉树,使用基尼系数最小化来选择具体特征

    • 基尼系数:

      1减去所有可能性的概率的平方 = 交叉项求和

      == 用于刻画可能性的分散情况

      1. 整个样本集D
      image-20231228164913241
      1. 由A分类后的D:

        image-20231228165738655

      2. 分类前后信息增益

        image-20231228165758154
  • 剪枝处理:

    当决策树层数太高/最高 即把所有属性遍历访问完[就相当于递归了所有属性],整棵树就只适合训练集的样本

    剪枝处理就是将没必要 / 不显著的 /太刻意的分支去掉 – 因为决策树的递归遍历是有优先级的

  1. 贝叶斯算法

    • 争论:

      古典统计学派 and 贝叶斯学派

      • 古典统计学派认为概率来自统计,需要通过统计来得到概率;在统计之前不应该存在可用的概率信息
      • 贝叶斯学派 引入先验信息;认为有些情况下,概率信息来自统计操作之外

      矛盾在于是否承认先验概率

    • 贝叶斯定理:

      如何交换条件概率中的条件和结果

      image-20231228172109089

      其中:

      • P(H)表示H发生的先验概率

        一封邮件是垃圾邮件的概率

      • P(X)表示X发生的先验概率

        一封邮件中有“办证”的概率

      • P(X|H)表示在H发生的情况下,X发生的概率;

        是先验概率 — 需要预先知道

        一封垃圾邮件中有“办证”的概率【事先对垃圾邮件便利统计过】

      • P(H|X)表示:当某个样本满足X条件,有多大概率将样本判定成H —— 是要计算得到的后验概率

        有“办证”的邮件是垃圾邮件的概率

      作用:计算某个属性确定后,有多少概率将其判定为1 / 0


      但是在应用场景下,往往不光根据一个H来判断X,而可能有多个H,按照上述思路,当X内含不同:例如X指“办证”、“办证+理财”、“办证+理财+金铲铲”都需要重新统计P(X),以及P(X|H);

      • 一种直观的思路是:当X指的内容相互独立,P(X)变成变成可插拔的P(X1)P(X2)…;P(X|H)变成P(X1|H)P(X2|H)…

        贝叶斯分类器:

        若样本x有n个特征,用(x_{1},x_{2},...,x_{n})表示,

        将其分到类y_k的可能性为:

        P(y_{k}|x_{1},x_{2},...,x_{n}) = P(y_{k})\prod_{i=1}^{n}P(x_{i}|y_{k})

  • 朴素贝叶斯:

    假设:特征X1、X2、X3…之间都是相互独立的

    image-20231228173727913

    由于事件相互独立,可以将原本X1、X2…理论上合并成一个事件,在计算时分成多个小事件

    具体模型:

    • 多项式模型

      解释P(X|H)时,当X的子事件有重复时,保留重复

      用于文本分类 —— 保留单词出现的次数,便于更准确的分类

      例如:当通过判断内含“代开发票,增值税发票,正规发票“的是不是垃圾邮件时,首先分词为(代开、发票、增值税、发票、正规、发票);

      计算P(X|H):表示一封垃圾邮件,必须有以上六个词才纳入统计

      则先验概率p(c) = 类c下单词总数 / 整个训练样本的单词总数

      类条件概率 p(tk|c) = (类c下单词tk在各个文档出现的数量之和+1) / (类c下单词总数 + |V|)

    • 伯努利模型

      每个特征是布尔类型,表示某个特征在文本中有无出现

      例如:计算P(X|H):表示一封垃圾邮件,只要有(代开、发票、增值税、正规)即可;

      先验概率p(c)=类c下文档总数/整个训练样本的文档总数

      类条件概率p(tk|c)=类c下包含单词tk的文档总数/类c下的文档总数+2

    • 混合模型

      在计算句子概率时,不考虑重复词的次数,但在同居词语的概率时,考虑重复词的次数

    • 高斯模型

      当特征是连续变量的时候,如果用多项式模型就会导致X的子事件很多,此时采用高斯模型

      高斯模型假设某个特征的分布满足高斯分布(μ和σ需要计算得出),于是可以单独计算某一点的概率,也可以计算区间的概率积分

      image-20231228201316787
  1. 聚类算法

    1. K-Means

      表示要将输入的样本划分成K个聚类

      要求:同一类中的对象相似度高、不同类中的对象相似度低

      • 算法思想:

        以空间中k个点为中心进行聚类:对最靠近它们的对象归类,通过迭代的方法,逐次更新各个聚类的中心位置,直到得到最好的聚类结果

        迭代步骤:初始位置时将所有点分配到距离最近的中心,在每个聚类中计算所有点的重心作为新的中心,再将所有点分配到最近的中心...知道聚类结果不再发生变化

        感觉每一步都在尝试靠近点更密集的位置

      • 问题:

        1. 对K个初始质心的选择比较敏感,容易陷入局部最小值

          即:整个过程的动态性全部依赖于:有点可以再聚类之间穿梭,穿梭后才能改变重心,改变重心才能改中心,才能再去吸引新的点进来

          循环停止的标准不是一个可量化的指标,就可呢导致停在意想不到的位置

          有点死锁的感觉,自己把自己的锁占用了 - 才需要可重入锁

        2. K值的选取比较麻烦

        3. 模型的局限性:非球状数据分布难以刻画

          image-20231228204119330

        4. 数据比较大的时候,收敛会比较慢

          解决方案:

          mini-banch-K-means: 先用小样本测测聚类

  2. DBSCAN算法

    基于密度的算法:将足够高密度的区域划分为簇,可以发现任何形状的聚类

    基本概念:

    1. 伊普西隆-邻域:

      给定对象半径伊普西隆内的区域

    2. 核心对象:

      如果给定伊普西隆邻域内样本点数大于等于Minpoints,则称该对象为核心对象

    3. 直接密度可达:

      给定一个对象集合D,如果P在q的邻域内,且Q是一个和相对性,则说对象p从q出发是直接密度可达的

    4. 密度可达:

      对于集合D,若存在一个对象链p1,p2,…pn=p,其中pi是从pi+1关于伊普西隆和Minpoints的直接密度可达,则称p是从q关于伊普西隆和minpoints的密度可达

    5. 密度相连:

      集合D存在点o,使得点p,q是从o关于伊普西隆和minpoints密度可达的,则点p,q是关于伊普西隆和minpoints密度相连的

    步骤:

    1. 指定合适的伊普西隆和minpoints
    2. 计算所有的样本点,如果点p的伊普西隆邻域内有超过minpoints个点,则创建一个以p为核心点的新簇
    3. 反复寻找这些和谐的的直接密度可达(或密度可达)的点,将其加入到相应的簇;对于核心点间发生密度相连,则合并两个簇
    4. 当没有新的点可以被添加到任何簇,算法结束

    感觉:

    DBSCAN尊重每个相邻足够近的点,即使不是球状,也能通过中间相邻将一个簇连接起来

    目标是区分这些簇:最近的两点间也有距离

  3. PCA 主成分分析

    思想:将高维的样本点投影到低维,投影的策略是:尽可能使得方差最大【投影操作牺牲的信息量越少】

    第一个主成分找到方差最大的方向,第二个主成分寻找方差次大,并且与第一个主成分正交的方向【正交是为了降低相关性】

    根据两个方向确认一个平面,即可投影


    KPCA

    问题描述:

    假如在一个平面中两类样本点比较难以区分

    但如果将这些点投影到三维空间:尝试根据Z轴的数值区分这些点

    则有可能在三维空间被一个平面完美分离

    image-20231229200138200

    核心概念:

    1. 核函数:

      核函数用于将原始数据映射到一个高维空间中;

      常见核函数包括:线性核、多项式核、高斯核等,不同核函数对数据进行不同类别的变换,实现不同降维效果

    2. 核函数参数:

      一般通过交叉验证等方法来确认最佳参数

  4. SVM支持向量机

    SVM寻找区分两类的超平面(hyper plane),使得边际(margin)最大

    image-20231229081546605

    ==>如何量化中间的margin

    先将两条虚线标准化成右侧为1,可以统一用||W||刻画

    image-20231229082740217

    求解步骤:

    1. 转化成凸优化问题:

      image-20231229085509872

    2. 拉格朗日乘子法:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      # 细说拉格朗日常数法:

      - 基本思想
      将约束条件引入目标函数,通过引入拉格朗日乘子来构建新的函数,通过对这个新函数求导,找到使其梯度为0的点,从而得到原问题的最优解

      - 可行性证明
      > 二维为例
      目标函数:f(x,y) = x+y;
      s.t.:x2+y2 - 1 = 0;
      目标函数和等式约束都可以用x,y的梯度来刻画其值的变化
      求解的目的就是:在s.t.梯度垂直方向移动过程中,一直沿着 目标函数梯度负方向移到尽头
      `注意搞明白活动的点具有活动的s.t.的梯度方向,全局拥有唯 一的目标函数梯度方向`
      ---
      于是:感性证明就是:
      只有当目标函数的梯度和s.t.的梯度共线时才能找到极值
      于是构建函数
      - L(x,λ) = f(x) + λg(x)
      求解方程:
      - L(x,λ)对x的偏导 --> 梯度相同
      - L(x,λ)对λ的偏导 --> 约束条件成立

      - 感觉就是:整个函数是为了构建两个偏导方程组的
      关键问题是:在等式约束下如何求解原问题极值?在无条件约束时 是偏导 == 0,有约束时是偏导 == 约束条件的偏导【此时只有 f(x)偏导 == 0并不够,必须用约束条件限制,而怎么限制?就是约束条件始终 == 0,即要求x......】

      转化成无约束问题

      image-20231229085539335

    3. 转化成对偶问题:

      image-20231229085701904

      其中:max min 表示:w和b的取值使得原式最小,a的值使得原式最大

    4. min问题通过求偏导解出w & b

      image-20231229085916801

    5. max问题要求解α值

      使用SMP算法

    假如样本线性不可分?

    即在两类的内部都有其他类的一些点(误差点),此时怎么划分出两个超平面边际?

    1. 尝试让每个边界变得松弛——移动到包括误差点

    2. 代价函数中添加惩罚函数,惩罚边界的移动距离

      寻找刚好包括自身类所有点的超平面

    image-20231229091734973
  5. 集成学习

    通过多个学习器完成学习任务,为了获得比单一学习器更优越的泛化性能

    image-20231229102016483

    每个学习器结构:

    • 个体学习器:学习器中只是用一种算法
    • 组件学习器:学习器中使用异质的算法

    集成学习集成多个学习器的原则:

    好而不同、少数服从多数

    ​ 场景1:好而不同、由多数的成功分类掩盖少数失败分类

    ​ image-20231229102424813

    ​ 场景2:好但相同、无法取长补短

    ​ image-20231229102446932

    ​ 场景3:差且不同、每个学习器自身分类太差,反而影响了别的学习器

    ​ image-20231229102659007

    什么是好模型?只要自身的分类/预测准确率大于50%,且和现有的学习机不重合;就可以给系统提高一点正确率

    解释:

    假设原本有500个准确率为60%的学习机,现在考虑能否添加一个新的学习率为51%的学习机

    原本模型准确率:

    image-20231229105245581

    新模型准确率:

    1
    0.51*(251个可能性求和)+0.49*(250个可能性求和)

    251表示:新模型对了,后来只至少250个模型也是对的(500-250+1)

    250表示:新模型错了,后台需要至少251个模型是对的

    于是:明显比原本大

    分类:

    • 个体学习器之间存在强依赖关系 –> 必须串行生成的序列化方法

      Boosting

    • 个体学习器之间不存在强依赖关系 –> 可以同时的并行化方法

      Bagging

      随机森林

  6. Boosting

    • AdaBoosting

      思路:多个模型中,每个模型都在尝试增强整体效果

      具体而言:

      先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,使得某些分类异常的样本权重更高 / 后续受到更多关注,然后基于调整后的样本分布来训练下一个学习器

    • Gradient_boosting

      思路:首先训练一个模型m1,产生错误e1,针对e1训练第二个模型m2,产生错误e2,针对e2训练第三个模型m3…

      最终的预测结果是m1+m2+m3+…

      AdaBoosting类似乘法,GradientBoosting类似加法

  7. Bagging and 随机森林

    思路:

    • 不同学习器使用不同的训练集:

      从训练集中进行抽样,组成每个子训练集;子训练集用来训练每个基模型;最后对所有及模型的预测结果进行综合产生最后的结果

    • 不同的学习器使用不同的算法

    • 不同的学习器使用不同的参数

    • 不同的学习器使用不同的特征选择和特征工程

    都是为了保证个体学习器尽可能相互独立

    Bagging

    通过训练集不同

    分类:

    • Bagging:放回取样
    • Pasting:不放回取样
    • bootstrap_features:在特征空间随机采样(每个学习器使用不同的特征工程)
    随机森林

    通过训练集和特征选取不同 –> 样本和节点判断的特征都随机选择

    简单思想:每个决策树是一个分类器,随机森林维护了多个不同的决策树;那么对于一个输入,N棵树给出N个分类结果;随机森林最终集成所有分类投票结果,输出票数最多的【bagging】



    结合策略:

    1. 平均分

      • 简单平均分

      • 加权平均分

        性能比较:

        加权平均的性能未必优于简单平均,因为加权时的权重一般来自训练数据,又很容易导致自身信息过度利用——过拟合

        一般而言:在个体学习器性能相差较大时使用加权平均,性能相近时使用简单平均

    2. 投票法

      • 绝对多数投票法

        若某标记得票超过半数,则预测为标记,否则拒绝预测

        实现统一一般人员比较困难–> 可能会退化成相对多数投票法

      • 相对多数投票法

        预测为的票最多的标记,如果同时有多个标记为得票最高,则随机从中选一个

      • 加权投票法

      • 硬投票与软投票

        硬投票:

        • 每个模型在A,B两个结果中做出选择,最后统计A票多还是B票多

        软投票:

        • 每个模型给出是A或B的概率,最后将概率相加平均,比较A,B的平均概率
    3. 学习法

      通过另一个学习器来进行结合

      把个体学习称为出基学习器,用于结合的学习器称为次级学习器或者元学习器(meta-learner)

      Stacking

      思想:

      把训练样本集分为两部分

      一部分用来训练许多初级学习器

      通过处理分类器预测的结果 和 另一部分样本一起来训练次级学习器,由此最终得到预测结果

  8. 特征选择与稀疏学习

    特征选择:如果选择最重要的特征,以提高模型的性能 - 目的是降维,减少复杂度,提高性能

    稀疏学习:指在模型的参数中有很多是零,对此模型怎么搞

    • 子集搜索与评价:

      • 概念:

        1. 特征 feature:

          西瓜的色泽、跟蒂、纹理…

        2. 相关特征:relevant feature:

          对当前学习任务有用的属性

        3. 无关特征:irrelevant feature:

          对当前任务无关的属性

        4. 冗余特征:redundant feature:

          指两个特征之间可以相互计算得到

        5. 特征选择:feature selection:

          从给定的特征及和中选择特征子集的过程【数据预处理 / 特征工程】

      • 本章假设

        • 数据集不涉及冗余特征
        • 初始特征集包含所有重要信息
      • 特征选择的思路:

        假设没有任何领域的先验假设

        思路一:

        • 遍历所有可能子集 - 高层for

          1
          2
          3
          4
          5
          6
          7
          8
          9
          for(int i = 0;i < n;i++;){//取i个
          for(){ //内部i层for,用i个指针实现组合遍历
          for(){
          for(){
          ...
          }
          }
          }
          }

        思路二:

        • 迭代:
          1. 从候选子集选择一个
          2. 跑一遍后评价
          3. 根据评价产生下一个子集
          4. 直到无法找到更好的候选子集
    • 子集搜索:

      最初怎么确定包含所有信息的初始子集?整体思路是贪心:贪心策略是:遇到一个决策一个

      1. 前向搜索:

        从候选子集中依次选择有用的

      2. 后向搜索:

        从候选子集中依次淘汰没用的

      3. 双向搜索:

        贪心策略强化:选有用的同时删掉没用的 / 冗余的

      问题:

      • 贪心策略未必有效:有可能导致忽略最优选择
    • 子集评价:

      问题描述:如何评价选择某个特征 / 子集的效果?

      通过信息增益

      每个特征都将原本的样本进行分类,分类好坏就是信息熵的大小,就是这个特征和实际结果相关性强不强;

      信息增益越大,意味着特征子集包含的有助于分类的信息越多

    • 特征选择:

      于是:特征选择就是搜索机制+评价机制

      例如:前向搜索 + 信息熵 = 决策树……

    • 特征选择方法:

      1. 过滤式 Filter
      2. 包裹式 Wrapper
      3. 嵌入式 Embedded
  9. 半监督学习

    思想:由于或许大量带有标签的数据是比较困难的,但获取大量未标签的数据是比较轻松的,于是能否利用带有标签的部分数据进行监督学习,主要利用现成的分类结果;之后对次模型使用无监督学习训练未标签数据

    针对 带标签样本远少于不带标签样本

    对未标签样本的一些假设:

    1. 平滑性假设:

      假设相似的 / 邻近的样本具有相似的标签

    2. 流形假设:

      假设高维数据可能在一个低维的流形上分布,在流形上相邻的点可能有相似的标签

    3. 聚类假设:

      假设未标记数据可能属于一些潜在的聚类结构

    分类 【根据对未标记样本】:

    • 主动学习

      将未标记样本查询标记后,更改为标记数据

    • 半监督学习

      • 纯半监督学习

        标记的和未标记的样本全都用来训练模型,测试的样本另外找

      • 直推学习

        用标记的样本来训练模型,未标记的同样参与训练,同时作为测试样本

    • 半监督学习算法:

      1. 自训练:

        简单的增量算法:

        最初用带标记的数据构建分类器,然后预测未标记数据,通过判断结果的可信程度决定是否将此样本加入到训练集中,优化训练模型

        增强训练

        包裹式算法:算法本身性能影响特征选择或者训练样本

        生成式模型:


机器学习学习笔记
http://songlin.work/2025/04/20/python机器学习/
作者
songlin
发布于
2025年4月20日
许可协议