查看全课大纲(第 16 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
有监督学习:从房价预测说起
约 23 分钟
小象实战讲义 · 机器学习算法精讲
前几节课我们打完了数学地基(线性代数、概率统计),也聊透了机器学习的宏观哲学。从本节开始,进入第一个真正的机器学习问题:波特兰的房价预测。讲师在课上说明这个例子借鉴了吴恩达(Andrew Ng)的公开课——英文好的同学可以直接去 follow 原版,会有更多收获。我们将沿着”提出问题 → 统一记号 → 选定最简模型 → 手工试出最优解”的路径,把监督学习第一次完整走通。
💡 核心导读
- 回顾主线:机器学习 = model learning = 在假设空间(hypothesis space)中搜寻最能解释数据的数学模型。
- 第一个问题:波特兰房价——给定历史数据(面积 → 价格),预测新房子的价格。
- 统一记号:训练数据 、上标 标样本序号(区别于幂)、特征向量 与标签 。
- 线性模型:——用 的小技巧把截距也收进向量形式。
- 手工试解:在 的最简情形下,靠”试线—看误差—调整”找到完美拟合,体会学习到底在做什么。
机器学习回顾:从哲学到动手
先用几句话把前面的宏观图景串起来。机器学习本质上是 model learning:在一个巨大的假设空间(hypothesis space)里,搜寻能最好地解释已知数据的那个假设——它的表现形式就是一个函数或数学模型。模型经过训练数据的训练之后,就可以用来预测或分类。
问题按范式分四大类,各自特点一句话说清:
- 监督学习:所有数据都有标签;
- 无监督学习:物以类聚、人以群分,看数据自身特点决定聚类;
- 半监督学习:一部分有标签、一部分没有;
- 强化学习:不直接给标签,但每次执行动作后给一个奖赏或惩罚——有点像监督学习,只是”标签”只有奖惩信号(game AI、下棋都属此类)。
为什么要先学线性代数?因为每个数据都要表示成特征向量。为什么要学概率统计?因为研究模型时充满不确定性,概率是最好的建模语言。地基备齐,现在开始砌第一块砖。
第一个机器学习问题:波特兰房价
问题设定(borrowed from 吴恩达的例子):研究美国城市波特兰(Portland)的房价。给定一组历史数据:横轴 是房子的居住面积(living area,美国用平方英尺 square feet 计,咱们中国习惯用平方米),纵轴 是价格(以每 1000 美元为单位——西方习惯用”千”,我们习惯说”万”,看到 400 千就是 40 万,熟悉一下这个换算就好)。
把所有已知数据画成散点,它们大致排成一条直线状的带子。现在来了一套新房子,面积 3500 平方英尺——训练数据里没有它。我们想知道:,即它的房价该预测为多少?
这就是最典型的一类问题:学一个从输入到输出的关系。既然数据看着像一条直线,那就从最简单的”直线”开始假设。
训练数据与记号
先把记号统一,后面所有算法都沿用:
- 训练数据(training data) 记作 ,由 对数据组成:
- 上标带括号: 表示第 个样本。注意它和 ( 的平方)不是一回事——括号是序号,没括号是幂。
- cardinality:描述集合里元素个数的术语—— 的 cardinality 就是 。
- 每个样本的特征 是一个 维向量():第一个维度可以是房子面积,第二个是卧室数,第三个可以是院子大小(当然,美国的例子才有院子——中国的房子一般不带院子卖,讲师原话)。
- 标签 一般是一个标量(),比如价格。
比如”面积 + 卧室数”两个特征的问题:同样面积下,多一个卧室的房子通常更贵——所以特征从一个标量升级为二维向量,模型也随之升维。我们要做的事情始终没变:学习 的映射关系,使得用函数 表达的对应关系是最好的。这是一个标准的监督学习问题。
线性模型:假设空间的第一个成员
先从最简单的情况开始,假设 是一个线性函数。什么叫线性函数?讲师现场画了一条线考大家:这条线经过 和 两个点,方程是什么?
- 时 , 时 ,两点唯一确定一条直线;
- 稍加计算可得:(验证: 得 ; 得 )。
用代码把”两点定线”走一遍:
# 两点确定一条直线:讲师课堂例 (0,2) 与 (1,0)
p1 = (0, 2)
p2 = (1, 0)
theta1 = (p2[1] - p1[1]) / (p2[0] - p1[0]) # 斜率 θ1
theta0 = p1[1] - theta1 * p1[0] # 截距 θ0
print(f"两点 {p1} 与 {p2} 确定的直线:h(x) = {theta1:g}·x + {theta0:g}")
print(f"验证 x=0: h(0) = {theta1 * 0 + theta0:g}(应为 2)")
print(f"验证 x=1: h(1) = {theta1 * 1 + theta0:g}(应为 0)")两点 (0, 2) 与 (1, 0) 确定的直线:h(x) = -2·x + 2
验证 x=0: h(0) = 2(应为 2)
验证 x=1: h(1) = 0(应为 0)直线有两个关键参数:斜率 (例子里的 )和截距 (例子里的 )。于是线性模型的一般形式为:
向量化:一个技巧统一所有写法
引入一个永远等于 1 的虚拟特征 ,模型就能写成规整的对称形式:
再把参数和特征各自堆成向量 、,线性模型就变成了一个内积:
这个写法的推广性极好:两个特征(面积 、卧室数 )时, 依然是 ,只是函数图像从一条线变成三维空间里的一张面;特征继续加,无非维数继续涨。一般地, 个特征时 、——多出来的那一维,就是 这个”截距占位”。
最简情形:一条过原点的直线怎么”调”出来
一切从最简单的开始。令 ,假设退化为最简形式 ——一条必须过原点的直线, 一变,直线就绕着原点转。
讲师给了三个训练点:(输入 1 输出 1,输入 2 输出 2,输入 3 输出 3)。现在要学出最好的 。
试线的过程:
- 先试 ,即 ——三个点都不在线上,误差不小;
- 再试一条更歪的——误差反而更大,方向不对,继续调;
- 调到 ,即 ——三个点全部落在线上,完美。
用代码复现这个”试线—看误差”的过程:
# 训练数据 D = {(1,1), (2,2), (3,3)},假设 h(x) = θx(过原点的直线)
D = [(1, 1), (2, 2), (3, 3)]
def h(theta, x):
"""最简线性假设:h(x) = θx"""
return theta * x
for theta in [0.5, 0.8, 1.0]:
preds = [round(h(theta, x), 6) for x, _ in D]
errors = [round(h(theta, x) - y, 6) for x, y in D]
print(f"θ = {theta}: 预测 {preds},误差 {errors}")θ = 0.5: 预测 [0.5, 1.0, 1.5],误差 [-0.5, -1.0, -1.5]
θ = 0.8: 预测 [0.8, 1.6, 2.4],误差 [-0.2, -0.4, -0.6]
θ = 1.0: 预测 [1.0, 2.0, 3.0],误差 [0.0, 0.0, 0.0]可以看到: 从 0.5 调到 0.8,误差整体缩小;调到 1.0,误差全部归零。所谓”学习”,就是这样一个不断调整参数、让假设越来越贴合数据的过程——我们最终需要的,是让所有点到这条线的距离(误差)最短,让假设能尽可能完美地解释数据。
📝 动手练一练
- 两点定线:给定训练点 与 ,求出它们确定的线性模型 ,并验证两点都在线上。
👉 点击查看参考答案
斜率 ,截距 (把 代入 即得)。所以 。
验证: ✓, ✓。
- 试线与误差:换一组数据 (即 的点),假设仍为 。分别取 和 ,逐点计算误差 。哪个 更好?由此体会”调参”在干什么。
👉 点击查看参考答案
- :预测 ,误差 ——全线偏小,误差很大;
- :预测 ,误差 ——完美拟合。
更好。“调参”就是朝误差变小的方向修改 :误差全为负说明预测偏低,应调大 。下一节我们要做的,就是把”误差大小”写成一个严格的数学函数(损失函数),让”朝哪调、调多少”不再靠手感。
本章小结
- 机器学习 = 在假设空间里搜寻最好解释数据的模型;监督学习 = 所有样本都有标签 。
- 波特兰房价是第一个完整走通的监督学习问题:预测 3500 平方英尺新房子的价格。
- 记号是全课程的通用语言: 有 对数据(cardinality 为 ), 是 维特征向量,上标括号区分序号与幂。
- 线性模型 借 的小技巧统一为 ,天然支持任意多维特征。
- 在 的最简情形下,“试线—看误差—调整”就是学习的雏形: 让 全部零误差。
📋 行动清单
- 用自己的话解释 与 的区别,以及 这个”占位特征”为什么能统一线性模型的写法
- 手算两点定线:任取两个点,求出 ,再代入验证
- 预习下一节:把”误差大小”写成一个严格的函数需要什么要素?(提示:正负号怎么处理、多个样本的误差怎么合并)
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。