← yifan.website
模块一 · 课程总览与数据处理基础
开始之前

关于这份知识库

本批内容覆盖 Week 1–3,全部严格来自课程讲义。后续会按周分批补全。

怎么用

  • 左侧目录树:点任意条目跳转;阅读时会自动高亮你当前所在的小节。
  • 顶部搜索框:输入关键词(中英文都行),正文里的命中处会被高亮,目录也会只留下含命中的小节。按回车在多个命中之间跳转。
  • 右上角主题按钮:切换浅色 / 深色,方便晚上看。
图例 正文中的小卡片:直觉/类比 帮你建立心智模型;例子 是具体演算;考点 是容易考的点;易错 是常见混淆。
Week 1 · Lecture 0–1

模块一 · 课程总览与数据处理基础

数据处理是什么、数据长什么样、计算机怎么表示数据。

1.1 什么是数据处理 / 数据整理

这门课的核心词是 Data Wrangling(数据整理 / 数据驯服)。讲义把它拆成两个词来记:

  • Data(数据):我们能拿来处理的信息。
  • Wrangling(驯服 / 圈拢):把杂乱的东西"圈起来、管起来"。

讲义原话:从原始数据到洞见(insight)是一个多步骤的过程。也就是说,数据不会自己变成知识,中间要经过一连串处理。

直觉 想象你是个牧场主,面前是一群乱跑的牛(原始数据)。Data Wrangler(数据整理者)就是那个把牛赶到一起、分门别类、最后让它们排好队的人。

数据处理 vs 数据科学

Data Processing(数据处理)和 Data Science(数据科学)不是一回事。讲义明确:本课不深入数据科学,但会学一些有用的技术。一个常被引用的事实是——数据科学家把大部分时间花在数据准备/清洗上,而不是花哨的建模上。这正是本课要训练的能力。

这门课要你掌握什么

学完后你应当知道(讲义 "The goal of the subject"):

  • 数据的主要形态forms:结构化 / 半结构化 / 非结构化)。
  • 数据的主要格式formats:数据在计算机里实际怎么存)。
  • 对各种形态/格式通常能做哪些操作。
  • 怎么检查你的计算是否正确。
  • 一些常用算法和工具包。
易错形态(forms)≠ 格式(formats)。形态说的是"数据有多规整"(结构化/半/非结构化);格式说的是"用什么文件方式存"(CSV/JSON/XML…)。两个词后面模块都会反复出现,先分清。

1.2 数据处理的核心管线

整门课可以挂在一张图上。The Core of Data Processing(数据处理核心)= 把数据变成知识(From data to knowledge),围绕中心有 5 个阶段:

  1. Data Input(数据输入):传感器、人、其它数据生产者。
  2. Data Cleanup & Enhancement(清洗与增强):让数据变干净、变可用。
  3. Data Interpretation / Models(解释 / 建模):数据分析与机器学习。
  4. Data Output / Visualization(输出 / 可视化)
  5. Data Use / Ethical Concerns(使用 / 伦理):数据的社会性使用。
数据处理核心管线与主要主题图
这张"轮盘图"是全课的地图:外圈是 5 个阶段,内圈是每个阶段下的具体主题(数据类型、数据格式、数据清洗=标准化/记录链接、数据模型=向量空间/距离度量、大数据、数据准确性=评估/验证/一致性、可视化)。中心是"从数据到知识"。
考点 本课(COMP20008)主要聚焦在前半段:数据输入 + 清洗增强,以及一点点建模。深入的机器学习留给 COMP30027。看到这张图能说出 5 个阶段,就抓住了课程主线。

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)。
类比 名义=运动员的球衣号码(只是名字,10 号不比 7 号"大");有序=比赛的名次(第 1 比第 2 好,但你说不出"好多少距离")。

离散 vs 连续:其实是"建模"问题

讲义有个反直觉但很重要的结论:

在计算机内部,所有数据归根结底都是离散的(因为用二进制、有限位数存储)。

所以"离散 vs 连续"不是关于物体本身,也不是关于二进制存储,而是关于你如何建模这个变量。没有硬性边界。

例子 年龄 Age:原则上你每一毫秒都在变老 → 连续;但实际中"我 20 岁" → 离散。两种都对,取决于你怎么建模。

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);每新增一个类别就要加一列
考点 二选一的判断:类别本身无顺序(颜色、城市)→ 用 One-hot;若硬用 Label 会误导模型以为有大小关系。代价是 One-hot 维度爆炸。

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)
例子 值 15:二进制 1111₂ = 1×2³+1×2²+1×2¹+1×2⁰;八进制 17₈ = 1×8¹+7×8⁰;十六进制 F₁₆ = 15×16⁰。
再如 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 的列表。

Week 1 · Lecture 1

模块二 · 半结构化数据格式

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中 ModerateAPI
记忆线索 一句话串起来:CSV 扁平最简单做分析;HTML 管"长什么样";XML 语义最强但啰嗦;JSON 轻量,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>
类比 讲义把 HTML 比作"一场戏的导演":它不创造内容,只指挥每样东西在画面上怎么摆、怎么显示。

2.5 外观 vs 语义

这是理解 HTML 与 XML 区别的关键。假设你要分享"Exam on Friday":

HTMLXML
写法<b>Exam on Friday</b><announcement>Exam on Friday</announcement>
计算机理解为"把这段文字加粗""这是一条公告 announcement"
表达的是外观 Presentation(它长什么样)语义 Semantics(它是什么意思)
考点 一句话:HTML 说"怎么看",XML 说"是什么"。这是这两种格式最本质的分工。

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

<& 在元素内部是非法的,必须转义:&amp; 表示 &&lt; 表示 <
如果要放一大段含特殊字符的文本,可用 CDATA 区块:<![CDATA[ all books & videos are now < AUD 10 ]]>

易错 注意区分两个概念:well-formed(格式良好)= 满足上面这些基本语法规则;而 valid(有效)= 还额外符合某个 schema 定义。讲义中"There's no right answer"的气球练习说明:同一份数据可以有多种合法的 XML 编码(用子元素还是用属性都行),取决于你后续怎么用。

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)。
易错 记忆方向:带 sloads/dumps 是和字符串 string 打交道。loads 进、dumps 出。

2.8 HTML vs XML vs JSON

HTMLXMLJSON
不可扩展;关心格式/外观,不关心语义 允许复杂 schema 定义(可用正则);可扩展,元素表达语义;逼你更认真地设计数据 更精简、轻量、紧凑;易解析;受程序员青睐(追求速度与效率)

JSON 小结:轻量标准的数据交换方式,原生 JavaScript,可表示任意半结构化数据;缺点是缺乏上下文与 schema 定义(语义比 XML 弱)。

Week 2 · Lecture 2

模块三 · 结构化数据与预处理

数据库、数据质量、缩放、缺失值插补、抽样。

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
类比 把一张"什么都有"的大表(学生+导师姓名+专业名)拆成:学生表(只存 ID)、导师表、专业表。学生表里用 SupervisorIDMajorID 这种外键去"引用"另两张表。改导师名字只改一处,不用全表改。

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。

  1. 确定输入数据的布局 layout:行=单条记录(如每个学生),列=属性。
  2. 确定每个单元的语义/元数据类型 semantic type(变成列标题,如 StudentID=integer, Name=text, Major=categorical, WAM=numeric)。
  3. 用 JSON 或 XML 定义内部数据结构(即实际的表/记录)。
  4. 写代码把数据逐行导入这个结构(每行变成一条结构化记录)。
  5. 然后……预处理 Preprocessing

因为"摄取只是一半",原始数据天生有缺陷,在能查询/建模之前必须严格预处理:数据清洗、整合(合并多数据集不冲突)、缩减与缩放(把数值归一化以便准确分析)。

3.4 数据质量与清洗

评估数据质量的 6 个维度

维度含义
准确性 Accuracy对还是错、准不准
完整性 Completeness是否有没记录/不可得的
一致性 Consistency表示方式有没有冲突
及时性 Timeliness是否及时更新
可信性 Believability我信不信这数据是真的
可解释性 Interpretability我多容易看懂它
例子 同一列"出生日期"出现:"20 years ago"、"-"、"20/5/79"、"13th Feb. 2019"、"11/20/66"、"1961年8月4日"——这些就同时踩中准确性、完整性、一致性、可解释性等多个问题。

解决不一致(数据清洗 = 去错)

  • 命名 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
易错(领域知识!) 9999 是错误吗?要看领域:如果这是医院病人年龄列表,9999 是损坏数据;如果是 Instagram 好友数列表,9999 完全合理。判断异常离不开领域知识 domain knowledge。

