百面机器学习笔记

包括机器学习和算法2部分 课程地址

Week 1

机器学习

分类算法

  • 逻辑回归
    • 极大似然估计
      • 似然:通过样本猜测总体
    • 梯度下降法推导
    • 逻辑回归推导
      • 在线性回归外层套一个sigmoid
  • 决策树
    • ID3 信息增益 仅离散属性
    • C4.5 信息增益比 = 信息增益/划分前熵 连续值
    • CART Gini指数(集合的不确定性) 仅二叉树
    • 剪枝(防止过拟合)
      • 预剪枝
      • 后剪枝(剪掉叶结点较少的分支)

算法

  • 快速排序
    • 挖坑法(双指针)
    • 指针交换法(交换数据)
  • 堆排序
  • 双指针
    • 对撞指针
    • 快慢指针
    • 滑动窗口

题目

算法刷题重点题型

算法刷题课后作业

Week 2

机器学习

  • SVM
    • 线性可分
    • 超平面 最大间隔超平面(最近的样本点到平面的距离)
    • 支持向量(距离超平面最近的点)
    • SVM的最优化问题
    • 对偶问题
      • 构造拉格朗日函数
      • (强对偶关系)
      • KKT约束条件(强对偶性的充要条件)
      • SMO(序列最小优化)算法求
    • 软间隔(允许个别样本点出现在间隔带里)
      • 松弛变量
    • 核函数(线性不可分)
      • 非线性SVM(映射到更高维度)
      • 减少映射的计算量
      • 常用核函数
        • 线性核函数
        • 多项式核(不平稳,数据已归一化)
        • RBF核(高斯核)(最常用)
  • 降维 PCA和LDA
    • PCA
      • 最大化投影的方差
    • LDA(Linear Discriminant Analysis)有监督
      • 最大化类间距离以及最小化类内距离

算法

  • KMP算法
    • 字符串匹配
    • 空间换时间
    • 部分匹配表PMT:记录字符串前缀集合和后缀集合交集中最长元素长度(子字符串p)
      • 向右移动一位得到next数组,0位填-1
      • 根据p求解next
  • 二分搜索
    • while left <= right if right = str.len - 1
    • mid = lower + (upper - lower) // 2 防止溢出
    • 目标有多个重复
      • 最左侧
        • left = 0 right = str.len # [)
        • while left < right # [left, left)
        • mid = (left + right) // 2
        • if str[mid] == target: right = mid
        • if str[mid] < target: left = mid + 1
        • if str[mid] > target: right = mid
        • return left
      • 最右侧
        • left = 0 right = str.len # [)
        • while left < right # [right, right)
        • mid = (left + right) // 2
        • if str[mid] == target: left = mid + 1
        • if str[mid] < target: left = mid + 1
        • if str[mid] > target: right = mid
        • return left - 1
  • 哈希表

题目

算法刷题重点题型

算法刷题课后作业

Week 3

机器学习

  • K-means
    • EM(Expectation Maximum)算法
    • 收敛性证明

算法

  • 虚拟头结点
  • 删除链表中重复的结点
    • 3指针:基准、快、慢
  • 链表中环的入口结点
    • 哈希表
    • 快慢指针
  • 栈和队列
    • 由链表实现 [].pop(0) [].pop()

题目

算法刷题重点题型

算法刷题课后作业

Week 4

机器学习

  • HMM
    • 概率模型
      • 生成模型 联合概率分布
      • 判别模型 条件概率分布
    • 基本假设
      • 齐次马尔可夫假设
      • 观测独立性检测
    • 基本问题
      • 概率计算:计算观测值的概率
        • 直接计算
        • 前向、后向算法(DP)
      • 预测/解码:通过观测序列求状态序列
        • 维特比算法(DP)Viterbi
      • 学习/训练:计算
        • 有监督
        • 无监督:仅观测序列
          • Baum-Welch算法
      • 实例
        • from hmmlearn import hmm
  • CRF 条件随机场
    • 基础概念
      • 概率有向图模型 HMM 贝叶斯网络
      • 概率无向图模型 马尔可夫网络 马尔可夫随机场(MRF)(生成式模型)
      • 团Clique:图中节点的子集,其中任意2个节点有边直接连接
      • 势函数:非负实函数
      • Hammersley-Clifford定理
        • MRF表达为正概率分布
      • 分离 分离集
      • 特征函数
    • CRF 判别式模型 有条件的MRF
      • 线性链CRF
        • 指数势函数
      • 三个问题
        • 概率计算
        • 预测
        • 学习

