49 条鱼以长度和重量这两个有名字的变量进入计算机,而一张照片则以 784 个没有名字的像素进入计算机。首先把两种数据并排放在一起,看看“用一个变量找规则”的做法为什么在鱼身上行得通,在照片上却会选中毫不相干的格子。接着在鱼这边确认分类的基本工具(规则、感知机·SVM 的直线、k-NN 的距离与标准化),再进入为什么照片需要寻找模式的特征。
49 条鱼以长度·重量两个数字进入计算机,一张照片则以几千个像素数字进入计算机。两者都是数字,为什么照片分类要难得多?
我们要把从市场运来的 49 条鱼(鲷鱼 35 条,胡瓜鱼 14 条)分开。能交给计算机的,是用尺子量出的长度和用秤称出的重量。
| 条数 | 长度范围 | 重量范围 | |
|---|---|---|---|
| 鲷鱼 | 35 | 25.4 ~ 41.0 cm | 242 ~ 1,000 g |
| 胡瓜鱼 | 14 | 9.8 ~ 15.0 cm | 6.7 ~ 19.9 g |
用鱼类数据进行的机器学习(决策树、k-NN、回归、逻辑回归、交叉验证等)在《用 Fish Market Data 轻松学机器学习》中有详细讲解。本篇只讲其中“进入图像分类所需要的部分”。
如果用照片来做同样的事,会怎么样呢?即使把吉娃娃和松饼的照片缩小到横竖各 28 格的灰度图,一张也有 784 个数字。如果是彩色 224 × 224,就是 150,528 个。
比数字多更大的区别在于:“长度 25.4cm”本身就有意义,而“第 412 格的亮度 187”单独看却没有任何意义。本篇先展示这个区别,也就是变量(有名字和含义的格子)与特征(多个格子共同构成的模式)的区别,然后在鱼这边确认分类的基本工具(规则、直线、距离),最后讲为什么照片需要别的方法。
鱼的数据是实际测量值(从 Kaggle Fish Market 数据集中只挑出了鲷鱼和胡瓜鱼 [R1])。鲷鱼身体高而大,胡瓜鱼细而小,这种差异直接体现在长度和重量这两个数字上。所以鱼这边是简单的分类,把它和照片并排放在一起,“是什么让照片分类变难”就一目了然了。
先把结论并排来看。鱼用一个变量就能写出一行规则,而照片用同样的方法却会选中毫不相干的格子。照片中产生意义的地方不是单个格子,而是多个格子的排列,也就是特征。
| 变量 (variable) | 特征 (feature) | |
|---|---|---|
| 含义 | 有名字和单位的测量值 | 把多个值共同构成的模式概括成数字 |
| 例子 | 长度 25.4cm,重量 242g | “三个暗点,呈三角形排列”“上方有尖尖的边缘” |
| 由谁制作 | 由人决定测量什么并进行测量 | 由滤波器·神经网络从原始数据(像素)中计算或学习得到 |
| 单个格子的含义 | 有 | 原始数据的单个格子(像素)里没有,含义在排列中 |
| 适合的方法 | 规则(决策树)、线性模型、k-NN | 像卷积神经网络(CNN)这样寻找模式的模型 |
| 可解释性 | 容易:“因为重量超过 131g” | 困难:需要另外查看训练出的滤波器在看什么 |
在机器学习中,两者有时都被称为“特征”。本系列为了区分清楚,把人命名的测量值称为变量,把从原始数据的排列中找出的模式称为特征。
左边(手机上是上方)是鱼,右边(下方)是照片。先对两种数据都寻找“某个变量 > 阈值就归为这一类”的规则。鱼到这一步就结束了,但照片的规则会选中毫不相干的格子。所以照片要看用滤波器生成的特征图中的模式。规则和模式在“训练用”的 80 张照片中寻找,再用没参与训练的 80 张“新照片”来验证。
每个变量都有名字和含义,一行人能读懂的规则就能解决。
① 用同样的方法,在全部 784 格中寻找“某个像素 > 阈值”的规则。
② 用滤波器生成特征图,再在整张图上概括模式。
点和鱼的颜色:● 鲷鱼·吉娃娃 ● 胡瓜鱼·松饼。右边 ② 的两个滤波器(找暗区、找边缘)是人为这次比较挑选的。CNN 会从数据中学习几十到几百个这样的滤波器并加以组合(4-2·4-3)。“新照片”是把同样的 12 张图以不同于训练用照片的方式平移并改变亮度制作的,所以比用完全不同的照片来测试要容易。在真实照片中,只靠两个模式很难达到 100%。
鱼数据的格子是有名字和含义的变量。“长度”这一个变量就包含了鲷鱼和胡瓜鱼的差别,所以一行“长度 > 阈值就是鲷鱼”的规则就能把 49 条鱼全部判对。这是人能读懂、能解释的规则,也是决策树这类基于规则的模型擅长的领域。这也多亏了人很好地挑选了“测量什么”。
照片的格子(像素)形式上也是变量,但既没有名字也没有含义。用同样的方法找规则,计算机会在 784 格中挑出碰巧判得准的格子,通常是边缘的背景格子,在没见过的照片上表现就会下降。照片中产生意义的地方不是单个格子,而是多个格子共同构成的模式(有几个暗点、在哪里、呈什么形状)。所以用滤波器生成特征图,再在整张图上概括模式,在新照片上也能判得准。
总结一下,两者都是“根据特征来判断”,这一点相同。不同的是,特征是由人命名准备好的(变量 → 规则),还是必须从多个格子的排列中找出来(像素 → 模式)。表格数据也可以使用逻辑回归这样不基于规则的模型,照片特征也可以套用规则,所以这个对照应理解为“哪种数据适合什么方法”的大致倾向。
那么,把 784 个格子全部用上就行了吗?格子越多,可以划分的方法也越多,但大部分格子没有意义,问题并不会消失。4-2 会介绍寻找模式的滤波器,4-3 会从“用平面划分”的角度来看这个问题。
请在左边的鱼中点击“自动找规则”,在右边的照片中点击“自动找像素规则”。鱼的规则能把 49 条全部判对,而且人能读懂。照片的规则则从 784 格中选中照片角落的背景格子,在没见过的照片上准确率下降。只有像右边 ② 那样用滤波器生成特征图并概括模式,才能把照片分开。这个对照就是整个系列的出发点。
一行是一个样本,数字格是特征,答案格是目标值。鱼的表和照片的表只是格子的数量和单个格子的含义不同。
分类模型学习的数据总是同样形状的表格。一行就是一个样本,每一行都有若干个叫作特征(feature)的数字格和一个目标值(标签,答案)格。如果是鱼的分类,一行就是一条鱼,特征是长度和重量 2 格,目标值是“鲷鱼”或“胡瓜鱼”。照片分类也一样:一行是一张照片,特征是把像素数字(4-2 详细讲解)排成一行,目标值是“吉娃娃”或“松饼”。
简单来说就像体检表。一个人占一行,身高·体重·血压是特征格,最后的“是否需要复查”是目标值格。鱼的表是只有 2 个项目的简短体检表,照片的表是有 784 个项目的超长体检表。区别在于每个项目是否有名字和含义。“长度 25.4cm”本身就有意义,而“第 412 格的亮度 187”单独看没有任何意义。
左边是 49 条鱼中的 6 条,右边是 80 张吉娃娃·松饼照片中的 6 张。照片缩小成 28 × 28 灰度图后展平成一行。点击右表中的某一行,下方会显示那张照片是如何变成一行的。
鱼数据:Kaggle Fish Market 数据集中鲷鱼(Bream)35 条·胡瓜鱼(Smelt)14 条的长度·重量。直接使用了 Haesun Park《自学机器学习+深度学习》(혼자 공부하는 머신러닝+딥러닝)示例代码(MIT 许可证)中的数值。照片数据:把 4-4 篇图像中的 12 格(吉娃娃 6,松饼 6)缩小到 28 × 28,每张将位置平移 ±4 格、亮度改为 70~130%,各生成 40 张。
Q1. 在照片分类的表格中,相当于目标值(标签)的是?
Q2. 把彩色 32 × 32 的照片展平成一行,特征有多少格?
Q3. 鱼用一个变量就能得出规则,而照片用单个像素得出的规则在新照片上却不太准,最主要的原因是?
目标值(target)是需要猜中的答案,由人给数据附上答案的工作就是标注。点击照片表格中的某一行,可以看到 28 × 28 的矩阵从第一行开始依次连接,变成 784 格的一行(展平)。形式上和鱼的表一样了,但每个格子的名字和含义都消失了。
变量有含义,边界就简单。来看看每次出错就挪动直线的感知机,和开出最宽道路的 SVM,在同样的鱼上分别画出什么样的线。
一个点就是一条鱼。紫色线是当前的边界,线的右上方是“鲷鱼”。感知机一条一条地看鱼,只在判错时才挪动直线。红圈是刚刚判错的鱼,白圈是判对的鱼。
能分开两组的直线有无数条。SVM 从中选出两组之间空白道路(间隔)最宽的那条直线。紫色实线是边界,虚线是道路两侧的边沿。勾选后可以和感知机停下时的直线(绿色虚线)进行比较。
感知机和线性 SVM 的边界形状相同(一条直线,w·z + b = 0)。感知机全部判对就停在那里,所以可能得到紧贴某一组的直线;SVM 则选择离两组都最远的直线(间隔最大)。在代码 1 中,SVM 的间隔宽度以标准化单位计为 1.233,决定边界的支持向量是最大的胡瓜鱼(15.0cm, 19.9g)和最小的鲷鱼(25.4cm, 242g)这两条。
也请记住先后顺序:感知机(1958)在前,SVM(1990 年代)在后 [R3] [R4]。两者都是在原始坐标上画一条直线的方法,对格子有含义的鱼的表来说足够,但在像素坐标上就行不通了(4-3)。
用鱼类数据进行的机器学习(决策树、k-NN、回归、逻辑回归、交叉验证等)在《用 Fish Market Data 轻松学机器学习》中有详细讲解。本篇只讲其中“进入图像分类所需要的部分”。
感知机把长度和重量分别乘以权重再相加,和大于 0 就回答“鲷鱼”。训练就是不断重复“把直线朝判错的鱼那边稍微挪一点”。在 SVM 图中勾选复选框,可以把感知机停下时的直线和 SVM 的直线叠在一起看。这个加权和(w·x + b)会在 4-2 的卷积和 4-3 的神经网络中原样再次出现。
新来的鱼(25cm, 150g)是鲷鱼吗?向最近的邻居询问的方法,答案会随着“近”的衡量方式而颠倒。
三角形是新捕到的鱼(初始值:长度 25cm,重量 150g)。k近邻用最近的 5 条鱼的答案进行多数表决。切换“原始单位”和“标准化”,看看邻居变成了谁。
用原始单位衡量距离时,长度相差 10cm 和重量相差 10g 被当作同样大小。可是重量动辄相差几百 g,所以距离几乎完全由重量决定。于是长度 25cm 的新鱼,也会因为重量 150g 而被算作和胡瓜鱼们(20g 以下)“很近”,5 个邻居中有 4 个成了胡瓜鱼。标准化之后,两个特征用的是同一把尺子,5 个邻居全都变成了鲷鱼(与代码 1 的结果相同)。
规则(章节 3)只看一个变量,所以不受单位影响。像感知机·SVM·k-NN 这样混合多个特征来计算距离或加权和的方法,就需要统一单位。照片的所有格子都是 0~255,所以这个问题不大,但会出现别的问题(章节 7)。
k近邻(k-NN)用离新样本最近的 k 个样本的答案进行多数表决 [R5]。方法简单,但一切都取决于“距离”,所以如果重量(g)这类数值大的变量独占了距离,就会选出不相干的邻居。照片的像素都在 0~255 之间,单位问题不大,但存在一个更大的问题:“同一位置数字的差”反映不了含义(4-2 章节 3)。
把照片的格子当作鱼的变量来用,能走多远?在形状不同的一组和形状相似的一组上,结果截然不同。
| 数字组合 | 规则选中的像素 | 单个像素规则(测试) | 64 格加权和(测试) |
|---|---|---|---|
| 0 对 1 | (第 5 行,第 5 列) | 98.3% | 100.0% |
| 3 对 8 | (第 6 行,第 4 列) | 86.0% | 98.3% |
| 4 对 9 | (第 5 行,第 2 列) | 93.9% | 98.3% |
把 8 × 8 的手写数字看作 64 格的表格,套用在鱼身上用过的“某个变量 > 阈值”规则。形状截然不同的 0 和 1,只用中间的一个像素就几乎能全部分开(中间是空的就是 0)。但在3 和 8 这样形状相似的一组上,单个像素规则只有 86.0%,要把 64 格全部加权求和才能达到 98.3%。
形状越相似,越要看的不是单个格子,而是多个格子共同构成的形状。手写数字是位置对得很整齐的小图片,所以只用加权和就能做得不错;但在位置·光照·背景各不相同的真实照片中,加权和也会行不通(4-2 章节 3,4-3 章节 2)。所以照片分类需要一个寻找模式的步骤,也就是特征提取。
总结一下,在变量有含义的表格数据中,规则·直线·距离这样简单的工具就足够了。在照片中,单个格子没有意义,所以需要寻找相邻格子花纹的滤波器,以及把这些花纹叠加成形状的层。4-2 讲照片变成数字矩阵的过程和滤波器,4-3 讲为什么要叠加层,4-4 讲即便如此仍然存在的难题。
两段代码都只使用 Colab 默认安装的库和内置数据。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
计算决策树的一个分支、标准化坐标下的感知机与线性 SVM,以及新鱼(25cm, 150g)在标准化前后的 k-NN 预测。想换成自己的数据,就把最上面的四个列表换成自己的测量值。
把 8 × 8 的手写数字看作 64 格的表格,在 0 对 1、3 对 8、4 对 9 上比较单个像素规则和 64 格加权和(逻辑回归)。想换成自己的数据,就修改 compare(a, b) 中的数字组合。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”,所选代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它推荐的论文·数值·库函数一定要对照原文和官方文档核实。如果在竞赛·论文中得到了 AI 的帮助,要按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线对应的词典。整个系列使用相同的写法。点击章节名可以跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。人眼·人脑类比标注了对应程度。直接 有依据表明确实在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 人眼·人脑类比 | 类比不成立的地方 |
|---|---|---|---|
| 决策树 | 二十个问题游戏 | 无 | 真正的决策树是从数据中计算并选出问题的阈值,而不是像人一样想出“看起来合理的问题” |
| 感知机 | 只重看做错题目的错题本 | 部分 源于神经细胞汇集输入、超过阈值就发出信号的想法 | 真实的神经细胞处理随时间变化的电信号,学习规则也复杂得多 |
| SVM 间隔 | 在两方之间开出最宽的道路 | 无 | 道路宽度是用“标准化后的单位”衡量的。换了单位,最宽道路的位置也会改变 |
| k-NN | 刚搬进新小区,去问离得最近的五户邻居 | 无 | 衡量邻居不是看“相隔几米”,而是看“差几 g、差几 cm”,所以如果不统一尺子,就会把远处的人家误当成近邻 |
| 标准化 | 把身高和体重换算成“在班里大约排第几”再比较 | 无 | 名次只保留顺序,而标准化保留的是离平均值有多远(间距) |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片·数据参考资料
这是给讲师、在职培训(OJT)负责人和辅导老师的运营指南。时间为预估值,请根据实际课堂进行调整。
| 对象 | 初学机器学习的大学生·职场人士。会用 Excel 表格,但第一次接触模型的人 |
|---|---|
| 预备知识 | 平均值和标准差、坐标平面上的直线方程。最好读过 3-2 的感知机 |
| 学习目标 | ① 用鱼和照片的例子说明变量与特征的区别 ② 用样本·特征·目标值描述数据,并说出规则·感知机·SVM·k-NN 确定边界的方式有何不同 ③ 说出需要标准化的情况,以及不能把单个像素当作变量来用的原因 |
| 预计时间 | 阅读 35~45 分钟 · 实践演示 20 分钟 · Colab 实践 25 分钟(代码 1 15 分钟,代码 2 10 分钟) |
导入 5 分钟(章节 1)→ 章节 2 变量 vs 特征 15 分钟 → 章节 3 表格结构 5 分钟 → 章节 4 感知机 10 分钟 → 章节 5 k-NN 5 分钟 → 章节 6 承上启下 5 分钟 → 小测验 5 分钟。
把章节 1·2 改画成本公司的数据表格 20 分钟 → 比较章节 3 的规则和章节 5 的 SVM 20 分钟 → 章节 6 找出标准化的陷阱(检查本公司数据的单位)20 分钟 → 用本公司数据运行代码 1 30 分钟。
入门者只学章节 1·2·3·6。中级者亲手算一遍章节 4 的更新公式,并解释代码 1 中 SVM 的支持向量为什么是两条鱼。
| 章节 | 停下来提的问题 | 操作技巧 |
|---|---|---|
| 1 问题 | “长度 25.4cm 和第 412 格的 187 有什么区别?” | 把鱼的表格和照片的数字个数并排指出来 |
| 2 变量 vs 特征 | “像素规则选中的格子和吉娃娃有关系吗?” | 依次点击两边的“自动找”按钮 |
| 3 特征·目标值 | “这张表里的答案格在哪里?” | 点击照片行,查看展平后的一行 |
| 4 规则与直线 | “看到判对的鱼时为什么不挪动直线?” | 用“一条一条看”停在红圈(判错)处,并在 SVM 图上叠加感知机的直线 |
| 5 标准化 | “新鱼的邻居为什么是胡瓜鱼?” | 从原始单位切换到标准化,再拖动重量滑块 |
| 6 像素是变量? | “0 和 1 可以,3 和 8 为什么不行?” | 比较代码 2 结果表中的两列 |
| 误解 | 正确解释 | 要展示的画面 |
|---|---|---|
| 因为 SVM 不行,所以才出现了感知机 | 顺序正好相反。感知机(1958)之后才出现了 SVM(1990 年代) | 章节 5 的讲解 |
| 只要求权重,就都是感知机 | 线性 SVM·逻辑回归也求权重。区别在于选择边界的标准 | 比较章节 4·5 的公式 |
| 只要特征多,就不需要标准化 | 使用距离·加权和的方法,单位不同结果就会颠倒 | 章节 6 的(25cm, 150g) |
| 基于规则的模型已经过时了 | 在特征有含义的表格数据中,它至今仍然很强,而且容易解释 | 章节 3 的一行规则 |
| 照片也是表格,所以同样的方法也行得通 | 形式相同,但单个格子没有意义,需要一个寻找模式的步骤 | 章节 7 和代码 2 |
样本 49(行),特征 2(长度·重量),目标值是鲷鱼 1 / 胡瓜鱼 0 的一格。
w ← w + 0.5 × (+1) × (0.2, −0.1) = w + (0.1, −0.05)。b 增加 0.5。
相同。两者都是 w·z + b = 0 的直线。SVM 从中选出间隔最宽的那条。
因为距离几乎完全由重量差决定。从数值上看,150g 离胡瓜鱼(20g 以下)比离鲷鱼(242g 以上)更近。
只有阈值的数字变成 10 倍,判对的鱼不变。只看一个变量的规则不受单位影响。
在代码 1 中去掉 StandardScaler 后训练 SVM,观察边界和支持向量如何变化,并结合章节 6 用两句话加以说明。
在代码 2 中把决策树的深度增加到 1、3、10,把 3 对 8 的训练·测试准确率做成表格,并解读随着深度增加,训练和测试之间的差距如何变化。
| 入门者 | 跳过章节 4·5 的公式也不影响理解整体脉络。只要把章节 3 和 6 的实践切实做一遍 |
|---|---|
| 进阶 | 用和章节 4·5 相同的表格比较逻辑回归,并让学生发表输出概率的分类器与只输出边界的分类器有何区别 |
| 延伸学习 | 用 Fish Market Data 轻松学机器学习(鱼类数据机器学习全篇) · Sangsun Ahn,《面向商业的数据科学》(비즈니스를 위한 데이터 과학)讲义 |
| 讲师用资料 | 小测验的评分标准和作业的参考答案可以在教师用答案页(4-1)中查看 |
你已经读完了“4-1 鲷鱼 vs 胡瓜鱼”篇。实验室的伙伴们每人用一句话为你总结。