清洗手段: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]比较数值的分布;用均值和标准差缩放;适合开放区间数据
例子 归一化:A 校满分 4.0、B 校满分 8.0,3.7 含义完全不同 → 归一化成比例(3.7/4=0.925 vs 3.7/8=0.463)再比。
标准化:比较摄氏[0–100]和华氏[32–212]的"相对炎热",但天气没有固定最大值可除 → 用 z=(温度−历史均值)/标准差,看偏离自身历史均值多少。
易错 归一化和标准化是两种可选方案不是先后两步。根据数据是否有固定上下界来二选一。
另外还有用于特征工程的其它变换:log(x)、xᵏ、eˣ。

3.6 缺失值与插补

数据集很少是完整的。在决定怎么填之前,要先诊断"为什么缺 missingness mechanism"。讲义用一棵概率树区分三种:

缺失机制判定树 MCAR MAR MNAR
两个判断问题:①缺失概率是否与数据集里其它已测变量有关?否 → MCAR。②若有关,在控制其它变量后,缺失是否还与该变量自身的隐藏值有关?否 → MAR;是 → MNAR。
类型定义能否造规则预测缺失
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(不漏掉某些情况)。
  • 挑战二:样本要足够大才(相对)可信——需要统计学保证;而且受访者还可能不诚实(政治民调常见)。
Week 3 · Lecture 3

模块四 · 非结构化数据:爬取与抓取

从网络获取数据: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(有针对)——你告诉它要抽什么。

爬取怎么做

  1. 从一组种子 URL 开始。
  2. 访问它们的页面,收集它们指向的所有链接。
  3. 把这些新页面当作新的起点。
  4. 不断循环。

爬虫又叫 spiders / robots / bots。它们尽量访问每个感兴趣的页面并取回处理、建索引。两个硬要求:必须避免重复 URL必须避免无限循环。难点还有:网上没有中央 URL 索引;爬虫永远不知道何时算"爬完了";有些站不希望被爬;有些内容是数据库实时生成(如社交动态);有些内容寿命很短(如新闻)。

爬取算法(图遍历)

网页是一张高度链接的图 graph。算法核心:从待访列表 L 取一个 URL,抓取并解析建索引,提取出新 URL,把已访的移到 V(已访集合),把新发现的(不在 V 里的)加进 L……反复。新 URL 加在哪里决定了遍历顺序:

  • 加在队首深度优先 DFS(depth-first)。
  • 加在队尾广度优先 BFS(breadth-first)。
  • 排序后插入最佳优先 best-first
易错 始终牢记:AVOID DUPLICATES(避免重复)。DFS/BFS 的区别就在"新 URL 加队首还是队尾"这一点,考试爱考。

危险与蜘蛛陷阱

  • 蜘蛛陷阱 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 解析器。

HTML 解析树输出示意
解析树 Parse tree:HTML 被解析成一棵树——html 下分 head/body,body 下分若干 <p>,<p> 下又有 <a> 和文本。BeautifulSoup 就是在这棵树上"导航"来定位元素。

常用操作(讲义示例):

  • 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.titlesoup.title.namesoup.title.stringsoup.title.parent.namesoup.p['class']

抓取完整流程

  1. 拿到 HTML/XML 文档。
  2. 决定要捕获哪些信息作为数据。
  3. 在数据库/表格里定义数据字段。
  4. 用 BeautifulSoup 解析文档。
  5. 写 BeautifulSoup 提取模式找到信息并存进字段。
  6. 完成!

4.4 文本 / 图像管线

非结构化文本管线:① 爬取页面 → ② 抓取出 HTML 中需要的部分 → ③ 现在剩一堆文本字符串 → ④ 你想:拆句拆词、用各种方式标准化词(去时态等)、移除无用内容 → ⑤ 最后才能处理文本(详见模块五)。

非结构化图像管线:① 爬取 → ② 抓取 → ③ 剩原始图像文件 → ④ 你想:缩放/裁剪、标准化分辨率和色彩通道、去噪/去无关区域、提取有用特征(边缘、形状、模式)→ ⑤ 最后处理图像。

小练习(区分 Crawl/Scrape) "从一个网页里提取所有标题" → Scraping(针对单个文档抽内容);"找到维基百科的所有页面" → Crawling(沿链接遍历找页面)。
Week 3 · Lecture 3

模块五 · 文本处理(NLP 基础)

分句分词、规范化、词干/词形还原、停用词、相似度、正则。

5.1 文本预处理流程

拿到原始文本后,要按顺序处理。讲义把它画成 4 个阶段:

文本预处理四阶段流程图
Stage 1 分句(在句号等处切)→ Stage 2 分词 & 规范化 → Stage 3 词形还原 Lemmatise → Stage 4 过滤(去停用词)& N-grams

5.2 分句与分词

分句 Sentence splitting

在哪里把词串切成句子?规则:当两个词被 "。"、"?"、"!" 之一分开,且(有时)后一个词以大写开头时切分。

易错 标准规则会"碎掉"——存在例外(如 "Dr."、"U.S.A." 里的句点不是句末;"Was John happy? she wondered." 这种引述也会打乱规则)。所以分句不是简单按句点切。

分词 Word Tokenisation

把(句子)字符串切成词元 word tokens。分隔符默认是空格 " ";把标点作为单独的词剥离开。标点包括:. , ; : ? ! – < > / | + $ % ~ 等。

5.3 规范化

大小写折叠 Case folding

把文本转成单一大小写(一般转小写)。把所有变体映射到同一个小写形式,能大幅减少数据稀疏性 sparsity。这是支持搜索、匹配、模式识别的简单而高效的技术。

直觉 不折叠的话,"Coffee"、"coffee"、"COFFEE" 会被当成 3 个不同的词,白白占 3 个特征。折叠成 "coffee" 后合并为 1 个,统计和聚类都更准。

其它文本规范化

处理嘈杂的真实数据(社媒评论、短信、邮件)时很关键,例如处理 OOV(Out-of-Vocab,词表外词)

5.4 词形还原:词干提取 vs 词形还原

词形态 Word Morphology 的两个问题:① 英语同一个词有不同形态(单复数、时态、体);② 词常由词根/词干 stem 加上更多部分(词素 morphemes)构成,如 in+expense+ive=inexpensive。如果每个形态都单独算,词表会大很多。所以要把它们归并。两种策略:

词干提取 Stemming词形还原 Lemmatisation
机制算法式砍后缀(brute force)基于字典的去词素(demorphing)
速度&复杂度执行快、代码极简单执行慢、需要庞大的语言数据库
输出有效性常产生非真实单词或片段总是产生有效的字典词元 lemma
工具Porter StemmerNLTK WordNet Lemmatiser
例子eating→eat(成功);green→gre(失败)eating→eat(成功);green→green(成功)

词形还原的实现路径:人工编写的去词素器(规则多,对德语等屈折语很必要);机器学习的去词素器(如今最常见);NLTK 提供基于 WordNet 数据库查词元的 WordNet Lemmatiser。

考点 一句话区分:Stemming 快但可能砍出非词(green→gre);Lemmatisation 慢但保证是真词(green→green)。要"准"用 lemmatisation,要"快"用 stemming。

5.5 停用词

词分两类:

保留:开放类词 Open-Class丢弃:封闭类词 Closed-Class
实义词 Content words(名词、动词、形容词、副词,如 bicycle、eat、happy、quickly)。承载真正的含义;数量无限。 功能词 / 停用词 Function / Stop words(限定词、代词、介词、连词,如 the、to、not、and)。语法骨架;只有几十个。

停用词 Stopwords = 你想移除的封闭类(功能)词。为什么移除?减少特征/词数,支持更准确的聚类和计数。何时用?常在搜索、文本分类、主题建模/抽取之前。停用词表可针对特定领域定制(如 ranks.nl 提供 40 种语言的表)。

注意 "not" 也常被列为停用词——但在情感分析里删掉 "not" 会把 "not good" 变成 "good",含义反转。所以是否删停用词、删哪些,要看任务。

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 距离