算法

  • DFS和BFS
    • BFS (279)
      • 队列
      • 邻接表
      • 临界矩阵
    • DFS (695)
      • 递归
      • 栈-非递归
      • 树的前序遍历
  • 最短路径
    • Dijkstra (743)
      • 1点到其它,每次确定一个结点
      • 记录上一个结点可得到路径
      • 权值非负
      • 稀疏图
    • Bellman-Ford
      • 权值可以为负(负环)
      • 循环遍历所有边,直到所有值不改变(最多N-1)
  • 最小生成树 图的最小连通子图
    • 并查集 用集合中的一个元素代表集合(帮会)(684)
    • Kruskal (1135)
      • 对边排序,从小到大并查集
    • Prim
      • 从某顶点开始,每次吸纳1个结点
  • 二叉树的遍历(stack非递归较复杂)
    • 前序
    • 中序
    • 后序
    • 层次(queue)
  • 二叉搜索树和平衡二叉树
    • |左右子树高度之差|<=1
    • 搜索
    • 插入
      • 平衡(只调整失衡的第一个结点)
        • 左-左
          • 右旋
        • 右-右
        • 左-右
          • 左旋(产生左-左)->右旋
        • 右-左
    • 删除
      • 结点不存在
      • 叶子节点
      • 有1个孩子
      • 有2个孩子
      • 平衡

题目

算法刷题重点题型

树类问题:

图类问题:

算法刷题课后作业

Week 5

机器学习

  • 前向神经网络
    • 前向传播
    • 反向传播
  • 序列数据中常用的循环神经网络
    • RNN
    • GRU和LSTM

算法

  • 递归
    • 记忆化搜索
    • 跳台阶 (509)
    • 变态跳台阶 (牛客)
  • 回溯法(反向递归树)
    • 递归一定会发生回溯 暴力搜索
    • 全排列 (46) 恢复标志位
    • 机器人运动范围 (面试题13)
  • 动态规划DP
    • 保存子问题的答案
    • 自下而上(与记忆化搜索相反)
    • 0/1背包问题 (416. 分割等和子集)
      • 挑选的物品只有一个
      • 该物品可选可不选
        • 状态
      • dp[i][j] 挑选第i个物品放入j容量的最大价值
        • 状态转移方程
        • 空间:$O(nC)O(2C)O(C)$(倒序更新)
        • 时间:$O(nC)$ 物品数量背包容量
    • 最长上升子序列LIS (300)
      • dp[i] 以第i个数字结尾的LIS长度
      • dp[i] = max([dp[j] + 1 for j in range(i) if nums[i] > nums[j]] + [1])
    • 最长公共子序列LCS (1143)
      • dp[i][j] s1的前i个字符和s2的前j的字符的LCS的大小
      • dp[i][j] = dp[i-1][j-1]+1 s1[i] == s2[j]
      • dp[i][j] = max(dp[i-1][j], dp[i][j-1]) s1[i] != s2[j]

题目

算法刷题重点题型

递归、回溯问题:

动态规划问题:

算法刷题课后作业

Week 6

机器学习

  • 集成学习
    • Bagging
      • 随机森林
    • Boosting
      • 梯度提升树 GBDT
        • 残差:真实值 - 预测值
        • 基分类器:回归树CART
        • 加法模型:决策树相加
          • 求解:前向分布算法
        • 用负梯度代替残差
          • 泰勒一阶展开
        • 问题(不同的损失函数)
          • 二分类
            • 对数损失函数
            • 初始值求解
            • Newton-Raphson一步迭代
          • 多分类
            • 交叉熵损失函数
          • 回归
            • huber损失函数
            • 平方损失函数
      • XGBoost
        • 预备知识
          • 泰勒二阶展开
          • 结构风险极小化:正则化
        • 结构分