关于这份知识库
本批内容覆盖 Week 1–3,全部严格来自课程讲义。后续会按周分批补全。
怎么用
- 左侧目录树:点任意条目跳转;阅读时会自动高亮你当前所在的小节。
- 顶部搜索框:输入关键词(中英文都行),正文里的命中处会被高亮,目录也会只留下含命中的小节。按回车在多个命中之间跳转。
- 右上角主题按钮:切换浅色 / 深色,方便晚上看。
模块一 · 课程总览与数据处理基础
数据处理是什么、数据长什么样、计算机怎么表示数据。
1.1 什么是数据处理 / 数据整理
这门课的核心词是 Data Wrangling(数据整理 / 数据驯服)。讲义把它拆成两个词来记:
- Data(数据):我们能拿来处理的信息。
- Wrangling(驯服 / 圈拢):把杂乱的东西"圈起来、管起来"。
讲义原话:从原始数据到洞见(insight)是一个多步骤的过程。也就是说,数据不会自己变成知识,中间要经过一连串处理。
数据处理 vs 数据科学
Data Processing(数据处理)和 Data Science(数据科学)不是一回事。讲义明确:本课不深入数据科学,但会学一些有用的技术。一个常被引用的事实是——数据科学家把大部分时间花在数据准备/清洗上,而不是花哨的建模上。这正是本课要训练的能力。
这门课要你掌握什么
学完后你应当知道(讲义 "The goal of the subject"):
- 数据的主要形态(forms:结构化 / 半结构化 / 非结构化)。
- 数据的主要格式(formats:数据在计算机里实际怎么存)。
- 对各种形态/格式通常能做哪些操作。
- 怎么检查你的计算是否正确。
- 一些常用算法和工具包。
1.2 数据处理的核心管线
整门课可以挂在一张图上。The Core of Data Processing(数据处理核心)= 把数据变成知识(From data to knowledge),围绕中心有 5 个阶段:
- Data Input(数据输入):传感器、人、其它数据生产者。
- Data Cleanup & Enhancement(清洗与增强):让数据变干净、变可用。
- Data Interpretation / Models(解释 / 建模):数据分析与机器学习。
- Data Output / Visualization(输出 / 可视化)。
- Data Use / Ethical Concerns(使用 / 伦理):数据的社会性使用。
1.3 数据与表示
讲义对"程序"的定义:程序就是把数据从起始状态(start state)变到目标状态(end state)的一串步骤。本课的核心目标,就是学会表示和使用这些数据。
计算机里数据怎么存
计算机只认二进制(0 和 1)。
- 数值:十进制 15 = 1×10¹ + 5×10⁰;二进制写作 1111 = 1×2³ + 1×2² + 1×2¹ + 1×2⁰。
- 文本:也存成二进制,每个字符对应一个编码(后面 1.6 讲 ASCII / Unicode)。
1.4 数据类型:大分野
讲义把数据分成两大阵营(The Great Divide):
| 数值型 Numerical(定量 Quantitative) | 非数值型 Non-numerical(定性 Qualitative) | |
|---|---|---|
| 本质 | 整数或实数 | 总是离散;由符号(TRUE/FALSE、M/F)和字符串("yes"、"John Smith")构成 |
| 子类 | 连续 / 离散;其中数字也可能只是类别(categorical:1,2)或有序(ordinal:1st,2nd) | 有序 Ordinal / 名义 Nominal |
定量数据:离散 vs 连续
- 离散 Discrete:可数的个数(如一个城市的人口)。注意有些运算没有自然意义——"平均 2.3 个小孩"不代表谁有 0.3 个小孩。
- 连续 Continuous:不可数、可测量(如温度、体重)。可用完整的数学运算和距离度量。
定性数据:名义 vs 有序
- 名义 Nominal:离散的名字,没有顺序、没有距离(如城市名)。其中一个特例是 Categorical(类别型),如 True/False。
- 有序 Ordinal:有有意义的顺序,但没有有意义的距离(如 T 恤尺码 S/M/L)。
离散 vs 连续:其实是"建模"问题
讲义有个反直觉但很重要的结论:
所以"离散 vs 连续"不是关于物体本身,也不是关于二进制存储,而是关于你如何建模这个变量。没有硬性边界。
1.5 转换问题与编码
The Transformation Problem(转换问题):数学模型只吃数值输入,但现实世界给的大量是非数值(定性)数据。怎么搭桥?答案是编码 Encoding。
方案一:标签编码 Label Encoding
把类别名映射成整数。例如 Fever:'mild'=0, 'no'=1, 'severe'=2。
| 优点 Pros | 缺点 Cons |
|---|---|
| 简单;省空间 | 引入了人为的顺序关系;距离变得没有意义(Red=0,…,Pink=4,但 Pink 和 Red 的"差 4"毫无含义) |
方案二:独热编码 One-hot Encoding
把每个类别变成一个二进制向量,每一位表示"是不是这个类别"。例如 Green = [0,0,1,0,0],Blue = [0,1,0,0,0]。
| 优点 Pros | 缺点 Cons |
|---|---|
| 避免人为顺序、避免人为距离 | 大幅增加维度,数据变得稀疏 sparse(一大堆 0);每新增一个类别就要加一列 |
1.6 数值与文本的底层表示
进位制 Number systems
同一个值在不同进制下写法不同,符号集也不同:
- 二进制 Binary(base 2):0,1
- 十进制 Decimal(base 10):0–9
- 八进制 Octal(base 8):0–7
- 十六进制 Hexadecimal(base 16):0–9, A–F(A=10 … F=15)
再如 4EBA₁₆ = 4×16³ + 14×16² + 11×16¹ + 10×16⁰ = 20154。(E=14, B=11, A=10)
文本编码 Text encoding
- ASCII:英文用,128 个字符。例如 'a' 有对应编码。
- Unicode(UTF-8 / UTF-16):码空间大得多,支持各种语言。例如 'o' = U+006F,汉字'人' = U+4EBA。
数据的集合与序列
很多数据是列表 / 序列(向量):文本=词的列表;时间序列=(时间点, 值)对的列表;DNA=符号 A、T、G、C 的列表。
模块二 · 半结构化数据格式
CSV / HTML / XML / JSON:系统之间最常用的数据交换格式。
2.1 为什么需要数据格式
数据要在不同系统间流动(如一次咖啡购买,要在 POS 系统、会计系统、手机 App 间传递)。不同系统内部存法不同,所以需要一种通用的中间格式把数据打包传过去。同一条交易可以写成 JSON、CSV、或 XML——它们是同一份信息的不同"包装"。
2.2 四种格式总览
讲义用一张表反复对比这四种格式(这张表是高频考点,建议背下来):
| 格式 | 用途 Purpose | 结构 Structure | 语义 Semantics | 典型场景 |
|---|---|---|---|---|
| CSV 简单列表 | 表格数据 | 扁平 Flat | 外部/弱 | 数据分析 |
| HTML 网页样式 | 显示 Display | 文档层级 | 弱 Weak | 网页 |
| XML 通用语言 | 语义建模 | 层级 Hierarchical | 强 Strong | 配置、标准 |
| JSON 编程数据 | 数据交换 | 层级 Hierarchical | 中 Moderate | API |
2.3 CSV / TSV
CSV(Comma Separated Values,逗号分隔值)= 最简单的数据格式,按行列存,值与值之间用逗号分隔。
| CSV 擅长 | CSV 做不到 |
|---|---|
| 简单;纯文本人类可读;易分析;Excel/Python/R 都能用 | 没有格式(formatting);没有层级(hierarchy);语义非常弱 |
TSV(Tab Separated Values,制表符分隔)和 CSV 一模一样,只是分隔符从逗号换成制表符 Tab。两者能存完全相同的数据,区别只在分隔符。
2.4 HTML
HTML(HyperText Markup Language,超文本标记语言):早期计算机只能显示纯文本,但人需要结构和强调(加粗、加大、列表)。HTML 就是用来告诉浏览器"这些东西该怎么显示"。
核心语法(讲义要点):
- 用元素 element 标记内容,元素由开始标签和结束标签界定(如段落、标题、列表)。
- 标签 tag 是放在尖括号对里的关键词;标签不区分大小写。
- 元素可以有属性 attributes,属性顺序无所谓:
<h1 class="city" id="c2">。 - 不是所有元素都需要成对标签,例如
<br>。
2.5 外观 vs 语义
这是理解 HTML 与 XML 区别的关键。假设你要分享"Exam on Friday":
| HTML | XML | |
|---|---|---|
| 写法 | <b>Exam on Friday</b> | <announcement>Exam on Friday</announcement> |
| 计算机理解为 | "把这段文字加粗" | "这是一条公告 announcement" |
| 表达的是 | 外观 Presentation(它长什么样) | 语义 Semantics(它是什么意思) |
2.6 XML
XML(eXtensible Markup Language,可扩展标记语言)是一种"元 meta"标记语言——用来"造语言"的语言(SVG、MathML、RSS 都是基于它)。特点:
- 可扩展:标签由用户自定义。
- 把样式和内容分开,专注数据而非外观。
- 设备/系统无关:纯文本,跨平台通用。
- 为系统间交换结构化数据而设计(银行、企业软件)。
- 支持多语言字符(Unicode)。
XML 语法规则(考点密集)
- 文件应以声明开头:
<?xml version="1.0"?>。 - 必须有唯一一个根元素 root element,如
<cities>…</cities>。 - 元素用标签构建,必须正确闭合;空元素写成
<br />。 - 属性必须加引号:
<person title="Sir">Richard</person>。 - 区分大小写:
<title>≠<Title>。 - 元素必须正确嵌套:
<author><firstname>James</firstname></author>对;交叉嵌套是错的。 - 注释:
<!-- … -->,不属于数据本身。
特殊字符与 CDATA
< 和 & 在元素内部是非法的,必须转义:& 表示 &,< 表示 <。
如果要放一大段含特殊字符的文本,可用 CDATA 区块:<![CDATA[ all books & videos are now < AUD 10 ]]>。
2.7 JSON
JSON(JavaScript Object Notation)是另一种流行格式:把对象表示成可在程序里操作的变量。它由 Douglas Crockford 提出(相比 XML 由委员会开发,JSON 几乎是一个人搞定的),轻量、精简。
语法规则
- JSON 对象 Object:键–值对,键是双引号包起来的字符串,用
{ }包裹、逗号分隔。 - JSON 值 Value 的类型:数字(整数或浮点)、字符串(双引号)、布尔(true/false)、数组(
[ ])、对象({ })、null。 - JSON 数组 Array:用方括号
[ ]放一串值。 - 这些对象可以递归地往下嵌套。
{
"firstName": "David",
"lastName": "Lynn",
"age": 30,
"address": { "streetAddress": "211 Fox Street", "city": "Greenville" },
"email": "dlynn@nhs.net"
}
JSON Schema(模式)
schema 是数据的"模板",描述另一份数据应有的结构。可以用 JSON 本身来写 schema,再用校验器(validator)检查某份 JSON 是否符合该 schema。例如要求必须有 name(string) 和 age(number)。
在 Python 中用 JSON
loads:把 JSON 字符串读入为 Python 的 list / dict(load from string)。dumps:把 Python 数据转成 JSON 文本(dump to string)。
loads/dumps 是和字符串 string 打交道。loads 进、dumps 出。2.8 HTML vs XML vs JSON
| HTML | XML | JSON |
|---|---|---|
| 不可扩展;关心格式/外观,不关心语义 | 允许复杂 schema 定义(可用正则);可扩展,元素表达语义;逼你更认真地设计数据 | 更精简、轻量、紧凑;易解析;受程序员青睐(追求速度与效率) |
JSON 小结:轻量标准的数据交换方式,原生 JavaScript,可表示任意半结构化数据;缺点是缺乏上下文与 schema 定义(语义比 XML 弱)。
模块三 · 结构化数据与预处理
数据库、数据质量、缩放、缺失值插补、抽样。
3.1 三层数据结构与可读性
数据按"规整程度"分三层:
- 非结构化 Unstructured:完全混在各种松散格式里(图像、音频、视频、原始文本块)。
- 半结构化 Semi-structured:数据以文本存在,但被标签、逗号、括号界定(CSV、HTML、XML、JSON)——它是"中间地带"。
- 结构化 Structured:数据项被干净地分开、按语义类型排好(电子表格、数据库)。
3.2 结构化数据与数据库
结构化数据大多由数字或单个符号构成:传感器数据(降雨、温度、湿度)、多条记录(学生、病人、交易)。
电子表格 vs 关系型数据库
电子表格 Spreadsheet 是商业/医院的默认标准:扁平表格,适合事务记录,自带校验(Excel、Google Sheets)。但当规模和复杂度变高时会"崩":列太多管不过来;用户其实每次只需要看一小部分。
解决方案:关系型数据库把大数据集拆成多个小而专注的表,靠"索引"连接起来。
- 主键 Primary Key(PK):在单张表内唯一标识每条记录。
- 外键 Foreign Key(FK):一张表里指向另一张表主键的列,用来连接两表、保证引用完整性 referential integrity。
SupervisorID、MajorID 这种外键去"引用"另两张表。改导师名字只改一处,不用全表改。DBMS 与 SQL
- DBMS(Database Management System,数据库管理系统):以有组织的方式创建、更新、检索数据的软件。
- SQL(Structured Query Language,结构化查询语言):用来创建和查询关系型数据库的语言(
create table…、select… from… where…)。
用表格还是数据库?
| 用电子表格 Spreadsheet | 用数据库 Database |
|---|---|
| 小而简单的数据集;个人或小团队;简单计算分析;更容易上手、更容易先建起来 | 大而复杂的数据集;多人并发访问;复杂查询与关系;可扩展性和性能更好、更易后续整理 |
3.3 数据摄取管线
建好数据库没用,还得可靠地把数据导入 Ingestion。讲义给出 5 步(顺序固定):Layout → Semantics → Structure → Ingestion Code → Preprocessing。
- 确定输入数据的布局 layout:行=单条记录(如每个学生),列=属性。
- 确定每个单元的语义/元数据类型 semantic type(变成列标题,如 StudentID=integer, Name=text, Major=categorical, WAM=numeric)。
- 用 JSON 或 XML 定义内部数据结构(即实际的表/记录)。
- 写代码把数据逐行导入这个结构(每行变成一条结构化记录)。
- 然后……预处理 Preprocessing。
因为"摄取只是一半",原始数据天生有缺陷,在能查询/建模之前必须严格预处理:数据清洗、整合(合并多数据集不冲突)、缩减与缩放(把数值归一化以便准确分析)。
3.4 数据质量与清洗
评估数据质量的 6 个维度
| 维度 | 含义 |
|---|---|
| 准确性 Accuracy | 对还是错、准不准 |
| 完整性 Completeness | 是否有没记录/不可得的 |
| 一致性 Consistency | 表示方式有没有冲突 |
| 及时性 Timeliness | 是否及时更新 |
| 可信性 Believability | 我信不信这数据是真的 |
| 可解释性 Interpretability | 我多容易看懂它 |
解决不一致(数据清洗 = 去错)
- 命名 Naming:"three" / "3" → 统一成 3。
- 格式 Formats:"3/4/2016" / "3rd April 2016" / "4/3/16" → 统一成 "2016-04-03"。
- 等价 Equivalency:Age=20 与 Birthdate="1/1/1971" 表示同一信息 → 统一成一个年龄变量。
- 重复 Duplication:两个学生用了同一个 student id。
- 离群值 Outliers:…87,89,90,9999。
清洗手段:data scrubbing、差异检测、去重、审计;也有 ETL(Extract-Transform-Load)工具通过图形界面指定转换。本课重点是理解这些方法背后的原理。
3.5 缩放:归一化与标准化
为什么要缩放 Rescaling?很多算法靠距离度量 distance metrics 找关系。如果不同变量量级差太多,绝对数值大的那个变量会人为地主导算法。所以要把它们放到可比的尺度上。这是预处理管线里的重要一步。
两种方法
| 归一化 Normalisation | 标准化 Standardisation | |
|---|---|---|
| 做什么 | 把值缩放到 [0,1] | 把值缩放成 均值=0、标准差=1 |
| 公式 | (x − xmin) / (xmax − xmin) | (x − μ) / σ |
| 何时用 | 数字有不同单位(英寸、厘米…);有明确上下界 | 数字没有固定上下界(年龄 0–…,收入 1000–…);想比较分布 |
| 侧重 | 比较单个数值;用最大最小值缩放;重置到固定端点 [0,1] 或 [-1,1] | 比较数值的分布;用均值和标准差缩放;适合开放区间数据 |
标准化:比较摄氏[0–100]和华氏[32–212]的"相对炎热",但天气没有固定最大值可除 → 用 z=(温度−历史均值)/标准差,看偏离自身历史均值多少。
另外还有用于特征工程的其它变换:log(x)、xᵏ、eˣ。
3.6 缺失值与插补
数据集很少是完整的。在决定怎么填之前,要先诊断"为什么缺 missingness mechanism"。讲义用一棵概率树区分三种:
| 类型 | 定义 | 能否造规则预测缺失 |
|---|---|---|
| MCAR 完全随机缺失 | 缺失概率与任何其它变量、也与该变量自身都无关 | 不能造规则,纯随机 |
| MAR 随机缺失 | 缺失概率与其它已测变量有关(例:男性的体重更容易缺) | 能造个规则(不一定 100% 准,但好过瞎猜) |
| MNAR 非随机缺失 | 缺失与该变量自身的值有关,即使控制了其它变量(例:只有低 IQ 的人 IQ 缺失) | 能造出准确预测缺失的规则 |
伪装缺失 Disguised Missing Data
有些缺失"伪装"成正常值:所有人生日都是 1 月 1 日?邮箱都是 xx@xx.com?(讲义经典例子:一个荷兰人租车,邮编填不进系统,工作人员让他用租车点的邮编代替——于是数据被污染了。)处理方法:用领域知识找"异常/可疑"的值。
简单插补 Simple Imputation(数值)
Imputation(插补)= 猜测/填补缺失值的方法。最简单的统计量插补:均值 Mean、中位数 Median、众数 Mode。
| 优点 | 缺点 |
|---|---|
| 易计算、易管理;不丢记录 | 会扭曲其它统计量(如方差、标准差) |
工具:sklearn 的 SimpleImputer,strategy 可选 mean / median / most_frequent(众数)。
3.7 抽样
Sampling(抽样)= 选少量样本来代表全部数据。何时抽样?当数据集大到无法高效全量分析时——抽一个有代表性的样本比调查全部更高效、更省钱。抽多少?太少会有抽样误差、结果不可信;不同数据/需求需要不同样本量。
抽样方法
- 随机抽样 Random sampling:随机选(如从电话簿随机抽 10000 个号码打)。
- 有/无放回 with / without replacement:没人接电话时怎么办(要不要把这个号"放回去"可能再抽到)。
- 分层抽样 Stratified sampling:先按相关特征把总体分组(年龄段/性别/收入层),再在每组内抽样(可随机,或再细分)。
抽样的挑战
- 挑战一:样本必须有代表性 representative(具备总体的重要属性)且平衡 balanced(不漏掉某些情况)。
- 挑战二:样本要足够大才(相对)可信——需要统计学保证;而且受访者还可能不诚实(政治民调常见)。
模块四 · 非结构化数据:爬取与抓取
从网络获取数据:API、爬取 Crawling、抓取 Scraping。
4.1 非结构化数据与获取方式
非结构化数据 Unstructured data = 没有(或隐藏)结构,缺乏规律、不易分解的内部结构(文本、图像等)。需要专门方法来搜索和处理;而且你得先从网上采集并清洗,才能用。
从网络拿数据有两条主路:
| 方法一:用 API | 方法二:爬取 + 抓取 |
|---|---|
| API(Application Programming Interface)让程序直接向服务请求数据,不用下载整个网页。返回的数据通常已经是结构化的(如 JSON)。 | Crawling(爬取):自动访问网页并收集;Scraping(抓取):从这些页面里提取你要的特定信息。 |
4.2 爬取 Crawling
| Crawling 爬取 | Scraping 抓取 |
|---|---|
| 在网上找到你想要的数据。从一组种子 URL(seed URLs)出发,沿链接图访问所有网站。非targeted(不针对)——只是把找到的文档记录下来。 | 从你已找到的文件里提取数据。从一个文档开始,targeted(有针对)——你告诉它要抽什么。 |
爬取怎么做
- 从一组种子 URL 开始。
- 访问它们的页面,收集它们指向的所有链接。
- 把这些新页面当作新的起点。
- 不断循环。
爬虫又叫 spiders / robots / bots。它们尽量访问每个感兴趣的页面并取回处理、建索引。两个硬要求:必须避免重复 URL,必须避免无限循环。难点还有:网上没有中央 URL 索引;爬虫永远不知道何时算"爬完了";有些站不希望被爬;有些内容是数据库实时生成(如社交动态);有些内容寿命很短(如新闻)。
爬取算法(图遍历)
网页是一张高度链接的图 graph。算法核心:从待访列表 L 取一个 URL,抓取并解析建索引,提取出新 URL,把已访的移到 V(已访集合),把新发现的(不在 V 里的)加进 L……反复。新 URL 加在哪里决定了遍历顺序:
- 加在队首 → 深度优先 DFS(depth-first)。
- 加在队尾 → 广度优先 BFS(breadth-first)。
- 排序后插入 → 最佳优先 best-first。
危险与蜘蛛陷阱
- 蜘蛛陷阱 Spider Traps:无限动态生成的链接(如日历"下一月"可以无限点),让爬虫永远循环。
- 重复页面:同义 URL、镜像站,把队列塞满冗余数据。
- 动态生成:实时从数据库生成内容会花服务商的钱,因此不欢迎过度访问。
- 延迟波动 Latency:远程服务器带宽和响应时间不可预测。
robots.txt(机器人排除标准)
因为 Google 爬得多,它推动了一个标准:robots.txt,让网站告诉爬虫哪些能爬、哪些不能。Googlebot 支持的字段:
user-agent:身份核对,指定规则适用于哪个爬虫。allow:允许爬的路径。disallow:不允许爬的路径。sitemap:站点地图的完整 URL(帮爬虫找到站内所有链接)。
爬虫行为准则
| 必须做(合规) | 应该做(性能) |
|---|---|
| 礼貌 Polite:只爬允许的页面,严格遵守 robots.txt 和礼貌延迟。 合法 Legal:尊重版权、知识产权、所有权边界。 健壮 Robust:对蜘蛛陷阱和恶意行为免疫。 |
节俭 Parsimonious:避免抓重复页面以省带宽。 高效 Efficient:先抓高质量页面;重抓以保持新鲜。 可扩展 Scalable:多机并行提高整体爬取速率。 |
4.3 抓取 Scraping
抓取三阶段管线:① 爬取网页拿到文档 → ② 从文档里抓取信息(HTML/XML 已经"半结构化",所以用 Beautiful Soup 或 lxml 库)→ ③ 清洗并保存(用 NLP 技术处理纯"原始"文本以标准化)。
抓取基础:从文档开始;是提取数据的过程;targeted(你给算法指定要抽什么);你还要指定抽出来的数据最终的格式。
清洗文本标记 markup
很多 AI/NLP 应用需要"干净"的原始文本——没有标记、没有多余空白。步骤:① 处理文件前导信息 preamble;② 压缩多余空白;③ 剥掉不必要的 XML/HTML 等标记;④ 可读的标记(如项目符号、空行)怎么处理则需要权衡。可以自己写处理器,或用现成软件包。
Beautiful Soup(简单方式)
一个软件包,能剥掉 HTML/XML 并方便地查找文本片段。两步:① 先用解析器 parser(把 HTML/XML 文档分解成各部分的程序);② 再用 BeautifulSoup 提取你要的片段。HTML 输入可用 Python 标准库解析器;XML 输入用 lxml 解析器。
常用操作(讲义示例):
BeautifulSoup(html_doc, 'html.parser')解析;soup.prettify()美化输出。soup.get_text():只抽出纯文本。soup.find_all('a'):按标签找所有匹配元素;find_all(["a","b"])找多种标签;find_all(True)遍历所有标签名。link.get('href'):取属性值(如提取所有 URL)。soup.find(id="link3"):按属性找单个元素。- 导航:
soup.title、soup.title.name、soup.title.string、soup.title.parent.name、soup.p['class']。
抓取完整流程
- 拿到 HTML/XML 文档。
- 决定要捕获哪些信息作为数据。
- 在数据库/表格里定义数据字段。
- 用 BeautifulSoup 解析文档。
- 写 BeautifulSoup 提取模式找到信息并存进字段。
- 完成!
4.4 文本 / 图像管线
非结构化文本管线:① 爬取页面 → ② 抓取出 HTML 中需要的部分 → ③ 现在剩一堆文本字符串 → ④ 你想:拆句拆词、用各种方式标准化词(去时态等)、移除无用内容 → ⑤ 最后才能处理文本(详见模块五)。
非结构化图像管线:① 爬取 → ② 抓取 → ③ 剩原始图像文件 → ④ 你想:缩放/裁剪、标准化分辨率和色彩通道、去噪/去无关区域、提取有用特征(边缘、形状、模式)→ ⑤ 最后处理图像。
模块五 · 文本处理(NLP 基础)
分句分词、规范化、词干/词形还原、停用词、相似度、正则。
5.1 文本预处理流程
拿到原始文本后,要按顺序处理。讲义把它画成 4 个阶段:
5.2 分句与分词
分句 Sentence splitting
在哪里把词串切成句子?规则:当两个词被 "。"、"?"、"!" 之一分开,且(有时)后一个词以大写开头时切分。
分词 Word Tokenisation
把(句子)字符串切成词元 word tokens。分隔符默认是空格 " ";把标点作为单独的词剥离开。标点包括:. , ; : ? ! – < > / | + $ % ~ 等。
5.3 规范化
大小写折叠 Case folding
把文本转成单一大小写(一般转小写)。把所有变体映射到同一个小写形式,能大幅减少数据稀疏性 sparsity。这是支持搜索、匹配、模式识别的简单而高效的技术。
其它文本规范化
处理嘈杂的真实数据(社媒评论、短信、邮件)时很关键,例如处理 OOV(Out-of-Vocab,词表外词)。
5.4 词形还原:词干提取 vs 词形还原
词形态 Word Morphology 的两个问题:① 英语同一个词有不同形态(单复数、时态、体);② 词常由词根/词干 stem 加上更多部分(词素 morphemes)构成,如 in+expense+ive=inexpensive。如果每个形态都单独算,词表会大很多。所以要把它们归并。两种策略:
| 词干提取 Stemming | 词形还原 Lemmatisation | |
|---|---|---|
| 机制 | 算法式砍后缀(brute force) | 基于字典的去词素(demorphing) |
| 速度&复杂度 | 执行快、代码极简单 | 执行慢、需要庞大的语言数据库 |
| 输出有效性 | 常产生非真实单词或片段 | 总是产生有效的字典词元 lemma |
| 工具 | Porter Stemmer | NLTK WordNet Lemmatiser |
| 例子 | eating→eat(成功);green→gre(失败) | eating→eat(成功);green→green(成功) |
词形还原的实现路径:人工编写的去词素器(规则多,对德语等屈折语很必要);机器学习的去词素器(如今最常见);NLTK 提供基于 WordNet 数据库查词元的 WordNet Lemmatiser。
5.5 停用词
词分两类:
| 保留:开放类词 Open-Class | 丢弃:封闭类词 Closed-Class |
|---|---|
| 实义词 Content words(名词、动词、形容词、副词,如 bicycle、eat、happy、quickly)。承载真正的含义;数量无限。 | 功能词 / 停用词 Function / Stop words(限定词、代词、介词、连词,如 the、to、not、and)。语法骨架;只有几十个。 |
停用词 Stopwords = 你想移除的封闭类(功能)词。为什么移除?减少特征/词数,支持更准确的聚类和计数。何时用?常在搜索、文本分类、主题建模/抽取之前。停用词表可针对特定领域定制(如 ranks.nl 提供 40 种语言的表)。
5.6 相似度与近似匹配
文本匹配解决三类问题:精确匹配 Exact、近似匹配 Approximate、简单相似 Simple Similarity。
简单相似:n-grams
n-gram:长度为 n 的连续序列。词 n-gram:连续 n 个词("coffee break")。字母 n-gram:长度 n 的子串。设 Gn 返回所有长度 n 的字母 n-gram(# 是填充符):
- G2(color) 的二元组 = [#c, co, ol, lo, or, r#]
- G3(color) 的三元组 = [##c, #co, col, olo, lor, or#, r##]
两词的字母 n-gram 距离:
二元组距离 = 7 + 7 − 2×6 = 2。(0 表示完全相同,越大越不相似)
近似匹配:编辑距离 Edit distance
何时用?文本不完全相同时。通过三种基本字符操作把源串变成目标串:插入 Insert、删除 Delete、替换 Replace。每次操作有一个代价(mismatch score);需要的编辑越多,距离越远。
相似度 = 1 − 编辑距离:
相似度 sim(s₁,s₂) = 1 − d(s₁,s₂) / max(|s₁|,|s₂|)
很多相似/距离度量:Jaccard、Sørensen-Dice、Cosine、Jaro-Winkler;编辑距离类有 Levenshtein、最长公共子串、Hamming。统一关系:相似度 = 1 − 距离。
5.7 正则表达式
正则表达式 Regular Expression(RE):一个能匹配各种子串的模式 pattern,匹配规则由你指定。用途:找到目标项、统计出现次数、完整性检查/过滤/替换。要求:简洁、无歧义、代码可维护。
基本匹配
- 字符匹配自身:模式
t匹配 "t";hello匹配 "hello"。 .通配符:匹配任意单个字符(a.c匹配 "a/c"、"abc"、"a5c")。.是元字符 metacharacter。
字符集
[ ]:匹配集合中任一字符。[abc]、[a-zA-Z]。[^ ]:取补集——把^放在集合第一个位置表示"除这些之外"。[^z]匹配除 "z" 外的任何字符。
预定义集合
\d= 任意数字 =[0-9]\w= 任意字母数字 =[a-zA-Z0-9_]\W= 任意非字母数字 =[^a-zA-Z0-9_]
转义、或、锚点
- 转义 Escape:用
\让元字符表示字面量。a\.c匹配字面 "a.c";a\\c匹配 "a\c"。\本身也是元字符。 - 或 Alternatives:
|是 "OR"。P1|P2匹配 P1 或 P2。 - 锚点 Anchors:
^必须是串开头(^from匹配 "from Melbourne",不匹配 "I am from Melbourne");$必须是串结尾。
重复、分组、断言
- 重复 Repeating:
*零或多次;+一或多次;?零或一次;{m,n}至少 m 至多 n 次。匹配默认是贪婪 greedy。 - 分组 Group:
( )把模式分组,捕获并编号,可用反向引用 back-reference。 - 前瞻断言 Lookahead:
(?= )正前瞻——后面必须匹配;(?! )负前瞻——后面必须不匹配;断言本身不算进匹配结果。\d+(?=AUD)只匹配后面跟着 AUD 的数字;\d+(?!AUD)只匹配后面不跟 AUD 的数字。
全部元字符:. ^ $ * + ? { } [ ] \ | ( )
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+ 的逐段含义:一或多个字母数字等 → "@" → 同样的字符段 → 字面 "." → 再来一段。合起来就匹配所有邮箱地址。5.8 字符串匹配的用途
为什么字符串匹配有用?三类应用:
- 拼写纠错 Spelling correction:词不在字典里时,用户本来想拼哪个?常见做法:找所有"邻近"(字母 n-gram 距离小)的词,结合左右词的上下文窗口选最合适的(需要语言里常见词 n-gram 的列表)。例 "no ther option" → 候选 otter / other / here,选 "other"。
- 新词 Neologisms:新造的词(phat、ChatGPT、arvo)。例如混成词 blending:breakfast+lunch→brunch,fork+spoon→spork,Britain+exit→Brexit。语言持续变化,社媒尤其多产;没有简单解法,只能不断扩充词典。
- 词等价 Word equivalence:近义/等价形式。英美拼写(color=colour,defence=defense);地名/街道缩写(boulevard|blvd|bd|… ;apartment|apt|ap|…)。
模块六 · 文档表示与文本相似度
把文本变成向量:BoW、TF-IDF、距离度量。
6.1 文本也有结构
前面(模块四/五)我们把文本爬下来、清洗、分词、去停用词了。但预处理还不够——文本看似"非结构化",其实有结构:词被分组 grouping,单个词和分组都各自携带信息。例如 "I love you but you hate me" 和 "I hate you but you love me" 用词完全一样,含义却相反——含义取决于词的组合方式。
难点在于:没人会把分组和角色直接给你,处理非结构化数据时要自己判定分组与角色。所以我们需要给整篇文档一个表示,它要:结构化、易生成、易操作(用于显示、分析、机器学习)。
6.2 词袋模型 BoW
Bag of Words(BoW,词袋模型):描述词在文档中出现情况的表示。包含两件东西:① 一个已知词的词表 vocabulary;② 对这些词出现程度的度量(通常是计数)。
做法:把文档表示成一个数值向量,每一维(每个格子)对应词表里的一个词,格子里的值是该词在文档里的计数。
"How are you" → [0,1,0,0,0,1,0,0,0,1];"Have a nice day" → [1,0,0,1,1,0,1,0,0,0]。每篇文档就是一个等长向量。
更多预处理能减少维度(特征数):词形还原(have/had/has 不分开数)、去停用词(不在乎 the/a)、去标点。BoW 优点:表示极简单(就是整数向量);只需一个很长的简单向量;用预处理工具就能生成;适用任何语言、甚至表情符号。
6.3 BoW 的问题:词频不够
BoW 用词频 Term Frequency(TF)作为值。相似的 BoW 向量大概率是同一主题。但只看词频会出错:
| 问题 | 说明 |
|---|---|
| 丢词序 = 丢语义 | "I love you but you hate me" 与 "I hate you but you love me" 词频完全相同 |
| 常见词主导计数 | the/a/of 到处出现,淹没了真正能区分文档的稀有词 |
| 计数依赖文档长度 | 文档越长计数通常越大,比较不公平 |
6.4 TF-IDF
解决思路:奖励稀有词。一个词出现在越少的文档里,它越能区分文档、越重要。这就是 IDF(Inverse Document Frequency,逆文档频率)。
TF-IDF = TF × IDF,把"局部丰富 Local Abundance"和"全局稀有 Global Rarity"相乘:
tfi,j = 词 i 在文档 j 中的出现次数 · dfi = 含词 i 的文档数 · N = 文档总数
取 log 是为了让 IDF 增长得慢一些。一个词若在某篇文档里频繁、但在整个集合里稀有,它的 TF-IDF 就高。
归一化(消除文档长度影响)
文档越长 → TF-IDF 值越大 → 比较不公平。所以要归一化:把每篇文档的 TF-IDF 向量除以它自身的长度(L2 范数 = 各项平方和再开根号),使值落在合理范围、可公平比较。
完整算例(讲义用的 sklearn 版本)
讲义算例用的是带平滑的 IDF:idf(t) = ln( (1+N) / (1+dft) ) + 1,再对每篇文档做 L2 归一化。
两篇文档(去停用词后):A = "car driven road",B = "truck driven highway",N = 2。
| 词 | df | idf = ln((1+2)/(1+df))+1 | 原始 TF·IDF(A / B) | L2 归一化后(A / B) |
|---|---|---|---|---|
| car | 1 | ln(3/2)+1 = 1.405 | 1.405 / 0 | 0.632 / 0 |
| driven | 2 | ln(3/3)+1 = 1.000 | 1.000 / 1.000 | 0.449 / 0.449 |
| road | 1 | ln(3/2)+1 = 1.405 | 1.405 / 0 | 0.632 / 0 |
| truck | 1 | ln(3/2)+1 = 1.405 | 0 / 1.405 | 0 / 0.632 |
| highway | 1 | ln(3/2)+1 = 1.405 | 0 / 1.405 | 0 / 0.632 |
文档 A 的 L2 范数 = √(1.405² + 1² + 1.405²) = √4.948 ≈ 2.225,所以 car 归一化 = 1.405 / 2.225 ≈ 0.632,driven = 1 / 2.225 ≈ 0.449。可以看到:只出现在一篇文档里的词(car、road、truck、highway)权重更高,因为它们能区分文档;两篇都有的 driven 权重被压低。
6.5 距离与相似度度量
把文档变成向量后,要衡量"两个点有多远"。距离度量 distance metric 就是给两点距离打分的公式。统一关系:相似度 = 1 − 距离(视度量而定)。
| 度量 | 含义 / 公式 | 直觉 |
|---|---|---|
| Cosine 余弦相似度 | 两向量夹角的余弦;衡量方向是否一致 | 不在乎向量长短(文档长度),只看"方向/主题"是否一致;越接近 1 越相似 |
| Manhattan / L1 曼哈顿距离 | 各维绝对差之和:|x₁−x₂| + |y₁−y₂| | "沿街区走",只能沿网格走,不能走直线 |
| Euclidean / L2 欧氏距离 | √((x₁−x₂)² + (y₁−y₂)²) | 平面上两点的"直线距离" |
| Jaccard 杰卡德 | 把词当集合:sim = |A∩B| / |A∪B|;距离 = 1 − sim | 交集占并集的比例 |
| Dice 骰子系数 | sim = 2|A∩B| / (|A|+|B|) | 与 Jaccard 类似,更看重交集 |
Jaccard:A={cat,dog}, B={cat,dog,elephant} → |A∩B|=2, |A∪B|=3,sim=2/3。
6.6 距离能用来做什么
- 检索 Retrieval:找到和手头这篇相似的文档。
- 查重 Duplicates:检查是否有重复或近似重复的文档。
- 聚类 Clustering:找出相似文档的集合(如新闻分到体育、政治…)。
- 主题建模 Topic Modeling:找出数据中的主题(如某文 60% 金融 + 40% 政治)。
- 趋势分析 Trend Analysis:看文档内容随时间的变化(比较 t 与 t+1 的距离)。
模块七 · 数据可视化
用图形发现结构:分布统计、单变量/双变量/高维图。
7.1 探索性数据分析 EDA
人的眼睛和大脑很擅长发现结构。可视化(绘图)就是数据的视觉编码。可视化的目的:① 分析数据——揭示模式;② 把数据传达给别人。
| 数据驱动(bottom-up) | 假设检验(top-down) |
|---|---|
| 从数据出发 → 引出你的想法(数据 → 你) | 从你的想法出发 → 去验证(你的脑 → 数据) |
EDA(Exploratory Data Analysis,探索性数据分析) 偏前者:先看数据长什么样、是否平衡、有哪些"簇"。
7.2 分布与统计量
定量变量的值有一个范围,数据点占据范围里的位置。这些点的"分布 distribution"=它们铺开的模式。用简单统计量描述分布的两类侧面:
| 位置度量 Location(数在哪) | 离散度量 Dispersion(数怎么散开) |
|---|---|
| Min/Max;Mean 均值;Median 中位数(中间值,适用于有序和名义);Mode 众数(最常见值,数值/有序/名义都行);分位数/百分位 Quartile/Percentile | 方差 Variance(点离均值多远);标准差 Std(方差的"平均"版);范围 Range(min 到 max);四分位距 IQR;偏度 Skewness(分布是否有长尾) |
7.3 单变量图:直方图、分箱、箱线图
直方图 Histogram
x 轴:把值域分成连续、不重叠、等宽的区间;y 轴:频数(或与频数成比例的值)。从直方图能读出:范围、中心位置、对称性、模态(单峰/双峰/多峰)、离群值。形态有:对称、左偏、右偏、单峰、双峰、多峰。
分箱 Binning
同一数据用不同箱宽 bin size 画出的直方图会很不一样,难点是选合适的箱宽:
- 箱太小 → 正常对象落进空的/稀有的箱里 → 假阳性 false positive。
- 箱太大 → 离群值被藏进某些高频箱里 → 假阴性 false negative。
箱线图 Box plot(Tukey)
- Median 中位数(排序后中间点);Q1 中位数以下的中间点;Q3 中位数以上的中间点。
- IQR(四分位距)= Q3 − Q1。
- 须 / 内栏 Whiskers:上限 = Q3 + 1.5×IQR,上内栏 = ≤ 上限的最高数据点;下限 = Q1 − 1.5×IQR,下内栏 = ≥ 下限的最低数据点。
- 疑似离群值(圆圈):比 Q1 低或比 Q3 高超过 1.5×IQR。
- 离群值(黑点):比 Q1 低或比 Q3 高超过 3×IQR。
7.4 双 / 三变量图
散点图 Scatter plot
两个数值变量:x 轴一个、y 轴另一个,每个点是一个 (x, y) 数据点。可看出模式(如典型相关:x 增大 y 通常也增大)和离群值。
过度绘制 Overplotting:点太多会重叠。解决:减小点的尺寸;抖动 Jittering(在画图前给值加一点均匀随机噪声);抽样;或改用等高线图。
等高线图 Contour plot
3 个变量 x, y, z,仍画在 2 维但能多显示一维:等高线连接第三变量取值相同的点。Python 用 seaborn 的 sns.kdeplot(),用核密度估计把"数据点密度"当作第三变量。
7.5 高维数据
我们习惯 2 维。要显示更多维,可用额外的信息载体 info carriers:颜色、形状、大小、运动(并用图例 legend 说明每个载体代表什么)。常用高维可视化:
- 热力图 Heat map:显示 x、y 轴,用颜色表示 z 值;画数据矩阵;当对象按类/型排好序时尤其有用;通常先归一化特征以防某一属性主导。
- 散点图矩阵 Scatterplot matrix:所有维两两配对画散点;能同时检查很多关系,方便发现相关和离群值。
模块八 · 聚类与降维
k-Means、肘部法、VAT、层次聚类、PCA。
8.1 聚类是什么
Clustering(聚类):自动找出数据中有意义的组 / 分段 / 社群。它是无监督的(没有标签)。好处:更好地理解数据;对每组施加不同干预(如不同营销活动);找到有意义的组、避免被太多细节淹没。
应用:市场细分、图像分析(图像离散化=把颜色重映射到 k 种、图像分割)、文档聚类、离群检测。
好聚类的三条标准 desiderata
- 每个对象恰好分到一个簇。
- 同簇内对象相似,不同簇对象相异。
- 每个簇可用它的质心 centroid(所有对象的"平均")来概括。
目标:簇内距离最小化(intra-cluster minimized),簇间距离最大化(inter-cluster maximized)。所有聚类算法最终都用到某种距离度量。
8.2 k-Means 聚类
划分式聚类 Partitioning clustering 需要分析者预先指定簇数。最有名的就是 k-Means。
- 问用户要几个簇(如 k=5)。
- 随机选 k 个质心 centroid。
- 每个数据点找出离它最近的质心,于是每个质心"拥有"一组点。
- 每个簇计算其中点的新质心(=均值点)。
- 新质心 → 新边界。
- 重复 3–5,直到不再变化(收敛)。
8.3 选 k:肘部法
最好的 k 是多少?思路:找让簇"最紧"的 k。做法:对 k=1,2,3… 反复计算,每次测"紧致度",挑最好的那个。
紧致度用 WCSS(Within Cluster Sum of Squared distance,簇内平方距离和),也叫 SSE(Sum of Squared Error):每个点到其最近质心距离的平方之和。
8.4 k-Means 的局限
k-Means 在以下情况表现不好:
- 簇大小差异大 Differing Sizes。
- 簇密度差异大 Differing Density。
- 非球形 Non-globular shapes(k-Means 偏好"球状"簇)。
一个克服思路:先用很多个小簇,再合并它们。
8.5 VAT:聚类倾向可视化
VAT(Visual Assessment of Clustering Tendency,聚类倾向的视觉评估) 用来在聚类前判断数据天然有几个簇(即 k-Means 的 k 该取几),尤其当有成千上万个点、不易直接看出时。方法:通过观察热力图来视觉判断聚类结构。
相异度矩阵 Dissimilarity matrix
用一个向量距离函数(如欧氏距离)计算所有对象两两之间的距离,得到一个 n×n 的相异度矩阵。性质:对角线全 0;关于主对角线对称(D(i,j)=D(j,i));行列对象顺序一致。把它画成热力图:相似→冷色,相异→热色(需配图例)。
重排揭示簇
原始(随机顺序)的相异度矩阵热力图看不出结构。把对象重新排序,让相近的对象在排序中也相邻,就会在对角线上出现大的暗色方块——每个暗块就是一个簇。好的 VAT 图能同时提示簇数和各簇大致成员。VAT 算法(Bezdek & Hathaway 2002)就是从最不相似的一对出发,每步把和已选集合"最相似"的对象并进来,得到这个排序。
8.6 层次聚类
Hierarchical clustering(层次聚类) 产生一组嵌套的簇,组织成一棵层次树,可用树状图 dendrogram 可视化(树状图的 y 轴是距离,记录合并的先后)。
好处:不必预先假定簇数;通过在合适高度"剪 cut"树状图可得到任意簇数(剪得高→簇少;剪得低→簇多);可能对应有意义的分类法(如生物界、系统发生树)。
凝聚式(最常用)流程
- 计算距离矩阵;让每个点各成一簇。
- 重复:合并最近的两个簇 → 更新邻近矩阵。
- 直到只剩一个簇。
簇间距离怎么定(区分不同算法的关键)
| 连接方式 Linkage | 两簇距离定义为 |
|---|---|
| 单连接 Single link | 两簇中各取一元素,所有配对里的最小距离 |
| 全连接 Complete link | 所有配对里的最大距离 |
| 平均连接 Average link | 两簇所有元素配对的平均距离 |
分裂式常借助最小生成树 MST 构建:从任一点开始,反复找一端在树内、另一端在树外的最近点对,把外点加入并连边。
8.7 降维与 PCA
高维数据问题:特征多 ≠ 信息多。无关特征会扰乱模型,且距离在高维下变得不那么有意义——这叫维度灾难 Curse of dimensionality。
降维 Dimensionality reduction:把特征从 N 降到 n(n ≪ N),保留有用信息、去掉无关特征。注意它会创造新特征(不只是挑选)。n 常取 2 或 3 以便可视化。
PCA
PCA(Principal Components Analysis,主成分分析):自动找出数据中最有用、相互独立的"侧面"。每个新维度是原特征的线性加权组合,各维正交(=独立),并按"重要性/强度"排序:
- 第一维:捕获尽可能多的变异性 variability。
- 第二维:与第一维正交,在此约束下捕获剩余变异性中尽可能多的。
- 第三维:与前两维正交,再捕获剩余尽可能多的……依此类推。
| PCA 优点 | PCA 局限 |
|---|---|
| 消除无关特征/降噪;特征更少 → 模型更小更快;变换出更好的特征 → 更准;避免维度灾难;便于可视化;主成分相互独立 | 不清楚该保留几维;主成分可能难以解释;可能有信息损失;只假设线性组合、非概率模型(不能与概率结果直接结合);降维后不一定有助分类;对尺度敏感(要先标准化!);对离群值敏感 |
模块九 · 相关性、熵与互信息
衡量两个特征的关系:Pearson、Entropy、Mutual Information。
9.1 相关性是什么
Correlation(相关性):① 发现可能有关系的变量对;② 判断关系有多强。可以从散点图目测。两个维度:
- 强度 Strength:强 vs 弱。
- 方向 Direction:正相关(x 增 y 增)vs 负相关(x 增 y 减)。
为什么重要?① 更理解数据、辅助决策(云和雨相关 → 带伞);② 是迈向因果的一步;③ 建更好的预测模型——好的特征 = 与要预测的目标高度相关的特征(特征排序/选择)。
9.2 相关 ≠ 因果
- 隐藏共因 Hidden common cause:太阳镜卖得多 → 冰淇淋也卖得多。不是太阳镜让人饿,而是太阳同时导致了两者。
- 虚假相关 Spurious correlation:两个毫不相关的量恰好同步变化(tylervigen 上有大量搞笑例子)。在政治和差劲论证里非常常见。
- 离群值会制造/掩盖相关:盐摄入与血压的研究里,去掉 4 个非工业化国家的离群点后,结论就大变。
9.3 Pearson 相关系数
要量化"强度"就要量距离:相关越强 = 各点到那条直线的平均距离越小。但直接用欧氏距离有问题——量纲不同、无法发现"形状相似但尺度不同"或"方向相反"的关系。于是用 Pearson Correlation(皮尔逊积矩相关系数 r),专门衡量散点图有多接近一条直线。
r ∈ [−1, 1]:1=完美正线性,−1=完美负线性,0=无(线性)相关;|r| 表示线性相关强度。Cohen 的经验解读:≥0.5 大,0.3–0.5 中等,0.1–0.3 小,<0.1 微不足道(实际还要看领域)。
Pearson 的性质(考点)
- 范围 [−1, 1];对离群值敏感。
- 只能检测线性关系(y=ax+b+噪声),检测不了非线性(如 y=x³)。
- 尺度不变 Scale invariant:r(x,y)=r(x,Ky),某特征乘常数 K 不变。
- 位置不变 Location invariant:r(x,y)=r(x,K+y),某特征加常数 K 不变。
9.4 熵 Entropy
Pearson 对非线性无能为力,但非线性数据明明有规律。于是研究"随机性"。Entropy(熵)衡量描述一个系统所需的信息量 / 不确定性 / "散乱度 scatteredness"。
用概率行不行?不行——概率只说"下一个值多可能",不衡量整组数的信息量。所以单独定义熵。
本课 log 默认以 2 为底(单位是 bit)。回顾:log₂16=4,log₂0.5=−1,log₂1=0。
算例
特征"Likes to sleep",8 人:Yes 4、Never 2、Maybe 1、No 1。
| 值 | 比例 p | log₂p | p·log₂p |
|---|---|---|---|
| Yes | 4/8=0.5 | −1 | −0.5 |
| Never | 2/8=0.25 | −2 | −0.5 |
| Maybe | 1/8=0.125 | −3 | −0.375 |
| No | 1/8=0.125 | −3 | −0.375 |
H = −(−0.5−0.5−0.375−0.375) = 1.75。(另一例 A B B A C C C C A:p=3/9,2/9,4/9 → H≈1.53)
熵的性质
- 最小值 = 0:某一类概率为 1(完全确定)。
- 最大值 = log₂(m):m 个类别等概率(最不确定)时取得。二元情形上限 = log₂2 = 1 bit。
- 类别数 m 越多,最大熵越大。
9.5 离散化
算熵需要离散值,但常遇到连续值(如身高),所以先离散化 Discretisation 成箱(类别)。三种方法:
| 方法 | 做法 |
|---|---|
| 等宽 Equal-width | 把值域分成等长度区间。如 0–100 分 10 个箱:[0,10),[10,20),… |
| 等频 Equal-frequency | 排序后分成每箱对象数大致相等的区间 |
| 领域知识 | 手动设阈值(如车速 0–40 慢、40–60 中、>60 快) |
等宽:箱宽=(21−2)/3≈6.33 → [2,8.33),[8.33,14.67),[14.67,21]。
等频:[2,13),[13,19),[19,21](每箱约等量)。
9.6 条件熵
Conditional Entropy(条件熵)H(Y|X):已知 X 之后,描述 Y 还需要多少信息(Y 还有多"散")。
H(Y|X=big) = −[(1/2)log(1/2)+(1/2)log(1/2)] = 1
H(Y|X=small) = −[(4/5)log(4/5)+(1/5)log(1/5)] = 0.721
H(Y|X) = (2/7)×1 + (5/7)×0.721 = 0.801
9.7 互信息
Mutual Information(互信息 MI):知道一个变量能减少另一个变量多少不确定性。它"对抗"熵。
算例
承上例:H(Y)=0.8631,H(Y|X)=0.5571 → MI = 0.8631 − 0.5571 = 0.3059。
性质与归一化
- MI(X,Y) ∈ [0, ∞);越大越相关(越依赖),越小越独立。也叫 Information Gain(信息增益)。
- 可证 0 ≤ MI ≤ min(H(X), H(Y)),所以归一化到 [0,1] → NMI:
例:MI=0.3059,NMI≈0.517(用 min)。
9.8 MI vs Pearson
| 对比 | Mutual Information | Pearson |
|---|---|---|
| 关系类型 | 任意(线性 + 非线性) | 只限线性 |
| 值为 0 表示 | 两变量独立 | 关系不是线性(可能仍有非线性关系) |
| 敏感于 | 反映结构的存在 | 对噪声/离群敏感 |
| 取值范围 | 0 到 +∞ | [−1, +1] |
| 计算速度 | 慢 | 快 |
| 方向 | 只给强度,不给方向 | 有方向(正/负) |
模块十 · 监督学习:分类
KNN、决策树、Hunt 算法与信息增益。
10.1 分类与回归
Classification(分类):把数据项放进正确的"桶/类"。好处:降低复杂度(很多东西能一起处理);基于历史数据预测未来——这就是预测建模,机器学习的基础。
方法论:训练 / 测试
- 准备:要有训练集 training set(带标签的样例)来教算法。
- 训练 Training:算法看每个样例,找出能预测标签的模式。
- 测试 Testing:用测试集 test set(新数据)定期检验预测有多准;够好就停,否则继续训练。
这类"给样例让算法学"的算法叫 Supervised Machine Learning(监督学习)。分类 vs 回归:分类学一个标签(离散类名);Regression(回归)学一个连续实数值(如由温度预测冰淇淋销量)。本课学两种:KNN 和决策树。
10.2 K 近邻 KNN
K Nearest Neighbours(K 近邻,KNN) 的直觉:在一堆带标签的点里,一个未知点很可能和它最近的邻居同类——"走起来像鸭子、叫起来像鸭子,那大概就是鸭子"。
需要三样东西
- 一组存好的(带标签)记录。
- 一个距离度量(如欧氏距离;也可用 Pearson)。
- 参数 k:取多少个最近邻。
给未知点分类:算它到所有训练点的距离 → 找出 k 个最近邻 → 用这些邻居的标签投票决定(多数表决 majority vote)。也可按距离加权投票,权重 w = 1/d²(越远票越轻)。k=1 时,分类边界就是 Voronoi 图。
10.3 决策树结构与使用
Decision Tree(决策树):先看最重要的方面,据此再看次重要的……直到做出决定。结构是一棵流程图式的树:
- 内部节点 internal node:对某个属性做一个测试。
- 分支 branch:测试的一个结果。
- 叶节点 leaf node:给出类标签(分类)或推荐动作(决策)。
用树预测:从根节点开始,按测试结果一路往下走,到叶子得到预测类。注意:同一份数据可以有不止一棵树拟合(先分 Refund 还是先分 MarSt 都行),所以需要一个标准来挑"最好"的树。
10.4 建树:Hunt 算法
建树用 Hunt's Algorithm:从全部训练记录出发,自顶向下递归。在节点 t 上把当前记录集 Dt 分给子节点:
- 若 Dt 里记录全属同一类 yt → t 是叶子,标为 yt。
- 若 Dt 为空 → t 是叶子,标为默认类 yd。
- 若 Dt 含多个类 → 用一个属性测试把数据分成更小的子集(t 的各分支),对每个分支递归。
三件要学的事:每个节点用哪个特征、特征值对应走哪个分支、底部给哪个类。理想情况是某特征的每个取值都干净对应一个类(同质类分布 homogeneous class distribution),但现实很少这样。
10.5 选最佳划分:熵与信息增益
贪心策略:偏好让子节点类分布更同质(更纯 pure)的划分。需要一个"不纯度 impurity"度量——就是熵:纯节点熵低,混杂节点熵高。
最大=log₂(n)(n 类均匀分布),最小=0(全属一类)。例:6 个全 C2 → H=0;1 个 C1+5 个 C2 → H=0.65;2 个 C1+4 个 C2 → H=0.92。
信息增益 Information Gain
比较划分前父节点的熵和划分后子节点的(加权)熵,差值就是增益:
N(vj)=子节点 vj 的样本数,N=父节点样本数
增益越大,划分越好。重要联系:信息增益 = 类特征与被划分特征之间的互信息 MI——所以"按信息增益划分"就是"选与类变量共享信息最多的特征"。
H(根) = −(50/200)log(50/200) − (150/200)log(150/200)
H(左) = −(25/50)log(25/50) − (25/50)log(25/50) = 1
H(右) = −(25/150)log(25/150) − (125/150)log(125/150)
划分效用 = 信息增益 = H(根) − [(50/200)·H(左) + (150/200)·H(右)]
10.6 不同类型属性的划分
测试条件取决于属性类型和想分几路:
- 名义 Nominal:多路划分(每个取值一路)或二元划分(把取值分两组,需找最优分组)。
- 有序 Ordinal:同样可多路或二元,但二元分组要尊重顺序(如 {小,中} vs {大} 合法,{小,大} vs {中} 不合法)。
- 连续 Continuous:① 离散化成有序类别(静态一次离散,或动态用等宽/等频/聚类);② 二元判断 (A < v) 或 (A ≥ v),考虑所有可能切点取最优(计算量更大)。
模块十一 · 线性回归与模型评估
回归、过拟合、交叉验证、性能指标、特征选择。
11.1 分类 vs 回归
机器学习自动发现数据中的模式以做预测,两种基本方式:
| 分类 Classification | 回归 Regression | |
|---|---|---|
| 预测什么 | 类别 / 类(离散) | 连续数值 |
| 目标变量 y | 离散值 | 连续实数 |
| 例子 | 该不该借钱给他?Yes/No | 30℃ 时会买多少冰淇淋?(一个数) |
11.2 线性回归
Linear Regression(线性回归):用一条直线,根据自变量(独立变量 X,即特征)预测因变量(依赖变量 Y)。
最小二乘法 Least Squares
训练点不会正好在直线上,每个点有误差 ε(残差 residual)= 真实 Y − 预测 Ŷ。我们要找"总误差最小"的线,方法是调 β₀、β₁ 使残差平方和最小:
解读系数
- 截距 β₀:X=0 时 Y 的估计平均值(房价例里没有 0 平方英尺的房,β₀ 只是"不由面积解释的那部分价格")。
- 斜率 β₁:X 每增加 1 个单位,Y 的平均变化(β₁=0.10977 → 每多 1 平方英尺,均价涨 $109.77)。
预测:2000 平方英尺 → 98.25 + 0.1098×2000 = 317.85(即 $317,850)。
多元回归 Multiple Regression
不止一个自变量时:Y = β₀ + β₁X₁ + β₂X₂ + …。一个自变量拟合直线,两个拟合平面,更多则是超平面 hyperplane,都放在使残差平方和最小的位置。
| 线性回归优点 | 缺点 |
|---|---|
| 简单、快、可解释、常常意外地准 | 可能太简单,线性假设过强 |
11.3 泛化与过拟合
分类器不只用在你这份数据上,还要用在从没见过的新数据上,所以要健壮、通用(generalise)。怎么确保它不是只学会了训练数据?
Overfitting(过拟合):模型从训练数据里学得太多,表现为:
- 低偏差 Low bias error:在训练数据上预测得很好。
- 高方差 High variance error:换一套训练/测试数据,预测就大变。
11.4 训练 / 测试集划分
怎么知道模型在新数据上表现好?在训练集 training set 上训练,在另一份测试集 test set 上评估。两个假设:① 训练集和测试集来自同一分布;② 样本相互独立抽取。只有一份数据?那就把它划分成训练集和测试集。
11.5 交叉验证
数据不多时,把数据切分后反复利用。Cross-validation(交叉验证):
- 把数据分成 N 份,用 N−1 份训练、剩 1 份测试(N 折交叉验证)。
- 换另一份当测试集,重复;直到每一份都当过一次测试集。
- 把 N 次的性能取平均(如 10 个准确率的平均)。
通常 N=10(数据少时用 5)。划分是随机的,但要保证每折都包含各种类型的数据。
变体
| 变体 | 做法 |
|---|---|
| 分层交叉验证 Stratified CV | 划分时保持类别比例不变(若总体 High:Low=80:20,每折训练/测试都保持 80:20)。半随机划分,避免漏掉少数类。 |
| 重复交叉验证 Repeated CV | 把 N 折 CV 重复 r 次(每次重新随机分块),平均 N×r 个分数,削弱随机划分的影响。 |
| 留一法 Leave-one-out | 极端版:每个分区只留 1 个样本当测试,其余全训练。10000 个样本 → 10000 个分区。 |
11.6 验证集与超参数选择
折数太多 → 每个测试折太小、漏掉某些类型;折数太少 → 训练数据不够。想找"最佳折数"或最佳模型参数怎么办?不能用测试集来选——那是作弊。要再划出一块"伪测试集":验证集 validation set。
11.7 自助法 Bootstrapping
Bootstrapping(自助法):通过有放回抽样 sampling with replacement 造出"近似独立"的多个数据集。
- 从 n 个训练样本中有放回地抽 n 个 → 一个自助样本 bootstrap sample(大小与原集相同,但有重复项),当训练集。
- 没被抽到的样本 = 袋外数据 Out-Of-Bag(OOB),当测试集。
- 抽 k 个自助样本,各自训练+在自己的 OOB 上评估,最后报告 k 个分数的均值和标准差。
交叉验证 vs 自助法
| 交叉验证 | 自助法 | |
|---|---|---|
| 抽样方式 | 无放回 | 有放回 |
| 主要目的 | 估计泛化误差(预测性能) | 估计不确定性(标准误、置信区间) |
| 数据划分 | 分成互斥的折 | 造出同样大小的新数据集,有重复、有遗漏 |
| 适用 | 模型选择、超参数调优;想要可靠的泛化估计 | 小数据集;想知道模型稳定性 / 要置信区间 |
11.8 分类评估指标
混淆矩阵 Confusion Matrix
把分类结果汇总成一张表,对比真实类与预测类:
| 真实 ↓ / 预测 → | Predicted Yes | Predicted No |
|---|---|---|
| Actual Yes | TP(真阳) | FN(假阴,漏报) |
| Actual No | FP(假阳,误报) | TN(真阴) |
以下用这个例子(共 100 个):TP=45, FN=3, FP=1, TN=51。
| 指标 | 公式 | 本例 | 含义 / 何时用 |
|---|---|---|---|
| 准确率 Accuracy | (TP+TN) / N | (45+51)/100 = 0.96 | 整体对了多少;类别不平衡时会误导 |
| 精确率 Precision | TP / (TP+FP) | 45/46 ≈ 0.98 | 预测为正的里面有多少是真的;不想要 FP(误报)时用 |
| 召回率 Recall | TP / (TP+FN) | 45/48 ≈ 0.94 | 真正的正例里抓到了多少;不想要 FN(漏报)时用 |
| F1 | 2 × (P×R)/(P+R) | ≈ 0.96 | 精确率与召回率的调和平均;两者接近时 F1 高于普通平均 |
多分类
3 类时,对每个类分别算 TP/FP/TN/FN(该类为正,其余为负)。
- 子集准确率 Subset accuracy(严格)= Σ对角线 TP / N。
- 平均准确率 Average accuracy(宽松)= 各类 (TP+TN)/N 的平均。
11.9 回归评估指标
回归预测的是数值,指标衡量预测值离真值有多"近"。残差 = Yi − Ŷi。
| 指标 | 公式 | 说明 |
|---|---|---|
| SSE 误差平方和 | Σ (Yi − Ŷi)² | 越小越好 |
| MSE 均方误差 | (1/n) Σ (Yi − Ŷi)² | = SSE/n;处于残差的平方尺度 |
| RMSE 均方根误差 | √MSE | 最常用;与残差同尺度,越小越好 |
| MAE 平均绝对误差 | (1/n) Σ |Yi − Ŷi| | 与残差同尺度,越小越好 |
11.10 特征选择
学习器要考虑所有特征,但有些特征预测力比别的强得多;只用这些能省很多时间。单变量 univariate 特征选择:逐个评估每个特征的"好坏"(关于特征数是线性时间,最常用最简单)。基于排序 ranking:按预测力给特征打分排序,再用阈值或取 Top-N。
| 任务 | 用什么度量特征与目标的关系 | 注意 |
|---|---|---|
| 分类(类别目标) | 互信息 MI(X, Class) | X 和 Class 都必须是类别型(否则先离散化) |
| 回归(数值目标) | Pearson 相关 | MI 不适用(要求目标离散化);数值特征用 Pearson |
反例(会过度乐观):先用整个数据集算 MI 选特征,再划分 train/test——这造成数据泄露,因为特征选择"看过"了测试数据,导致报告的准确率(如 90%)偏高。
模块十二 · 隐私、伦理与 IP
差分隐私、数据伦理、大数据分析的责任。
12.1 隐私的三层视角
| 视角 | 谁来保护 | 策略 |
|---|---|---|
| 自我隐私 Self privacy | 每个人保护自己 | 不披露 Don't disclose;说谎 Lie |
| 局部隐私 Local privacy | 数据拥有者改记录里的字段 | 加噪声、删特征、泛化特征(含 k-匿名、l-多样性) |
| 全局隐私 Global privacy | 数据拥有者在回答查询时做改动 | 差分隐私:用 budget k 和 global sensitivity G 控制噪声 |
12.2 局部隐私:k-匿名与 l-多样性
为降低发布数据集中个人被重新识别 re-identification 的风险:
- k-匿名 k-anonymity:选一个 k,把数据处理到"每条记录至少和 k−1 条无法区分"。手段:用更宽的类别替换具体值;或用
*抑制 suppress 属性(效用受限)。 - l-多样性 l-diversity:进一步保证每个分组里敏感属性至少有 l 个不同取值(防止"组内大家敏感值都一样"导致泄露)。
- 高维数据(如轨迹数据)很难维持隐私:cloaking 提供空间 k-匿名;obfuscation 让位置不精确。
12.3 全局隐私:差分隐私
Differential Privacy(差分隐私):回答查询时加随机噪声来隐藏任一个体的存在/缺席。两步:① 针对查询统计每个相关个体;② 加均值为 0 的随机噪声,发布带噪结果。
每次发布都略有不同,平均下来仍约等于真值,但查询者从单次结果无法确知个体信息。
两个关键量
| 量 | 含义 | 由谁定 |
|---|---|---|
| 隐私损失预算 budget k | 容忍多大程度的改动(k 小 = 改得少 = 查询者更难猜真值) | 数据拥有者决定 |
| 全局敏感度 global sensitivity G | 改动单个记录字段对结果的最大影响(多查询时 G = 各差异之和) | 通过计算"改一条记录对结果准确度的影响"得到 |
12.4 差分隐私:选哪些记录改
原则:改那些对整体统计影响最小的记录(改它前后"结果仍是真值"的概率几乎不变)。计算每个字段改成 * 时对输出的影响 E。
→ 改不吸烟者更好:对整体统计破坏小,查询者也猜不到真实吸烟人数。
12.5 预算计算与 Laplace 噪声
设不含某字段的世界结果概率为 A、改动后的为 B。用预算 k 约束:
- k=0:A=B,不改任何记录 → 无隐私。
- k 小:只允许小差异 → A≈B(必须选 prob(B) 接近 prob(A) 的改法)。
- k 大:允许大差异 → 结果可偏离更多(可做大幅改动)。
| A(含) | B(不含) | k | 2ᵏ×B | A ≤ 2ᵏ×B? | 结论 |
|---|---|---|---|---|---|
| 0.9 | 0.3 | 1 | 0.6 | 否 | 改动大、k 小 → 不改 |
| 0.9 | 0.9 | 1 | 1.8 | 是 | 改动小、k 小 → 可改 |
| 0.9 | 0.3 | 3 | 2.4 | 是 | 改动大、k 大 → 可改 |
最后用 G 和 k 一起决定噪声:在保持平均不变的前提下调节噪声"散布"。比值 G/k 决定取舍——改"更暴露"的记录但改得少,或改"不暴露"的记录但改得多。噪声从 Laplace 分布采样:均值 μ=0,标准差(散布)b = G/k。
12.6 数据伦理
伦理研究"什么是该追求的好、什么是该做的对"。一个好用的尺子是 误分类的代价 cost of misclassification:如果搞错了,你的数据处理会造成多少痛苦?如果这事发生在你身上,你能接受吗?
- 合法 ≠ 道德(Legal ≠ Ethical);公开 ≠ 被广而告之(Public ≠ Publicized)。
- 反例 "AI Gaydar"(2018):技术上只是用公开数据做的分类器,但社会用途可能极其可怕(有些国家对此判死刑)。
- 对偶用途 dual use:同一技术可善可恶,谁该负责?使用者 / 开发者 / 审稿人 / 大学 / 全社会?
对抗式评估系统:谁会受益?谁会受害?训练数据是否有代表性?是否优化了"对的"目标?错误预测会不会对人的生活产生重大影响?
| 误分类/错误的影响 | 工作的收益 | 是否该做 |
|---|---|---|
| 高 | 低 | 不该做! |
| 低 | 高 | 可以做! |
| 高 | 高 | 大概不该? |
| 低 | 低 | 无所谓 |
12.7 大数据分析的伦理
数据多时有特殊伦理顾虑:你可能通过推断从一些数据"读出"别的信息——你可能对、也可能错,但当事人可能不希望被披露。
- 技术不是中立的全部:只看技术不足以理解不道德使用,要考虑被影响的利益相关者 stakeholders(个人创造数据、组织拥有并获益、社会引导监管)。
- IRB(Institutional Review Board,机构审查委员会):组织内部审议"以人为对象的研究是否合乎伦理"的小组;涉及人或人的数据的项目要写明目标、流程、风险、缓解措施,获批才能做。
- GDPR(EU 通用数据保护条例,2018 年起执行):保护欧盟公民数据隐私,违规罚款达全球年营收的 4%。要求:同意清晰简明并说明收集/分析理由;个人有权同样容易地撤回同意;有权索取自己数据的副本及处理目的;有权数据可携 data portability(把数据从一个控制者转到另一个)。
12.8 防止问题的十条规则
来自 Zook 等(2017):
- 假设"数据即人"——数据可能造成伤害(除非证明无关)。
- 隐私不是二元的——隐私是情境化的(单张照片 vs 全部社媒历史)。
- 防范重新识别——匿名数据与其它变量结合可能意外重识别。
- 实践合乎伦理的数据共享——共享前征得同意。
- 认清数据的优势与局限——大不等于好;相关的数据胜过更多的数据;记录数据来源与演变。
- 就棘手的伦理问题展开辩论——在同行中讨论、教育彼此。
- 制定行为准则——是否符合服务条款与用户期望?公众会觉得"瘆人 creepy"吗?
- 为可审计性设计系统——欢迎对大数据实践的审计。
- 正视更广的后果——大数据研究有社会级影响。
- 知道何时打破这些规则——为更大的公共利益(自然灾害、公共卫生紧急、敌对威胁)可暂时搁置个人隐私。
12.9 IP(知识产权)考点清单
讲义明确列出 IP 部分"必须掌握"的内容(详细定义在 IP 专题讲解中,本讲义只给出范围):
- 什么是 许可 license、版权 copyright、商标 trademark、专利 patent。
- 数据许可的两大家族:Open Data Commons(ODC) 与 Creative Commons(CC),各有一系列从宽到严的许可(细节不必记)。
- GDPR 是什么、为何被创立(见 12.7)。
- 在不侵犯版权 © 的前提下,能用多少文字和图像。
模块十三 · Prompts 与 RAG
如何控制 LLM、如何给它专属知识。
13.1 LLM 与两大问题
LLM / LVLM(大语言/视觉模型)是生成式的:把从网上获得的知识拆成片段、表示成嵌入 embeddings(一串数字),再用神经网络重组这些数字、把匹配的片段重新拼成文本/图像。用它不需要懂它。两大使用问题:
- 怎么有效控制它做你想要的?→ Prompts(提示)
- 怎么给它一些它本来没有的专属知识?→ RAG 等
13.2 Prompt 与微调;Prompt 等级
Prompt(提示) = 用户用自然语言给 LLM 的具体指令。因为是人话,所以非 CS 背景的人也能用。
Prompt vs 微调 Fine-tuning:早期用微调(继续训练以加强特定领域/任务知识,可能覆盖/削弱旧知识)来控制 LLM;但直接提示更简单,成了主流。
Prompt 的权力等级
LLM 构建者让某些 prompt 比别的更重要:
- 系统提示 system prompt(始终生效)——最强,约束总体行为("礼貌、不说脏话、不带偏见"),总是加在每个用户提示的最前面。
- 团队中资深/专家用户的提示。
- 个人用户自己的会话提示——最弱。
13.3 写好 Prompt
OpenAI 速查表:① 上下文/背景;② 具体指令(用动作动词 describe/list/explain/compare);③ 细节与约束(格式、长度、受众、字数、视角);④ 例子与澄清。两个常用框架:
| AUTOMAT | 含义 |
|---|---|
| Act as | 给 LLM 设定角色与专长(如"你是记者/专家") |
| User persona | 读者是谁、有何需求(如"讲给 10 岁小孩") |
| Targeted action | 具体要做的任务(summarize / explain) |
| Output format | 输出描述与格式(表格、粗体标题) |
| Mode/style | 语气风格(正式、极简) |
| Atypical cases | 异常情况怎么处理(缺失项等) |
| Topic whitelist | 话题白名单/例外(只要 2024、不要 2023) |
| CO-STAR | 含义 |
|---|---|
| Context | 背景与细节 |
| Objective | 任务与目标结果 |
| Style & Tone | 风格与情感语气 |
| Audience | 谁来读 |
| Response | 输出格式 |
输出(O)实操:尽量清楚定义每个字段;指明形式与记号;用清晰分隔符 ### 分隔每条指令;给例子。还有些"魔法短语 magic phrases"被证明能提升质量("Take it step by step"、"It is important to me that…"、"Please"),下周讲为什么。
13.4 Prompt 策略
| 策略 | 做法 |
|---|---|
| 1a 迭代提示 Iterative | 你把任务拆成小步,一步一步问(先定上下文、再逐方面、最后汇总) |
| 1b 思维链 Chain-of-thought | 让系统自己把任务拆成小步("Take it step by step");大概因为这能让它给更有逻辑/更详细/更分步的措辞更高权重 |
| 2 指向可信源 | 点名要它用的来源("According to Wikipedia/PubMed…"),偏置输出朝向它们;但仍可能幻觉,用前要验证 |
| 3 自我复核 Self-verify | 让系统对自己的输出生成核查问题、逐一回答、对照原答案找错、再给最终答案(Meta 提出,GROK-2 常用) |
| 4 元提示 Meta-prompting | 让系统替你生成提示,再把它喂回去 |
| 5 自动提示优化 | 需要:起始提示 + 变异生成器 mutator + 输出评估器。硬提示(语言层面的提示进化)/ 软提示(用 LLM 输出层嵌入加进下一个提示) |
Prompt 进化(自动优化的细节)
Mutator(变异器):用 LLM 自己造提示变体("在不改变核心语义的前提下生成变体")。Evaluator(评估器):用 RewardBench 或人工对输出排序。DARWIN 搜索:1 个查询 → N 个变异 → LLM 回答 → 评估 → 替换掉最差的 K 个 → 重复直到收敛。
13.5 Prompt 评估
能自动衡量提示好坏,才能做自动优化。需要一份 Prompt+Response 数据集。好提示的期望(desiderata):
| 期望 | 对应指标 |
|---|---|
| 越短越好 | 词数 word count |
| 越准越好(无幻觉) | 事实的精确率 Precision |
| 越完整越好(无遗漏) | 事实的召回率 Recall |
| 越连贯越好 | 篇章连贯性指标 |
| 越易懂越好(含解释) | 对话任务指标 |
13.6 给 LLM 加入专属知识
LLM 知道很多,但不知道:昨天的新闻、你自己的研究细节、你从没发到网上的东西。加知识的方法:
| 方法 | 说明 |
|---|---|
| 1 长提示 Long prompts | 把知识塞进提示。问题:靠前的信息容易被忽略;超过 500 词后每多 100 词理解力约降 12%;长提示会削弱系统提示效果 |
| 2 插件 / 定制 GPT | 插入函数(如算术、公司事实);GPT Store |
| 3 本地 Wiki("第二大脑") | 让 LLM 维护一个只含你感兴趣内容的 Wiki:你给原始笔记,AI 读取、总结、组织成结构化 wiki 并互相链接、主动更新 |
| 4 本地数据仓库 | 下载你的购买历史等,导入让 LLM 分析 |
| 5 RAG store | 见下(最重要) |
13.7 RAG store
RAG = Retrieval + Augmented + Generation(检索增强生成):一个放在"旁边"的大型附加数据仓库。
- 把你的私有信息存在单独的仓库里。
- 切成块 blocks(Claude 的块大小是 500+ 页)。
- 用本地搜索引擎从中抽出与提示相关的材料。
- LLM 把匹配信息加进你的提示再生成。你也可以显式请求访问该仓库。
13.8 RAG 分段挑战
RAG 内存不是无限长,常要把文档切成段 segment。切在哪里很关键——切错了,段里的 "it"、"AAII" 等指代会失去上下文。四种切分方式:
- 整篇上传:匹配则纳入整篇——但大部分内容可能无关。
- 固定长度切分:切成等长段——但可能把相关材料切散,丢失连贯性。
- 按文档结构(标题/章节)切分:更合理——但要额外工作找好边界。
- 预抽取:先把所有可能需要的信息抽出来、合并成一段。
模块十四 · LLMs 原理
神经网络、嵌入、语言模型、生成式 LLM 与它的弊端。
14.1 LLM 能做什么 & AI 演化
LLM 在很多数据处理任务上意外地强,但不是万能:复杂或敏感任务需要仔细提示、微调和验证;效果取决于数据质量。常见用途:处理非结构化数据、NLP、信息抽取、数据清洗转换、数据增强(生成合成数据)、摘要与报告、数据集成、文本异常检测、为数据任务生成代码(如 pandas 脚本)。
| 时期 | 范式 | 可解释性 |
|---|---|---|
| 1960s–70s | 旧 AI:手写规则系统(ELIZA、MYCIN) | 容易理解 |
| 1980s–90s | 机器学习:从样例学规则 | 可以理解 |
| 2000s–2020s | 深度学习:神经网络学"规则"与操作(LLM、DALL-E) | 很难理解 |
14.2 神经网络基础
神经网络 Neural Network:模仿大脑——每个神经元 neuron 是一个小计算函数,把输入向量组合成输出向量;连接的"强度"(权重)通过训练调整。建网范式:① 把数据编码成数值向量;② 选每层节点数、层数、连接、节点的组合函数、输出怎么用;③ 用大量输入–输出样例训练(调权重);④ 拿来用。
- 感知机 Perceptron:最简单的神经网络,单向前馈,能做 AND/OR/NOT/多数投票,但对多数任务太弱。
- 反向传播 Backpropagation:训练时从最后一层往回,逐节点判断分数是否朝对的方向,对的就加强相关连接、错的就削弱,反复直到稳定。
- 训练好的网络是函数逼近器 function approximator,给没见过的输入也能给出接近训练数据的输出。
14.3 嵌入 Embeddings
神经元的输入/输出是实数向量,所以要先把数据编码成数字。怎么编码英文词?早期用 BoW / TF-IDF 分数,但神经网络能学出更好的分数:用成千上万个"以某词为中心"的句子训练,反向传播会调整向量,使经常一起出现的词得高分。结果:意义相关的词,向量分布也相似。
这种神经网络词向量就叫 embeddings(嵌入)。
现成嵌入工具:Word2vec(Google)、GloVe(Stanford)、fastText(157 种语言)。
14.4 语言模型(小)
语言模型 Language Model(LM) = 一份记录"语言中词序列及其相对概率"的资源(手机输入预测就是它)。历史:先用于语音识别 ASR(在"recognize speech" vs "wreck a nice beach"间选更可能的),后用于机器翻译 MT。
建一个 n-gram LM
- 从网上爬大量文本。
- 清洗成干净词串。
- 用一个 n 词的窗口 window 滑过文本。
- 记录每个 n-gram 窗口,统计出现次数。
- 归一化计数;为方便取 log。
14.5 大语言模型与 Transformer
大 LM 用深而宽的神经网络。节点里是组合函数(线性 R=a₁x₁+…不够用,现代用非线性如 sigmoid/tanh,能"压缩"部分参数、"拉伸"重要的)。两个核心概念:
| 概念 | 含义 |
|---|---|
| 参数 Parameter | 决定某微特征强度的数值,在连接上(边权)或节点里(注意力权重);从数据自动学到;一个 LLM 里通常有数十亿个 |
| 微特征 Microfeature | 表示词/token 某个有意义侧面的数值;组合起来预测结果;像"左右上下文 n-gram 模式的模式",散布在各神经层,几乎无法从 LLM 中提取理解 |
现代 LLM 通常 50–500 个节点宽、12–20 层高;强而流行的结构是 Transformer(万物互联,everything linked to everything)。可以把 LLM 想成一本"词典",每个词由它的一组微特征定义。
14.6 生成式:chat loop 与 temperature
普通 LLM(BERT 等)是被动的。OpenAI 让它生成式:简单英文输入 → 简单英文输出(ChatGPT = GPT-3 175B 参数 + 一个"chat loop")。生成循环:
- 输入文本(prompt)。
- 用它的微特征去匹配可能的响应 n-gram。
- 挑一个匹配的 n-gram。
- 输出它。
- 把它加到 prompt 后面,重复——从左到右一直生成,直到达到阈值。
14.7 生成的弊端
"从左到右拼接 n-gram"本身不保证语法/真实/连贯,于是有三类问题:
| 问题 | 说明 |
|---|---|
| 1 幻觉 Hallucination(近距离虚假) | 没有"真相"模型——可能照搬网上的错误(flat earth),或把两句各自为真的话拼成一句假的 |
| 2 长程不连贯 | 长文本里前后自相矛盾(独角兽例子:一角还是四角?为什么是两个世纪?) |
| 3 不可接受的输出 | 不懂社会规范;网上充满暴力/偏见/仇恨内容,系统可能输出;又因为无法定位"坏"内容在哪个节点,只能重训或在输出后加过滤器 |
14.8 图像与代码生成
- 图像/视频生成(DALL-E、Stable Diffusion、Midjourney、SORA):和文本平行,用图像微特征。从一片随机彩色点出发,根据提示词找匹配微特征、拼进最合适的位置、反复合并,逐渐"长出"越来越具体的图像。文本和图像处理在融合,因为用同样的神经网络和嵌入表示。
- 代码生成:用程序而非英文训练。词表更小、组合更受限,更易生成代码"句子";但同样有幻觉和不连贯问题(Codex、Claude)。
14.9 LLM 到底是什么
讲义的结论很重要(也很可能考概念题):
- 没有真相理解:会报告网上的假信息;会把分别为真的片段拼成假的(幻觉)。
- 不能推理:不会推断、检查一致性、做逻辑;表面的"逻辑"来自长上下文(匹配窗口)。
- 没有目标或愿望:它不会"想"做任何事(比如统治世界);但你很容易把它"驱使"到占星、仇恨、种族主义等它读过的任何方向。
这台机器没有大脑——用你自己的。
能力层级与评估
能力层级:① 基础事实知识;② 直接处理与推断(摘要、翻译、简单 QA);③ 创作(代码、诗歌、图像);④ 更深的问题求解(数学、逻辑、心智理论、跨模态)。LLM 评估维度:答案相关性、任务完成度、正确性、幻觉、工具调用正确性、(RAG 的)上下文相关性、伦理(无偏见/无毒性)、任务特定指标。
模块十五 · 复习与考试
考试结构与全课复习清单。
15.1 考试结构
讲义给出的考试分三部分:
| 部分 | 题型 | 要求 |
|---|---|---|
| Section A · 简答 | 多道小题,每题 2–3 句 | 定义类(X 是什么?)、概念类(关联 X 和 Y、Z 的用途),可能要举例说明某技术/问题 |
| Section B · 长答(分析理解) | 较长的回答 | 对比不同方法、分析某算法/应用、论证某建模技术为何合适、清楚而有细节地解释概念 |
| Section C · 算法计算 | 在给定示例数据上做计算 | 数值计算(对算法跑示例数据)、用自己的例子给出算法大纲、逐步解释算法如何工作 |
15.2 全课复习清单
按主题快速自查(括号是对应模块,可点目录跳转):
| 主题 | 必会要点 |
|---|---|
| 数据基础(M1–M2) | 数据类型大分野、Label/One-hot 编码、进制、CSV/HTML/XML/JSON 对比(外观 vs 语义) |
| 预处理(M3) | 数据库 PK/FK、数据质量、归一化 vs 标准化、缺失值 MCAR/MAR/MNAR、抽样 |
| 爬取与文本(M4–M5) | Crawl vs Scrape、robots.txt、BeautifulSoup、分词/词干 vs 词形还原、停用词、n-gram/编辑距离、正则 |
| 文档与相似度(M6) | BoW、TF-IDF(会算)、Cosine/L1/L2/Jaccard/Dice、距离的用途 |
| 可视化(M7) | 位置/离散度统计量、直方图/分箱、箱线图(1.5×IQR / 3×IQR)、散点图/热力图 |
| 聚类与降维(M8) | k-Means 流程与局限、肘部法 WCSS、VAT、层次聚类(凝聚/分裂、single/complete/average link)、PCA(正交、按方差排序、对尺度敏感) |
| 相关性与信息(M9) | 相关≠因果、Pearson(只测线性)、熵/条件熵/互信息(会算)、NMI、MI vs Pearson |
| 监督学习(M10) | 分类 vs 回归、KNN(选 k)、决策树、Hunt 算法、信息增益选划分(会算) |
| 回归与评估(M11) | 线性回归/最小二乘、过拟合、交叉验证/自助法、混淆矩阵 + Precision/Recall/F1(会算)、MSE/RMSE/MAE、特征选择(分类用 MI、回归用 Pearson,注意数据泄露) |
| 隐私伦理 IP(M12) | 显式 vs 准标识符、k-匿名/l-多样性、差分隐私(budget k、global sensitivity G、会算 E)、BDA 伦理、IRB、GDPR、十条规则、IP 四点 |
| Prompts & RAG(M13) | 提示等级、AUTOMAT/CO-STAR、提示策略、提示评估(接 Precision/Recall)、RAG store 与分段挑战 |
| LLMs 原理(M14) | 神经网络/嵌入、n-gram LM、Transformer(参数/微特征)、生成 chat loop 与 temperature、幻觉/不连贯/不当输出、RLHF、"LLM 是什么" |