距离 = |Gn(x)| + |Gn(y)| − 2×|Gn(x) ∩ Gn(y)|
例子 G2(google)=[#g,go,oo,og,gl,le,e#](7 个),G2(goggle)=[#g,go,og,gg,gl,le,e#](7 个),交集 6 个。
二元组距离 = 7 + 7 − 2×6 = 2。(0 表示完全相同,越大越不相似)

近似匹配:编辑距离 Edit distance

何时用?文本不完全相同时。通过三种基本字符操作把源串变成目标串:插入 Insert、删除 Delete、替换 Replace。每次操作有一个代价(mismatch score);需要的编辑越多,距离越远。

相似度 = 1 − 编辑距离

归一化距离 = d(s₁,s₂) / max(|s₁|,|s₂|)
相似度 sim(s₁,s₂) = 1 − d(s₁,s₂) / max(|s₁|,|s₂|)
例子 "ther" → "otter":需要 2 次编辑,较长串长度 5 → sim = 1 − 2/5 = 0.6

很多相似/距离度量: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 字符串匹配的用途

为什么字符串匹配有用?三类应用:

  1. 拼写纠错 Spelling correction:词不在字典里时,用户本来想拼哪个?常见做法:找所有"邻近"(字母 n-gram 距离小)的词,结合左右词的上下文窗口选最合适的(需要语言里常见词 n-gram 的列表)。例 "no ther option" → 候选 otter / other / here,选 "other"。
  2. 新词 Neologisms:新造的词(phat、ChatGPT、arvo)。例如混成词 blending:breakfast+lunch→brunch,fork+spoon→spork,Britain+exit→Brexit。语言持续变化,社媒尤其多产;没有简单解法,只能不断扩充词典。
  3. 词等价 Word equivalence:近义/等价形式。英美拼写(color=colour,defence=defense);地名/街道缩写(boulevard|blvd|bd|… ;apartment|apt|ap|…)。
Week 4 · Lecture 4

模块六 · 文档表示与文本相似度

把文本变成向量: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;② 对这些词出现程度的度量(通常是计数)。

为什么叫"袋" 因为它丢弃了词序和结构,只关心"哪些已知词出现了、出现几次",不关心出现在哪里。就像把一句话的词全倒进一个袋子摇匀。

做法:把文档表示成一个数值向量,每一维(每个格子)对应词表里的一个词,格子里的值是该词在文档里的计数

例子 词表 = [a, are, been, day, have, how, nice, see, to, you]。
"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 到处出现,淹没了真正能区分文档的稀有词
计数依赖文档长度文档越长计数通常越大,比较不公平
例子 文档 A="python python good python python…"(TF(python)=4),文档 B="python tutorial beginner guide to install…"(TF(python)=1)。光看 TF 会说 A 更相关,但其实 B 才是真正讲怎么用 python 的教程。"更多计数 ≠ 更多含义"。

6.4 TF-IDF

解决思路:奖励稀有词。一个词出现在越少的文档里,它越能区分文档、越重要。这就是 IDF(Inverse Document Frequency,逆文档频率)

TF-IDF = TF × IDF,把"局部丰富 Local Abundance"和"全局稀有 Global Rarity"相乘:

wi,j = tfi,j × log( N / dfi )
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。

dfidf = ln((1+2)/(1+df))+1原始 TF·IDF(A / B)L2 归一化后(A / B)
car1ln(3/2)+1 = 1.4051.405 / 00.632 / 0
driven2ln(3/3)+1 = 1.0001.000 / 1.0000.449 / 0.449
road1ln(3/2)+1 = 1.4051.405 / 00.632 / 0
truck1ln(3/2)+1 = 1.4050 / 1.4050 / 0.632
highway1ln(3/2)+1 = 1.4050 / 1.4050 / 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 权重被压低。

考点 算例三步:① 数 tf;② 算 idf = ln((1+N)/(1+df))+1;③ 相乘得原始 TF-IDF,再除以该文档向量的 L2 范数做归一化。讲义两处都注明"公式会在考试中给你",所以重点是会按步骤算,理解"稀有词权重高"的含义。

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 类似,更看重交集
例子 欧氏:点 (0,0) 与 (1,2) → √(1²+2²)=√5≈2.236。曼哈顿:|0−1|+|0−2|=1+2=3。
Jaccard:A={cat,dog}, B={cat,dog,elephant} → |A∩B|=2, |A∪B|=3,sim=2/3。
注意 没有"最好"的度量(所以人们不断发明新的)。讲义注明这些公式考试会给,重点是知道每个度量衡量什么、什么场景用哪个(如比文档主题用 Cosine 因为它不受长度影响)。

6.6 距离能用来做什么

  1. 检索 Retrieval:找到和手头这篇相似的文档。
  2. 查重 Duplicates:检查是否有重复或近似重复的文档。
  3. 聚类 Clustering:找出相似文档的集合(如新闻分到体育、政治…)。
  4. 主题建模 Topic Modeling:找出数据中的主题(如某文 60% 金融 + 40% 政治)。
  5. 趋势分析 Trend Analysis:看文档内容随时间的变化(比较 t 与 t+1 的距离)。
Week 4 · Lecture 4

模块七 · 数据可视化

用图形发现结构:分布统计、单变量/双变量/高维图。

7.1 探索性数据分析 EDA

人的眼睛和大脑很擅长发现结构。可视化(绘图)就是数据的视觉编码可视化的目的:① 分析数据——揭示模式;② 把数据传达给别人。

数据驱动(bottom-up)假设检验(top-down)
从数据出发 → 引出你的想法(数据 → 你)从你的想法出发 → 去验证(你的脑 → 数据)

EDA(Exploratory Data Analysis,探索性数据分析) 偏前者:先看数据长什么样、是否平衡、有哪些"簇"。

7.2 分布与统计量

定量变量的值有一个范围,数据点占据范围里的位置。这些点的"分布 distribution"=它们铺开的模式。用简单统计量描述分布的两类侧面:

位置度量 Location(数在哪)离散度量 Dispersion(数怎么散开)
Min/MaxMean 均值;Median 中位数(中间值,适用于有序和名义);Mode 众数(最常见值,数值/有序/名义都行);分位数/百分位 Quartile/Percentile 方差 Variance(点离均值多远);标准差 Std(方差的"平均"版);范围 Range(min 到 max);四分位距 IQR偏度 Skewness(分布是否有长尾)
例子 数据 1,2,2,2,2,3,9:Mean=21/7=3,Mode=2(出现最多),Median=2(排序后中间那个)。注意均值被 9 这个大值拉高了。

7.3 单变量图:直方图、分箱、箱线图

直方图 Histogram

x 轴:把值域分成连续、不重叠、等宽的区间;y 轴:频数(或与频数成比例的值)。从直方图能读出:范围、中心位置、对称性、模态(单峰/双峰/多峰)、离群值。形态有:对称、左偏、右偏、单峰、双峰、多峰。

分箱 Binning

同一数据用不同箱宽 bin size 画出的直方图会很不一样,难点是选合适的箱宽:

  • 箱太小 → 正常对象落进空的/稀有的箱里 → 假阳性 false positive
  • 箱太大 → 离群值被藏进某些高频箱里 → 假阴性 false negative

箱线图 Box plot(Tukey)

Tukey 箱线图各部件标注
箱线图的部件:箱子是 Q1–Q3,中间线是中位数;须(whiskers)伸到 1.5×IQR 内的最远数据点;超出的点是离群值。
  • Median 中位数(排序后中间点);Q1 中位数以下的中间点;Q3 中位数以上的中间点。
  • IQR(四分位距)= Q3 − Q1。
  • 须 / 内栏 Whiskers:上限 = Q3 + 1.5×IQR,上内栏 = ≤ 上限的最高数据点;下限 = Q1 − 1.5×IQR,下内栏 = ≥ 下限的最低数据点。
  • 疑似离群值(圆圈):比 Q1 低或比 Q3 高超过 1.5×IQR
  • 离群值(黑点):比 Q1 低或比 Q3 高超过 3×IQR
考点 一个常用的离群值定义:落在第三四分位数之上(或第一四分位数之下)超过 1.5 倍 IQR 的点。记住 1.5×IQR(疑似)和 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:所有维两两配对画散点;能同时检查很多关系,方便发现相关和离群值。
例子(Iris 数据) 鸢尾花 4 特征(花瓣/花萼的长宽)3 类。用散点图矩阵或热力图会发现:花瓣宽度 petal width 能干净地区分三类(短=setosa,中=versicolour,长=virginica),其它特征区分得没这么清。
Week 5 · Lecture 5

模块八 · 聚类与降维

k-Means、肘部法、VAT、层次聚类、PCA。

8.1 聚类是什么

Clustering(聚类):自动找出数据中有意义的组 / 分段 / 社群。它是无监督的(没有标签)。好处:更好地理解数据;对每组施加不同干预(如不同营销活动);找到有意义的组、避免被太多细节淹没。

应用:市场细分、图像分析(图像离散化=把颜色重映射到 k 种、图像分割)、文档聚类、离群检测。

好聚类的三条标准 desiderata

  1. 每个对象恰好分到一个簇。
  2. 同簇内对象相似,不同簇对象相异。
  3. 每个簇可用它的质心 centroid(所有对象的"平均")来概括。

目标:簇内距离最小化(intra-cluster minimized)簇间距离最大化(inter-cluster maximized)。所有聚类算法最终都用到某种距离度量

8.2 k-Means 聚类

划分式聚类 Partitioning clustering 需要分析者预先指定簇数。最有名的就是 k-Means

k-Means 聚类步骤与四阶段演示
k-Means 的迭代:随机放 k 个质心 → 每个点归到最近质心 → 重新计算各簇质心 → 新质心产生新边界 → 重复直到不再变化。
  1. 问用户要几个簇(如 k=5)。
  2. 随机选 k 个质心 centroid。
  3. 每个数据点找出离它最近的质心,于是每个质心"拥有"一组点。
  4. 每个簇计算其中点的新质心(=均值点)。
  5. 新质心 → 新边界。
  6. 重复 3–5,直到不再变化(收敛)。
细节(考点) 初始种子通常随机选 → 不同次运行结果可能不同;"最近"通常用欧氏距离(也可用相关等);算法收敛到局部最优 local optimum,通常不需太多迭代。一个点可能在迭代中从一个簇"跳"到另一个簇。
应用 基于聚类的离群检测:每个对象的离群分数 = 它到所属簇质心的距离,距离任何正常簇都远的就是离群点。

8.3 选 k:肘部法

最好的 k 是多少?思路:找让簇"最紧"的 k。做法:对 k=1,2,3… 反复计算,每次测"紧致度",挑最好的那个。

紧致度用 WCSS(Within Cluster Sum of Squared distance,簇内平方距离和),也叫 SSE(Sum of Squared Error):每个点到其最近质心距离的平方之和。

WCSS = Σ(各簇 i) Σ(点 x ∈ 簇 i) ‖x − ci‖² (ci 是簇 i 的质心)
为什么叫"肘部" k 越大 WCSS 越小(k=点数时为 0)。把 WCSS 对 k 画曲线,会在某处出现"拐弯"像手肘——再加簇收益骤减。肘部对应的 k 就是较好的选择

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)就是从最不相似的一对出发,每步把和已选集合"最相似"的对象并进来,得到这个排序。

局限 VAT 不是万能的:对形状复杂、簇间显著重叠或几何不规则的数据集,VAT 图质量会明显下降。

8.6 层次聚类

Hierarchical clustering(层次聚类) 产生一组嵌套的簇,组织成一棵层次树,可用树状图 dendrogram 可视化(树状图的 y 轴是距离,记录合并的先后)。

好处:不必预先假定簇数;通过在合适高度"剪 cut"树状图可得到任意簇数(剪得高→簇少;剪得低→簇多);可能对应有意义的分类法(如生物界、系统发生树)。

凝聚式与分裂式层次聚类对比
两种方向:凝聚式 Agglomerative(自底向上)从每点各成一簇,每步合并最近的一对;分裂式 Divisive(自顶向下)从一个大簇开始,每步分裂,直到每点一簇。

凝聚式(最常用)流程

  1. 计算距离矩阵;让每个点各成一簇。
  2. 重复:合并最近的两个簇 → 更新邻近矩阵。
  3. 直到只剩一个簇。

簇间距离怎么定(区分不同算法的关键)

连接方式 Linkage两簇距离定义为
单连接 Single link两簇中各取一元素,所有配对里的最小距离
全连接 Complete link所有配对里的最大距离
平均连接 Average link两簇所有元素配对的平均距离

分裂式常借助最小生成树 MST 构建:从任一点开始,反复找一端在树内、另一端在树外的最近点对,把外点加入并连边。

局限 复杂度:需存距离矩阵 → 空间 O(N²);时间常为 O(N³)(可优化到 O(N²logN))。一旦合并就不能撤销;没有直接最小化的全局目标函数;对噪声/离群敏感,难处理不同大小和非球形簇。

8.7 降维与 PCA

高维数据问题:特征多 ≠ 信息多。无关特征会扰乱模型,且距离在高维下变得不那么有意义——这叫维度灾难 Curse of dimensionality

降维 Dimensionality reduction:把特征从 N 降到 n(n ≪ N),保留有用信息、去掉无关特征。注意它会创造新特征(不只是挑选)。n 常取 2 或 3 以便可视化。

关键约束 变换要保持数据的特性,即对象间的距离:变换前近的,变换后还应近;变换前远的,变换后还应远;近邻集合最好不变。

PCA

PCA(Principal Components Analysis,主成分分析):自动找出数据中最有用、相互独立的"侧面"。每个新维度是原特征的线性加权组合,各维正交(=独立),并按"重要性/强度"排序:

  • 第一维:捕获尽可能多的变异性 variability
  • 第二维:与第一维正交,在此约束下捕获剩余变异性中尽可能多的。
  • 第三维:与前两维正交,再捕获剩余尽可能多的……依此类推。
PCA 示例:找到捕获变异性的新坐标轴
PCA 把原始相关的数据旋转到新坐标系:pc1(第一主成分)沿数据散布最大的方向,pc2 与之正交。新维度让点分布得更清楚。
类比 给一座雕塑拍照:你会选一个"信息量最大"的角度(正面),这就是第一主成分;第二张从侧面(与正面正交)补充剩余信息。PCA 自动找这些"最佳拍摄角度"。
PCA 优点PCA 局限
消除无关特征/降噪;特征更少 → 模型更小更快;变换出更好的特征 → 更准;避免维度灾难;便于可视化;主成分相互独立 不清楚该保留几维;主成分可能难以解释;可能有信息损失;只假设线性组合、非概率模型(不能与概率结果直接结合);降维后不一定有助分类;对尺度敏感(要先标准化!);对离群值敏感
考点 PCA 的别名要知道:工程领域叫 SVD(奇异值分解),心理学/AI 领域叫 LSA(潜在语义分析)。三个关键词记牢:正交、按方差排序、对尺度敏感(先标准化)
Week 6 · Lecture 6

模块九 · 相关性、熵与互信息

衡量两个特征的关系:Pearson、Entropy、Mutual Information。

9.1 相关性是什么

Correlation(相关性):① 发现可能有关系的变量对;② 判断关系有多强。可以从散点图目测。两个维度:

  • 强度 Strength:强 vs 弱。
  • 方向 Direction:正相关(x 增 y 增)vs 负相关(x 增 y 减)。

为什么重要?① 更理解数据、辅助决策(云和雨相关 → 带伞);② 是迈向因果的一步;③ 建更好的预测模型——好的特征 = 与要预测的目标高度相关的特征(特征排序/选择)。

9.2 相关 ≠ 因果

核心结论 Correlation does not imply Causation(相关不蕴含因果)。这是本课最爱考的概念之一。
  • 隐藏共因 Hidden common cause:太阳镜卖得多 → 冰淇淋也卖得多。不是太阳镜让人饿,而是太阳同时导致了两者。
  • 虚假相关 Spurious correlation:两个毫不相关的量恰好同步变化(tylervigen 上有大量搞笑例子)。在政治和差劲论证里非常常见。
  • 离群值会制造/掩盖相关:盐摄入与血压的研究里,去掉 4 个非工业化国家的离群点后,结论就大变。
考点(2016 真题) 学习时间与成绩的 Pearson=0.85,能否说"学习导致成绩高"?要指出局限并给替代解释:① 相关≠因果;② 可能有隐藏共因(如学习兴趣/能力同时影响两者);③ 可能反向因果(成绩好→更愿意学)。

9.3 Pearson 相关系数

要量化"强度"就要量距离:相关越强 = 各点到那条直线的平均距离越小。但直接用欧氏距离有问题——量纲不同、无法发现"形状相似但尺度不同"或"方向相反"的关系。于是用 Pearson Correlation(皮尔逊积矩相关系数 r),专门衡量散点图有多接近一条直线

rxy = Σ(xi−x̄)(yi−ȳ) ⁄ [ √(Σ(xi−x̄)²) × √(Σ(yi−ȳ)²) ]

r ∈ [−1, 1]:1=完美正线性,−1=完美负线性,0=无(线性)相关;|r| 表示线性相关强度。Cohen 的经验解读:≥0.5 大,0.3–0.5 中等,0.1–0.3 小,<0.1 微不足道(实际还要看领域)。

Pearson 相关系数示例网格
三行很关键:第一行 r 从 1 到 −1,反映强度与方向;第二行 不管斜率多陡,只要完美共线 r 就是 ±1(Pearson 只看是否成直线,不看斜率大小);第三行 各种明显的非线性图案,Pearson 全是 0——Pearson 抓不住非线性关系

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 不变。
易错 Spearman 等级相关(比较"排名"而非数值)讲义明确标注 不在考试范围,了解即可:Pearson 关联实际数值,Spearman 关联相对排名。

9.4 熵 Entropy

Pearson 对非线性无能为力,但非线性数据明明有规律。于是研究"随机性"。Entropy(熵)衡量描述一个系统所需的信息量 / 不确定性 / "散乱度 scatteredness"。

直觉 100 辆车乱开在路上 → 要报每辆的 (x,y),100 对坐标(高熵);100 辆车整齐停成 10×10 → 一句"10×10 网格"就够(低熵)。高熵=更随机,低熵=更有序。

用概率行不行?不行——概率只说"下一个值多可能",不衡量整组数的信息量。所以单独定义熵。

H(X) = − Σi=1..k pi · log₂ pi (pi = 第 i 个类别/箱所占比例,k 个类别)

本课 log 默认以 2 为底(单位是 bit)。回顾:log₂16=4,log₂0.5=−1,log₂1=0。

二元结果的熵曲线
二元结果的熵曲线(以天气为例):p=0 或 p=1(完全确定)时熵=0;p=0.5(毫无头绪)时熵达到最大值 1 bit。两端确定、中间最不确定。

算例

特征"Likes to sleep",8 人:Yes 4、Never 2、Maybe 1、No 1。

比例 plog₂pp·log₂p
Yes4/8=0.5−1−0.5
Never2/8=0.25−2−0.5
Maybe1/8=0.125−3−0.375
No1/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 快)
例子 值 2,2,3,10,13,15,16,17,19,19,20,20,21,做 3 箱:
等宽:箱宽=(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) = Σx∈X p(x) · H(Y | X=x)
算例 7 个对象,X=身高(big/small),Y=体重(light/heavy)。big 有 2 个、small 有 5 个。
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):知道一个变量能减少另一个变量多少不确定性。它"对抗"熵

MI(X,Y) = H(Y) − H(Y|X) = H(X) − H(X|Y)
直觉 "I say Humpty, you say ____"——一旦我说 Humpty,你几乎确定下一个是 Dumpty,不确定性大减,说明这两个词互信息高。

算例

承上例: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
NMI(X,Y) = MI(X,Y) ⁄ f(H(X), H(Y)) ,f 可取 min / max / mean

例:MI=0.3059,NMI≈0.517(用 min)。

9.8 MI vs Pearson

对比Mutual InformationPearson
关系类型任意(线性 + 非线性)只限线性
值为 0 表示两变量独立关系不是线性(可能仍有非线性关系)
敏感于反映结构的存在对噪声/离群敏感
取值范围0 到 +∞[−1, +1]
计算速度
方向只给强度,不给方向有方向(正/负)
易错(高频考点) MI 的缺点:连续特征必须先离散化才能算 MI,而不同的分箱选择会得到不同的 MI 值。所以 Pearson=0.85 但 NMI 只有 0.1 的"矛盾",可能就是因为分箱太粗(如各分 2 箱)把线性关系的信息丢掉了。讲义点名这是"a good exam question"。
Week 7 · Lecture 7

模块十 · 监督学习:分类

KNN、决策树、Hunt 算法与信息增益。

10.1 分类与回归

Classification(分类):把数据项放进正确的"桶/类"。好处:降低复杂度(很多东西能一起处理);基于历史数据预测未来——这就是预测建模,机器学习的基础。

方法论:训练 / 测试

  • 准备:要有训练集 training set(带标签的样例)来教算法。
  • 训练 Training:算法看每个样例,找出能预测标签的模式。
  • 测试 Testing:用测试集 test set(新数据)定期检验预测有多准;够好就停,否则继续训练。
y = f(x₁, x₂, …, xₙ) :y=目标变量,xᵢ=属性/预测变量,f=预测模型(树/规则/公式)

这类"给样例让算法学"的算法叫 Supervised Machine Learning(监督学习)分类 vs 回归:分类学一个标签(离散类名)Regression(回归)学一个连续实数值(如由温度预测冰淇淋销量)。本课学两种:KNN 和决策树。

10.2 K 近邻 KNN

K Nearest Neighbours(K 近邻,KNN) 的直觉:在一堆带标签的点里,一个未知点很可能和它最近的邻居同类——"走起来像鸭子、叫起来像鸭子,那大概就是鸭子"。

需要三样东西

  1. 一组存好的(带标签)记录。
  2. 一个距离度量(如欧氏距离;也可用 Pearson)。
  3. 参数 k:取多少个最近邻。

给未知点分类:算它到所有训练点的距离 → 找出 k 个最近邻 → 用这些邻居的标签投票决定(多数表决 majority vote)。也可按距离加权投票,权重 w = 1/d²(越远票越轻)。k=1 时,分类边界就是 Voronoi 图

KNN 中 k 的选择
同一个未知点:k=3 时近邻多数是红色 → 判红;k=5 时多数变绿 → 判绿。k 的取值会改变结果
考点 选 k 的权衡:k 太小 → 对附近噪声点敏感k 太大 → 邻域里混进别的类的点。k 决定决策行为,是 KNN 的关键参数。

10.3 决策树结构与使用

Decision Tree(决策树):先看最重要的方面,据此再看次重要的……直到做出决定。结构是一棵流程图式的树:

  • 内部节点 internal node:对某个属性做一个测试。
  • 分支 branch:测试的一个结果。
  • 叶节点 leaf node:给出类标签(分类)或推荐动作(决策)。
决策树:从训练表到树模型(逃税预测)
经典"逃税预测"例:从训练表(分类/连续属性 + 类标签 Cheat)学出一棵树——先按 Refund 分,再按婚姻状况 MarSt,再按收入 TaxInc,叶子给出 No/Yes。

用树预测:从根节点开始,按测试结果一路往下走,到叶子得到预测类。注意:同一份数据可以有不止一棵树拟合(先分 Refund 还是先分 MarSt 都行),所以需要一个标准来挑"最好"的树。

10.4 建树:Hunt 算法

建树用 Hunt's Algorithm:从全部训练记录出发,自顶向下递归。在节点 t 上把当前记录集 Dt 分给子节点:

  1. 若 Dt 里记录全属同一类 yt → t 是叶子,标为 yt
  2. 若 Dt 为空 → t 是叶子,标为默认类 yd
  3. 若 Dt多个类 → 用一个属性测试把数据分成更小的子集(t 的各分支),对每个分支递归

三件要学的事:每个节点用哪个特征、特征值对应走哪个分支、底部给哪个类。理想情况是某特征的每个取值都干净对应一个类(同质类分布 homogeneous class distribution),但现实很少这样。

10.5 选最佳划分:熵与信息增益

贪心策略:偏好让子节点类分布更同质(更纯 pure)的划分。需要一个"不纯度 impurity"度量——就是:纯节点熵低,混杂节点熵高。

节点 t 的熵 H(t) = − Σj p(j|t) · log₂ p(j|t) (p(j|t)=节点 t 中类 j 的相对频率)

最大=log₂(n)(n 类均匀分布),最小=0(全属一类)。例:6 个全 C2 → H=0;1 个 C1+5 个 C2 → H=0.65;2 个 C1+4 个 C2 → H=0.92。

信息增益 Information Gain

比较划分前父节点的熵和划分后子节点的(加权)熵,差值就是增益:

Gain = H(Parent) − Σj=1..k ( N(vj) / N ) · H(vj)
N(vj)=子节点 vj 的样本数,N=父节点样本数

增益越大,划分越好。重要联系:信息增益 = 类特征与被划分特征之间的互信息 MI——所以"按信息增益划分"就是"选与类变量共享信息最多的特征"。

算例(2016 真题 2c) 根节点 A:50, B:150(共 200)。划分成 左(A25,B25) 和 右(A25,B125)。
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 个 C0 + 10 个 C1。"是否有车"信息增益=0.029;"车型"信息增益=0.62 → 选车型作为划分(增益更大)。

10.6 不同类型属性的划分

测试条件取决于属性类型和想分几路:

  • 名义 Nominal:多路划分(每个取值一路)或二元划分(把取值分两组,需找最优分组)。
  • 有序 Ordinal:同样可多路或二元,但二元分组要尊重顺序(如 {小,中} vs {大} 合法,{小,大} vs {中} 不合法)。
  • 连续 Continuous:① 离散化成有序类别(静态一次离散,或动态用等宽/等频/聚类);② 二元判断 (A < v) 或 (A ≥ v),考虑所有可能切点取最优(计算量更大)。
本节要记住 分类 vs 回归的区别与用途;KNN 中 k 的作用;如何用决策树预测;建树的关键步骤(如何划分、如何指定测试条件、如何选最佳划分、何时停止);以及用熵作为不纯度度量、用信息增益选划分的原理。
Week 8 · Lecture 8

模块十一 · 线性回归与模型评估

回归、过拟合、交叉验证、性能指标、特征选择。

11.1 分类 vs 回归

机器学习自动发现数据中的模式以做预测,两种基本方式:

分类 Classification回归 Regression
预测什么类别 / 类(离散)连续数值
目标变量 y离散值连续实数
例子该不该借钱给他?Yes/No30℃ 时会买多少冰淇淋?(一个数)
快速判断 "明天下不下雨"=分类;"明天下多少雨"=回归;"考试及格/不及格"=分类;"考试得几分"=回归。看输出是类别还是数值

11.2 线性回归

Linear Regression(线性回归):用一条直线,根据自变量(独立变量 X,即特征)预测因变量(依赖变量 Y)。

Ŷ = β₀ + β₁X :β₀ = 截距 intercept,β₁ = 斜率 slope
房价线性回归散点与拟合线
房价 = 98.248 + 0.10977 × 面积。截距 β₀=98.248,斜率 β₁=0.10977。点不在线上,拟合线选"总体最接近所有点"的那条。

最小二乘法 Least Squares

训练点不会正好在直线上,每个点有误差 ε(残差 residual)= 真实 Y − 预测 Ŷ。我们要找"总误差最小"的线,方法是调 β₀、β₁ 使残差平方和最小

minimize Σ (Yi − Ŷi)² = Σ (Yi − (β₀ + β₁Xi))²
为什么用平方 ① 误差有正有负,直接相加会相互抵消、低估真实总误差;② 平方在误差变大时增长很快,更重地惩罚少数大误差,胜过很多小误差。

解读系数

  • 截距 β₀:X=0 时 Y 的估计平均值(房价例里没有 0 平方英尺的房,β₀ 只是"不由面积解释的那部分价格")。
  • 斜率 β₁:X 每增加 1 个单位,Y 的平均变化(β₁=0.10977 → 每多 1 平方英尺,均价涨 $109.77)。

预测:2000 平方英尺 → 98.25 + 0.1098×2000 = 317.85(即 $317,850)。

内插 vs 外推 内插 Interpolation:在数据范围估计(较稳)。外推 Extrapolation:到数据范围估计(有风险)。准则:只在数据的相关范围内做预测

多元回归 Multiple Regression

不止一个自变量时:Y = β₀ + β₁X₁ + β₂X₂ + …。一个自变量拟合直线,两个拟合平面,更多则是超平面 hyperplane,都放在使残差平方和最小的位置。

线性回归优点缺点
简单、快、可解释、常常意外地准可能太简单,线性假设过强

11.3 泛化与过拟合

分类器不只用在你这份数据上,还要用在从没见过的新数据上,所以要健壮、通用(generalise)。怎么确保它不是只学会了训练数据?

泛化良好 vs 过拟合对比
左:直线虽不完美,但对圆点和星点都预测得不错 → 泛化好。右:弯弯曲曲的线把圆点拟合得极准,却对星点很糟 → 过拟合(贴训练数据太紧)。

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

例子:给 KNN 选 k k 是超参数 hyperparameter(属于学习模型、不属于数据本身)。流程:对 k∈{1,3,5},在训练子集上拟合、在验证集上看表现 → 选验证表现最好的 k → 用(训练+验证)合并重新拟合 → 最后才用独立测试集评估。
数据泄露 Data leakage 选超参数时绝不能偷看测试数据——那还属于"训练"阶段,不是"测试"。否则测试分数会虚高。

11.7 自助法 Bootstrapping

Bootstrapping(自助法):通过有放回抽样 sampling with replacement 造出"近似独立"的多个数据集。

  • 从 n 个训练样本中有放回地抽 n 个 → 一个自助样本 bootstrap sample(大小与原集相同,但有重复项),当训练集。
  • 没被抽到的样本 = 袋外数据 Out-Of-Bag(OOB),当测试集。
  • 抽 k 个自助样本,各自训练+在自己的 OOB 上评估,最后报告 k 个分数的均值和标准差
例子 原集 {0..9},一个自助样本 {7,2,6,7,5,4,8,8,1,0} → 有重复(7,8),OOB={3,9}。经验比例:每个自助样本约含63% 的数据(训练),OOB 约 37%(测试)。

交叉验证 vs 自助法

交叉验证自助法
抽样方式无放回有放回
主要目的估计泛化误差(预测性能)估计不确定性(标准误、置信区间)
数据划分分成互斥的折造出同样大小的新数据集,有重复、有遗漏
适用模型选择、超参数调优;想要可靠的泛化估计小数据集;想知道模型稳定性 / 要置信区间

11.8 分类评估指标

混淆矩阵 Confusion Matrix

把分类结果汇总成一张表,对比真实类与预测类:

真实 ↓ / 预测 →Predicted YesPredicted No
Actual YesTP(真阳)FN(假阴,漏报)
Actual NoFP(假阳,误报)TN(真阴)

以下用这个例子(共 100 个):TP=45, FN=3, FP=1, TN=51。

指标公式本例含义 / 何时用
准确率 Accuracy(TP+TN) / N(45+51)/100 = 0.96整体对了多少;类别不平衡时会误导
精确率 PrecisionTP / (TP+FP)45/46 ≈ 0.98预测为正的里面有多少是真的;不想要 FP(误报)时用
召回率 RecallTP / (TP+FN)45/48 ≈ 0.94真正的正例里抓到了多少;不想要 FN(漏报)时用
F12 × (P×R)/(P+R)≈ 0.96精确率与召回率的调和平均;两者接近时 F1 高于普通平均
方向类比 Precision = "不可错杀一个无辜"(别把好人关进监狱,怕 FP);Recall = "宁可错杀一千,不可放过一个"(要抓出尽量多的恶意程序,怕 FN)。"狼来了"喊太多 = 误报多 = 低 Precision。
易错 Accuracy 在不平衡数据上骗人:97 个 Yes / 3 个 No,模型把所有都预测 Yes → Accuracy=97/100=0.97 看着高,但少数类全错。这时要看 Precision/Recall/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|与残差同尺度,越小越好
考点 谁对离群值敏感?MSE / RMSE——因为平方会放大大误差。MAE 用绝对值,对离群值更稳健。

11.10 特征选择

学习器要考虑所有特征,但有些特征预测力比别的强得多;只用这些能省很多时间。单变量 univariate 特征选择:逐个评估每个特征的"好坏"(关于特征数是线性时间,最常用最简单)。基于排序 ranking:按预测力给特征打分排序,再用阈值或取 Top-N。

任务用什么度量特征与目标的关系注意
分类(类别目标)互信息 MI(X, Class)X 和 Class 都必须是类别型(否则先离散化)
回归(数值目标)Pearson 相关MI 不适用(要求目标离散化);数值特征用 Pearson
例子 MI(a₁, c)=H(c)−H(c|a₁)=1−0=1(高,a₁ 完美预测 c → 选);MI(a₂, c)=1−1=0(低,a₂ 预测不了 c → 不选)。
单变量选择的坑:XOR 单独看每个特征会漏掉特征间的相互依赖。若类别是若干特征的 XOR(异或):给全部特征时类别完全可预测,但单看任一个特征 MI 都是 0。补救:特征提取 feature extraction——用已有特征构造新特征(如收入与支出的差/比)。
高频考点 特征选择必须在训练步骤内做。一组选出的特征就像一个超参数。正确流程:在交叉验证/自助法的每一折训练数据上单独做特征选择,再训练、再在该折测试集评估。
反例(会过度乐观):先用整个数据集算 MI 选特征,再划分 train/test——这造成数据泄露,因为特征选择"看过"了测试数据,导致报告的准确率(如 90%)偏高。
Week 9 · Lecture 9

模块十二 · 隐私、伦理与 IP

差分隐私、数据伦理、大数据分析的责任。

12.1 隐私的三层视角

视角谁来保护策略
自我隐私 Self privacy每个人保护自己不披露 Don't disclose;说谎 Lie
局部隐私 Local privacy数据拥有者改记录里的字段加噪声、删特征、泛化特征(含 k-匿名、l-多样性
全局隐私 Global privacy数据拥有者在回答查询时做改动差分隐私:用 budget kglobal sensitivity G 控制噪声

12.2 局部隐私:k-匿名与 l-多样性

为降低发布数据集中个人被重新识别 re-identification 的风险:

  • k-匿名 k-anonymity:选一个 k,把数据处理到"每条记录至少和 k−1 条无法区分"。手段:用更宽的类别替换具体值;或用 * 抑制 suppress 属性(效用受限)。
  • l-多样性 l-diversity:进一步保证每个分组里敏感属性至少有 l 个不同取值(防止"组内大家敏感值都一样"导致泄露)。
  • 高维数据(如轨迹数据)很难维持隐私:cloaking 提供空间 k-匿名;obfuscation 让位置不精确。
考点 需掌握:显式标识符 explicit identifier准标识符 quasi-identifier 的区别;k-匿名、l-多样性及其局限。准标识符(如邮编+年龄+性别)单看不识别身份,但组合起来可能唯一锁定个人——这是 k-匿名要防的。

12.3 全局隐私:差分隐私

Differential Privacy(差分隐私):回答查询时加随机噪声来隐藏任一个体的存在/缺席。两步:① 针对查询统计每个相关个体;② 加均值为 0 的随机噪声,发布带噪结果。

发布结果 Released result = 真实结果 True result + 噪声 Noise

每次发布都略有不同,平均下来仍约等于真值,但查询者从单次结果无法确知个体信息。

权衡 Accuracy vs Privacy 改得越少 → 结果越真越准;改得越多 → 隐私保护越强。目标:在保证足够隐私的前提下,尽量少改。噪声太多数据就没价值了。

两个关键量

含义由谁定
隐私损失预算 budget k容忍多大程度的改动(k 小 = 改得少 = 查询者更难猜真值)数据拥有者决定
全局敏感度 global sensitivity G改动单个记录字段对结果的最大影响(多查询时 G = 各差异之和)通过计算"改一条记录对结果准确度的影响"得到
例子 查询 CountFemale(数有几个女性):增/删一个女性使计数变 1,所以全局敏感度 = 1;若数据集本来就没有女性,敏感度 = 0。

12.4 差分隐私:选哪些记录改

原则:改那些对整体统计影响最小的记录(改它前后"结果仍是真值"的概率几乎不变)。计算每个字段改成 * 时对输出的影响 E。

算例(7 条记录,2 个吸烟者、5 个不吸烟者) 把一个吸烟者改掉:E=1/2=0.5(吸烟者少,影响大);把一个不吸烟者改掉:E=1/5=0.2(不吸烟者多,影响小)。
→ 改不吸烟者更好:对整体统计破坏小,查询者也猜不到真实吸烟人数。
算例(Mavis 邮编) 记录 A、B 各有独一无二的邮编;C、D 是邮编+年龄的唯一组合(但各自的邮编、年龄都和别人共享)。预算只能改 2 条,应改 C、D:因为改 A、B 会让那两个独有邮编在发布数据里完全消失(查询会得到"没人来自那里"的错误答案);改 C、D 则所有邮编仍由其它记录保留,答案更准。

12.5 预算计算与 Laplace 噪声

设不含某字段的世界结果概率为 A、改动后的为 B。用预算 k 约束:

prob(A) ≤ 2k × prob(B) 即 prob(A) / prob(B) ≤ 2k
  • k=0:A=B,不改任何记录 → 无隐私。
  • k 小:只允许小差异 → A≈B(必须选 prob(B) 接近 prob(A) 的改法)。
  • k 大:允许大差异 → 结果可偏离更多(可做大幅改动)。
A(含)B(不含)k2ᵏ×BA ≤ 2ᵏ×B?结论
0.90.310.6改动大、k 小 → 不改
0.90.911.8改动小、k 小 → 可改
0.90.332.4改动大、k 大 → 可改

最后用 G 和 k 一起决定噪声:在保持平均不变的前提下调节噪声"散布"。比值 G/k 决定取舍——改"更暴露"的记录但改得少,或改"不暴露"的记录但改得多。噪声从 Laplace 分布采样:均值 μ=0,标准差(散布)b = G/k

差分隐私的承诺与局限 它保证无法从发布结果判断某用户是否在数据集中;但它不阻止查询者从总体的聚合结果对个人做出推断。要定噪声规模,必须先定预算 k、再求全局敏感度 G。

12.6 数据伦理

伦理研究"什么是该追求的好、什么是该做的对"。一个好用的尺子是 误分类的代价 cost of misclassification:如果搞错了,你的数据处理会造成多少痛苦?如果这事发生在身上,你能接受吗?

  • 合法 ≠ 道德(Legal ≠ Ethical)公开 ≠ 被广而告之(Public ≠ Publicized)
  • 反例 "AI Gaydar"(2018):技术上只是用公开数据做的分类器,但社会用途可能极其可怕(有些国家对此判死刑)。
  • 对偶用途 dual use:同一技术可善可恶,谁该负责?使用者 / 开发者 / 审稿人 / 大学 / 全社会?

对抗式评估系统:谁会受益?谁会受害?训练数据是否有代表性?是否优化了"对的"目标?错误预测会不会对人的生活产生重大影响?

误分类/错误的影响工作的收益是否该做
不该做!
可以做!
大概不该?
无所谓

12.7 大数据分析的伦理

数据多时有特殊伦理顾虑:你可能通过推断从一些数据"读出"别的信息——你可能对、也可能错,但当事人可能不希望被披露

著名案例 Target 通过购买模式推断出一个高中女生怀孕并寄来婴儿用品优惠券;Facebook 2012 秘密"情绪传染"实验,篡改 68.9 万用户的信息流看情绪反应。
  • 技术不是中立的全部:只看技术不足以理解不道德使用,要考虑被影响的利益相关者 stakeholders(个人创造数据、组织拥有并获益、社会引导监管)。
  • IRB(Institutional Review Board,机构审查委员会):组织内部审议"以人为对象的研究是否合乎伦理"的小组;涉及人或人的数据的项目要写明目标、流程、风险、缓解措施,获批才能做。
  • GDPR(EU 通用数据保护条例,2018 年起执行):保护欧盟公民数据隐私,违规罚款达全球年营收的 4%。要求:同意清晰简明并说明收集/分析理由;个人有权同样容易地撤回同意;有权索取自己数据的副本及处理目的;有权数据可携 data portability(把数据从一个控制者转到另一个)。

12.8 防止问题的十条规则

来自 Zook 等(2017):

  1. 假设"数据即人"——数据可能造成伤害(除非证明无关)。
  2. 隐私不是二元的——隐私是情境化的(单张照片 vs 全部社媒历史)。
  3. 防范重新识别——匿名数据与其它变量结合可能意外重识别。
  4. 实践合乎伦理的数据共享——共享前征得同意。
  5. 认清数据的优势与局限——大不等于好;相关的数据胜过更多的数据;记录数据来源与演变。
  6. 就棘手的伦理问题展开辩论——在同行中讨论、教育彼此。
  7. 制定行为准则——是否符合服务条款与用户期望?公众会觉得"瘆人 creepy"吗?
  8. 为可审计性设计系统——欢迎对大数据实践的审计。
  9. 正视更广的后果——大数据研究有社会级影响。
  10. 知道何时打破这些规则——为更大的公共利益(自然灾害、公共卫生紧急、敌对威胁)可暂时搁置个人隐私。

12.9 IP(知识产权)考点清单

讲义明确列出 IP 部分"必须掌握"的内容(详细定义在 IP 专题讲解中,本讲义只给出范围):

  • 什么是 许可 license、版权 copyright、商标 trademark、专利 patent
  • 数据许可的两大家族:Open Data Commons(ODC)Creative Commons(CC),各有一系列从宽到严的许可(细节不必记)。
  • GDPR 是什么、为何被创立(见 12.7)。
  • 在不侵犯版权 © 的前提下,能用多少文字和图像
本周必会清单(讲义原话归纳) 隐私:显式 vs 准标识符、k-匿名/l-多样性及局限、budget k 与 global sensitivity G、差分隐私如何通过"撤记录加噪声"工作。伦理:BDA 的伦理考量、IRB 是什么、十条规则。IP:上面四点。
Week 10 · Lecture 10

模块十三 · Prompts 与 RAG

如何控制 LLM、如何给它专属知识。

13.1 LLM 与两大问题

LLM / LVLM(大语言/视觉模型)是生成式的:把从网上获得的知识拆成片段、表示成嵌入 embeddings(一串数字),再用神经网络重组这些数字、把匹配的片段重新拼成文本/图像。用它不需要懂它。两大使用问题:

  1. 怎么有效控制它做你想要的?→ Prompts(提示)
  2. 怎么给它一些它本来没有的专属知识?→ RAG

13.2 Prompt 与微调;Prompt 等级

Prompt(提示) = 用户用自然语言给 LLM 的具体指令。因为是人话,所以非 CS 背景的人也能用。

Prompt vs 微调 Fine-tuning:早期用微调(继续训练以加强特定领域/任务知识,可能覆盖/削弱旧知识)来控制 LLM;但直接提示更简单,成了主流。

Prompt 的权力等级

LLM 构建者让某些 prompt 比别的更重要:

  1. 系统提示 system prompt(始终生效)——最强,约束总体行为("礼貌、不说脏话、不带偏见"),总是加在每个用户提示的最前面。
  2. 团队中资深/专家用户的提示。
  3. 个人用户自己的会话提示——最弱。
注意 系统提示并不总是被遵守(用逻辑不一致的探针可测出来,各系统表现都不同)。所以你要:写精确的提示、检查系统是否真照做、检查提示内部是否自相矛盾。

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"),下周讲为什么。

为什么"Act as"有用 给 LLM 设定角色,大概能让它聚焦到训练数据中那类信息出现的语境(如设定"气象专家"会调出气象相关的知识)。

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
越连贯越好篇章连贯性指标
越易懂越好(含解释)对话任务指标
联系 注意这里又用到了 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(检索增强生成):一个放在"旁边"的大型附加数据仓库。

RAG store 工作流程
流程:你的提示先去 RAG store 检索 → 取出与提示相关的材料 → LLM 把匹配到的信息加进你的提示 → 生成系统回答。
  • 把你的私有信息存在单独的仓库里。
  • 切成块 blocks(Claude 的块大小是 500+ 页)。
  • 本地搜索引擎从中抽出与提示相关的材料。
  • LLM 把匹配信息加进你的提示再生成。你也可以显式请求访问该仓库。

13.8 RAG 分段挑战

RAG 内存不是无限长,常要把文档切成段 segment切在哪里很关键——切错了,段里的 "it"、"AAII" 等指代会失去上下文。四种切分方式:

  1. 整篇上传:匹配则纳入整篇——但大部分内容可能无关。
  2. 固定长度切分:切成等长段——但可能把相关材料切散,丢失连贯性。
  3. 按文档结构(标题/章节)切分:更合理——但要额外工作找好边界。
  4. 预抽取:先把所有可能需要的信息抽出来、合并成一段。
本周必会清单 好提示的基本组成;提示进化与自我改进技术;提示评估;RAG store 是什么、有什么问题(分段挑战);其它加入私有信息的方法。
Week 11 · Lecture 11

模块十四 · 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,给没见过的输入也能给出接近训练数据的输出。
注意(讲义标注) 具体的函数数学(sigmoid/tanh 公式)、网络结构种类、反向传播细节,讲义都标了 "不在考试范围"。理解直觉即可,不必背公式。

14.3 嵌入 Embeddings

神经元的输入/输出是实数向量,所以要先把数据编码成数字。怎么编码英文词?早期用 BoW / TF-IDF 分数,但神经网络能学出更好的分数:用成千上万个"以某词为中心"的句子训练,反向传播会调整向量,使经常一起出现的词得高分。结果:意义相关的词,向量分布也相似

这种神经网络词向量就叫 embeddings(嵌入)

词嵌入示例:man/woman/king/queen
经典例子(Mikolov 2013):man/woman/king/queen 各是一个 7 维向量,降到 2 维可视化后,man→woman 和 king→queen 的方向几乎平行——嵌入把"性别"这种语义关系编码进了向量几何里。

现成嵌入工具:Word2vec(Google)、GloVe(Stanford)、fastText(157 种语言)。

14.4 语言模型(小)

语言模型 Language Model(LM) = 一份记录"语言中词序列及其相对概率"的资源(手机输入预测就是它)。历史:先用于语音识别 ASR(在"recognize speech" vs "wreck a nice beach"间选更可能的),后用于机器翻译 MT。

建一个 n-gram LM

  1. 从网上爬大量文本。
  2. 清洗成干净词串。
  3. 用一个 n 词的窗口 window 滑过文本。
  4. 记录每个 n-gram 窗口,统计出现次数
  5. 归一化计数;为方便取 log。
n-gram 的规模问题 词表 10 万 → bigram 高达 10¹⁰、trigram 10¹⁵(约 10⁶ GB)。所以需要各种平滑 smoothing 方法,在不知道完整 n-gram 时近似一个分数。

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 想成一本"词典",每个词由它的一组微特征定义。

怎么用文本学 "…went upstairs to the ___ and waited for the train" → 左边 "station/the/to the"、右边 "train/wait for/9¾" 这些上下文线索共同把空格预测为 "platform"。

14.6 生成式:chat loop 与 temperature

普通 LLM(BERT 等)是被动的。OpenAI 让它生成式:简单英文输入 → 简单英文输出(ChatGPT = GPT-3 175B 参数 + 一个"chat loop")。生成循环:

  1. 输入文本(prompt)。
  2. 用它的微特征去匹配可能的响应 n-gram。
  3. 挑一个匹配的 n-gram。
  4. 输出它。
  5. 把它加到 prompt 后面,重复——从左到右一直生成,直到达到阈值。
Temperature(温度) 即使输入相同,系统也可能从"最匹配 n-gram 列表"里选另一个,这种随机性(可选列表的长度)叫 temperature。温度高 → 更多样;温度低 → 更确定。

14.7 生成的弊端

"从左到右拼接 n-gram"本身不保证语法/真实/连贯,于是有三类问题:

问题说明
1 幻觉 Hallucination(近距离虚假)没有"真相"模型——可能照搬网上的错误(flat earth),或把两句各自为真的话拼成一句假的
2 长程不连贯长文本里前后自相矛盾(独角兽例子:一角还是四角?为什么是两个世纪?)
3 不可接受的输出不懂社会规范;网上充满暴力/偏见/仇恨内容,系统可能输出;又因为无法定位"坏"内容在哪个节点,只能重训或在输出后加过滤器
RLHF(基于人类反馈的强化学习) 让人评判系统输出的好坏,再重训系统避免坏答案(OpenAI 曾雇肯尼亚的人来评分)。大体有效,但昂贵、耗时、且不保证

14.8 图像与代码生成

  • 图像/视频生成(DALL-E、Stable Diffusion、Midjourney、SORA):和文本平行,用图像微特征。从一片随机彩色点出发,根据提示词找匹配微特征、拼进最合适的位置、反复合并,逐渐"长出"越来越具体的图像。文本和图像处理在融合,因为用同样的神经网络和嵌入表示
  • 代码生成:用程序而非英文训练。词表更小、组合更受限,更易生成代码"句子";但同样有幻觉和不连贯问题(Codex、Claude)。
图像解释错误 神经网络的微特征和人看到的特征不一样——可用对抗方法训练出"在 NN 看来相似、在人看来不同"的图像。

14.9 LLM 到底是什么

讲义的结论很重要(也很可能考概念题):

一句话 LLM 是"一个非常大的(隐式)文本片段数据库 + 一个聊天循环"
  • 没有真相理解:会报告网上的假信息;会把分别为真的片段拼成假的(幻觉)。
  • 不能推理:不会推断、检查一致性、做逻辑;表面的"逻辑"来自长上下文(匹配窗口)。
  • 没有目标或愿望:它不会"想"做任何事(比如统治世界);但你很容易把它"驱使"到占星、仇恨、种族主义等它读过的任何方向。

这台机器没有大脑——用你自己的

能力层级与评估

能力层级:① 基础事实知识;② 直接处理与推断(摘要、翻译、简单 QA);③ 创作(代码、诗歌、图像);④ 更深的问题求解(数学、逻辑、心智理论、跨模态)。LLM 评估维度:答案相关性、任务完成度、正确性、幻觉、工具调用正确性、(RAG 的)上下文相关性、伦理(无偏见/无毒性)、任务特定指标。

Week 12 · 复习

模块十五 · 复习与考试

考试结构与全课复习清单。

15.1 考试结构

讲义给出的考试分三部分:

部分题型要求
Section A · 简答多道小题,每题 2–3 句定义类(X 是什么?)、概念类(关联 X 和 Y、Z 的用途),可能要举例说明某技术/问题
Section B · 长答(分析理解)较长的回答对比不同方法、分析某算法/应用、论证某建模技术为何合适、清楚而有细节地解释概念
Section C · 算法计算在给定示例数据上做计算数值计算(对算法跑示例数据)、用自己的例子给出算法大纲逐步解释算法如何工作
备考重点 Section C 的计算题最该练熟:TF-IDF、熵 / 条件熵 / 互信息、信息增益、距离度量、k-Means 迭代、层次聚类合并、混淆矩阵指标、差分隐私的 E 与预算判断——这些本知识库都配了逐步算例,建议照着算一遍。多数公式考试会给,重点是会按步骤算、能解释每步的含义。

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 是什么"
最后 这门课的主线始终是那张"从数据到知识"的轮盘图(见 1.2):输入 → 清洗增强 → 建模 → 输出 → 使用(伦理)。把每个模块挂回这条主线,概念就串起来了。