HKUST-数据分析基础笔记-全-

HKUST 数据分析基础笔记(全)

数据分析基础:01:引言与统计回顾

在本节课中,我们将回顾一些基础的统计分析知识。之所以这样做,是因为我们即将开始数据分析的学习,这通常包括描述性分析、预测性分析等。为了进行这些分析,我们需要运用多种数学工具。虽然你可能已经学过这些工具,但由于不常使用,我们需要唤醒对这些概念的回忆。因此,本节将是一次关于基础统计分析的复习。


什么是统计分析?📊

首先,我们来讨论什么是统计分析。从形式上说,统计分析是一门收集、探索和呈现大量数据(我们通常称之为数据集)以发现其潜在模式和趋势的科学

我们几乎在每个领域都会收集数据。然而,仅仅收集数据是不够的。收集到的数据可能是关于某个事件、某种情况的一系列数值。仅仅拥有这些数值本身没有意义。我们需要知道如何探索数据背后隐藏的含义,理解数据向我们传递了怎样的信息。此外,数据的收集本身也需要对相关领域有所了解。

因此,为了进行统计分析,我们需要了解有哪些方法、需要注意哪些事项,以及如何分析数据、理解数据并发现其中的模式和趋势。统计分析实际上无处不在,从物理学到社会科学,它被广泛使用。我们每天听到的各种组织发布的调查报告,其发现正是通过统计分析得出的。


统计分析的主要任务

接下来,我们将讨论统计分析中的一些主要任务。

以下是三个核心任务:

  1. 描述和总结数据:对数据进行概括性描述。
  2. 识别变量间的关系:探究不同数据项之间的关联。
  3. 预测结果:基于现有数据对未来进行推断。

统计分析为何重要?🤔

正如我们刚才提到的,我们周围有大量数据,日常生活中也有许多问题。我们需要答案,而统计分析正是帮助我们回答这些问题。

例如,一个典型的问题是:“如果我毕业了,我的薪水会是多少?”人们会使用历史数据或统计分析来回答这个问题。比如,基于从往届或本届毕业生收集的薪资数据,我们可以计算所有数值的平均值,从而了解毕业生的平均薪资水平。

示例:假设平均薪资是80000。那么,我们就可以用这个数字来回答问题,让你对平均薪资或通常的薪资水平有一个预期。

统计分析之所以重要的另一个原因是,一旦我们了解了数据,它实际上也能为我们如何做决策提供一些答案。当我们面对多种可能性和不同路径时,哪一条才是好的、合适的?统计分析也将帮助我们回答这个问题。


总结

本节课中,我们一起学习了统计分析的基本定义、核心任务及其重要性。我们了解到,统计分析是通过科学方法处理数据以发现模式和趋势的过程,它对于从数据中获取信息、解答疑问以及支持决策都至关重要。在接下来的课程中,我们将深入探讨描述数据、分析关系等具体任务。

数据分析基础:P02-03-02-02:数据描述与汇总 📊

在本节课中,我们将要学习如何描述和汇总数据。我们会首先理解什么是数据集,然后探讨几种组织和呈现数据的常用方法,包括表格、图表以及一些数值描述性度量。这些工具能帮助我们更好地理解和解释收集到的信息。


什么是数据集?📁

我们经常使用“数据”或“数据集”这些术语。数据集可以看作是一系列数值的集合,但数据并不一定是数字,它也可以是一组项目。

以下是两个例子:

  1. 假设我们询问20名学生的体重,并记录下这些数字。我们得到了20个数值(有些可能相同)。这20个值构成了一个包含20个观测值的数据集。
  2. 我们询问这20名学生的发色,并记录下颜色名称。这次我们得到的是20个颜色名称(字符串或项目),而不是数字。

基于这两个例子,我们可以看到数据有两种主要类型:

  • 连续型数据:例如体重数据。这些是数字,并且数值之间是连续的(例如,可以有122.5或146.1这样的值)。
  • 离散型数据:例如发色数据。这些值通常是分类的或计数的,数值之间没有连续的中间值(例如,在“红色”和“黑色”之间没有明确的中间颜色名称)。

收集数据后,仅仅查看原始数字或项目列表并不直观。因此,我们需要使用各种方法来描述和汇总数据,以便更好地解读它们。


使用表格呈现数据 📋

组织数据的一种常见方式是使用表格。例如,下面的表格有三列,分别描述了行业分组、致残伤害人数以及相应的百分比。每一行都包含特定类别的信息。

行业分组 致残伤害人数 占总数的百分比
农业 130 3.4%
... ... ...
贸易服务 1100 28.9%

表格能以易于管理的方式清晰地展示数据。通过扫描数字,我们可以知道哪个类别的数值最大或最小。然而,表格提供的信息可能不够直观,有时我们更倾向于使用图表来强调数据的某些方面。


使用图表呈现数据 📈

图表能更直观地展示信息,通常比原始数字更容易解读。以下是两种常见的图表:

条形图
将上述表格信息用条形图呈现,我们可以更容易地比较不同类别之间的差异。一眼就能看出“服务”类别的条形最高,而“农业”类别的条形最低,这比在表格中逐行扫描数字要快得多。

饼图
饼图用整个圆代表100%,每个扇区表示该类别在整体中所占的百分比。例如,农业占3.4%,是一个小扇区;而服务占比最大,对应的扇区也最大。饼图能直观地展示各部分相对于整体的相对大小。

表格和图表各有优势。表格适合呈现复杂或大量的数据,而图表(如条形图、饼图)则在强调数据的比较、分布或构成比例时更为有效。


茎叶图 🍃

除了常见的图表,还有其他有用的数据呈现方式。茎叶图就是其中一种,它的名字形象地体现了其结构:由“茎”和“叶”两部分组成。

假设我们有以下18个关于某城市夏季最大臭氧读数的数值(已排序):
60, 61, 62, ... , 122, 129, 169, 179

存储这18个独立数字需要一定空间。为了压缩存储,我们可以使用茎叶图,其构建方法如下:

  • 对于一个数字(如60),我们取第一位数字6作为,最后一位数字0作为
  • 对于三位数(如122),我们取前两位12作为茎,最后一位2作为叶。
  • 将所有数字按此规则整理,得到如下茎叶图:

6 | 0 1 2 3 4
7 | 1 2 5 8
8 | 1 2 4
9 | 2 5 7
10 | 2
11 |
12 | 2 9
13 |
14 |
15 |
16 | 9
17 | 9

茎叶图有以下优点:

  • 可以快速用纸笔构建。
  • 可以从图中恢复每个原始数据点的值(例如,茎16和叶9对应数字169)。
  • 数据排列紧凑,因为茎部不重复。
  • 易于解读数据的分布形态。

散点图 🔍

散点图常用于展示数据集中两个变量之间的关系。例如,我们想了解57名棒球运动员的身高和体重之间是否存在关联。这里,身高和体重就是两个变量。

构建散点图时,我们将每个球员的两个变量值作为笛卡尔坐标(如(74, 210)),并在图表上绘制出对应的点。将所有数据点绘制出来后,就形成了散点图。

观察散点图,我们可以获取以下信息:

  • 方向:数据点是否呈现出某种趋势(如从左下到右上)?
  • 形状:点是否大致沿一条直线分布,还是呈现曲线或其他形状?
  • 紧密程度:数据点是紧密聚集在一起,还是分散在各处?

这些观察能帮助我们理解两个变量之间是否存在相关性以及相关的强弱。


数值描述性度量 📏

除了用图形和表格描述数据,我们还经常使用一些数值来概括数据的特征。这些数值描述性度量主要分为两类:描述集中趋势和描述变异性

在详细介绍这些度量之前,需要先理解几个基本统计概念:

  • 总体:统计研究中所有个体或项目的集合。(例如,香港科技大学所有学生的身高。)
  • 样本:从总体中选取的一部分,用于收集信息。(例如,随机询问100名港科大学生的身高。)
  • 抽样误差:由于只测量了样本而非整个总体,导致样本结果与总体真实结果之间的差异。

集中趋势度量

假设我们有一个大小为 n 的样本,其观测值为 x1, x2, ..., xn

以下是描述数据集中趋势的常用度量:

  • 均值:所有数值的平均值。
    均值 = (x1 + x2 + ... + xn) / n
  • 最小值:样本中的最小数值。
  • 最大值:样本中的最大数值。
  • 中位数:将样本所有值按大小排序后,位于中间位置的值。如果 n 为奇数,中位数是中间那个数;如果 n 为偶数,中位数是中间两个数的平均值。
  • 众数:样本中出现次数最多的数值。

变异性度量

以下是描述数据变异或分散程度的常用度量:

  • 极差:最大值与最小值之差。
    极差 = 最大值 - 最小值
  • 百分位数:第 p 百分位数是一个值,使得大约 p% 的样本观测值小于或等于该值,而大约 (100-p)% 的观测值大于该值。例如,中位数就是第50百分位数。
  • 四分位距:第三四分位数(第75百分位数,Q3)与第一四分位数(第25百分位数,Q1)之差。
    IQR = Q3 - Q1
    IQR 反映了中间50%数据的分布范围。
  • 方差:各观测值与均值之差的平方的平均值(对于样本,通常除以 n-1)。
    方差 = Σ(xi - 均值)² / (n-1)
  • 标准差:方差的平方根。它和方差一样衡量数据的离散程度,但单位与原始数据相同。
    标准差 = √方差

计算示例 🧮

让我们用一个包含20个数值的样本来演示如何计算这些度量:
65, 122, 125, 140, 142, 146, 151, 151, 155, 157, 162, 162, 171, 176, 179, 179, 195, 235

  • 样本大小 n20
  • 均值(65+122+...+235)/20 = 155.85
  • 最小值65
  • 最大值235
  • 中位数: 排序后第10和第11位的值是 155157,中位数为 (155+157)/2 = 156
  • 众数151162179 都出现了两次,所以这个样本是多众数的。
  • 极差235 - 65 = 170
  • 第一四分位数 (Q1): 计算得约为 143
  • 第三四分位数 (Q3): 计算得约为 168.75
  • 四分位距 (IQR)168.75 - 143 = 25.75
  • 方差: 计算得约为 1136.34
  • 标准差√1136.34 ≈ 33.71

总结 📝

在本节课中,我们一起学习了数据描述与汇总的基础知识。我们首先了解了数据集和数据类型(连续与离散)。然后,探索了多种呈现数据的方法:用表格清晰组织数据,用条形图和饼图进行直观比较,用茎叶图紧凑展示分布,以及用散点图分析变量间关系。最后,我们深入探讨了关键的数值描述性度量,包括描述数据集中趋势的均值、中位数、众数,以及描述数据变异性的极差、百分位数、四分位距、方差和标准差。掌握这些工具对于理解和分析任何数据集都至关重要。

数据分析基础:03:线性模型

在本节课中,我们将要学习如何识别和描述两个变量之间的关系。我们将从理解变量本身开始,然后探讨如何通过散点图观察关系,并最终学习如何使用线性模型来量化这种关系。我们还将介绍衡量关系强度的相关系数。


变量与数据收集

当我们收集数据时,通常会记录多个特征。例如,在一项针对大学生的调查中,我们可能会收集他们的身高、体重、性别、专业和GPA等信息。每一个这样的特征都被称为一个变量

对于单个变量,我们可以使用描述性统计量(如均值、最大值、标准差、四分位距等)来概括其特征。例如,我们可以计算体重的平均值或GPA的中位数。

然而,数据分析的核心目标之一是探索变量之间的关系。例如,我们可能想知道学生的身高和体重之间是否存在某种关联。


探索变量关系:散点图

为了直观地探索两个变量(例如身高 x 和体重 y)之间的关系,最有效的方法是使用散点图

在散点图中,每个数据点代表一个观测对象(如一名学生)。点的横坐标 x 代表其身高,纵坐标 y 代表其体重。将所有数据点绘制在图上后,我们通过观察点的整体分布形态来初步判断关系。

观察散点图时,我们关注以下几点:

  • 形态:点是否大致呈直线、曲线或其他特定形状分布?
  • 方向:随着 x 增加,y 是总体增加还是减少?
  • 密集程度:点是紧密聚集还是分散开?

如果散点图上的点大致沿一条直线分布,那么尝试用线性模型来描述这种关系就是合理的。


线性模型

线性模型试图用一条直线来概括散点图中所有点的趋势。其基本公式为:

y = a + b*x + e

其中:

  • y因变量(我们试图预测或解释的变量,如体重)。
  • x自变量(用来预测 y 的变量,如身高)。
  • a截距,表示直线与 y 轴的交点。
  • b斜率,表示直线倾斜的程度(x 每变化一个单位,y 平均变化多少)。
  • e随机误差,代表每个实际数据点与直线上预测值之间的偏差。因为数据点几乎不可能完全落在一条直线上,所以需要误差项 e 来容纳这种差异。

如果不存在误差,那么 y 就是 x 的确定性线性函数:y = a + b*x


如何拟合直线?

上一节我们介绍了线性模型的概念,本节中我们来看看如何实际找到那条“最佳”直线。主要有两种方法。

方法一:目测拟合

这种方法比较直观,类似于我们手动在散点图上画一条看起来最合适的直线。具体步骤如下:

以下是目测拟合的步骤:

  1. 在散点图上选择两个看起来能代表整体趋势的点,例如 (x1, y1)(x2, y2)
  2. 根据这两个点计算斜率 bb = (y2 - y1) / (x2 - x1)
  3. 选择其中一个点(如 (x1, y1))和计算出的斜率 b,代入公式 y1 = a + b*x1,解出截距 aa = y1 - b*x1

例如,选择点 (69, 160)(78, 225),计算得斜率 b = 7.2,截距 a = -336.8,从而得到直线方程。

这种方法的缺点是,不同的人可能会选择不同的点,从而得到不同的直线,结果不够客观和精确。

方法二:最小二乘法拟合

为了找到一条在数学意义上“最佳”的直线,我们使用最小二乘法。其核心思想是:找到一条直线,使得所有数据点到这条直线的垂直距离的平方和最小。这个平方和就是总误差 S

对于第 i 个数据点 (x_i, y_i),其预测值为 a + b*x_i,误差为 e_i = y_i - (a + b*x_i)。最小二乘法的目标是:

最小化总误差 S = Σ (y_i - (a + b*x_i))^2,其中求和从 i=1n

通过分别对 ab 求偏导数并令其为零,我们可以推导出计算 ab 的公式:

b = Cov(x, y) / Var(x)
a = mean(y) - b * mean(x)

其中,Cov(x, y)xy 的协方差,Var(x)x 的方差,mean() 表示平均值。

使用最小二乘法拟合出的直线(通常显示为绿色)比目测拟合的直线(橙色)更优,因为它最小化了所有点的总误差。一旦得到线性模型,我们就可以用一个新的 x 值(如某学生的身高)来预测其对应的 y 值(如体重)。


相关系数

除了用直线拟合,我们还需要一个数值指标来衡量两个变量线性关系的强度和方向。这个指标就是相关系数,通常记为 r

相关系数的计算公式为:
r = Cov(x, y) / (SD(x) * SD(y))
其中,SD() 代表标准差。

相关系数 r 的取值范围在 -11 之间:

  • r = 1:完全正相关。两个变量同向等比例变化。
  • r = -1:完全负相关。两个变量反向等比例变化。
  • r ≈ 0:无线性相关。一个变量的变化不能预测另一个变量的线性变化。

例如,利用学生身高体重数据计算出的相关系数 r = 0.7,这表明两者之间存在较强的正相关关系。

通过观察不同 r 值对应的散点图,可以直观理解其含义:

  • r = -1:点严格落在一条向下倾斜的直线上。
  • r = 0:点呈随机云团状,无明确方向。
  • r = 1:点严格落在一条向上倾斜的直线上。

需要注意的是,相关系数仅衡量线性关系的强弱。即使 r ≈ 0,两个变量之间也可能存在其他非线性的关系(如曲线关系),这就需要借助其他分析方法来发现。


总结

本节课中我们一起学习了如何分析两个变量之间的关系。

  1. 我们首先回顾了变量和描述性统计。
  2. 然后学习了使用散点图来直观探索变量间的关系。
  3. 接着,我们引入了线性模型 (y = a + b*x + e) 来量化这种关系,并介绍了两种拟合直线的方法:目测拟合和更精确的最小二乘法拟合
  4. 最后,我们学习了相关系数 r 的概念,用它来衡量两个变量线性关系的强度和方向(取值范围从 -11)。

理解这些基础概念是进行更复杂数据分析的重要第一步。

004:概率 📊

在本节中,我们将学习概率论的基础知识。概率是衡量事件发生可能性的数学工具,在数据分析中至关重要。我们将从基本概念开始,逐步深入到概率模型和定理。

实验、样本空间与事件

上一节我们介绍了数据分析的框架,本节中我们来看看概率论的核心基础。首先,我们需要理解三个基本术语:实验、样本空间和事件。

  • 实验:指结果不确定的行动。例如,抛一枚硬币。
  • 样本空间:指实验所有可能结果的集合,通常用 S 表示。例如,抛一枚硬币的样本空间是 S = {H, T},其中 H 代表正面,T 代表反面。
  • 事件:指样本空间 S 的一个子集。例如,抛硬币得到正面是一个事件;掷一个六面骰子得到点数1或2也是一个事件。

概率的定义与性质

理解了基本术语后,我们可以正式定义概率。概率是衡量事件发生可能性的度量。

概率 P(A) 定义为事件 A 中期望结果的数量除以所有可能结果的数量。用公式表示为:
P(A) = (期望结果的数量) / (所有可能结果的数量)

关于概率,有以下重要事实:

  1. 任何事件的概率都是一个介于 01 之间的数。
  2. 整个样本空间的概率为 1,即 P(S) = 1
  3. 如果两个事件 AB 不能同时发生(互斥),则事件 AB 发生的概率是它们各自概率的和,即 P(A 或 B) = P(A) + P(B)

树状图

当事件组合变得复杂时,计算概率可能变得困难。树状图是一种有用的工具,可以直观地展示所有可能结果及其概率。

以下是构建树状图的步骤:

  1. 从初始点开始,为第一次实验的每个可能结果画一个分支。
  2. 在每个分支上,标注该结果发生的概率。
  3. 从第一次实验的每个结果出发,重复步骤1和2,为后续实验画分支。
  4. 要计算沿着特定路径(一系列结果)的概率,将路径上所有分支的概率相乘。
  5. 要计算某个事件(可能对应多条路径)的概率,将所有相关路径的概率相加。

条件概率与独立性

在许多情况下,一个事件的发生会影响另一个事件发生的概率。这引出了条件概率的概念。

事件 B 在事件 A 已发生条件下的概率,称为条件概率,记作 P(B|A)。计算公式为:
P(B|A) = P(A 且 B) / P(A)

如果事件 A 的发生不影响事件 B 发生的概率,即 P(B|A) = P(B),则称事件 AB独立的。对于独立事件,它们同时发生的概率等于各自概率的乘积:P(A 且 B) = P(A) * P(B)

随机变量

为了更方便地处理数值结果,我们引入随机变量的概念。

随机变量是一个变量,其可能取值是某个实验的数值结果。通常用大写字母如 X 表示。随机变量分为两类:

  • 离散随机变量:取值是可数的(通常是整数)。
  • 连续随机变量:取值是连续的(可以是某个区间内的任意实数)。

离散概率模型

对于离散随机变量,我们使用概率质量函数来描述其概率分布。

概率质量函数 p(x) 给出了随机变量 X 取特定值 x 的概率,即 p(x) = P(X = x)。所有可能取值的概率之和为1。

两个重要的参数用于描述概率分布:

  • 期望(均值) μ:衡量分布的中心趋势。计算公式为 μ = E[X] = Σ [x * p(x)]
  • 方差 σ²:衡量分布的离散程度。计算公式为 σ² = Var(X) = E[(X - μ)²] = Σ [(x - μ)² * p(x)]。方差的平方根称为标准差 σ

二项分布

二项分布是一种常见的离散概率模型,适用于满足以下条件的“伯努利试验”:

  1. 试验由 n 次相同的独立试验组成。
  2. 每次试验只有两种可能结果:“成功”或“失败”。
  3. 每次试验“成功”的概率 p 保持不变。

在二项分布中,随机变量 X 表示 n 次试验中“成功”的次数。X 的概率质量函数为:
P(X = k) = C(n, k) * p^k * (1-p)^(n-k), 其中 k = 0, 1, ..., n。
这里 C(n, k) 是组合数。我们记作 X ~ Binomial(n, p)
其期望和方差为:μ = np, σ² = np(1-p)

泊松分布

泊松分布是另一种常见的离散分布,用于描述在固定时间或空间间隔内,随机事件发生的次数。

如果随机事件在单位时间内发生的平均次数为 λ,那么随机变量 X(表示在给定间隔内事件发生的次数)服从泊松分布。其概率质量函数为:
P(X = k) = (e^(-λ) * λ^k) / k!, 其中 k = 0, 1, 2, ...
我们记作 X ~ Poisson(λ)
其期望和方差相等:μ = λ, σ² = λ

连续概率模型

对于连续随机变量,我们使用概率密度函数来描述其分布。

概率密度函数 f(x) 描述了随机变量在任意点附近取值的相对可能性。曲线下的总面积代表概率,且等于1。事件 a < X < b 的概率是密度函数在区间 [a, b] 上的积分面积。
连续随机变量的期望和方差通过积分定义:
μ = E[X] = ∫ x * f(x) dx
σ² = Var(X) = ∫ (x - μ)² * f(x) dx

正态分布

正态分布(又称高斯分布)是最重要的连续分布之一,其曲线呈对称的钟形。

正态分布由两个参数完全决定:均值 μ(决定中心位置)和标准差 σ(决定分布的宽度)。记作 X ~ N(μ, σ²)
μ = 0σ = 1 时,称为标准正态分布,记作 Z ~ N(0, 1)。任何正态变量 X 都可以通过标准化转换为标准正态变量:Z = (X - μ) / σ

均匀分布与指数分布

除了正态分布,还有其他重要的连续分布。

  • 均匀分布:在区间 [a, b] 上,概率密度是常数。记作 X ~ Uniform(a, b)。其密度函数为 f(x) = 1/(b-a), 当 a ≤ x ≤ b。期望和方差为:μ = (a+b)/2, σ² = (b-a)²/12
  • 指数分布:常用于描述独立随机事件发生的时间间隔。由一个参数 λ(速率)决定,记作 X ~ Exponential(λ)。其密度函数为 f(x) = λe^(-λx), 当 x ≥ 0。期望和方差为:μ = 1/λ, σ² = 1/λ²

置信区间

当我们用样本统计量(如样本均值)估计总体参数时,需要评估估计的可靠性。置信区间提供了参数可能落入的一个范围。

例如,95% 置信区间意味着,如果我们重复抽样多次,大约有95%的区间会包含真实的总体参数。对于总体均值的估计,当样本量较大时,95%置信区间可以近似为:样本均值 ± 1.96 * (样本标准差 / √n)

联合概率分布

当我们同时考虑两个或多个随机变量时,需要研究它们的联合分布。

对于两个离散随机变量 XY,其联合概率质量函数 p(x, y) 给出了 X = xY = y 的概率。边缘分布可以通过对联合分布求和得到,例如 p_X(x) = Σ_y p(x, y)
如果 XY 独立,则联合概率等于边缘概率的乘积:p(x, y) = p_X(x) * p_Y(y)
对于连续随机变量,有类似的联合概率密度函数 f(x, y),概率通过对密度函数在相应区域上二重积分得到。

贝叶斯定理

贝叶斯定理是概率论中一个非常强大且实用的公式,它描述了如何利用新的信息更新事件的概率。

贝叶斯定理的公式如下:
P(A|B) = [P(B|A) * P(A)] / P(B)
其中:

  • P(A|B) 是后验概率,即在观察到事件 B 后,事件 A 发生的概率。
  • P(B|A) 是似然概率。
  • P(A) 是先验概率,即在观察 B 之前,对 A 发生可能性的初始判断。
  • P(B) 是证据或边际似然。

当样本空间由互斥事件 A1, A2, ..., An 构成时,全概率公式为 P(B) = Σ_i P(B|Ai) * P(Ai)。结合贝叶斯定理,可以计算在观察到 B 后,某个特定原因 Ak 发生的概率:
P(Ak|B) = [P(B|Ak) * P(Ak)] / [Σ_i P(B|Ai) * P(Ai)]


本节课中我们一起学习了概率论的核心概念,从基本的定义、性质到具体的概率模型(如二项分布、正态分布),再到高级主题如置信区间和贝叶斯定理。这些工具是进行统计推断和数据分析的基石,能够帮助我们量化不确定性并对未来结果做出预测。

005:数据预处理 📊

在本节课中,我们将要学习数据预处理。数据预处理是数据分析(如数据挖掘)中至关重要的一步。只有当我们对数据进行预处理并获得高质量数据后,才能获得良好的分析性能。数据预处理正是帮助我们实现这一目标的关键环节。本节我们将探讨数据预处理面临的挑战,特别是大数据环境下的挑战,然后概述数据预处理的具体内容,接着介绍其常见步骤和一系列可用的技术。我们会提及许多不同的术语和技术,有些会详细介绍,有些可能较为高级,虽无法深入探讨,但我们希望你能对数据预处理有更全面的了解,以便在未来需要处理数据时,知道基本步骤以及可以进一步探索的方向。

挑战与可能性

现在,每当我们谈论大数据时,一个主要的挑战当然是可扩展性问题。我们总是在处理海量的数据和多样的数据。因此,我们需要方法来处理这些大量的数据和巨大的数据差异。与其他数据处理技术类似,我们仍在探索适用于大数据的技术。通常,当前的方法可能还不够。这意味着,对大数据的预处理也创造了新的可能性,我们正在寻找新的技术和新的方法来处理大数据的预处理。

对于新技术,近年来已有一些探索,例如在数据处理中使用分布式计算(如Hadoop、Spark),以及在特征选择、不平衡学习等方面的应用。这里最重要的问题是,我们如何能处理好数据预处理,使其能够与其他数据挖掘挑战以及数据分析问题相适应。

什么是数据预处理?

数据预处理是知识发现过程中的一个非常重要的步骤,也就是KDD过程。例如,你可以看到,我们首先有数据,有数据库。为了发现知识,主要的步骤包括:问题定义、问题理解、数据预处理、数据挖掘、评估和结果探索。首先,我们当然需要解决问题,需要知道约束条件是什么,需要获得什么样的结果等。这意味着我们也需要理解问题,理解我们的数据。

然后,我们需要进行数据预处理。数据预处理之后,数据就为数据挖掘做好了准备。数据挖掘之后,我们仍然需要进行评估,并需要探索结果,看看是否存在问题,是否可以进一步改进。很可能我们需要返回并重新开始这个过程,经过多次迭代,直到对结果满意,我们才能得到结果,并从中提取知识。数据预处理是一个非常重要的步骤,它将影响最终的性能和知识发现。

那么,为什么我们需要数据预处理呢?原因是,大多数时候我们的数据可能以不同的格式存在,特别是现在我们谈论的是大数据,其多样性意味着我们将看到许多不同格式的数据。例如,我们可能查看结构化数据,如表格,它表示值和属性之间的关系;或者可能是非结构化数据,如文本,它是一系列字符和单词;此外,我们可能还会查看音频、视频数据。这些非结构化数据也需要进行预处理,以便我们能够继续数据分析或数据处理的下一阶段。

因此,数据预处理可以被视为将原始数据(即我们第一步获得的数据)转换为格式良好的数据,使其适合数据挖掘分析。因为在许多数据挖掘模型或数据分析统计中,它们要求数据具有特定的格式。如果数据已经是这些格式,那么我们可以期待更好的结果。如果数据本身就不合适,那么我们当然不会得到好的结果。这就是为什么我们需要数据预处理。

理解数据:属性和类型

在我们进行数据预处理之前,其中一个步骤是理解问题。因此,让我们也稍微讨论一下数据到底是什么。通常,当我们谈论数据时,我们指的是数据对象及其属性的集合。例如,我们可以谈论个人信息的集合,或者关于人群的信息集合。那么,属性就是这些人的特征或属性。例如,如果我们谈论人,我们可能会用他或她的眼睛颜色来描述一个人;如果我们谈论的是人们的医疗数据,那么体温可能被包含在内。你可以看到,不同的特征会有不同类型的值,这意味着这些是不同的属性。

我们通常将它们称为属性,这些属性也会有不同的值。有时我们会使用其他术语来代替属性,如变量、字段、特征,它们都是关于对象的属性。

一旦我们设定了一组属性,那就是描述特定对象的信息。因此,有时我们将它们称为记录、点、样本、实体或实例。然后,我们有了对象的集合或记录的集合,这就是数据。

现在我们谈论属性,显然可以看到它会有许多不同类型的值。那么,让我们谈谈属性的类型。属性的类型可以像这张图一样分类:你可以看到属性可以分为两个子类别:分类属性和数值属性。让我们先谈谈分类属性。分类属性意味着它是定性的,我们谈论的是一个特定的值集合,它是一个预定义的值集合,并且可以进一步分为名义类型或序数类型。

对于名义类型,意味着这些值不能被量化,值之间没有特定的顺序。例如,性别,我们可能有男性、女性。男性和女性之间没有顺序,我们只是有两个不同的值。因此,它不能被量化,没有顺序。另一个例子是眼睛颜色。例如,眼睛颜色可以是蓝色、绿色、棕色。同样,这些值之间没有顺序,它们只是不同的值,是一个特定的集合。

除了名义值,另一个类别是序数值。序数值与名义值不同,它有一个顺序,有顺序,但值之间的距离是未知的。例如,字母等级,我们知道A比B等级高,B比C好,但我们知道A和B之间的确切差异或距离吗?我们不知道,我们无法量化它。这就是为什么序数属性是分类属性,它不能被量化,但又与名义属性不完全相同,因为它有顺序。这就是为什么我们有序数类型的值。除了字母等级,另一个例子可能是教育水平。例如,小学教育水平。

通常我们这样排序:最高的教育水平可能是大学毕业生或以上,高中通常在中间,小学在那之前。所以,你可以再次看到教育水平是有顺序的。另一个例子是李克特量表。当我们填写问卷时,经常需要在“喜欢”、“中立”、“不喜欢”之间选择。我们知道“中立”是中间点,它必须在“喜欢”和“不喜欢”之间,不会在“喜欢”之前,而“不喜欢”比“中立”更负面,比“喜欢”更负面,依此类推。

这就是名义和序数。接下来让我们谈谈数值属性。你可以看到,在数值属性下,我们也有两个子类别:离散型和连续型。

对于数值属性,与分类属性不同,数值属性是定量的。它可以被量化,这意味着数值就是数字。在数字中,我们可以进一步将它们分类为离散值和连续值。对于离散值,它是可数的。例如,人数,我们会说一个人、两个人、三个人,我们不会说有1.2个人。虽然在某些变体中可能有,但大多数时候我们会有1、2、3,所以那是离散的,并且是可数的。

除了离散型,我们还有连续型。这意味着数据可以被测量。这意味着数值可以被测量,我们指的是某个水平。例如,身高、分数,这些数字可以被测量。即使在像身高或分数这样可以被测量的值中,我们也可以进一步将它们分类为区间数据或比率数据。对于区间数据,意味着这些数值我们可以进行计算,可以做加法、减法。例如,摄氏温度,10摄氏度和20摄氏度,差异是10摄氏度。但对于摄氏度,没有零点。

那么,我们有什么例子是非区间的,即比率数据呢?开尔文温度,有一个零点。所以比率数据实际上是区间数据,数值我们可以进行计算,但有一个零点。这些是我们用来描述属性的常见类型。我们需要知道属性的类型,以便决定在数据预处理步骤中应该如何处理这些属性。这就是为什么我们必须提到数据类型。

为什么需要数据预处理?

除了我们看到数据的不同变化之外,另一个原因是,我们可能必须一直处理的问题是:如果我们有完美的数据就好了。这意味着没有错误,一切都如我们所愿,那么我们可以完美地使用数据与模型,并给出好的结果。但不幸的是,在现实生活中,错误无处不在。因此,我们需要处理这些情况。

那么,数据可能出现哪些不良情况呢?可能有一些缺失值,某些值缺失,某些记录不完整,某个特定记录的少数属性有缺失。想象一下问卷,有些人可能漏掉了某些问题,最终导致缺失值。有时会有噪声,例如,有人错误地输入了一个错误的数字,这个错误的数字不符合正常的数值范围,那么它就像是噪声。此外,我们可能在不同地方有数据,但来自不同来源的数据副本或数据可能存在一些冲突值。我们该如何处理?我们需要找出该怎么做。有时我们可能查看非常大的数据集,那么我们如何减少它们,使它们能够在特定情况下进行处理?这就是为什么我们现在讨论的所有这些实际上都与数据质量有关。

如果我们有低质量的数据,那么就会有低质量的性能。当然,我们希望有高质量的数据。但即使我们面对低质量的数据,我们也可以做一些事情来看看是否可以改进。那么,现在我们来谈谈数据质量。数据质量可能涉及很多方面。这些是我们在谈论数据质量时通常可以查看的方面,例如:

  • 完整性:例如,我们可以回答数据集中是否有缺失值。对于某些记录、某些属性,是否没有提供值?如果有些值没有提供,那么数据就不完整,完整性就低。
  • 有效性:这意味着数据是否有效。例如,如果我们希望日期数据包含日、月和年,那么数据是否以特定方式表示这三个值?因为有时我们只要求人们填写月份和年份,可能没有日数据。但如果我们想处理一个需要日数据的问题,那么数据就无效。
  • 唯一性:我们的数据中是否存在重复的对象、重复的数据或重复的记录?如果存在重复记录,那么我们的数据就有冗余。有时也可能存在重复的属性。同样,这种冗余会影响数据的进一步处理。
  • 一致性:例如,我们可能有一个特定数据集或表格的多个副本。人们更新并存储了不同的版本。当我们想要获取数据表时,可能需要查看它是否一致。在不同的数据存储之间是否存在任何不一致?
  • 及时性:指的是如果我们想要某个特定时间点的数据,我们能否得到它?如果我们能在需要的时候从特定时间点获取数据,那么意味着数据是及时的,否则就有问题。
  • 准确性:例如,我们拥有的数据是否准确?它是否真的是真实的实际数据?你可以看到,当我们获取数据时,可能通过正确的方式获得,涉及许多方面和人员,因此可能存在问题,导致数据不准确。

这些是我们在谈论数据质量时通常查看的衡量标准或方面。

数据预处理的主要步骤

接下来,让我们看看数据预处理的主要步骤。这里有三个主要步骤:

  1. 数据清洗:正如我们提到的,我们的数据通常有错误。这意味着我们需要进行清洗来纠正这些错误。如果有一些不正确的数据,我们可能需要过滤掉它们;如果有冗余数据,我们可能也需要减少它们。这就是数据清洗。
  2. 数据转换:有时,对于一些数据处理步骤或某些模型,它们需要数据具有特定的格式或表示形式。因此,如果我们原始的表示形式不同,我们可能需要将其转换为所需的表示形式,以便数据处理步骤(例如数据挖掘或数据分析步骤)能够更高效或给我们带来更好的性能。这就是数据转换,即改变数据的形态。
  3. 数据集成:这是将来自多个数据源的数据合并。你可以看到我们这里的解释非常简单,但实际步骤并不那么简单。稍后我们会更详细地讨论,但数据集成意味着我们可能查看来自不同来源的数据,它们可能格式不同,我们需要看看是否可以将它们合并在一起。例如,如果我们查看两个关于人的不同数据集,我们需要识别两个数据集中是否有共同的人,当我们能识别出他们是共同的时,我们如何将不同的属性整合在一起。这就是数据集成,之后我们将拥有合并的数据集,然后可以用于数据处理步骤。

另外三个数据预处理步骤是数据标准化、缺失数据填补和噪声识别。

  • 数据标准化:是将数据表达在相同的度量单位、尺度或范围内。因为对于数据,不同的数据集可能使用不同的度量单位或方式来衡量事物。例如,对于身高,我们可以用米表示值,也可以用厘米表示值。如果它们在不同的尺度、不同的单位下,如果我们把它们当作相同的来处理,就会在处理时出现问题。这就是为什么我们需要将它们转换为相同的度量单位,然后才能进一步处理。
  • 缺失数据填补:如果我们有缺失值,那么应该怎么做?有两种主要的可能性:一是如果我们有缺失值,并且可以承受,那么我们就忽略那些记录;二是如果我们不能承受忽略那些记录,那么我们需要考虑是否有可能进行估计来填补缺失值,以使记录或对象仍然有用。
  • 噪声识别:例如,如果数据输入时出现错误,那么一个非常奇怪的值可能被输入并存在于数据集中。那么它们就不是具有正常行为的正常值。我们需要检测它们。如果我们将其视为正确值并使用,那么当然会对我们的最终结果产生负面影响。我们希望检测这些随机错误和方差,以便决定如何处理。

除了前面的六个步骤,我们还有更多的步骤,例如特征选择、实例选择、离散化以及特征提取或实例生成。这些是关于处理数据维度问题的步骤。例如,特征选择和实例选择是关于如何减少数据集的。对于特征选择,我们希望选择相关的特征,并移除不相关或冗余的特征。我们可以这样看:我们将选择一些特征(假设每一列是一个属性或特征),那么我们将有更少的列、更少的特征,因此我们的数据可能更易于管理。类似地,对于实例选择,我们可能有很多记录(行就是记录),那么我们可能希望选择一些记录、对象、样本、实体,而不是使用整个数据集。这样做有不同的原因,但同样,选择之后,我们将查看更少的行,因此可能更易于管理。

另一种减少维度的方法可能是离散化,这意味着我们正在进行一种转换。例如,如果我们查看数值属性,那么会有很多很多值。我们可能希望将其转换为名义属性,这样我们就有更少的数值、更少的区间。这就是离散化。至于特征提取和实例生成,实际上是通过拥有新的表示形式来扩展特征和实例选择。

那么,这就是数据预处理的简要概述。接下来,我们将更详细地逐一讨论这些步骤。

数据预处理步骤之间的关系

但在我们逐一查看这些步骤之前,让我们也讨论一下流程或之前步骤之间的关系。我们之前提到的步骤并不是独立的步骤,意思是说我们不会只做数据清洗而不做其他步骤。很多时候,我们会根据需求组合这些步骤。例如,我们可能首先需要进行数据集成,因为我们从不同数据集、不同数据格式和不同来源收集了数据。我们需要整合它们,因为存在很多不一致性,可能是表格设计不同,我们有不同的属性,属性有不同的需求,我们需要弄清楚如何将它们放在一起,属性值也可能不同。

例如,在一个表或一个数据库中,我们可能将人的姓名(包括名、中间名和姓)放在一个属性值中,而在另一个表中,我们可能将名和姓放在两个属性中。那么,我们再次需要知道如何整合它们。此外,不同数据库之间的属性名称可能非常不同,即使相同的属性名称也可能代表不同的概念。我们将在后面的章节中讨论为什么需要数据集成以及会遇到什么问题。

那么,对于数据集成,我们可以说它是为了产生一个统一的数据集。显然,数据集成不是最后一步,它只是第一步。在我们整合了数据之后,可能仍然存在错误,比如缺失值、噪声仍然存在,而且表示形式我们可能也需要进行转换。这就是为什么它通常后面跟着一个数据清洗步骤。在数据清洗步骤之后,当我们处理了缺失值、错误后,我们可能仍然需要检查清洗后的数据集是否真的适合某些算法。如果不适合,那么我们可能需要进行数据标准化或数据转换。或者,如果清洗后的数据非常大,那么我们可能希望通过使用一些数据缩减技术来减少它。接下来,我们将开始更详细地查看数据集成,然后是数据清洗等等。

总结

在本节课中,我们一起学习了数据预处理的基础知识。我们首先探讨了在大数据背景下数据预处理面临的挑战和可能性。然后,我们定义了数据预处理,并理解了它在整个知识发现过程中的重要性。为了有效地进行预处理,我们深入了解了数据的构成,特别是属性和它们的类型(分类与数值,名义与序数,离散与连续)。我们还讨论了为什么需要数据预处理,核心原因在于现实世界数据的质量往往不理想,存在缺失、噪声、不一致、冗余等问题。接着,我们系统性地介绍了数据预处理的主要步骤,包括数据清洗、数据转换、数据集成、数据标准化、缺失数据填补和噪声识别,以及特征选择、实例选择等维度处理技术。最后,我们了解了这些步骤之间并非孤立,而是根据实际需求组合应用的流程。掌握这些基础知识,是进行有效数据分析的重要前提。

006:数据集成导论 📊

在本节课中,我们将要学习数据集成的基本概念、目标以及实施过程中可能遇到的挑战。数据集成是数据分析流程中至关重要的一步,它涉及将来自不同来源的数据合并成一个统一的数据集。我们将探讨如何匹配数据模式、处理冗余属性、检测重复记录,并介绍数据清洗的初步方法。


数据集成目标 🎯

数据集成的目标是明确的:收集一个单一的数据集,其中的信息来自多个不同的来源。

然而,这个过程并不简单。它实际上涉及许多步骤和处理工作。


模式与记录匹配 🔍

上一节我们介绍了数据集成的目标,本节中我们来看看实施过程中的具体挑战。例如,数据集成通常涉及模式的匹配。因为如果我们查看来自不同来源的数据,它们的设计是不同的。因此,我们需要能够查看设计上的差异,并指示属性之间的关系。

此外,我们还需要查看记录之间的关系。我们可能需要将一个来源的记录与另一个来源的记录进行匹配,然后查看是否可以将这些记录合并在一起。例如,如果我们只查看来自关系数据库的数据,那么就像是将关系数据库中的数据视为一个整体。这意味着我们收集记录,然后将相关的记录合并成一个单一的记录。


冗余与不一致性处理 ⚠️

在完成数据集成后,可能会出现冗余和不一致性问题。因为我们正在将事物合并在一起,所以可能需要识别冗余属性。当一个属性可以从另一个属性或属性组合中推导出来时,该属性就是冗余的。

我们需要避免冗余,因为这显然会增加数据量。这意味着我们需要更多的时间来处理事务。另一个问题是,冗余属性会导致过拟合。因为如果属性冗余,我们的模型将无法正确执行其任务,因为它们会受到重复或冗余属性的影响。

因此,我们可以使用相关性分析来检测冗余。以下是检测冗余的两种主要方法:

  • 对于标称属性:我们可以使用卡方相关性检验。例如,我们可以计算卡方相关性值。然后,我们可以查看属性值的频率以及属性的期望值。当我们查看卡方值时,如果它较大,则属性(或我们这里称为变量)更可能相关。

    让我们看一个例子。假设我们正在查看两个属性,每个属性都有两个不同的值。例如,属性A有两个值:“有游戏机”和“没有游戏机”。对于属性B,我们有“科幻”和“非科幻”这两个值。然后,我们检查这些值的频率,并能够计算这些属性的期望值。你可以看到这里,“有游戏机”的总频率是300,“科幻”的总频率是10500,那么期望值是90。然后,我们按照卡方公式,使用每种属性类型的频率和期望值进行计算。计算出的卡方值是507,这表明“科幻”和“有游戏机”是相关的。因此,我们可能需要移除其中一个。

  • 对于数值属性:我们需要另一种方法,即皮尔逊相关系数。如果皮尔逊系数接近1或-1,则意味着两个属性A和B之间存在高度相关性。你可以看到它可以用这个公式计算:
    r_{A,B} = \frac{\sum (A - \bar{A})(B - \bar{B})}{(n-1)\sigma_A \sigma_B}

除了相关性,协方差也被广泛使用。相关性和协方差之间的关系在这里给出。因此,我们可以使用协方差来衡量属性的冗余性。


重复记录检测 🔄

除了检测冗余属性,还可能存在重复记录。当我们有重复记录时,可能会出现不一致性。例如,如果我们识别出不同的元组(记录是相同的),那么通过使用其他属性,我们可能在不同记录之间的另一个属性上出现不一致的值。

因此,我们需要考虑如何处理不一致性。有时,检测重复记录可能不那么明显。例如,来自不同数据库或数据集、数据源的记录可能使用不同的度量系统。但是,如果我们将它们转换为特定的度量单位,那么这些记录或实例可能是相同的。例如,我们可能有使用公制系统表示的值(如米),或者有使用英制系统表示的值(如英尺)。两者都表示高度或长度,但如果两个数据集使用不同的度量单位,这意味着数值可能看起来不同,但它们实际上可能代表不同表中同一实体或对象的相同值。这就是为什么我们说有时重复的元组不那么容易识别。

现在,找到重复记录或重复属性(尤其是对于标称属性)并不容易。因为标称属性是值,如果我们想比较那些文本属性值或其他类型的非数值属性值,我们需要一些特定的距离度量。通常,我们可能需要使用某些基于字符或序列的距离或相似性度量。例如,一些基于序列或字符的相似性或距离度量可以是编辑距离、Jaccard算法等。稍后我们将在另一节中详细讨论这些字符串距离度量。

在识别了重复值之后,我们可能需要识别重复记录。之前提到的度量方法在衡量两个属性值之间的相似性时很有用,但我们需要检测重复记录。因此,我们需要诸如概率方法、监督方法、基于距离的方法或聚类算法等方法。同样,我们将在另一节中讨论这些。


数据清洗简介 🧹

在数据集成之后,我们可能需要进行数据清洗。数据清洗意味着我们正在处理包含缺失、错误、错误数据或非标准表示的“脏数据”。我们需要数据清洗来提高性能,因为如果我们处理脏数据,并且脏数据的比例很高,那么我们当然不会得到理想的结果。

脏数据的问题来源可能包括纯粹的数据输入错误。例如,我们在打字或数据输入时经常犯错误。例如,你可能已经注意到在我的笔记或幻灯片中,经常有打字错误、拼写问题。这些就是数据输入错误。那么,当你出现拼写错误时,你该如何处理?或者有些数字输入错误,可能以不正常的方式输入。那么你应该如何处理?脏数据的另一个来源可能是更新错误。例如,当你更新数据时,有时可能更新为一个错误的数字,或者更新之间存在不一致性。这意味着,如果你查看它,它是最新的数据吗?或者它是否被错误地更新了?还可能是传输错误。

通常,当我们谈论数据清洗和处理脏数据时,我们主要讨论的是缺失数据(缺失值)或错误数据(噪声数据)。为了处理这两种形式的脏数据,我们需要不同的方法。

以下是处理脏数据的主要策略:

  • 对于缺失值:我们需要决定是否可以忽略那些包含缺失值的记录或实例,即简单地将它们从数据中移除。如果我们不能承受移除那些有缺失值的记录,那么我们需要考虑如何处理缺失值。我们是否可以替换它?是否可以用另一个值填充它?例如,我们可能需要选择一个特定的常数值,然后手动填充,而不是在记录中保留缺失值。或者我们可能想要估计数据,然后使用一些估计值来替换那些缺失值。典型的估计方法可以是属性的均值、最可能的值或全局常量(某个固定值)。

  • 对于噪声:我们需要使用统计或描述性技术来识别错误值,这意味着这些值不正常,因此它们是异常值。或者有时我们可能应用过滤器来消除那些带有错误值的噪声实例。

这里有一些处理噪声数据的方法。其中之一是分箱,这意味着我们对数据进行排序,然后将它们分区到箱中,然后通过均值、中位数或边界等方法进行平滑处理。让我们看一个例子。假设我们正在进行分箱,我们可以进行等宽分区。这意味着我们试图将值的范围(即最小值和最大值之间的差值)分成n个等大小的区间。例如,如果a和b是属性的最低和最高值,那么区间的宽度将是 (b-a)/n。然后,我们根据值的范围、值的区间来划分数据。另一种分区可以是等频分区。这意味着我们查看频率。然后,我们再次将范围分成n个区间,每个区间应具有大致相同数量的数据点。

让我们看一个等频分箱的例子。你可以看到这里有12个排序后的值。对于等频,意味着我们应该有相同数量的点。这意味着前四个点在第一个箱中,接下来的四个点在下一个箱中,最后四个点在第三个箱中。然后,你可以看到我们有三个箱。K,正如我们之前提到的。在有了箱之后,我们需要进行平滑处理。例如,我们可以通过均值进行平滑。那么9是第一个箱的均值,所以我们用均值替换所有值,依此类推处理第二个箱和第三个箱。如果我们使用另一种方法进行平滑,例如,我们使用边界。那么在每个箱内,我们取边界最小值和最大值,然后尝试将它们转换为最接近的边界值。你可以看到这里,8和9比15更接近4,所以它们都被改为4,替换为4。然后我们有边界,类似地,对于21,我们将其保留为边界值,而24更接近25,所以我们得到那个值。这就是分箱的例子。

除了分箱,我们如何处理异常值(噪声)?我们可以使用回归,通过将数据拟合到回归函数中。或者进行聚类,这意味着我们将实例或点聚类在一起,这样就会检测到异常值。或者通过人工检查,我们可以检测可疑值,然后手动检查它们。这些就是数据清洗的步骤。


在本节课中,我们一起学习了数据集成的核心目标与流程。我们探讨了如何匹配不同数据源的模式和记录,识别并处理由集成引起的属性冗余与记录重复问题。最后,我们介绍了数据清洗的基本概念,包括处理缺失值和噪声数据的方法,如分箱、回归和聚类。掌握这些步骤是构建高质量、可用于分析的数据集的基础。

数据分析基础:P7:数据归一化与数据变换

在本节课中,我们将要学习数据归一化与数据变换。这是数据预处理的关键步骤,旨在将原始数据转换为更适合分析模型的形式,以提升模型性能。

上一节我们介绍了数据预处理的基本概念,本节中我们来看看如何通过归一化和变换来优化数据。

数据归一化

有时,原始属性值(如收入)的数值范围过大或过小,这种巨大的差异会影响模型的性能。因此,我们需要将原始值转换到一个特定的范围内。

以下是几种常见的归一化方法:

均值归一化
当已知属性的最大值和最小值时,可以使用此方法。其目标是将值缩放到一个固定范围,例如 [0, 1]。公式如下:
新值 = (原始值 - 最小值) / (最大值 - 最小值) * (新范围最大值 - 新范围最小值) + 新范围最小值
例如,若收入范围是 12000 到 98000,想将其映射到 0 到 1 之间,则 73000 转换后的值为 0.0716。

Z-Score 归一化
当不知道属性的最大值和最小值时,可以使用此方法。它将数据转换为均值为 0、标准差为 1 的标准正态分布。公式如下:
新值 = (原始值 - 均值) / 标准差
例如,若某属性均值为 50,标准差为 10,则原始值 60 转换后为 1.0。

小数定标归一化
这是一种简单的方法,通过移动小数点来缩放数值。公式如下:
新值 = 原始值 / (10^j)
其中,j 是使最大绝对值小于 1 的最小整数。例如,数值 1234 可以通过除以 1000 (10^3) 转换为 1.234。

数据变换

除了归一化,我们有时还需要通过组合原始属性来创建新的属性,这称为数据变换。

线性变换
这是最典型的变换方式,通过原始属性的线性组合来创建新属性。公式如下:
新属性 = a1 * 属性1 + a2 * 属性2 + ... + an * 属性n

多项式变换
如果线性变换效果不佳,可以尝试更高阶的多项式变换。例如,二次变换公式为:
新属性 = a * 属性1^2 + b * 属性1 * 属性2 + c * 属性2^2 + ...

特定领域变换
有时需要结合领域知识创建新属性。例如,在几何问题中,可以将三角形的顶点坐标 (x1, y1), (x2, y2), (x3, y3) 组合成一个新的面积属性 a

秩变换
此方法将数值转换为正态分数。首先将属性值排序并赋予秩(排名),然后使用以下公式计算正态分数:
正态分数 = φ^(-1)( (秩 - 0.5) / 总样本数 M )
其中,φ 是标准正态分布的累积分布函数。

Box-Cox 变换
当我们不确定最佳变换形式时,可以使用 Box-Cox 变换来搜索。它通过一个参数 λ 来变换数据,使其更接近正态分布。公式如下:
当 λ ≠ 0 时: 新值 = (x^λ - 1) / λ
当 λ = 0 时: 新值 = log(x)
我们会在一系列 λ 值(如 -3 到 3)中进行搜索,选择使结果最接近正态分布的那个。对于包含负值的数据,需要引入偏移参数 C:
新值 = ((x + C)^λ - 1) / (λ * g)
其中 g 是缩放参数。

Box-Cox 变换有两个常用的特例:

  • 对数变换:用于扩展直方图右侧(处理右偏数据)。
  • 幂变换:用于扩展直方图左侧(处理左偏数据)。

名义属性到二值属性的变换
许多数学模型无法直接处理名义属性(如颜色:红、蓝、绿)。将其简单编码为数字(如红=1,蓝=2)会引入不存在的顺序关系。
更好的方法是“独热编码”,也称为“一到 N 变换”。对于一个有 N 个可能值的名义属性,我们创建 N 个新的二值属性(0 或 1)。对于每个实例,只有对应其原始值的那个新属性标记为 1,其余均为 0。
例如,颜色属性有 {红, 蓝, 绿},则创建三个新属性:“是红色吗?”、“是蓝色吗?”、“是绿色吗?”。一个红色实例的编码为 [1, 0, 0]。
这种方法的缺点是会显著增加数据集的维度。

处理维度问题

当数据集非常大时,我们需要在减少数据规模的同时,尽可能保留原始信息。这涉及到降维技术。

属性降维
旨在减少属性数量,同时保留大部分信息。

  • 小波变换
  • 主成分分析:一种常用的线性降维技术。

实例降维
旨在减少实例数量。

  • 聚类技术:将相似的实例分组,并用聚类中心代表该组。
  • 分箱与离散化技术:将连续值分段,也可以视为一种简化。

本节课中我们一起学习了数据归一化与数据变换。我们探讨了多种将原始数据转换为更适合分析形式的方法,包括缩放数值范围的归一化、创建新属性的变换,以及处理高维数据的降维技术。理解这些预处理步骤对于构建有效的数据分析模型至关重要。

008:字符串相似性是什么

在本节中,我们将讨论字符串相似性。首先,我们将探讨什么是相似性。接着,我们将聚焦于本节要讨论的核心问题——字符串相似性。因此,我们将阐述该问题的定义,然后具体介绍多种相似性度量方法,特别是字符串相似性度量。最后,我们将探讨在处理字符串相似性时可能面临或需要应对的挑战。

什么是相似性

相似性是一个衡量两个数据对象相似程度的数值度量。相似性在数据处理中至关重要,它是许多数据处理技术(如数据集成和数据挖掘)的基本组成部分之一。

在数据集成中,我们需要处理诸如查找重复属性、冗余属性、重复记录以及识别异常值等问题。所有这些都需要我们判断是否存在相似的对象、属性或记录,或者是否存在不相似的事物。因此,我们需要相似性度量。

数据集成的另一个目标是合并来自两个数据源的数据。我们如何合并?我们需要识别哪些记录可以合并在一起。通常,我们会利用相似性来判断:如果两条记录相似,它们很可能相关,应该被放在一起。这就是相似性在数据集成中重要的原因。

对于数据挖掘,许多处理技术如分类、聚类、推荐和异常检测也需要使用相似性。例如,在分类中,我们判断一个特定数据对象的类别。我们通常会利用已知类别的数据对象:如果我们讨论的新对象与那些已有类别的对象相似,我们就可以给它赋予相同的类别。在聚类中,我们通常希望将相似的对象分组在一起,因此需要衡量一个对象是否与某个簇相似,或者是否与其他对象相似。在推荐系统中,我们希望发现相似的用户、相似的商品,以便向系统用户进行推荐。在异常检测中,我们旨在识别那些不正常、不寻常的行为,同样需要通过相似性度量来识别异常事物。

除了相似性,我们也经常讨论相异性。相异性是衡量两个对象差异程度的数值度量。你可以看到,它实际上是相似性的反面。我们想了解两个事物之间的差异程度。此外,术语“距离”更常用于指代两个对象之间的差异。在数据处理中,你经常需要处理事物有多相似或多不同,因此需要计算相似性和相异性。

实际上,我们一直在进行相似性度量。想想你每天做的事情:例如,我们经常阅读新闻或网上的帖子。当你阅读时,你常常会想:“我以前读过这个吗?有没有见过类似的内容?” 你已经在进行相似性度量了。当你看到一张图片或遇到一个人时,你也会想:“这张图片看起来很熟悉”、“这个人看起来很面熟”。你又在进行相似性判断。我们一直在这样做,这对我们来说非常自然。但当我们谈论数据时,我们应该如何处理呢?这是我们需要讨论的问题。

问题定义

首先,让我们来看这个问题。假设我们正在看两个对象,它们来自某个特定的属性类型或属性。例如,我们看一个属性A,以及属于该属性的两个对象X和Y,我们正在度量这两个对象的相似性或距离。

对于属性,我们可能有多种不同的属性类型,例如:标称型(即分类的)、序数型、区间型或比率型。对于不同的属性类型,我们寻找其相似性、相异性或距离的方式可能不同。

标称型属性

标称型属性意味着它们有类别。例如,我们之前提到的性别。性别的可能值可以是男性或女性,如今也有中性选项。我们先关注两个值的情况。假设我们有两个对象X和Y,例如,X的属性值为男性,Y的属性值也为男性。那么我们可以看到它们是相同的。当然,它们的相似性应该是1(完美相似)。这意味着当两个对象具有相同的标称属性值时,相似性应为1。

在另一种情况下,假设Y是女性。我们知道它们现在不相同。如果它们不相同,意味着X与Y不同,那么它们完全不相似,是不同的。因此,它们的相似性应为0。对于相异性则相反:当两个对象X和Y具有相同的值时,它们是相同的,因此它们的相似性应为1,而相异性应为0(完全没有相异性)。所以距离或相异性为0。相反,当对象不相同时,它们完全不同,距离为1。这就是标称型属性的处理方式。

序数型属性

序数型属性意味着它们的值可以排序、可以排名。例如,李克特量表,我们可以在“不喜欢”、“中立”、“喜欢”之间选择。我们为这个属性类型有两个值(实际上通常是三个或更多,但这里举例),我们可以对它们进行排名,可以有一个程度。例如,“不喜欢”可以认为小于“中立”,“中立”可以认为小于“喜欢”。这样我们就有了一个顺序。这就是序数型属性。

那么如何度量两个序数型属性值之间的相似性或距离呢?例如,X是“中立”,Y是“喜欢”。我们如何度量相似性?我们可以这样做:首先,我们给它们分配一些排名数字,例如,“不喜欢”是1,“中立”是2,“喜欢”是3。然后,我们将排名转换为0到1之间的数字。具体来说,对于X(中立,排名2),我们通过计算 (2-1)/(3-1) = 0.5 来转换。对于Y(喜欢,排名3),计算 (3-1)/(3-1) = 1。接下来,我们可以计算距离:X和Y之间的距离就是 |0.5 - 1| = 0.5

用公式表示,距离 d = |(rank(x) - 1)/(M - 1) - (rank(y) - 1)/(M - 1)|,其中M是等级总数。要计算相似性,我们只需用1减去距离:相似性 = 1 - d。这就是我们计算序数型属性值的相似性和相异性的方法。

区间型或比率型值

对于区间型或比率型值,我们只需要使用常见的、非常流行的距离度量。例如,我们可以计算这两个区间值或比率值之间的归一化差值,并将其用作距离。如果它是归一化的,意味着它在0到1之间。然后,我们同样可以通过用1减去它来计算相应的相似性。

从单值到向量

在了解了如何找到两个值的相似性和相异性之后,我们通常不仅仅看两个值,还可能看两个数据向量,每个向量包含许多属性的值。例如,这里我们有两个向量V1和V2。V1代表属性的值,假设我们有n个属性x1到xn。第一个数据向量是V1,第二个数据向量是V2,其属性值为y1到yn。

对于两个向量,我们如何计算相似性度量呢?如果它们是数值型、连续数据,我们可以使用常见的、流行的距离度量,例如闵可夫斯基距离族。我们可以使用曼哈顿距离,它是对应属性值之间绝对差值的总和。我们也可能使用欧几里得距离度量,它是特定属性值之间距离平方和的平方根。此外,余弦相似性和皮尔逊相关性也经常用于计算两个向量之间的相似性或距离。

字符串匹配问题

我们现在要讨论的问题是字符串匹配。我们试图匹配两组字符串。假设我们有一个集合X包含许多字符串,另一个集合Y也包含许多字符串。我们想要识别出那些指向相同现实世界实体的字符串对(一个来自集合X,一个来自集合Y),并将这些对称为匹配。

例如,假设集合X有三个字符串:x1, x2, x3;集合Y有两个字符串:y1, y2。我们想要匹配所有来自X和Y的对。这意味着我们将查看x1和y1、x1和y2、x2和y1、x2和y2、x3和y1、x3和y2。这里我们正在查看来自集合X和Y的六对字符串。在这六对中,我们要识别出那些指向相同现实世界实体的对,即匹配。指向相同现实世界实体的对将是x1和y1、x3和y2。

现在让我们看看x1和y1的情况:x1是“Dave Smith”,y1是“David D. Smith”。根据我们的知识,我们知道“Dave”和“David”通常是同一个名字,“Dave”是“David”的替代名或昵称。有时我们可能会省略中间名缩写。因此,“David D. Smith”很可能与“Dave Smith”指的是同一个人。基于某些相似性度量,我们将其识别为匹配。类似地,“Dan Smith”和“Daniel Smith”也与x1和y1的情况相似,“Dan”是“Daniel”的替代形式,中间名缩写可以省略。因此,x3和y2也极有可能指向同一个现实世界实体。

因此,问题在于识别这两个匹配。在处理字符串匹配问题时,我们通常试图匹配字符串,并匹配大量的字符串对。这时我们会面临两个挑战:准确性和可扩展性。

挑战一:准确性

首先,准确性是什么意思?回想一下之前的内容,如果我们谈论标称属性,字符串就像标称属性。如果我们能进行精确匹配,那就完美了:如果两个字符串相同,我们说它们的相似性是1。但很多时候,我们可能无法找到完全相同的字符串来识别两个字符串是相同的,尽管它们实际上是相同的。这是因为在收集数据、处理数据时,可能会出现许多问题和错误。生活并不完美,我们经常会遇到数据质量问题。

因此,在准确匹配字符串方面会遇到问题。让我们看看可能遇到哪些问题:

  1. 打字和OCR错误(自动识别错误):收集数据时,通常是通过人们在表格中填写或输入信息。打字或书写时经常会出现错误。同样,自动识别字符时也可能出错。例如,尝试自动识别图片中的字符时,结果并不总是完美的。例如,我们可能看到两个字符串:“Davod Smith”和“David Smith”。我们知道“Davod”不是一个常见的名字,而“David”更常见。这可能是一个打字错误,“Davod Smith”原本应该是“David Smith”,从而与另一个字符串匹配。

  2. 不同格式:例如,日期。不同地区的人可能以不同格式书写日期。有些人可能写成“10/8”(指10月8日),而有些人可能喜欢用缩写或单词形式书写月份,如“Oct 8”。此外,我们还有年、月、日的顺序问题。例如,我们可能指“2021年10月8日”,有些人会写成“10/8/2021”,有些人会写成“2021-10-08”,或者“8 Oct 2021”。有不同的方式来表示日期。我们如何比较它们?如何匹配它们以确定它们指的是同一个日期?

  3. 缩写或省略:例如中间名缩写。对于缩写,例如“香港科技大学”,我们可以写成“HKUST”或经常只写“UST”。这些是缩写。我们如何匹配它们?又如何将它们与全称“Hong Kong University of Science and Technology”匹配?或者如何匹配缩写与缩写之间?这是一个问题。

  4. 名称变体:即使是同一个英文名,也可能有不同的变体。许多人还有昵称。例如,“William Smith”和“Bill Smith”,他们指的是同一个人吗?如何匹配它们?

  5. 词序变换:对于包含多个单词的字符串或短语,我们实际上可以打乱单词的顺序。例如,“Department of Computer Science UST”,但有些人也可能写成“Computer Science Department UST”。你可以看到单词的顺序可能不同。我们知道它们是相同的,但如果我们只是像之前提到的那样进行匹配,它们会被认为是不同的。我们该如何处理?

这就是准确性挑战。这意味着我们不能只有0或1,不能像标称属性那样,相同就是1,不同就是0。我们需要一个相似性度量,它给出一个0到1之间的数字,并具有以下行为:相似性分数越高,X和Y匹配的可能性越大。或者,如果我们看相似性度量值,如果它大于一个阈值T,那么我们就有足够的信心说它们匹配,指的是同一个实体。

对于距离度量,概念类似,只是此时距离越小,相似性越高;距离值越大,相似性越小(或差异越大)。这就是准确性挑战。

挑战二:可扩展性

现在让我们看看可扩展性挑战。在问题定义中,我们谈到匹配所有对。现在我们只是从一个集合中看三个字符串,从另一个集合中看两个字符串。如果我们每个数据集都有成千上万个字符串呢?你可以想象,我们将要匹配大量的对。这就是为什么我们会面临可扩展性挑战。

如今,我们经常拥有海量数据。匹配所有对,试图找到数据中每一对之间的相似性,可能是不切实际的,因为对的数量太大、太多。因此,我们需要一种解决方法。其中一个解决方案是:让我们找到最有希望的对。我们使用一种方法来找到那些有希望的对,将它们识别为候选对。然后,我们只计算这些候选对之间的相似性。我们想减少需要计算相似性分数的对的数量。

这意味着一个可能的方法是:对于集合X中的每个字符串,我们尝试在集合Y中找到一个候选子集。因为这个子集已经比原始集合小,然后我们计算字符串X与该子集中字符串Y之间的相似性分数。接着,我们按照正常的相似性度量进行:如果分数大于阈值,我们就说来自集合X的X和来自Y子集的Y是一个匹配对。这样我们就减少了候选对的数量。

总结与过渡

在讨论了挑战之后,接下来我们将看看字符串相似性度量,即我们可以计算相似性度量的各种方法。

现在,我们来看相似性度量。首先,让我们看看相似性度量到底是什么。这里的相似性度量意味着我们试图计算两个对象的相似性分数,它们可以是两个字符串、两个数字、两个对象或两张图片。当然,正如开头提到的,我们现在关注的是两个字符串。

相似性分数大多数时候我们希望它是一个归一化的相似性分数,意味着分数应该在0到1之间。当它是1时,我们知道是精确匹配,例如两个字符串完全相同。如果两个字符串的相似性分数是0,那么我们知道它们完全不同。对于0到1之间的任何值,意味着这两个字符串在某种程度上的相似性,我们可以说它是近似相似。

有时,除了相似性度量,我们可能想使用距离度量,或者更具体地说,距离矩阵。如果我们谈论距离矩阵,它必须具有以下属性:自反性、正定性、对称性和三角不等式性质。

正如我们之前简要提到的,我们经常可能希望将距离度量得到的距离分数转换为相似性分数。通常的转换方法可能是用1减去该分数,或者用1除以距离分数。

回到我们的问题,我们需要考虑是否可能进行精确匹配。假设我们的数据是完美的,没有打字错误,数据中没有此类差异,一切都是标准化的,数据质量完美,那么我们可以直接使用精确匹配,非常简单。这意味着假设一切都是正确的,我们看到X是“David”,Y也是“David”,那么当然,因为两个字符串完全相同,所以它们的相似性是1。

同样,假设我们看的是完美数据,那么我们知道不会有任何打字错误,所以这两个字符串是不同的,因此它们的相似性是0。

但显然,我们可能没有完美的数据,我们可能会看到变体和错误。因此,精确匹配是不够的。这就是为什么我们需要进行近似匹配。在接下来的时间里,我们将看看可以用于字符串的相似性度量。我们将研究所有这些相似性度量。

首先,我们将讨论一些基于序列的相似性度量。接下来,我们将看看基于集合的相似性度量。有时,我们希望将不同种类的相似性度量合并在一起,因此我们有了混合方法。最后,有时所有这些基于序列、基于集合的度量都不够好,我们可能需要处理一些更复杂的情况,因此我们还需要研究语音相似性度量。接下来,我们将逐一研究这些相似性度量。


本节课总结

在本节课中,我们一起学习了相似性的基本概念及其在数据处理中的重要性。我们首先定义了相似性,并探讨了不同属性类型(标称型、序数型、区间/比率型)的相似性计算方法。接着,我们引入了字符串匹配的具体问题,并详细分析了在处理该问题时面临的两大核心挑战:准确性(由于数据错误、格式差异、缩写、变体等导致无法简单精确匹配)和可扩展性(海量数据下计算所有字符串对相似性的效率问题)。最后,我们概述了解决这些挑战的总体思路,并预告了后续将深入学习的各类字符串相似性度量方法,为后续的实际应用奠定了理论基础。

009:基于序列的相似性度量

在本节课中,我们将要学习一系列基于序列的相似性度量方法。这些方法将字符串视为字符序列,通过比较两个字符序列来衡量它们的相似程度。这类方法通常用于处理打字错误或拼写错误,因为它们关注的是字符的顺序。我们将逐一探讨不同的序列相似性度量,并理解它们为何适用于此类场景。

汉明距离

首先,我们介绍汉明距离。汉明距离非常简单,它假设两个字符串长度相等,然后计算两个字符串在对应位置上字符不同的数量。

它常用于处理二进制数字,以衡量通信错误。因为二进制数字位数相同,所以可以使用汉明距离。我们将二进制数字也视为字符序列。

现在来看一个例子。我们有两个字符串,长度均为五个字符。第一个字符串是“Peter”,第二个是“Pater”。我们可以看到前两个字符完全相同,而剩余的三个字符不同。这意味着有三个位置上的字符不同,因此汉明距离为三。

汉明距离衡量的是两个字符串的差异程度。然而,汉明距离过于简单,并且假设两个字符串长度相等。大多数情况下,我们处理的字符串长度不同,因此汉明距离并不适用。这就是我们需要其他距离或相似性度量的原因。

编辑距离

接下来,我们看看编辑距离。编辑距离也称为莱文斯坦距离。它试图找出将字符串X转换为字符串Y所需的最少操作次数。

这里所说的操作是指什么呢?让我们看一个例子。我们有字符串X和字符串Y。快速手动观察,我们可以识别出差异:与字符串X相比,字符串Y多了一个“D”;在字符串X中,“s”后面的字符是“M”,而这里却是“I”;接着,在X中是“I”,而在Y中是“M”;此外,字符串X末尾多了一个“S”。我们在这对字符串中识别出了四处差异,这就是莱文斯坦距离的分数。

我们手动完成了这个计算。编辑距离将问题更正式地定义为操作次数,差异被视为操作,每次操作的成本为1。如果不需要操作,则没有额外成本。

这里定义的操作包括:删除一个字符、插入一个字符或替换一个字符。

如果我们考虑这些操作,意味着字符串“Davis Smith”需要:首先,在“David”后插入一个“D”;然后,我们知道在X中这个位置是“M”,但在Y中这个位置应该是“I”,因此我们将“M”替换为“I”;接着,在这个位置原本是“I”,我们希望它是“M”,因此我们将“I”替换为“M”;最后,我们知道在Y中没有末尾的“S”,因此我们需要删除最后一个字符“S”。经过这四次操作后,得到的字符串是“David Lee Smith”,也就是字符串Y。我们将X转换成了Y,操作次数是一次插入、两次替换和一次删除,总共四次操作。因此,字符串X和Y之间的编辑距离是4。

我们了解了编辑距离的基本思想,但如何计算它呢?我们有一个使用动态规划的算法来计算编辑距离。在这个算法中,我们将字符串X定义为一个字符序列,包含n个字符,即X的长度。我们还有另一个字符串Y,长度为m。两者都被视为字符序列。对于每一对可能的位置,例如字符串X的最后一个字符和字符串Y的最后一个字符,我们计算在该特定位置对之间的编辑距离,记作D[i][j]。我们想要找到这两个字符串之间的编辑距离,这意味着我们关注的是最后的位置n和m,即在处理完字符串X和Y的所有字符后,最终位置所需的操作次数,即D[n][m]。

那么如何计算D[n][m]呢?我们需要考虑在该位置对(例如字符X[n]和Y[m])之间所需的操作或转换。假设需要某种操作,那么除了这个操作,还需要之前序列中所需的操作。这就是动态规划的思想:它依赖于之前的位置。我们首先需要创建一个矩阵,其大小为(n+1)行(m+1)列。例如,字符串X长度为3,n=3;字符串Y长度为4,m=4。那么我们需要创建一个4行5列的矩阵。

创建矩阵后,我们需要进行初始化。例如,每一行的第一列单元格根据其行号初始化,第一行的所有列根据列号初始化。初始化矩阵后,我们就可以开始计算后续单元格的距离。例如,在D[1][1]位置,我们考虑将字符“D”与“D”对齐所需的操作。我们需要考虑如果假设了之前的操作,那么当前位置的操作是什么,然后计算总成本。因此,我们会考虑四种操作:删除、插入、替换以及无操作(即保留或复制字符)。删除或插入一个字符的成本是1。如果两个字符相同,则无操作,成本为0。

回到这个例子,我们想计算D[1][1]。如果我们考虑删除字符,则需要加1,成本为2。如果我们必须插入一个字符,成本也是2。现在,如果我们看字符对“D”和“D”,它们相同,因此没有成本,只是之前位置的编辑距离,即D[0][0],其值为0。在这三个数字中,我们选取最小的一个,即0。因此,D[1][1]处的距离是0。

由于编辑距离是寻找最少的操作次数,而最小值来自D[0][0],所以我们选择它,此时的距离为0。我们继续按照这个模式填充矩阵的其余单元格。例如,考虑位置D[1][2],我们同样考虑三种可能性,并选取最小值。最终,我们计算出的矩阵将类似这样。我们知道X和Y的编辑距离是D[3][4],即2。这就是字符串X和Y之间的编辑距离。

除了知道距离,我们通常还想知道需要哪些操作。我们可以通过追踪在每个单元格中获得最小分数时标记的箭头来做到这一点。例如,字符“A”和“E”不同,因此需要替换操作;之前的字符匹配,所以只是复制;接着,字符串X中的字符“A”对应于字符串Y中的字符“D”,字符数不同,因此需要插入操作;最后,这两个字符相同,所以不是替换而是复制。因此,需要成本的操作只有插入和替换,这就是编辑距离为2的原因。我们可以看到字符对齐的情况。

了解了使用动态规划的编辑距离后,让我们再看一些关于编辑距离的信息。编辑距离用于建模常见的错误,例如多出一个字符或两个字符位置互换。编辑距离越小,相似度越高,因为需要的操作更少。相反,编辑距离越大,两个字符串越不相似。因为它是距离度量,如果我们需要相似度,可以将其转换为相似性度量,例如通过距离进行归一化。我们可以用较长字符串的长度来归一化距离,然后用1减去它,从而得到相似性度量。例如,从“DVA”到“DAVE”的编辑距离是2,“DVA”的长度为3,“DAVE”的长度为4。将2除以4得到0.5,然后1减去0.5得到相似性分数0.5。

尼德曼-温施度量

我们将讨论的另一个基于序列的相似性度量是尼德曼-温施度量。它实际上是对编辑距离的修改,通过考虑几个方面来推广莱文斯坦编辑距离。在编辑距离中,所有操作的成本都是相同的:插入一个字符成本为1,删除一个字符成本为1,替换一个字符成本也为1。所有成本相同可能不是最好的表示方式,有时我们可能希望为不同的操作设置不同的分数,这就需要尼德曼-温施度量。

尼德曼-温施度量计算的是相似性而非距离。它的做法是对齐两个字符串,在字符串X和字符串Y之间给出一个对齐方式,然后根据对齐方式给出一个分数。它试图找到最佳对齐方式,即分数最高的对齐方式,并以此衡量相似性。这里的对齐是指我们试图将字符串X和字符串Y的字符对应起来,并允许一些间隙。

例如,假设X是“D V”,Y是“D E E V”。我们可以用不同的方式对齐这两个字符串,其中一种方式是包含两个间隙。在对齐“D”与“D”之后,因为下一个最佳对齐是相同的字符“V”,所以中间我们允许间隙。因此,“D E E V”与“D V”的对齐是:第一个“D”对齐,然后两个间隙,接着字符“V”对齐。然后,我们为这对对齐找到一个分数。

尼德曼-温施通过引入间隙惩罚来推广编辑距离,因为它考虑添加间隙,所以对间隙有一个惩罚成本,称为间隙惩罚。对于其他操作,如对齐“D”与“D”或对齐“A”与“E”,有一个分数。很可能,对齐“D”与“D”的分数较高,而对齐“A”与“E”不太理想,分数较低。这由分数矩阵表示。如果我们对齐“D”与“D”,分数是正2;如果对齐“A”与“E”,因为两个字符不同,所以是负分,类似于成本或惩罚。有了分数矩阵和间隙惩罚,我们将再次计算差异数量,然后根据差异得到分数。

对于之前的对齐,“D”与“D”对齐,根据分数矩阵得2分;因为有两个间隙,每个间隙惩罚为-1,所以扣除2分;接着“V”与“V”对齐得2分;最后“A”与“E”对齐得-1分。2加2减1等于3,再减去间隙惩罚2,所以这对字符串的尼德曼-温施分数是1。

尼德曼-温施在三个方面推广了莱文斯坦距离:它基于对齐计算分数,而不是寻找差异,实际上是计算相似性分数;除了所有操作成本相同外,尼德曼-温施有一个分数矩阵,允许我们进行更细粒度的分数建模,可以指定哪些字符对应什么值;它将插入和删除操作泛化为间隙成本,在编辑距离中,插入和删除操作只是在字符串X或Y中放置间隙,在尼德曼-温施中,我们将其泛化为间隙成本,并且这个成本可以由我们指定。

类似于编辑距离,我们也可以用动态规划来计算尼德曼-温施分数。动态规划算法与此类似。我们再次将字符串X和Y定义为字符序列,然后需要一个类似的矩阵,初始化略有不同,我们考虑间隙成本,并根据行索引或列索引乘以间隙成本进行初始化。然后进行递推计算。在位置S[i][j],我们再次考虑是间隙(即将X或Y与间隙对齐)还是进行对齐(即将X[i]与Y[j]对齐)。我们查看分数矩阵,找到对应的分数C(X[i], Y[j])。然后进行计算,我们不是计算最小值,而是寻找最大值,因为我们在计算相似性,希望选择最佳对齐方式,即最大值。

如果我们想要更详细地控制如何匹配字符,例如我们希望间隙还是不希望间隙,我们可以通过设置不同的间隙成本值C_g和分数矩阵中的不同值来控制匹配,以选择最佳或首选的对齐方式。因此,尼德曼-温施更加灵活。

仿射间隙度量

我们将要看的下一个度量是仿射间隙度量。仿射间隙度量实际上是尼德曼-温施分数的扩展。回忆一下,尼德曼-温施分数有间隙惩罚。当我们在以下情况下使用尼德曼-温施度量时:字符串X是“David Smith”,而字符串Y是“David Richardson Smith”,如果使用尼德曼-温施对齐它们,我们会看到一个很大的间隙,长达11个字符。如果我们对所有这11个字符考虑相同的间隙成本,那么将会有很大的间隙成本,这对字符串的尼德曼-温施分数将会很小。这实际上是一个非常常见的情况。例如,在一个数据集中,名字只有名和姓,而在另一个数据集中,名字包含名、中间名和姓。这意味着在一个数据集中没有中间名。如果我们将该数据集中的所有名字与另一个数据集进行比较,它们都会有很高的差异和很低的相似性。考虑到这种情况,显然尼德曼-温施度量不适用,因为间隙通常倾向于长于一个字符。

仿射间隙度量试图将间隙成本分为两种:一种是打开间隙的成本,当我们开始添加间隙时,第一次打开间隙有一个成本,用C_o表示;打开第一个间隙后,如果我们有更多间隙,只是继续间隙、扩展间隙,那么这是继续间隙的成本,用C_r表示。这两个成本之间的关系是:打开间隙更昂贵,而一旦打开间隙,继续间隙的可能性更大,所以继续间隙的成本应小于打开间隙的成本,即C_r < C_o。对于一个有k个空格的间隙,其成本是打开间隙的成本C_o加上剩余k-1个字符的继续间隙成本C_r。

回到之前的例子,“David Smith”和“David Richardson Smith”,间隙长度为11个字符。第一个字符是打开间隙,成本为C_o加上(11-1)乘以C_r。假设C_o=1,C_r=0.5,那么成本是1 + (11-1)*0.5 = 6。对于其他对齐的字符,假设它们都对齐且每个得分为1,原本没有间隙的分数是11。现在扣除间隙惩罚后,更新后的分数是11 - 6 = 5。而如果我们使用尼德曼-温施,因为所有间隙成本相同,我们会扣除11的间隙惩罚,结果分数是0。可以看到,仿射间隙度量的分数更高,这更可取,因为我们知道在实际情况中省略中间名很常见。当然,这取决于问题设置,例如,你必须了解你的数据集和问题,需要知道我们是否要考虑间隙,或者中间名非常重要,那么就不能使用仿射间隙度量。但如果你知道中间名可以省略,那么使用仿射间隙度量比尼德曼-温施更好,后者给出的相似性很低。

由于我们现在有打开间隙和继续间隙的概念,与尼德曼-温施相比,我们需要考虑更多情况,因此仿射间隙度量的算法变得更加复杂。计算仿射间隙分数的动态规划算法如下:首先,我们为每一对位置考虑三个分数:M[i][j]表示将X[i]与Y[j]对齐的分数;I_x[i][j]表示将字符串X中的字符与间隙对齐的分数;I_y[i][j]表示将字符串Y中的字符与间隙对齐的分数。然后,动态规划算法意味着我们必须考虑之前位置的最佳分数,因此会有很多组合。

让我们看一下算法。对于位置(i, j),有三种情况:情况一是将X[i]与Y[j]对齐,用分数M[i][j]表示;情况二是将字符串X中位置i的字符与间隙对齐,用分数I_x[i][j]表示;情况三是将字符串Y中位置j的字符与间隙对齐,用分数I_y[i][j]表示。对于每种情况,因为我们必须考虑之前位置的分数,所以它们又可以有更多的组合情况。

对于情况一(M[i][j]),我们考虑三种可能性:X[i-1]与Y[j-1]对齐(即M[i-1][j-1]分数)加上当前对齐分数C(X[i], Y[j]);或者X[i-1]与间隙对齐(即I_x[i-1][j-1]分数)加上当前对齐分数;或者Y[j-1]与间隙对齐(即I_y[i-1][j-1]分数)加上当前对齐分数。我们取这三者中的最大值作为M[i][j]。

对于情况二(I_x[i][j]),表示X[i]与间隙对齐。我们考虑两种可能性:X[i-1]与Y[j]对齐(即M[i-1][j]分数)加上打开间隙的成本-C_o;或者X[i-1]与间隙对齐(即I_x[i-1][j]分数)加上继续间隙的成本-C_r。我们取这两者中的最大值作为I_x[i][j]。

对于情况三(I_y[i][j]),表示Y[j]与间隙对齐。我们考虑两种可能性:X[i]与Y[j-1]对齐(即M[i][j-1]分数)加上打开间隙的成本-C_o;或者Y[j-1]与间隙对齐(即I_y[i][j-1]分数)加上继续间隙的成本-C_r。我们取这两者中的最大值作为I_y[i][j]。

最终,在位置(i, j)的仿射间隙分数是M[i][j]、I_x[i][j]和I_y[i][j]中的最大值。我们计算所有值,最终分数是位置(m, n)的分数。如果我们想找到对齐方式,可以从(m, n)位置开始回溯。

初始化时,M[0][0]初始化为0,I_x[0][0]初始化为打开间隙的成本-C_o,I_y[0][0]也初始化为-C_o。对于其他行和列,因为它们是继续间隙,所以用继续间隙成本-C_r进行初始化。然后进行递推计算。例如,在位置(1,1),我们计算M[1][1]、I_x[1][1]和I_y[1][1]的值,然后取最大值。最终,我们得到整个矩阵,仿射间隙分数是M[m][n]、I_x[m][n]和I_y[m][n]中的最大值。通过追踪箭头,我们可以得到对齐方式。

仿射间隙度量考虑得更细致,它考虑了与空格匹配、与间隙对齐或与字符对齐的细粒度匹配。它倾向于继续间隙,而不是将长间隙拆分为两个打开间隙,因为那样成本更高。仿射间隙度量能够处理具有长间隙的字符串匹配。当你有长间隙时,你可能想使用仿射间隙度量。

史密斯-沃特曼度量

另一个基于序列的相似性度量是史密斯-沃特曼度量。它也与之前提到的尼德曼-温施度量和仿射间隙度量非常相似,但当然有区别。它实际上是尼德曼-温施度量的扩展。当我们看前两种度量(尼德曼-温施和仿射间隙)时,我们试图进行全局对齐,即尝试匹配所有字符。但有时,我们不想匹配整个字符串,只想找到最长的公共子串。那么我们应该使用史密斯-沃特曼度量,之前的度量就不适用了。

例如,有两个字符串:一个是“Professor John R Smith University of Wisconsin”,包含所有信息;另一个只有头衔和名字,没有所属机构。如果我们使用仿射间隙或尼德曼-温施度量,由于这两个字符串之间存在巨大差异,一个长一个短,分数肯定会很低,相似性分数会非常低。对于这种字符串匹配,我们试图关注“John R Smith”和“Professor”的相似性,因此需要另一种度量,即史密斯-沃特曼度量。它试图识别局部对齐,即尝试找到X和Y中最相似的两个子串,而不是考虑整个字符序列。

我们如何做到呢?史密斯-沃特曼度量与尼德曼-温施度量相比有两个变化:它允许在任何位置重新开始匹配,这意味着如果匹配或对齐不够好,分数变得太低,那么最好重新开始;它忽略后缀,意味着在某个点已经足够好,任何后续的匹配或对齐产生的分数不如我们不需要考虑的那样高。因此,我们忽略那些产生不够好匹配的后缀。

让我们看一下动态规划算法。它与尼德曼-温施度量非常相似,只是多了一种情况:0。现在,如果分数变为负数,变得太低,我们就不考虑,从0重新开始,然后考虑剩余的对齐。这是主要区别,其他几乎相同。史密斯-沃特曼相似性的分数是矩阵中的最高分,而不像之前总是查看最后一对位置的分数。对于史密斯-沃特曼度量,我们考虑整个矩阵中的最高分。

另一个区别是初始化:之前我们考虑对齐间隙,第一行和第一列有递增的惩罚,但现在我们考虑重新开始,所以第一行和第一列都初始化为0。计算过程类似。例如,对于D[1][1],我们计算最大值。最终,我们计算完所有值后,选取整个矩阵中的最大值,然后追踪箭头得到对齐方式。这就是史密斯-沃特曼度量。

杰罗-温克勒度量

我们将要看的最后一个基于序列的相似性度量是杰罗-温克勒度量。它建立在杰罗分数之上,但考虑了前缀。当X和Y的杰罗分数较低,但我们想更重视公共前缀时,可以使用这种改进的杰罗-温克勒度量。杰罗-温克勒度量的公式如下:它取两个字符串之间的杰罗分数,然后加上两个值:P是最长公共前缀的长度,P_w是赋予前缀的权重。

例如,X是“J N”,Y是“J X N”。最长公共前缀是两个字符,即P=2。根据之前杰罗相似性度量的计算,我们有那个分数,然后使用这个公式。假设P_w通常小于0.25,取决于你有多重视公共前缀。假设P_w=0.1,那么杰罗-温克勒分数就是杰罗分数加上2*0.1。

我们已经看了许多基于序列的相似性度量。不同的序列相似性度量具有不同的特性,每种都适用于不同的情况。正如我们常说的,你必须很好地了解你的问题和数据集,看看你处理的数据有什么特征,你正在处理什么样的字符串。例如,如果经常有长间隙,并且忽略这些间隙部分后,它们仍然指向同一个实体,那么我们应该考虑仿射间隙度量。如果你只想识别子串,经常有很多前缀或额外信息,那么应该使用史密斯-沃特曼度量。不同的度量适用于不同的情况。这些是基于序列的相似性度量。从之前的例子可以看出,我们经常使用这些来匹配人名、组织名等。此外,这类序列相似性度量也常用于匹配生物医学信息,如基因序列、蛋白质序列等。

杰罗度量

在看了许多使用动态规划进行计算的度量之后,让我们看一个不同的度量:杰罗度量。杰罗度量主要用于比较短字符串,例如名和姓。杰罗度量对两个字符串的计算如下:首先尝试找到公共字符,但这些公共字符必须彼此接近。我们试图找到彼此接近的字符对,因此有一个约束:位置i和j之间的差异应小于min(|X|, |Y|)/2。我们试图识别公共字符对的数量,即两个字符串之间有多少公共字符。然后,在公共字符中,我们查看它们的顺序是否相同。例如,如果X中第一个公共字符与Y中第一个公共字符不同,那就是一次换位。杰罗度量考虑公共字符的数量C,以及公共字符中有多少次换位T,然后一起计算分数。分数由X的长度和Y的长度归一化,并考虑换位。

让我们看一个例子。我们有两个字符串“J N”和“J O X N”。我们知道这两个字符串有三个公共字符:J、O和N。对于X,这三个公共字符的顺序是J、O、N;对于Y,顺序也是J、O、N。没有换位,顺序没有差异。因此,C=3,T=0。根据公式,我们得到杰罗分数为0.917。

如果我们有两个稍有不同的字符串X和Y,例如X中三个公共字符的顺序是J、O、N,而Y中的顺序是O、J、N。C仍然是3,但顺序不同,有两次换位,T=2。计算出的杰罗分数是0.81。可以看到,如果公共字符的顺序不同,那么杰罗相似性分数会更低。相比之下,第一对字符串的公共字符顺序相同,相似性更高。这就是杰罗度量。

本节课中,我们一起学习了多种基于序列的相似性度量方法,包括汉明距离、编辑距离、尼德曼-温施度量、仿射间隙度量、史密斯-沃特曼度量、杰罗度量和杰罗-温克勒度量。每种方法都有其独特的应用场景和计算方式,理解它们的原理和适用条件对于在实际数据分析中选择合适的度量标准至关重要。

数据分析基础:10:基于集合的相似性度量

在本节课中,我们将要学习基于集合的相似性度量方法。与之前将字符串视为字符序列的度量方法不同,基于集合的方法将字符串视为由“词元”构成的集合或多重集。这种方法特别适用于处理短语或句子,能够更好地捕捉文本的语义相似性。

上一节我们介绍了基于序列的相似性度量,本节中我们来看看如何将字符串视为词元集合并进行比较。

词元生成方法

首先,我们需要将字符串分割成词元。以下是几种常见的词元生成方法:

  • 按单词分割:最常见的方法是按照空格将句子分割成单词。每个单词就是一个词元。
  • 词干提取:为了减少单词的形态变化(如“running”和“ran”),可以对单词进行词干提取,将其还原为基础形式。
  • 去除停用词:像介词、冠词这类在文本中出现频率极高但意义不大的词(如“the”,“a”,“of”),可以考虑将其移除。
  • 使用 N-gram:另一种方法是考虑字符的组合,即 N-gram(或 k-shingle),它是长度为 N 的连续字符子串。例如,对于字符串“David Smith”,其 3-gram 集合为:{“Da”, “Dav”, “avi”, “vid”, “id “, “d S”, “ Sm”, “Smi”, “mit”, “ith”, “th#”}。有时为了包含字符串起始和结束的信息,会使用特殊符号(如 ^ 表示开始,$ 表示结束)来生成边界 N-gram。

一旦将字符串分割成词元集合,我们就可以使用基于集合的相似性度量方法了。

重叠度量

第一个要看的基于集合的相似性度量是重叠度量。它的计算非常简单,就是统计两个词元集合中共有词元的数量。

公式
Overlap(X, Y) = |B_X ∩ B_Y|

其中,B_XB_Y 分别是字符串 X 和 Y 生成的词元集合。

例如,字符串 X 生成的 2-gram 集合为 {“^D”, “Da”, “av”, “id”, “d$”},字符串 Y 生成的集合为 {“^D”, “Da”, “an”, “n$”}。它们的共有词元是 {“^D”, “Da”},因此重叠度量值为 2。

你可以看到,重叠度量非常直接,就是计算共有词元的数量。

Jaccard 相似度

重叠度量没有考虑字符串的长度。如果一个字符串非常长,它自然更有可能获得较高的重叠分数。为了消除这种长度偏差,我们引入 Jaccard 相似度。

Jaccard 相似度计算的是两个集合的交集大小与并集大小的比值。

公式
Jaccard(X, Y) = |B_X ∩ B_Y| / |B_X ∪ B_Y|

沿用上面的例子,B_XB_Y 的并集大小为 7,交集大小为 2,因此 Jaccard 相似度为 2 / 7 ≈ 0.286

Jaccard 相似度计算简单,应用非常广泛。

TF-IDF 相似度

在前两种方法中,所有词元都被平等对待。但在某些情况下,我们可能希望更关注那些具有区分性的词。例如,比较“Apple Corporation”和“IBM Corporation”时,“Corporation”这个词很常见,区分度低;而“Apple”和“IBM”则是关键的区分词。TF-IDF 相似度就是为了解决这个问题。

TF-IDF 为每个词元计算一个权重分数,该分数由两部分组成:

  1. 词频:词元在当前文档中出现的频率。TF(t, d) 表示词元 t 在文档 d 中的出现次数。
  2. 逆文档频率:衡量词元在所有文档中的普遍程度。IDF(t) = log(N / n_t),其中 N 是文档总数,n_t 是包含词元 t 的文档数量。

公式
TF-IDF(t, d) = TF(t, d) * IDF(t)

对于一个文档(字符串),我们可以将其所有词元的 TF-IDF 分数组成一个特征向量。然后,通过计算两个文档特征向量之间的余弦相似度来衡量它们的相似性。

余弦相似度公式
Cosine Similarity(V_x, V_y) = (V_x · V_y) / (||V_x|| * ||V_y||)

余弦相似度值越高,表示两个字符串共享越多的高 TF-IDF 值词元,即它们包含的区分性词汇越相似。

TF-IDF 还有一些变体,例如对 TF 或 IDF 取对数进行平滑,或对特征向量进行归一化处理。

混合相似性度量

我们讨论了基于集合和基于序列的相似性度量,它们适用于不同的场景。基于序列的方法能很好地处理拼写错误等字符级差异;而基于集合的方法更适合处理较长的短语或句子,关注词元级别的匹配。

但有时我们需要兼顾两者:既要处理拼写错误,又要对短语或句子进行词元级别的比较。这就需要混合相似性度量方法,将两类方法的优势结合起来。

以下是三种常见的混合方法:

1. 广义 Jaccard 度量

标准的 Jaccard 度量要求词元必须完全相同才算匹配。广义 Jaccard 度量则放宽了这一要求。

计算步骤

  1. 对于集合 B_XB_Y 中的每一对词元,使用一种基于序列的相似性度量(如编辑距离相似度)计算它们的相似度分数。
  2. 设定一个阈值,只保留相似度高于阈值的词元对。
  3. 将保留的词元对视为一个二分图,寻找一个最大权匹配(即找到一组匹配,使得匹配边的总相似度分数最高)。
  4. 广义 Jaccard 相似度计算公式为:匹配边的总相似度分数除以 (|B_X| + |B_Y| - |M|),其中 |M| 是匹配边的数量。

这种方法允许拼写相似的词元(如“energy”和“enrgy”)进行匹配。

2. 软 TF-IDF 度量

软 TF-IDF 是对标准 TF-IDF 的软化,允许词元之间进行近似匹配。

计算步骤

  1. 对于 B_X 中的每个词元 t,在 B_Y 中寻找与其最相似的词元 u(相似度需超过某个阈值)。所有这样的 t 构成一个“闭合集”。
  2. 计算软 TF-IDF 相似度时,不再要求 tu 完全相等,而是将它们的 TF-IDF 向量点积,再乘以它们之间的序列相似度分数(作为权重)。
  3. 最终的相似度是所有这些加权点积的总和。

这样,即使“Apple”被误拼为“Aple”,只要它们足够相似,仍然能对相似度计算产生贡献。

3. Monge-Elkan 相似度

Monge-Elkan 相似度采用一种“最佳匹配”策略。

计算步骤

  1. 将字符串 X 和 Y 分割成词元序列 (x1, x2, ..., xm)(y1, y2, ..., yn)
  2. 对于 X 中的每个词元 xi,计算它与 Y 中所有词元的相似度(使用一种次级相似性度量,如编辑距离或广义 Jaccard),并取其中的最大值 max_sim(xi, Y)
  3. Monge-Elkan 相似度定义为 X 中所有词元这些最大相似度值的平均值。

公式
Monge-Elkan(X, Y) = (1/m) * Σ_{i=1 to m} [ max_{j=1 to n} sim(xi, yj) ]

这种方法为 X 中的每个部分在 Y 中寻找最佳匹配,对局部的拼写错误或变体有较好的鲁棒性。

总结

本节课中我们一起学习了多种相似性度量方法。我们首先介绍了基于集合的度量,包括简单的重叠度量、考虑集合比例的Jaccard相似度以及能突出关键区分词的TF-IDF相似度。接着,我们探讨了结合序列与集合度量优势的混合方法,包括广义Jaccard度量软TF-IDF度量Monge-Elkan相似度。理解这些方法及其适用场景,对于在不同数据质量和需求下选择合适的数据匹配工具至关重要。

011:语音相似度度量 📊

在本节课中,我们将要学习相似度度量的最后一个类别:语音相似度度量。这类度量方法关注的是字符串的发音,而非其拼写或外观。它主要用于处理因口头交流、听力录入导致的数据不一致问题,例如姓氏或地址的拼写错误。

上一节我们介绍了基于编辑距离和序列的相似度度量。本节中我们来看看当数据错误源于发音相似时,应如何处理。

语音相似度度量的原理 🎤

语音相似度度量旨在根据字符串的发音进行匹配。有时,不同的拼写可能对应非常相似的发音。例如,“Me”和“Mee”,或者“Smith”和“Smyth”。如果直接使用基于字符的度量方法(如编辑距离),这些词会被判定为不相似,因为它们的拼写不同。因此,我们需要一种能“听懂”字符串的度量方法。

Soundex算法详解 🔢

Soundex是语音相似度度量的一种经典算法,主要用于匹配姓氏。其核心思想是将一个姓氏映射为一个由一个字母和三个数字组成的四字符代码。如果两个姓氏的Soundex代码相同,则认为它们在语音上相似。

以下是Soundex算法的具体步骤:

  1. 保留首字母:保留原始字符串的第一个字母。
  2. 处理后续字符:对首字母之后的所有字符进行转换。
    • 移除所有出现的‘W’和‘H’。
    • 将特定的辅音字母组替换为对应的数字(1-6)。
  3. 合并连续相同数字:将转换后序列中连续出现的相同数字合并为一个。
  4. 移除非数字字符:移除所有非数字字符(即元音字母和‘Y’等)。
  5. 生成代码:将首字母与处理后的数字序列组合。如果数字不足三位,用0补足;如果超过三位,则只取前三位。

以下是Soundex算法的核心映射规则(代码表示):

# Soundex 字符到数字的映射规则
mapping = {
    'B': '1', 'F': '1', 'P': '1', 'V': '1',
    'C': '2', 'G': '2', 'J': '2', 'K': '2', 'Q': '2', 'S': '2', 'X': '2', 'Z': '2',
    'D': '3', 'T': '3',
    'L': '4',
    'M': '5', 'N': '5',
    'R': '6'
}
# 字母‘A’, ‘E’, ‘I’, ‘O’, ‘U’, ‘Y’, ‘W’, ‘H’ 不编码,在步骤中被移除。

算法示例演示 📝

让我们以姓氏“Ashcraft”为例,演示Soundex代码的生成过程。

  1. 保留首字母A
  2. 处理剩余字符 “shcraft”
    • 移除‘H’:scraft
    • 应用映射规则:
      • S -> 2
      • C -> 2
      • R -> 6
      • A (元音,移除)
      • F -> 1
      • T -> 3
    • 得到数字序列:2, 2, 6, 1, 3
  3. 合并连续相同数字2, 6, 1, 3
  4. 移除非数字字符:此步已无影响。
  5. 生成代码:首字母A + 前三个数字261 = A261

因此,“Ashcraft”的Soundex代码是 A261

另一个例子是“Robert”和“Rupert”。

  • Robert -> R163
  • Rupert -> R163

两者的Soundex代码相同(R163),因此被判定为语音相似。

Soundex的优缺点与适用场景 ⚖️

Soundex算法有其特定的优势和局限性。

以下是Soundex的主要优点:

  • 能有效处理因发音相似导致的拼写变体,如“Jon”和“John”。
  • 计算相对简单,效率较高。
  • 在匹配英语姓氏,特别是高加索人姓氏时,效果良好。

以下是Soundex的主要局限性:

  • 文化局限性:算法主要针对英语发音设计,对于东亚、非洲等不同语言起源的姓名,效果不佳。例如,中文姓氏“张”(Zhang)和“常”(Chang)发音不同,但拼写首字母规则可能无法很好区分。
  • 适用范围窄:主要用于姓氏,对普通单词或内容的匹配效果有限,因为普通单词的拼写通常比较固定。
  • 精度有限:它只是一个粗略的语音哈希,不同发音的单词可能产生相同的代码(例如“Gough”和“Goff”可能映射到相同代码),而有些发音相似的单词可能因首字母不同而无法匹配。

因此,在处理多元化数据时,可能需要探索其他更先进的语音相似度算法(如Metaphone, Double Metaphone等)作为补充或替代。

总结 📚

本节课中我们一起学习了语音相似度度量,重点剖析了Soundex算法。我们了解到,当数据错误源于听觉录入时,基于发音的匹配至关重要。Soundex通过将字符串转换为一个简化的语音代码来实现这一目标。虽然它在特定领域(如英语姓氏匹配)非常有效,但我们也必须认识到其文化局限性和适用范围。在实际数据分析工作中,需要根据数据的具体来源和特点,选择合适的相似度度量方法。

012:可扩展性与倒排索引筛选 📊

在本节课中,我们将要学习如何解决字符串相似度计算中的可扩展性挑战。当处理大量字符串对时,逐一计算所有可能的配对是不现实的。因此,我们需要一些方法来筛选和减少候选对的数量,从而专注于更有希望的匹配。

上一节我们介绍了各种字符串相似度度量方法,本节中我们来看看如何通过筛选技术来提升计算效率。

可扩展性挑战与候选集筛选

在讨论字符串相似度度量时,我们提到面临两大挑战:准确性和可扩展性。对于准确性,我们已经探讨了近似匹配、序列相似度、子串相似度、混合方法以及语音相似度度量。然而,另一个主要挑战是可扩展性问题。这意味着当处理大量字符串对时,逐一计算所有候选对的相似度得分是不可行的。

因此,我们需要一种方法来减少候选对的数量。核心思想是,对于一个给定的字符串集合X中的某个字符串x,我们尝试从另一个字符串集合Y中找到一个候选子集。这样,我们需要考虑的配对数量就大大减少了。对于筛选出的每一对x和y,我们再计算其相似度得分。如果得分超过预设阈值,则被视为匹配对。这种方法的核心是筛选减少需要测试的配对数量,专注于更有希望的候选对。这个过程也常被称为分块

以下是几种实现筛选的可能方法。

基于倒排索引的筛选 🔍

一种方法是基于字符串构建倒排索引。具体操作是,我们将集合Y中的每个字符串转换为一系列标记,然后基于这些标记构建一个倒排索引。

例如,假设我们有一个集合Y,包含多个文档(字符串)。我们为每个标记记录它出现在哪些文档中。假设标记“lake”出现在文档4和6中,标记“Mendota”出现在文档6中。现在,考虑集合X中的一个字符串x1,其标记为“lake”和“Mendota”。使用倒排索引,我们发现包含“lake”的Y中文档是4和6,包含“Mendota”的Y中文档是6。将这两个列表合并,我们得到需要与x1比较的候选文档是4和6。文档5不包含x1的任何标记,因此无需考虑。原本需要比较3对(x1与Y中所有文档),现在只需比较2对,从而减少了候选对的数量。

然而,基于倒排索引的筛选有其局限性。首先,某些常见标记的倒排列表可能非常长(例如,几乎出现在每个文档中),这会导致筛选效果不佳。其次,构建和维护这样的倒排索引本身是耗时且成本较高的。最后,即使经过筛选,我们仍然需要枚举和处理剩余的候选对,如果剩余数量很大,计算开销依然可观。

基于大小的筛选 📏

另一种处理可扩展性的筛选方法是大小筛选。其核心思想是,如果两个字符串的标记数量相差太大,那么它们达到高相似度得分的可能性就很低。

具体来说,给定一个字符串x,我们只保留那些大小(标记数量)在特定范围内的字符串y作为候选。以Jaccard相似度为例,可以证明,若希望字符串x和y的Jaccard相似度不低于一个预设阈值t,则y的标记数量必须满足以下范围:

|y| 必须在 t * |x||x| / t 之间。

例如,假设字符串x有5个标记,我们设定的相似度阈值为0.8。那么,任何希望与x匹配的字符串y,其标记数量必须在 0.8 * 5 = 45 / 0.8 ≈ 6.25 之间,即y必须有4、5或6个标记。如果集合Y中所有字符串的标记数都是3,那么根据大小筛选,没有字符串满足条件,我们可以立即排除所有配对,无需进行任何相似度计算,从而极大地减少了计算量。

基于前缀的筛选 🔤

第三种方法是前缀筛选,它通常用于重叠度量的场景。如果我们希望两个字符串的重叠得分超过一个预设值k,那么可以推断,在按某种顺序(如字典序)排序后,字符串x的前 |x| - k + 1 个标记中,至少有一个必须出现在字符串y中。

其原理是,如果连前缀部分都没有足够的重叠,那么整个字符串的重叠得分几乎不可能达到k。因此,我们可以利用前缀信息快速排除大量不可能的候选。

例如,假设字符串x1的标记按序为 [lake, Mendota],我们希望找到与x1重叠度至少为2的字符串。这里k=2,|x1|=2,那么我们需要检查的前缀长度为 |x1| - k + 1 = 1。即,我们取x1的第一个标记“lake”。然后,我们只需要在集合Y中查找那些包含标记“lake”的文档作为候选。如果Y中的某个文档不包含“lake”,那么它不可能与x1有2个或以上的重叠标记,因此可以被安全地过滤掉。这样,我们同样减少了需要详细比较的候选对数量。

除了上述方法,还有许多其他技术可以实现相同的筛选目标,以减少候选对数量,从而应对可扩展性挑战。后续课程中,我们还将探讨其他专门处理相似度计算可扩展性问题的算法。

本节课中我们一起学习了三种应对字符串相似度计算可扩展性挑战的筛选技术:基于倒排索引的筛选、基于大小的筛选和基于前缀的筛选。这些方法的核心目标都是通过智能地减少需要详细比较的候选对数量,来提升大规模数据处理的效率。

013:导论

在本节课中,我们将要学习一种用于高效查找相似文档的算法。该算法主要包含两个步骤:最小哈希和局部敏感哈希。我们将了解其背景、原理、具体步骤以及如何通过它们来应对海量文档比较的挑战。

为什么需要查找相似文档?

在数据分析和处理中,我们经常需要比较大量文档的相似性。例如,在新闻聚合、抄袭检测或网站去重等场景中,直接比较所有文档对的计算成本极高。如果有 N 个文档,两两比较的时间复杂度是 O(N²),当文档数量巨大时,这个过程可能需要数天甚至数月,这是不可接受的。因此,我们需要一种方法来显著减少需要比较的文档对数量,同时又能准确地找到那些真正相似的文档。

算法概述:三步流程

该算法通过三个主要步骤来高效地查找相似文档:

  1. 分片:将文档转换为由“片段”构成的集合。
  2. 最小哈希:将大型的集合表示压缩成更小的“签名”表示,同时保留文档间的相似性特征。
  3. 局部敏感哈希:基于签名,进一步减少需要详细比较的候选文档对数量。

下面,我们将详细介绍每一步。

第一步:分片

分片的目的是将文档转换为一个由“片段”构成的集合,以便进行基于集合的相似性度量(如杰卡德相似系数)。

核心概念:分片主要有两种方式:

  • 词袋模型:不考虑单词顺序,直接将文档拆分为单词集合。
  • K-Shingle:考虑顺序,将文档拆分为连续的 K 个字符(或 K 个单词)序列。

例如,对于字符串 “ABCAB”,使用 2-Shingle(字符级别)会得到集合:{‘AB’, ‘BC’, ‘CA’, ‘AB’}。通常我们会去重,得到 {‘AB’, ‘BC’, ‘CA’}。

如何选择 K 值
K 值的选择取决于文档长度和领域。

  • K 值过小(如 K=1):会导致许多不相关的文档拥有很高的相似度(因为常见字符普遍存在),无法有效区分。
  • K 值过大:则难以在文档间找到共同的片段,相似度会普遍偏低。
  • 经验值:对于短文(如推文、邮件),K=5 通常足够;对于长文(如新闻、论文),K=10 更合适。

为了进一步压缩表示,我们还可以对分片进行哈希,将其映射为数字,以减少存储开销。

第二步:最小哈希

在获得文档的分片集合后,我们可以用一个很长的二值向量来表示每个文档(每个维度代表一个分片是否存在)。然而,当分片总数很大时,这个向量会非常稀疏且庞大。最小哈希算法的目标就是将这些大向量压缩成更小的“签名”向量,同时确保签名之间的相似度能够近似反映原始文档之间的杰卡德相似度。

核心思想
通过随机排列所有分片的顺序,对于每个文档(即每个列向量),记录其第一个值为 1 的分片所在的行索引。这个索引值就是该文档在此次排列下的一个“签名”。重复多次随机排列,就能为每个文档生成一个固定长度的签名向量。

关键性质
可以证明,两个文档的签名在某一行相等的概率,等于这两个文档的杰卡德相似度。因此,签名矩阵能够很好地保留原始文档的相似性关系。

高效的单遍算法实现
实际上,我们不需要真正生成所有可能的随机排列。我们可以使用一组哈希函数来模拟随机排列的过程。具体算法如下:

  1. 初始化一个签名矩阵 Sig,其行数等于哈希函数数量 k,列数等于文档数量。将所有元素初始化为无穷大。
  2. 遍历原始矩阵的每一行(即每个分片):
    • 对于当前行 i,计算其 k 个哈希值:h1(i), h2(i), ..., hk(i)
    • 对于每一列 j(即每个文档):
      • 如果原始矩阵中 (i, j) 位置的值为 1,则对于每一个哈希函数 r(1 到 k),检查 hr(i) 是否小于 Sig[r][j]。如果是,则用 hr(i) 更新 Sig[r][j]

这个算法只需扫描原始矩阵一次,即可生成签名矩阵。

第三步:局部敏感哈希

即使有了较小的签名矩阵,如果文档数量 N 很大,比较所有 N(N-1)/2 对签名仍然开销巨大。局部敏感哈希的目标是进一步筛选出最可能相似的文档对作为候选对,从而避免全部比较。

核心思想
将签名矩阵按行划分为 b 个 band,每个 band 包含 r 行(因此总行数 k = b * r)。对于每个 band 和每个文档(即每一列):

  1. 将该文档在此 band 内的 r 行签名值拼接起来。
  2. 使用一个哈希函数,将这个拼接后的值哈希到一个有大量桶的哈希表中。

候选对识别
如果两个文档在任何一个 band 中被哈希到了同一个桶中,它们就被视为一个候选对。

原理分析
假设两个文档的杰卡德相似度为 s

  • 在任意一个 band 中,它们所有 r 行签名都相同的概率是 s^r
  • 它们在所有 b 个 band 中都不相同的概率是 (1 - s^r)^b
  • 因此,它们至少在某个 band 中相同的概率是 1 - (1 - s^r)^b

这个概率函数是一个 S 形曲线。通过调整 br,我们可以控制曲线的形状,使其在某个相似度阈值 t 附近急剧上升。这样,真正相似(s > t)的文档对有很大概率成为候选对,而不相似(s < t)的文档对被误判为候选对的概率则很低。

参数选择示例
如果我们希望找到相似度至少为 0.8 的文档,可以选择 b=20r=5。此时:

  • 对于相似度为 0.8 的文档对,它们在某个 band 中相同的概率非常高(接近 1),因此几乎不会被漏掉(假阴性率极低)。
  • 对于相似度仅为 0.3 的文档对,它们成为候选对的概率非常低(约 4.7%),即假阳性率可控。

总结与工作流程

本节课我们一起学习了用于高效查找相似文档的完整流程:

  1. 预处理与分片:将原始文档转换为分片集合。
  2. 最小哈希:将庞大的集合表示压缩为紧凑的签名矩阵,保留相似性。
  3. 局部敏感哈希:通过将签名矩阵分 band 哈希,快速找出潜在的相似文档对(候选对)。
  4. 最终验证:对筛选出的候选对,使用原始的杰卡德相似度(或其他度量)进行精确计算,确认其相似性。

这个方法的核心在于,用计算代价低廉的步骤(最小哈希和LSH)过滤掉大量明显不相似的文档对,只对少数潜在的相似对进行精确而昂贵的计算,从而在大规模数据集上实现高效的相似性搜索。这个框架也可以与 MapReduce 等并行计算框架结合,以处理超大规模数据。

014:引言

在本节课中,我们将要学习数据集成的基本概念、面临的挑战以及其核心步骤。数据集成是将来自不同来源的数据组合成一个统一视图的过程,这对于大数据分析至关重要。


之前,当我们讨论数据预处理中的数据集成时,我们通常关注的是数据库内部或多个表之间的数据比较。这些表通常已有模式,意味着列名相似,因此我们主要进行属性值的相似性分析。

然而,这种方法基于一个假设:我们知道哪些列是相互关联的。但如何确定这些列确实相关呢?这使得整个集成过程比单纯的数值比较更为复杂。本课程强调处理大数据,当数据量巨大时,问题会变得更加复杂。

因此,我们将探讨一些传统方法,这些方法在过去十年甚至更长时间里被提出并应用于某些系统。同时,由于我们处理的是大数据,也会有一些新提出的算法、技术或观点,我们也将一并了解。

首先,让我们再次介绍数据集成。

在接下来的几讲中,我们主要使用两本教材和一些在线资料。最常用的教材是《数据集成原理》。这本教材出版已有一段时间,但它是对数据集成相关技术和主题覆盖最全面的教材之一。我们还会用到另一本名为《大数据集成》的书,我们将在下一个主题中讨论该书的一些内容。

那么,什么是数据集成?想想我们通常如何存储数据。传统上,我们常将数据存储在数据库中,结构良好,是关系型的。但如今,我们的大部分数据并非都整齐地存储在数据库中,它们无处不在。

我们有大量不同格式的数据,即使文档已经数字化,它们也可能以不同格式存在。我们有文本文档、视频、图像。即使是文本文档,也有许多不同的格式,它们可能是非结构化的(如新闻文章),也可能是半结构化的(如广告或产品目录)。

因此,我们有多种不同格式的数据,它们存储在不同的地方。有些在数据库中,有些是在线文档(如网络上的表格),有些数据隐藏在网页背后。格式、系统、来源的不一致性,所有这些都使得数据集成具有挑战性。

我们一直在讨论数据集成,有些论文甚至是二三十年前的。但直到最近几年,我们仍在讨论它,因为要实现完全自动化的完整数据集成过程,目前仍然难以实现。如今,我们实际上有一些工具可以帮助我们处理数据集成中的某些步骤,我们将会讨论这些。

那么,数据集成的简单定义就是将不同来源的数据结合在一起。问题在于为什么数据集成如此困难?因为数据通常由不同的人管理,而涉及到人,就必然会带来挑战。

我们经常需要查看来自不同来源的数据,可能包括我们提到的结构化数据库(如SQL)、其他结构化文档(如JSON、XML),以及非结构化文档(如文本)或其他类型的结构化文档(如CSV文件或Excel文件)。来源多种多样,我们的目标是将它们集成起来,形成一个统一的视图。

这里还有另一个数据集成的定义:将来自多个来源的数据组合成一个统一的视图。这意味着在拥有统一视图后,我们可以进行查询。我们不必对特定来源进行查询,而是可以对集成视图进行查询,从而从各个来源中找到所需的数据。

如果我们想做到这一点,就需要能够进行查询。这意味着我们至少需要有一个特定的模式来支持查询,并且这个模式必须是集成的。这个模式将允许我们基于不同来源的数据获取所需信息,我们称之为中介模式

中介模式用于指定我们想要的查询与数据源之间的关系。它不必包含数据源中的所有内容,我们很快会看到一个例子。但可以看到,如果我们想在中介模式上进行查询并从数据源获取数据,就需要某种映射。通常,我们称之为中介模式与数据源之间的语义映射

因此,数据集成的一个步骤就是讨论如何进行映射。

数据集成有很多应用。当然,除了数据预处理,一个非常典型的案例是两家公司合并。每家公司都有大量数据和数据库,合并后需要将所有数据库整合在一起,以发现是否能从中获得信息或价值,这就需要我们对数据库进行数据集成。

另一个例子是在科学领域。例如,在生物信息学领域,存在许多生物信息学知识库。如果你尝试寻找生物医学或生物信息学领域的数据集或知识库,会发现数量非常多,这里仅列出少数几个,例如基因本体、GEO、GenBank、Ensembl等。存在许多不同的知识库,有些存在已久,有些是新近创建的。因此,我们拥有许多数据源。如果我们想要有一个集成的视图,由于它们是不同的知识库,可能以不同的方式设计来处理不同的问题,集成过程就需要很多步骤或付出大量努力。

另一个可能大多数人都能理解的例子是如何找书。现在如果你想搜索一本书,同样会面临许多不同的在线书店。仅就在线书店而言,数量就已经很多了。此外,与传统书店不同,出版商通常不直接售书,但如今有了网络商店,出版商也很可能直接销售实体书或电子书。这意味着我们可以在很多地方查看或购买书籍。

因此,如果我们无法在一个地方找到某本书,就必须去另一个网站,这个过程变得越来越耗时。例如,过去如果想购买像冰箱这样的家电,我通常只会去一两家电器店,比较价格后做出决定。但现在,我们可以在很多网站上购买,每个电器店都有自己的网站,还有一些在线商店也可以购买。因此,你需要进行大量比较,整个过程非常耗时。

实际上,在近十年和上个十年,我们也需要一些元搜索引擎。但可以看到,元搜索引擎虽然存在,但并非适用于所有领域,因为还存在许多其他限制。

另一个例子是,网络上有数百万个表格。不同的组织、不同的人,由于组织的目标、职责或个人兴趣,会创建包含丰富信息的网页。因此,网络上存在大量有用或丰富的信息,我们可能希望将它们集成起来以获取信息。

再比如我之前提到的找书,那么找工作呢?同样,你需要从不同的网站搜索。对于求职网站,通常需要填写表格,输入大量详细信息,不像搜索产品只需输入名称。为了找工作,你需要反复在许多页面上填写个人信息、工作性质、领域等细节,这也会非常麻烦。

因此,如果我们能够进行数据集成,能够将它们整合在一起,无论是物理上放在一个地方,还是通过一个集成的界面虚拟地整合在一起,然后进行搜索,这两种方式都很难实现。这就是为什么数据集成实际上很困难,并不容易。

原因之一是显而易见的,即系统层面的原因。例如,我们看数据库,它们通常使用SQL。但即使如此,多年来SQL也有很多不同的变体,系统对查询的支持方式也不同。因此,仅从系统层面看,数据存储在哪里、平台是否可访问、如何访问,这些已经足够困难了。

如果我们忽略这些技术或系统层面的原因,让我们看看另外两类原因。

一类是逻辑原因,这里我们讨论的是模式和数据的异构性。那么,差异在哪里?为什么我们说模式和数据结构不同?

正如我们之前提到的,为什么需要相似性度量?我们提到了许多需要相似性度量的原因,因为存在数据异构性。你能想到哪些类型的数据异构性?

或许我们也可以想想日常生活。你每天看到什么样的数据或信息,在查看时仍然需要思考几秒钟才能理解它是什么或具体在谈论什么?你有这样的例子吗?

谢谢。是的,时间。例如,我们有AM/PM制和24小时制两种表示方式。此外,还需要考虑时区。例如,现在我们在线开会,如果你在海外与另一个地方的人开会,你们必须确保谈论的是同一个时区,否则就会产生误解。还有其他例子吗?

是的,非常好的例子。货币。例如,当我们买东西时,经常只标注金额“300”,但它是美元还是港币?你需要考虑这一点。如果你看到两个产品描述,一个说300,一个说2000,哪个更贵?它们实际上匹配吗?我们需要进行一些转换,很好。还有其他例子吗?我想有数百万个。

实际上,我认为每天都会遇到。例如,当你购买食品或饮料时,日期。我每天早上都会遇到这个问题。例如,如果我拿一包饮料、蛋糕或预包装的面包,上面有日期。是年/月/日,还是日/月/年,或是任何组合?是的,还有不同的单位。例如,度量单位,我们有米、厘米,还有英寸(这是距离和长度),有重量单位,还有体积单位等。它们可能使用不同的单位,所有这些都会使我们的集成变得非常困难,我们需要考虑转换。

那么模式呢?模式也非常困难。这里我们讨论的模式是指属性类型。你知道,当我们有一个数据库时,会有许多关系。对于每个关系,都有许多属性。通常,对于一个特定的关系,会有一个模式来描述该属性是什么,以及存储在那里的数据类型。如果我们只看两个数据库或两个表中的两个表,它们可能涉及相似的数据。例如,一家公司有一个关于其雇员的表,另一家公司有一个关于客户的表。我们谈论的是人,描述人通常有姓名、年龄和其他个人信息。人们如何写下标题?即使不看数据库,假设我们创建那些Excel表格来存储例如某个班级同学的信息,你会发现,一位老师会写下“学生ID”,而另一位老师在表格中可能只写“ID”;一位会写下“名”和“姓”,另一位可能只写“姓名”。

可以看到,标题、属性如“姓名”已经不同,那么模式相同吗?因为数据库、表、关系的模式是由不同的人设计的。它们肯定会不同,这可以说是人性使然。作为不同的个体,我们肯定有不同的思维、想法和设计,这是不可避免的,因此我们发现将事物整合在一起很困难。

我认为我们每天都会遇到数据集成的问题。我试着想一些日常生活中我们在整合、组织事物时遇到的问题,但发现所有这些例子都是旧的。例如,我经常抱怨整理书籍。过去我们购买实体教科书时,它们尺寸各异,很难整齐地摆放。另一个例子是过去我们购买CD或DVD时,它们也有不同尺寸,有些包装大,有些小,这总是令人头疼。这也是为什么我们在数据设计上存在很多差异。我们总是说,如果能有一个标准化格式就好了,但这并不总是可能。

纵观多年,我们尝试为许多不同的应用达成特定标准,但这并不总是可能。例如,如今我们仍然看到DVD的多种格式,可能是DVD、蓝光,或高清DVD等。我们仍然面对多种格式。好的。

那么,这就是本课程将要讨论的主要逻辑原因。因此,在后续描述数据集成的主题或步骤中,我们经常讨论如何处理这些逻辑原因。

数据集成困难的另一类原因实际上是社会原因,这又与人有关。这里列出的社会原因包括在企业中定位和捕获相关数据。你知道,当事物由人管理时,并不总是能找到所有东西。你可能认为它应该在那里,但就是找不到。这是可能的。另一件事是数据所有权。

当我们涉及到人,并且人们处于不同的管理级别时,你会发现人们可能并不总是愿意分享数据。因为你知道,数据也是财产,从另一个角度反映了你所拥有的权力。如果有人控制着特定的数据源或数据集,他或她可能不愿意分享,因为他或她会认为如果分享了,就可能失去对它的控制。这是一个原因。

另一件事是,人们可能担心如果与他人分享数据,就很难控制。这意味着有些人可能未经授权访问,你如何防止他人错误地访问数据或泄露给他人?这将涉及安全和隐私问题。隐私是我们在讨论数据时又一个非常重要的话题。因为现在我们访问的数据越来越多,所以在能够获取某些数据之前,必须解决隐私问题。即使我们能掌握数据,在进行数据集成时,是否会引起额外的隐私或安全问题?这也是我们在数据集成过程中进行数据分析时需要意识到的问题。

好的,我们已经概述了为什么数据集成困难。接下来的几页是说明为什么困难的例子。例如,在这一页中,我们试图举一个案例,假设我们看两家公司:FruitServe公司和EuroCard公司,这两家公司正在合并。

你可以看到,这两家公司起步规模不同,覆盖领域也不同。EuroCard实际上是一家信用卡服务公司,而FruitServe则从事销售等其他业务,有自己的服务等。它们原本是两家不同的公司,因此它们的数据库也不同。例如,FruitServe有员工信息,也有简历信息,而EuroCard也有这些,但覆盖的内容也不同。因此,关系、设计实际上不同,如何将它们整合在一起将会很困难。

如果我们看一个更小的应用,比如我们想要集成这两个数据库,以获得客户相关信息的完整图景,那么你会看到我们实际上需要处理具有不同关系的多个数据库。例如,我们想要集成信用卡信息,查看客户详细信息,查看过去的客户以及销售相关信息。我们需要集成所有这些,以获得完整的图景,潜在的好处可能是为客户增加更多价值。

对于逻辑原因,我们可以看到这里有两个数据集、两个数据库。一个数据库有病人表,另一个有两个表:入院病人表和地址表。如果你看姓名,我们已经提到过,这里是“姓名”,而我们有“姓氏”和“名字”。然后你可以看到出生日期,它们以不同的表示形式存在。还有性别,地址如何表示和存储?这将非常不同。即使我们有病人ID,但病人ID只适用于特定组织,这意味着它们不能帮助我们跨数据库集成,因此我们不能依赖ID。我们需要处理的是属性名称、模式属性名称以及内容。

当我们进行数据集成时,正如我们所提到的,数据集成确实很困难,需要考虑许多步骤。

目前还没有完全解决的方法,每个人都在思考可能的技术或步骤来帮助完成整个过程。

因此,我们将讨论这些步骤。在继续讨论步骤之前,我们必须提到另一件事:当我们谈论数据集成时,通常讨论两种场景,一种是数据仓库,另一种是虚拟数据集成。

当你查找“数据集成”这个术语时,经常会发现它与数据仓库相关。数据仓库实际上是将数据物理地放在同一个地方。通常,我们谈论的是非常复杂的数据处理、大量的转换和处理,最终它们以一个定义良好的模式集成在一起。然后你在集成的仓库上进行查询。

在本课程接下来的讲座中,我们将专注于虚拟数据集成。这意味着我们不是讨论将所有数据提取出来并物理地放在一个特定的地方,而是讨论所有数据仍然在其源位置。一切都在其原始位置,只是当我们想要进行查询时,我们需要能够知道从哪个源获取所需的具体信息。这意味着我们需要一些额外的过程,我们将讨论这些。

那么你可以看到,如果我们谈论虚拟数据集成,我们会有不同格式、不同位置的数据源。假设我们想要进行查询,我们会在一个模式上进行查询,我们称之为中介模式。然后该查询会根据描述其与源之间关系的源进行重新格式化,这样我们就知道从哪里获取数据。通过查询重写(这实际上是重新制定查询,使其具有逻辑和物理查询计划),我们将从每个源获取所需的数据。你可以看到这里会有许多不同的步骤,例如我们需要进行查询重写或转换。

这里是另一个例子。假设这是中介模式。

这个中介模式描述了我们想要拥有的内容。

那么,如果我们在这个中介模式上进行查询,我们需要知道可以从哪些源获取。你可以看到这里,中介模式谈论的是一个电影关系,但你可以看到它并不存在于一个特定的源中,而是无处不在。对于源一,它给了我们电影关系,但你可以看到属性名称并不相同。在这里,源一的电影关系谈论的是“名称”,而在中介模式中,我们想要电影的“标题”。

那么,你如何说明“名称”就是电影名称呢?还是演员姓名或导演姓名?你可以看到,“名称”这个词本身可以代表很多不同的事物。因此,如果我们想要描述“标题”和“名称”之间的关系,就需要一些处理。

有时你可以看到,并非某个特定的源会覆盖所有内容。例如,这里的源三只谈论纽约的电影院信息,而源四谈论旧金山的电影院信息,所以它并不完整。这涉及到覆盖范围,我们需要知道如何获取数据,并且源之间可能存在一些重复。

因此,对于数据集成,有许多详细的步骤。例如,其中之一是源与中介模式之间的关系,我们肯定需要一个映射。

我们需要知道中介模式与源模式之间的映射。如果我们能够进行模式映射,那么我们将能够合并或比较不同源之间的属性和模式。然后,我们将能够查看记录(元组),并能够比较元组与元组,以发现它们是否在谈论相似的实体、相同的实体或相同的个体。这将需要另一个步骤,称为记录链接

你会发现,有几个术语与数据集成密切相关。一个是模式映射,另一个是记录链接。这两个通常是整个数据集成过程中最重要的步骤。但近年来,还有更多步骤,例如另一个称为数据融合的步骤。实际上,“数据融合”一词有多种含义,但这里通常指真值发现

你知道,现在数据中存在许多不一致性。可能是因为存在错误、数据更新不同步,或者由于各种原因导致不同来源的数据不一致。因此,即使我们能够说这个数据库中的这条记录可能指的是与另一个数据库中的另一条记录相同的人,如果它们的值不一致,那么我们应该使用哪一个作为真值?因此,近年来提出了一个额外的步骤,称为数据融合或真值发现。实际上,我认为真值发现、虚假检测或假信息检测等在近年来也变得越来越重要。


在本节课中,我们一起学习了数据集成的核心概念。我们了解到数据集成是将多源数据统一视图的过程,面临着系统、逻辑和社会层面的多重挑战。核心步骤包括建立中介模式、进行语义映射模式映射记录链接以及数据融合(真值发现)。我们还区分了数据仓库(物理集成)和虚拟数据集成两种主要场景。理解这些基础是后续深入学习具体技术和方法的基石。

数据分析基础:15:大数据集成 🧩

在本节课中,我们将要学习大数据集成所面临的挑战。我们将从大数据的“4V”特性出发,探讨在处理海量、高速、多样且真实性不一的数据时,数据集成会遇到哪些具体困难。

上一节我们介绍了数据集成的概念与价值,本节中我们来看看在大数据背景下进行数据集成所面临的挑战。这些挑战通常可以用大数据的“4V”特性来概括。

  • Volume(体量大):数据量和数据源的数量都非常庞大。
  • Velocity(速度快):数据生成和更新的速度极快。
  • Variety(多样性):数据形式多样,包括结构化、半结构化和非结构化数据(如文本、数值、视频、图像等)。
  • Veracity(真实性):数据的质量和可信度参差不齐。

在后续内容中,我们将讨论研究人员如何针对这些方面进行验证和应对。


大数据集成的价值与应用

基于之前的应用案例,我们知道数据集成能够创造价值,无论是商业领域还是个人层面。从大数据视角来看,人们希望构建网络规模的知识库

例如,谷歌的知识图谱。当我们搜索“数据集成”时,如果该实体存在于知识图谱中,谷歌会展示相关信息。构建这样的知识图谱需要整合关于某个实体的所有信息:它在哪些数据中被提及,以及具体被如何描述。

其他网络规模的知识库还包括DBpedia、WikiData和YAGO。构建这类知识库的另一个目的是实现关联数据,以便进行推理,并支持多种应用。此外,处理数据分析(如整合多个生物信息学数据库)也是重要价值所在。


数据集成的三个核心步骤

正如前面提到的,数据集成通常包含三个主要步骤:

  1. 模式对齐:通常作为“模式映射”的替代术语。此步骤旨在根据表的设计、关系和属性,将不同数据表的列进行映射。
  2. 记录链接:此步骤旨在识别个体或实体,将不同数据源中的记录(元组)链接在一起。
  3. 真值发现/数据融合:此步骤旨在处理不一致的值和冲突的内容,通过集成找出“真相”。

相关研究洞察

上一张幻灯片我们谈到了效用问题,即投入资源集成大量数据源是否值得。以下是一些相关的基础研究,它们并非具体方法,而是提供了背景洞察。

研究一:需要多少数据源才能构建完整的领域数据库?

一组研究人员专注于研究需要整合多少数据源才能为特定领域(如图书、餐厅电话号码)构建完整的数据库。他们以雅虎搜索引擎的网页缓存作为参考基准,研究覆盖度。

以下是研究发现:

  • 对于餐厅电话这类信息,仅整合前5个主要数据源就能覆盖约80%的实体。斜率较缓意味着不需要覆盖太多源就能获得大部分信息。
  • 不同信息模式不同。电话号码通常在很多网页提供,但并非所有餐厅都有网页。

研究二:数据之间的连接程度如何?

该研究还调查了数据之间的连接性,即能否通过一个实体或信息找到其他关联实体。

研究发现,几乎所有实体都相互连接,最大连通分量中的实体数量覆盖了超过99%的实体。这意味着同样不需要探索所有数据源就能将大部分信息关联起来。

这些研究表明,构建网络规模的知识图谱是可行的,我们无需覆盖所有数据源,只需整合一定数量的关键源就能获得大部分信息。


数据异质性与质量问题

另一个研究方向是数据异质性带来的问题。一组研究调查了数据质量。

在数据量较小的时代,保持数据集清洁相对容易。但在大数据环境下,获得高质量、清洁的数据集变得困难。数据质量一直是数据分析应用中的关键问题。

该研究调查了股票和航班两个领域,观察数据值的不一致程度。

研究发现:

  • 股票领域的数据不一致性相对高于航班领域。航班数据通常非常简洁(如航班ID、航班号、时间),出错机会较少。
  • 股票数据的错误来源多样,包括:
    • 语义歧义:例如,“当日区间”或“52周区间”的定义在不同页面可能不同。
    • 单位错误:不同页面使用不同的计量单位。
    • 录入错误:纯人为输入错误,在航班和股票领域都存在。

研究还分析了错误类型的分布,这非常有趣:

  • 在股票领域,一个主要的错误来源是数据过时。这启示我们,在进行真值发现时,“真相”可能不是唯一的,它可能与时间相关。在某一时刻是真相的数据,在之后可能已被更新。
  • 在航班系统中,纯错误(即录入错误)也很常见。
  • 语义歧义同样存在。

这意味着在进行数据集成时,我们必须考虑错误处理。

为什么会出现错误?

错误,尤其是重复出现的错误,很可能源于复制传播。就像之前提到的新闻案例,一个由某人造成的错误可能会传播开来,影响其他数据源。

因此,在处理不同数据源时,我们必须处理数据不一致性、错误和复制传播等问题。这些都将成为数据融合步骤中需要重点研究和解决的问题。


总结与下节预告

本节课中我们一起学习了大数据集成的挑战,包括其“4V”特性带来的困难、数据集成的价值与应用、核心的三个步骤(模式对齐、记录链接、数据融合),以及关于数据源覆盖度和数据质量的相关研究洞察。

下一讲我们将开始深入探讨这三个步骤中的第一步:模式对齐。我们将研究当拥有两个数据源时,如何判断某一列应与另一列匹配,以及如何进行映射(例如,处理不同货币单位的价格数据)。之后,我们会继续讲解记录链接和数据融合。

016:模式对齐导论 🧩

在本节课中,我们将要学习数据集成中的一个核心环节——模式对齐。模式对齐是整合来自不同数据源信息的第一步,它旨在解决不同数据源之间模式(即数据结构)的差异问题。

为什么需要模式对齐?

上一节我们介绍了数据集成的基本概念,本节中我们来看看为什么模式对齐是必不可少的。原因在于模式异构性。当我们进行数据集成时,面对的是来自不同数据源的数据集。这些数据集可能以不同的方式表示相同或相似的数据,这意味着它们拥有不同的模式。因此,为了能够将这些数据整合在一起,我们首先需要理解各个数据源的模式,包括它们的属性,并建立它们之间的映射关系。只有这样,我们才能将数据正确地映射和合并。

模式不同是普遍存在的现象。这源于人类的本性。即使两个人设计相同领域或主题的系统,其结果也往往不同。模式是由不同的人或组织为了不同的用途而设计的,因此它们自然会存在差异。即使讨论的是同一个领域或主题,模式也可能不同。

模式对齐的目标

模式对齐的目标是处理这些模式异构性。基于模式间的差异,我们需要在源模式(例如一个数据源的模式)和目标模式(例如另一个数据源的模式,或在数据集成中常指的“中介模式”)之间建立映射。

回顾数据集成过程,我们通常采用以下方式:存在多个数据源,我们创建一个中介模式来承载查询。这些查询会被重新表述为对每个数据源的查询,返回的结果再被集成,作为对中介模式查询的最终答案。因此,模式对齐可以是两个源模式之间的映射,也可以是中介模式与一个或多个数据源模式之间的映射。

模式异构性的表现

当讨论模式异构性时,我们指的是模式之间的差异。这些差异几乎可以出现在任何地方。

以下是几种主要的差异类型:

  • 表和属性名称差异:不同数据库中的关系(表)可能使用不同的名称,即使它们描述相似的概念。表内的属性名称在不同数据源之间也可能有很大差异。例如,一个数据源可能用 location 表示地点名称,而另一个数据源可能用 placeplace_name。虽然它们都指代地点这个概念,但属性名不同。
  • 表组织结构差异:不同数据源设计表结构的方式可能不同。例如,一个数据源可能将演员信息和电影信息分开存储在两个表中,并通过关联表连接;而另一个数据源可能将演员姓名和电影标题直接放在一个表中。
  • 覆盖范围和粒度差异:不同数据源覆盖的数据范围和详细程度可能不同。例如,一个关于城市的表可能包含城市级别的信息,而另一个关于地点的表可能只包含区级的信息。
  • 数据表示差异:数据值的表示格式可能不同。例如,日期可能以“YYYY-MM-DD”格式存储,也可能只存储年份;温度可能用摄氏度或华氏度表示;价格可能包含或不包含税费。

模式对齐的步骤

模式对齐可以看作包含三个主要步骤:

  1. 创建中介模式:首先,需要定义一个中介模式,作为数据集成后查询的统一视图。
  2. 属性匹配:将中介模式中的属性与各个数据源模式中的属性进行匹配,识别出哪些属性是相互对应的。
  3. 建立映射:基于匹配结果,创建具体的转换规则或映射,说明如何从源数据计算出中介模式所需的数据。

让我们详细看看第一步:中介模式。中介模式的设计高度依赖于具体的数据集成需求。通常,它需要我们对所处理的领域和数据源有深入的了解,因此这个过程很难完全自动化。在后续讨论中,我们将假设中介模式已经给定,并专注于如何建立它与源模式之间的映射。

接下来是属性匹配(也称为模式匹配)。这一步主要是比较和识别属性对之间的潜在对应关系,例如判断 nametitle 是否可能指向同一概念。匹配关系可以是一对一、一对多或多对多。

然而,仅仅识别出属性匹配还不够,我们还需要处理数据层面的异构性。例如,两个属性都表示“价格”,但一个含税一个不含税,这就需要通过计算(如乘以税率)来进行转换。因此,我们需要从简单的匹配进一步“阐述”为详细的映射规则。

模式匹配与模式映射

模式匹配和模式映射是两个相关但不同的概念。

  • 模式匹配:侧重于识别源模式和目标模式(或中介模式)之间潜在的属性对应关系。它是一个“建议”过程,输出可能的匹配对。
  • 模式映射:侧重于定义如何从源数据推导出目标数据。它是一个“阐述”过程,需要指定具体的转换函数、约束条件和数据来源。

将整个过程分解为匹配和映射两步,有助于降低复杂性。先通过(相对容易部分自动化的)匹配步骤缩小候选范围,再基于这些匹配结果,利用领域知识来构建精确的映射规则,这样可以减少从头开始构建完整映射所需的工作量和专业知识。

面临的挑战

模式对齐之所以困难,主要有以下挑战:

  • 语义异构性普遍存在:由于设计者、用途、背景不同,差异是不可避免的。
  • 依赖自然语言描述:模式信息(如表名、属性名、注释)通常是自然语言文本,需要预处理和解释,且可能不完整或不可靠。
  • 名称的歧义性:像 name 这样的常见属性名可以指代人、电影、地点等任何事物的名称,增加了匹配的难度。
  • 标准化不可行:由于涉及的领域太广、需求变化太快,且不同组织难以达成一致,为所有数据建立统一的标准模式是不现实的。

实例观察

考虑从两个不同图书馆系统查询同一本书的记录。即使对于“书”这个相对简单的领域,两个系统的记录模式也存在明显差异:出版地在一个系统中是单独的属性,在另一个系统中则包含在“出版项”里;ISBN号在一个系统中属性名为“标识符”,在另一个系统中则叫“标准书号”。这些差异直观地展示了模式对齐在实际应用中面临的挑战。

本节课中我们一起学习了模式对齐在数据集成中的核心作用。我们了解了模式异构性的各种表现,探讨了模式对齐的三个基本步骤(创建中介模式、属性匹配、建立映射),并区分了模式匹配与模式映射的概念。最后,我们认识到由于语义差异的普遍性和标准化难以实现,模式对齐是一个复杂但至关重要的过程,通常需要结合自动化工具和领域知识来共同完成。

017:匹配系统

在本节课中,我们将学习如何构建一个匹配系统,用于识别不同数据源中可能相互对应的属性。我们将从最简单的“一对一匹配”开始,逐步探讨如何结合多种信息源来提高匹配的准确性。


上一节我们介绍了匹配系统的基本概念和挑战,本节中我们来看看如何具体实现一个匹配系统。首先,我们聚焦于“一对一匹配”,即识别两个数据源中可能成对的属性。

为了最大化匹配的准确性,系统需要能够处理属性之间的各种差异。我们可以通过多种方式进行匹配。

以下是几种主要的匹配方式:

  • 基于属性名的匹配:通过比较属性名称的相似度来识别可能的匹配。
  • 基于属性值的匹配:通过分析属性下具体数据的相似度或重叠度来辅助判断。

仅仅依赖单一信息源(如只比较名字或只比较数据)往往无法确定最佳匹配。例如,一个名为“release_info”的属性,仅通过名称可能同时与“release_date”和“release_company”相似。但通过查看其属性值,可能发现它更符合“release_date”的数据模式。因此,我们需要结合多种匹配方式的结果。


上一节我们讨论了结合多种匹配方式的必要性,本节中我们来看看匹配系统的整体架构。

一个完整的匹配系统通常包含多个匹配器。每个匹配器接收源模式和目标模式,并输出一个表示属性对之间相似度的相似度矩阵

接下来,系统需要一个组合器,将多个相似度矩阵合并为一个统一的矩阵。然后,基于专家知识或背景知识定义的约束,对可能的匹配组合进行剪枝,得到一个精简后的矩阵。

最后,通过匹配选择器从精简矩阵中挑选出最可能的匹配对,并将其具体化为最终的匹配关系。

整个流程可以概括为:多个匹配器生成相似度矩阵 -> 组合器合并矩阵 -> 约束执行器剪枝 -> 匹配选择器挑选 -> 具体化为匹配。


上一节我们概述了匹配系统的流程,本节中我们深入看看核心组件“匹配器”。

每个匹配器的任务是:输入源模式和目标模式,可能结合数据实例或其他文本描述等辅助信息,输出一个相似度矩阵。该矩阵的每个元素代表源模式中一个属性与目标模式中一个属性之间的相似度得分,得分通常在 0到1 之间。

匹配器主要分为两大类:

  • 名称匹配器:专注于比较属性名称。
  • 数据匹配器:专注于比较属性值。

对于名称匹配器,由于属性名通常是字符串,因此会使用字符串相似度度量,如编辑距离、Jaccard相似度等。在实际比较前,通常需要对属性名进行预处理,例如:

  • 分词:将“CellLocID”拆分为“Cell”, “Loc”, “ID”。
  • 词义扩展:将缩写“Loc”扩展为“Location”,或添加同义词(如“cost”添加同义词“price”)。
  • 移除停用词并进行词干提取等自然语言处理步骤。

这样做的目的是将原始属性名标准化为一组术语,以便更全面、准确地计算相似度。


上一节我们介绍了名称匹配器,本节中我们通过一个例子来看它的实际应用。

假设我们使用基于集合的相似度度量(如Jaccard相似度)来比较电影数据源中的属性。通过比较所有属性对(如“name”与“name”、“name”与“title”、“release_info”与“release_date”等),并只保留非零相似度得分,我们可能得到如下结果:

  • name (源) 与 name (目标):相似度 1.0(完全匹配)。
  • name (源) 与 title (目标):相似度 0.2(通过同义词关联)。
  • release_info (源) 与 release_date (目标):相似度 0.5(部分匹配)。
  • base_price (源) 与 price (目标):相似度 0.8(经过词义扩展后高度相似)。

这些得分构成了名称匹配器输出的相似度矩阵(此处仅展示非零部分)。


上一节我们看了基于名称的匹配,本节中我们转向基于属性值的匹配,即数据匹配器。

数据匹配器主要有三种实现思路:

  1. 基于识别器的匹配:利用字典或规则来识别属性值的类型。例如,构建一个国家名称字典,如果一个属性的值大多能匹配该字典,则该属性很可能表示“国家”。同样,可以识别电话号码、颜色、基因名称等。如果两个属性都被识别为同一种类型,则它们可能匹配。
  2. 基于重叠度的匹配:直接计算两个属性值集合的重叠程度。例如,比较“name”属性和“title”属性的值集合,如果它们包含大量相同的电影名,则重叠度高,匹配可能性大。可以使用 Jaccard相似度 等指标来衡量。
  3. 基于分类器的匹配:利用机器学习技术。为源模式中的某个属性(如“address”)训练一个分类器,以其属性值作为正例,以其他属性的值作为负例。然后用这个分类器去预测目标模式中每个属性的所有实例,计算预测置信度的平均值,作为这两个属性间的相似度得分。公式可以表示为:
    相似度(S_i, T_j) = 平均( 分类器C_S_i 对 T_j 中每个实例的预测置信度 )
    可以双向训练分类器并合并结果以提高鲁棒性。

基于属性值的匹配可能得出与名称匹配不同的结论。例如,名称匹配可能认为“name”与“name”最相似,但数据匹配可能发现“name”与“title”的值重叠度更高。


上一节我们介绍了多种匹配器,本节中我们来看看如何整合它们的结果,即“组合器”的作用。

组合器的任务是将多个匹配器输出的相似度矩阵合并为一个统一的矩阵。有几种简单的合并策略:

  • 平均值:对同一属性对在所有矩阵中的得分取平均。合并得分 = (得分1 + 得分2 + ... + 得分K) / K
    这表示所有匹配器被平等看待。
  • 最大值:取同一属性对在所有矩阵中的最高得分。合并得分 = max(得分1, 得分2, ..., 得分K)
    这表示我们信任最强的匹配信号。
  • 最小值:取同一属性对在所有矩阵中的最低得分。合并得分 = min(得分1, 得分2, ..., 得分K)
    这表示我们要求所有匹配器都给出一定的相似度证据。

也可以使用更复杂的组合方式,例如:

  • 基于规则的组合:根据领域知识指定规则。例如,如果属性是“地址”,则直接采用数据匹配器的得分,忽略名称匹配器。
  • 加权和:为不同匹配器分配不同的权重,权重可以通过机器学习从训练数据中习得。
  • 使用元学习器:训练一个分类器(如决策树)来学习如何最佳地组合各匹配器的得分。

上一节我们讨论了如何组合匹配结果,本节中我们看看如何利用领域知识进一步优化匹配,即“约束执行器”。

在得到合并的相似度矩阵后,可能仍然存在许多可能的匹配组合。约束执行器利用领域知识定义的完整性约束来剪枝不可能的匹配。

例如,假设我们有两条匹配组合路径M1和M2,它们的总体相似度得分很接近。我们可以添加一个约束:“如果属性A匹配‘电影名’,那么A的值中单词数大于4的比例应较高”。如果M1中的对应属性是“位置名”(通常单词数少),可能不满足此约束,而M2满足,从而帮助我们选择M2。

通过应用此类约束,可以有效地减少候选匹配的数量,使结果更精确。


上一节我们利用约束缩小了候选范围,本节中我们进行最后的筛选与输出,即“匹配选择器”和“具体化”。

匹配选择器通常很简单,例如设置一个阈值,只保留相似度得分高于该阈值的属性对作为最终候选匹配。

最后一步是具体化,即将筛选出的属性对转化为可执行的模式映射关系。例如,我们确定了“price”和“base_price”是一对匹配,但具体的映射可能涉及复杂的转换(如单位换算、公式计算)。从简单的属性匹配到完整的模式映射,通常还需要进一步的探索和搜索。


本节课中我们一起学习了构建一个数据匹配系统的完整流程。我们从简单的“一对一匹配”出发,介绍了名称匹配器数据匹配器的核心原理,了解了如何通过组合器整合多源信息,并利用约束执行器匹配选择器来优化和确定最终的匹配对。这个过程体现了解决复杂数据整合问题时,结合多种证据和领域知识的重要性。

018:大数据模式对齐

在本节课中,我们将探讨大数据环境给模式对齐带来的新挑战,并介绍几种应对这些挑战的先进思路和方法。

上一节我们介绍了在传统数据集成中如何进行模式对齐,包括模式匹配和模式映射。本节中我们来看看当数据规模变得巨大时,模式对齐会面临哪些新问题。

😊 大数据带来的挑战

大数据在体量速度多样性三个维度上给模式对齐带来了新的困难。

以下是主要挑战的具体分析:

  • 体量问题:需要处理的数据源数量庞大,且每个数据源本身可能包含海量数据实例。即使只对两个数据源进行模式对齐,其复杂度已经很高,处理大量数据源则更具挑战性。
  • 速度问题:现代数据环境中,模式可能是动态变化的,会根据需求和情境进行调整。同时,新的数据源和数据会不断涌现,这意味着数据源的数量在持续增长。
  • 多样性问题:数据源之间存在巨大的多样性和异构性,其模式也各不相同,并且这些模式本身也可能在不断变化。

面对这些挑战,传统的、构建统一中介模式的集成方法已不再可行。因此,研究人员提出了一些新的思路。

🚀 数据空间与“按需付费”方法

一种被建议的应对方法是采用数据空间“按需付费” 的方法来处理大数据集成或模式对齐。

传统的数据集成方法(如构建统一的中介模式或数据仓库)在大数据场景下面临困难。因为将海量数据物理集成到一处不现实,为大量异构数据源构建统一的中介模式也极其困难。

因此,可行的思路是从简单、有用的服务开始,然后迭代地添加更多功能和复杂度,这就是“按需付费”方法。该方法将问题分解为两个主要部分:

  1. 系统引导:从用户服务开始,例如上一节提到的自动模式匹配。我们首先尝试识别属性对之间的匹配关系。
  2. 迭代改进:允许用户验证和改善模式匹配或映射的结果,从而迭代地提升匹配和映射的质量。

🎲 融入不确定性:概率中介模式

在引导系统时,由于存在多种可能性,我们需要将不确定性融入到模式对齐过程中。

这意味着我们需要使用概率中介模式。与之前确定性的中介模式不同,概率中介模式能够对不确定性进行建模,因为在大数据环境下,我们对许多事情都无法完全确定。

一旦建立了概率中介模式,我们就尝试创建从源模式到中介模式的映射,即关注属性之间的映射关系。这种映射本身也是带有概率的。

让我们看一个例子。假设有两个数据源 S1 和 S4。我们不是直接将源属性与中介模式匹配,而是首先基于相似性或共现性等方法对源属性进行聚类

例如,我们可能得到四个聚类(M1 到 M4)。然后,我们选择概率最高的聚类(如 M1 和 M2)来构建可能的中介模式。接着,我们建立源模式与这个概率中介模式之间的概率映射

❓ 基于概率的查询应答

建立了概率中介模式和概率映射后,我们就可以进行查询应答。主要有两种方式:按表语义按元组语义

以下是两种方式的说明:

  • 按表语义:将映射规则应用于整个数据表。例如,应用映射 G1(概率 0.6)到源表,会得到一个结果表;应用映射 G2(概率 0.4)会得到另一个结果表。每个结果都带有其映射规则的概率。
  • 按元组语义:可以对不同的数据元组应用不同的映射规则。例如,对第一个元组应用 G1,对第二个元组应用 G2,这样就产生了一种新的可能性。通过组合不同的映射应用方式,我们可以得到多个可能的结果表,每个结果表的概率是其所用映射规则概率的乘积。最终,我们可以汇总所有可能性,为查询结果中的每个值计算一个概率分数。

这就是在模式对齐中融入不确定性,并通过概率中介模式和概率映射进行查询应答的基本思想。

🌐 应对数据多样性:集成网络表格

除了体量和速度,数据的多样性(如非结构化数据)也是巨大挑战。接下来我们看看如何集成没有清晰模式的网络表格

网络表格通常规模小、没有明确的模式描述,且格式各异。研究表明,尽管网络表格众多,但只有相对少量的模式频繁出现,这意味着跨表格对齐模式是可能的。

首先,我们需要找到相关的表格。一个建议的方法是执行关键词搜索来检索相关表格,并根据查询词对表格进行排名。

研究发现,网络表格通常具有一些特征。例如,关键词如果出现在表格标题中,则该表格相关性更高;如果只出现在正文里,则相关性可能较低。因此,在排名时可以考虑表格特有的特征,如关键词是否出现在表头或最左列。

另一个特征是模式的连贯性,可以通过计算属性之间的点互信息 来衡量。PMI 公式如下:
PMI(A, B) = log( P(A, B) / (P(A) * P(B)) )
其中 P(A, B) 是属性 A 和 B 共同出现的概率,P(A)P(B) 是它们各自出现的概率。PMI 值越高,表明这两个属性共同出现的频率远超随机预期,该表格的模式连贯性越高,相关性也可能越强。

找到相关表格后,下一步是识别和标注表格中的属性。我们可以利用本体或知识库。通过将表格中的实体值与知识库中的条目进行匹配,我们可以推断出该列所代表的属性类型(例如,通过识别一列值都是政治家,推断该列属性为“政治家”)。

此外,在集成多个相关表格时,还需要研究它们之间的一致性互补性。例如,两个表格的模式是否一致?它们是在扩展同一实体的信息,还是在提供新的属性?

📚 总结

本节课中我们一起学习了大数据模式对齐的核心挑战与前沿思路。

我们首先回顾了大数据在体量、速度和多样性上给传统模式对齐方法带来的挑战。接着,我们介绍了数据空间“按需付费” 这种迭代式、渐进式的集成新范式,其核心是通过概率中介模式概率映射来建模和应对不确定性。最后,我们探讨了如何集成网络表格这类缺乏清晰模式的异构数据源,涉及基于关键词和模式连贯性的表格检索、利用知识库进行属性标注,以及评估表格间的一致性与互补性。

面对众多不同的方法,关键在于理解基本思想和核心挑战,然后根据具体问题去探索和选择合适的解决方案。大数据环境下的数据集成与模式对齐是一个持续演进的领域,需要结合传统智慧与创新思维来应对。

019:机器学习绪论

在本节课中,我们将要学习机器学习的基本概念。我们将探讨什么是机器学习,它有哪些应用,以及其核心特点和优缺点。通过本课的学习,你将建立起对机器学习的初步认识,为后续深入学习打下基础。

什么是机器学习?

上一节我们介绍了课程概述,本节中我们来看看机器学习的定义。机器学习,顾名思义,是研究机器如何学习的一门学科。学习对我们人类至关重要,我们每天都在学习新事物,积累经验,从而改进我们对事物的理解和处理方式。机器学习的目标与此类似,即让机器能够自动地从过去的经验中学习,从而做出准确的预测或行动。

例如,根据我们的经验,如果天空乌云密布,那么很可能会下雨。这是一个简单的观察和结果。在未来某一天,当我们再次看到天空布满乌云时,我们就会预测即将下雨。这就是我们学习和预测的方式,机器学习也是如此。给定所有的经验(即过去的观察和例子),机器如何能够自动地从这些例子中学习,并在面对新情况时预测其结果。

分类问题

在机器学习中,一个非常重要且经常被用来解决的问题是分类问题。分类问题意味着我们希望将样本(或事物)划分到给定的类别中。也就是说,我们有一些预定义的类别和一些项目(样本),我们需要判断每个项目属于哪个类别。

分类问题之所以常与机器学习一同提及,是因为它非常重要,几乎无处不在。我们人类实际上也一直在进行分类。例如,在街上看到一个人,你会判断是否认识他/她。这就是一个分类问题,类别是“认识”和“不认识”。再比如,在购物时挑选水果,你会判断一个苹果是否是好苹果、是否好吃,这也是一个分类。

如果能让机器帮助我们处理一些分类问题,那将非常有用。例如,让机器通过一张苹果的照片来判断其好坏。在未来,我们甚至可以实现远程挑选水果。此外,在电子化存储的今天,自动将文档、网页归类也极大地依赖于分类技术。新闻文章的分类就是一个已经应用多年的例子,图书馆或大学利用机器学习将电子文档自动归入合适的类别,方便查找和使用。

机器学习如何工作?

在了解了分类问题后,我们来看看机器学习是如何具体运作的。下图展示了一个很好的例子,说明了机器学习的具体用途。

我们知道,机器学习是从过去的经验中学习,以帮助我们处理各种问题,例如分类。当我们进行分类时,是观察一个样本,然后基于某些规则或模式来预测其类别。

那么,这些分类规则从何而来?当然,我们可以手动构建它们,例如通过一系列条件语句(if-else)。但这会涉及大量规则,手动编写这些规则非常麻烦。为了自动构建这些规则,机器学习就可以发挥作用。机器学习算法会查看我们所说的“过去的观察”,在机器学习领域,我们通常称之为带标签的训练样本

基于这些过去的观察,机器学习算法将自动构建出分类规则。然后,我们就可以利用这些构建好的规则进行预测。这就是机器学习帮助我们学习不同模型,以进行预测和应用的方式。

机器学习的应用

之前我们主要看了分类问题,现在来看看机器学习具体能帮助我们做什么,有哪些现实世界的应用已经在使用机器学习。

以下是机器学习的一些应用领域,实际上这个列表非常非常长,新的应用每天都在涌现。

  • 文本分类:这是分类问题的一种。它指的是确定一段文本(如文档)的类别。一个主要用途是电子邮件管理。我们可以利用机器学习对收到的邮件进行分类,将其归入不同的文件夹或打上不同的标签,例如“重要邮件”、“垃圾邮件”、“同事邮件”等。垃圾邮件过滤就是一个典型应用,像Gmail、Outlook等邮件服务提供商已经利用机器学习技术自动识别并将垃圾邮件放入垃圾文件夹。
  • 欺诈检测:这与文本分类中的垃圾邮件过滤类似。例如,金融机构在处理信用卡申请时,可以利用机器学习识别虚假申请。
  • 光学字符识别:将扫描的图片格式文档中的字符和文本自动识别出来,转换为真正的电子文本格式。这使得扫描文档更易用,并能与其他应用(如文本分类)结合。
  • 机器翻译:自动翻译也广泛运用了机器学习。它首先利用OCR技术识别图片中的字符,然后通过自然语言处理技术理解文本含义,最后进行语言间的转换。
  • 自然语言处理:这是机器学习的一个重要领域,用于理解人类使用的自然语言。除了翻译,它还应用于情感分析(分析人们对产品的评论是正面还是负面)、话题趋势分析(了解社交媒体上最热门的话题)等。
  • 机器视觉:处理视觉信息。一个应用是人脸检测,即在图像或视频中定位人脸。这被广泛应用于视频通讯美化、安防监控、身份认证等。另一个应用是物体检测,识别图像中出现的物体。
  • 自动驾驶:基于大量历史经验和实时数据,让汽车自动做出驾驶决策。类似的技术也应用于航空航天(如自动驾驶)和制造业(如缺陷检测)。
  • 预测:预测客户行为、物流配送需求、交通拥堵情况等,帮助企业和政府提前做出安排。

我们可以看到,机器学习的应用无处不在,并且未来将在我们生活的更多方面发挥作用。

现代机器学习的特点

在了解了机器学习的应用之后,我们来讨论一下现代机器学习的特点。机器学习的目标是在测试数据(即未见过的数据)上做出高精度的预测,而不是去揭示绝对的底层真理。我们希望模型能很好地应用于未来的、未知的数据。

理想的方法应该是通用、全自动的,即需要最少的人工干预。但在现实中,获取和处理用于学习的“过去的经验”(即数据)本身就需要大量人力。数据通常并不完美,可能存在错误,需要经过清洗、预处理等步骤才能使用。此外,要选择和应用合适的机器学习算法,我们需要先理解问题本身和数据的特性,这需要人类的先验知识和背景知识。因此,尽管我们追求自动化,但实践中仍需要大量人工努力。

现代机器学习通常涉及大量理论和实践的结合。我们探索理论并将其应用于机器学习,但必须通过实践来检验模型是否有效,这取决于具体问题和数据特性。

最后,现代机器学习的一个重要特点是能够处理大规模数据集。在过去,由于计算能力有限,无法在大数据上运行复杂的机器学习算法。如今,计算能力已不再是瓶颈,因此处理大数据集成为现代机器学习的关键特征。大数据的“4V”特性(Volume大量, Velocity高速, Variety多样, Veracity准确)要求机器学习算法能够应对数据量大、变化快、类型多、可能存在噪声和错误等挑战。

机器学习的优势与劣势

我们讨论了机器学习的应用、核心思想和特点,现在来看看为什么我们要使用机器学习,即它的优势和劣势。

以下是机器学习的主要优势:

  • 通常能获得比人工制定更准确的规则:因为机器学习由数据驱动,能够处理和分析海量数据,从而发现人类可能忽略的复杂模式。
  • 能够表达人类难以描述的知识:人类有时凭直觉或经验知道某事,但很难详细解释原因。机器学习模型可以从数据中学习并构建出可解释的规则或模型。
  • 无需持续的人工专家或程序员干预:一旦建立了合适的机器学习算法,它就可以自动从数据中学习,无需程序员不断调整参数或专家手动进行分类预测。
  • 自动搜索解释数据的假设:机器学习算法会广泛探索数据,寻找能够解释数据的最佳方式(即假设)。
  • 成本低廉且灵活:开发一个机器学习算法可能需要大量研究和实验(初始成本高),但一旦开发成功,将其应用于新的学习任务时,成本相对较低。它易于添加新样本,适应新任务,无需每次都从头开始。

以下是机器学习的主要劣势:

  • 需要大量标注数据:大多数机器学习算法需要大量的“过去的经验”,即带标签的数据,才能学习并达到良好的性能。而获取和准备高质量的标注数据本身是一项耗时费力的工作。
  • 存在错误概率,难以达到完美精度:机器学习算法由数据驱动,而现实世界的数据充满变化和噪声。模型可能无法捕捉到所有变化,或者数据中的错误会导致学习结果不准确,因此通常无法达到100%的预测准确率。

比较优势与劣势,优势显然更为突出。我们需要能够灵活、低成本地应用于各种任务和新数据的算法,这正是机器学习存在的价值。

带标签数据集与无标签数据集

在之前的讨论中,我们反复提到了“带标签的数据”这个概念。这对于机器学习至关重要。与带标签数据集相对的是无标签数据集。下面我们来详细讨论它们,这与机器学习中数据的表示方式有关。

在机器学习中,我们通常按以下方式表示数据:

  • 带标签数据集:包含已知结果的观察(过去经验)。我们用 X 表示特征集,包含 n 个样本,每个样本是一个 d 维向量(即具有 d 个特征值)。同时,我们有一个标签集 C,包含了这 n 个样本对应的已知结果(标签)。因此,带标签数据集是 (X, C) 的组合。
  • 无标签数据集:我们只有特征集 Xn 个样本的 d 维特征向量),而没有对应的标签集 C。我们不知道每个样本的结果。

公式表示

  • 带标签数据集: {(x_i, c_i) | i = 1, ..., n}, 其中 x_i ∈ R^d, c_i 是标签。
  • 无标签数据集: {x_i | i = 1, ..., n}, 其中 x_i ∈ R^d

例子:假设我们要对人们的健康状况进行分类。特征集 X 可以包含 n 个人的体检值(如身高、体重、血压、体温等,共 d 项指标)。标签集 C 则对应这 n 个人的健康状况(如健康、感冒、高血压等)。这就是一个带标签数据集。如果只有体检值而没有健康状况诊断,那就是一个无标签数据集。

训练数据集与测试数据集

机器学习中另外两个非常重要的概念是训练数据集和测试数据集。

我们假设存在一个全体数据,它包含了所有可能的数据对(所有可能的观察实例)以及它们在现实世界中出现的概率分布。但显然,我们不可能获得全体数据。

在实际应用中,我们只能获得全体数据的一个子集,我们称之为训练数据集。训练数据集用于学习全体数据的属性和知识。机器学习的目标就是利用这个子集,学习到能够解释全体数据属性的模型,从而能够预测未来的、未见过的样本。

为了检验我们学习到的模型是否真的掌握了全体数据的属性(即能否很好地预测新数据),我们需要另一组数据。这组数据被称为测试数据集。我们使用学习到的模型对测试数据集进行预测,并通过比较预测结果与真实标签来验证模型的性能。

因此,在机器学习中,我们通常需要将已有的数据划分为两部分:一部分用于训练模型(训练集),另一部分用于测试模型性能(测试集)。

下图展示了训练集和测试集的概念:

假设我们有一个未知的全体数据集。我们获取它的一个子集作为训练数据,通过观察学习到一些属性(例如,可以将数据分为两类)。然后,我们获取另一个子集作为测试数据,将学习到的模型应用于它,以验证模型是否能正确分类这些新样本,从而评估学习效果。

总结

本节课中,我们一起学习了机器学习的基础知识。我们首先探讨了机器学习的定义,即让机器从经验中自动学习以做出预测。接着,我们深入了解了分类这一核心问题及其普遍性。然后,我们通过图示理解了机器学习的工作原理:利用带标签的训练数据自动构建规则,并应用于预测。我们还列举了机器学习在文本分类、OCR、翻译、视觉、自动驾驶等多个领域的广泛应用。之后,我们分析了现代机器学习的特点、优势与劣势。最后,我们明确了几个关键概念:带标签与无标签数据集、训练集与测试集,它们是理解和实践机器学习的基石。通过本课的学习,你应该对机器学习有了一个初步而全面的认识。

020:性能度量与机器学习类型

在本节课中,我们将要学习如何评估机器学习算法的性能,并了解机器学习的主要类型。我们将探讨不同的性能度量指标,理解过拟合与欠拟合问题,并介绍交叉验证这一重要技术。最后,我们将区分监督学习、无监督学习和强化学习这三种主要的机器学习范式。

性能度量

上一节我们介绍了训练集和测试集的作用。本节中我们来看看如何定量地衡量机器学习算法的性能。

我们需要一个定量的度量标准来评估机器学习算法的能力。具体使用哪种度量标准,取决于我们要测量的内容和任务类型。例如,对于分类任务,我们想知道模型是否能正确分类测试数据;对于预测任务,我们关心预测值是否接近真实值。不同的任务或应用需要不同的定量度量标准。

以下是针对不同任务的常见性能度量指标:

  • 分类任务:通常使用准确率,即模型产生正确输出的样本比例。也可以使用错误率,即模型产生错误输出的样本比例(也称为0-1损失期望)。其他常用指标还包括召回率、精确率、F值、混淆矩阵等。
  • 连续值预测任务:无法简单地用正确或错误来衡量。常用指标包括均方误差平均绝对误差,它们衡量的是预测值与实际值之间的差异。

过拟合与欠拟合

在讨论性能度量时,我们常会提到过拟合和欠拟合这两个术语。让我们来理解它们的含义。

机器学习的目的是利用训练数据集学习问题的属性和知识,并用其预测未来的未知样本。我们希望模型在未知样本上也能表现良好,即模型应具有良好的泛化能力。我们通过最小化训练误差来学习模型,但最终目标是让模型在测试集(未知样本)上的误差(即泛化误差)也尽可能小。一个好的机器学习算法应能同时减小训练误差和训练误差与测试误差之间的差距(即泛化误差)。

然而,模型可能无法达到理想的泛化效果,主要会出现以下两种问题:

  • 过拟合:模型在训练数据上表现非常好(训练误差低),但在未知数据上表现很差(测试误差高)。这意味着模型过于复杂,过度捕捉了训练数据中的噪声和细节,而未能学习到底层的普遍规律。
  • 欠拟合:模型在训练数据和测试数据上都表现不佳(训练误差和测试误差都高)。这通常是因为模型过于简单,无法充分表示数据的特征和属性。

为了更直观地理解,可以参考下图:

  • 左图(过拟合):蓝色曲线(模型)完美地穿过了所有训练数据点(黑点),但对真实函数(绿线)的拟合很差。这表明模型对训练数据“死记硬背”,泛化能力弱。
  • 右图(欠拟合):蓝色直线(模型)过于简单,既无法很好地拟合训练数据,也无法反映真实的数据关系。

过拟合和欠拟合都是我们不希望发生的问题。

交叉验证

为了解决过拟合和欠拟合问题,我们可以使用交叉验证技术。

之前的方法是:用训练集学习模型,用测试集评估性能。但这样容易导致模型在测试集上表现不佳。交叉验证的核心思想是:在训练阶段就估计模型的泛化误差,从而选择出泛化能力最好的模型。具体做法是将训练数据进一步拆分。

我们通常将原始训练数据划分为两部分:

  • 训练子集:用于实际训练模型。
  • 验证集:用于在训练过程中或训练后估计泛化误差。验证集来自训练数据,我们知道其标签,因此可以评估模型在其上的性能,以此作为泛化误差的估计。

一个典型的划分比例是80%的数据用于训练,20%用于验证。但固定划分一次仍然可能因数据划分的偶然性导致评估不准。因此,我们使用交叉验证

交叉验证的基本流程是:将训练数据多次划分,每次使用不同的部分作为验证集,最终综合多次评估结果。以下是具体步骤:

  1. 将整个训练数据集平均分成K个互不相交的子集(称为“折”或“份”)。
  2. 进行K轮训练和验证。在每一轮中,选取其中一个子集作为验证集,剩下的K-1个子集合并作为训练集。
  3. 训练模型,并在该轮的验证集上评估性能,得到一个性能估计值。
  4. 重复步骤2和3,直到每个子集都恰好被用作一次验证集。
  5. 计算这K轮性能估计值的平均值,作为该算法性能的最终估计。

这种方法被称为K折交叉验证。K通常取5或10。对于小数据集,K折划分可能导致训练数据不足,此时可以使用留一法交叉验证,即每次只留一个样本作为验证集,其余全部用于训练。

我们利用交叉验证来评估不同模型的性能,并从中选择最佳模型。其目标是学习一个具有低泛化误差的模型,而不仅仅是低训练误差。

机器学习类型

到目前为止,我们讨论的机器学习场景都涉及带有标签的数据,这属于监督学习

在监督学习中,我们拥有带标签的数据集,知道部分样本的真实类别或输出。我们利用这些样本的特征向量和标签来学习模型,目标是找到特征与标签之间的关系。这就像有导师指导的学习过程。

然而在某些情况下,我们只有无标签数据集。这时就需要无监督学习。无监督学习的目标是发现数据内在的结构和模式,例如将数据分组(聚类)、估计概率密度或发现特征之间的关联。无标签数据在实际中非常普遍,因此无监督学习非常重要。

除了以上两种,还有强化学习。强化学习不同于监督学习,它不依赖于带标签的数据集,而是用于解决决策问题。其典型模式是:智能体根据环境状态采取行动,环境给予奖励或惩罚的反馈,学习的目标是最大化累积奖励。自动驾驶和自动下棋是强化学习的典型应用。

综上所述,监督学习、无监督学习和强化学习是机器学习的三种主要类型。

学习场景示例

最后,让我们通过典型场景来直观理解监督学习和无监督学习的区别。

  • 监督学习场景:我们有一个已标记的数据集,包含三个类别(图中以三种颜色表示)。我们的目标是学习一个分类边界(如图中曲线),以便根据特征将新样本划分到正确的颜色类别中。
  • 无监督学习场景:我们拥有相同的样本点,但没有颜色标签。无监督学习算法(如聚类)的目标是自动发现数据中潜在的分组结构(如图中圈出的三个簇)。

一些典型的算法例子包括:

  • 监督学习:逻辑回归、K近邻、朴素贝叶斯。
  • 无监督学习:K均值聚类、主成分分析。

本节课中我们一起学习了评估机器学习性能的多种度量标准,深入探讨了过拟合与欠拟合的概念及其重要性,并掌握了使用交叉验证来提升模型泛化能力的方法。最后,我们明确了监督学习、无监督学习和强化学习这三种核心机器学习范式的区别与典型应用场景。理解这些基础概念是进行有效数据分析的关键第一步。

021:朴素贝叶斯分类

在本节课中,我们将要学习一种基础的机器学习方法——朴素贝叶斯分类。这是一种基于贝叶斯定理的简单分类方法,其核心在于一个“朴素”的假设:所有特征在给定类别下是条件独立的。我们将通过一个具体的例子,学习如何应用它来对未知数据进行分类。

什么是朴素贝叶斯分类?

上一节我们简要介绍了机器学习,本节中我们来看看一个具体的分类方法。

朴素贝叶斯分类是一种简单的分类方法,其思想基于贝叶斯定理。这里的“朴素”并非指算法简单,而是指一个核心假设:所有数据特征在给定类别标签的条件下是相互独立的。我们稍后会详细讨论这一点。

当我们使用朴素贝叶斯方法时,我们处理的是带有类别标签的训练数据。类别标签用 C_j 表示。假设我们共有 N 个类别,即 C_1, C_2, ..., C_N。每个数据样本都属于这些类别中的一个。

除了类别标签,训练数据本身是一系列属性值的集合。每个样本可以表示为一个 D 维的特征向量 x = (x_1, x_2, ..., x_D)。我们有很多这样的带标签向量,因此我们正在进行监督学习

分类问题的目标是:给定一个没有标签的未知数据(即一个特征向量 x),我们希望找出最可能的类别标签 C_j

分类问题如何求解?

我们通过计算每个类别标签在给定数据下的概率来求解。

具体来说,对于未知数据 x,我们计算 P(C_1 | x)P(C_2 | x), ..., P(C_N | x)。然后,我们选择概率最大的那个类别作为分类结果。例如,如果 P(C_2 | x) 最大,那么 C_2 就是该数据的预测类别。

我们可以将算法形式化地表示为寻找最大后验概率
C_map = argmax_{k ∈ {1,...,N}} P(C_k | x)

应用贝叶斯定理

那么,如何计算 P(C_j | x) 呢?这里我们需要用到贝叶斯定理。

贝叶斯定理的公式是:
P(Y|X) = P(X|Y) * P(Y) / P(X)

在我们的场景中,Y 对应类别 C_jX 对应观测数据 x。因此,我们可以将后验概率写为:
P(C_j | x) = P(x | C_j) * P(C_j) / P(x)

注意,对于所有类别 C_j,分母 P(x) 是相同的。由于我们只关心比较不同 C_j 下概率的相对大小,这个公共分母可以忽略。因此,我们的目标简化为寻找能最大化下式的类别:
P(C_j | x) ∝ P(x | C_j) * P(C_j)

朴素(条件独立)假设

现在的问题是如何估计 P(x | C_j)。即使有训练数据,要直接估计所有特征组合的联合概率也需要海量的样本,这通常不可行。

因此,我们引入“朴素”假设:在给定目标类别 C_j 的条件下,所有特征属性是条件独立的。这意味着联合概率可以分解为各特征概率的乘积:
P(x | C_j) = P(x_1 | C_j) * P(x_2 | C_j) * ... * P(x_D | C_j)

将这个假设代入上面的公式,我们得到朴素贝叶斯分类的核心公式:
P(C_j | x) ∝ P(C_j) * ∏_{i=1}^{D} P(x_i | C_j)

这个假设极大地减少了需要估计的参数数量,缓解了数据稀疏问题。

综上所述,朴素贝叶斯分类器通过计算使后验概率最大的类别来对未知实例进行分类,其中后验概率通过贝叶斯定理和条件独立假设来估计。

一个具体例子:是否打网球?

让我们通过一个具体例子来理解这个过程。以下是关于天气条件与是否打网球的训练数据:

天气 温度 湿度 打网球?
正常
正常
正常
正常
正常
正常
正常

现在,我们遇到一个新的未知天气情况:天气=晴,温度=凉,湿度=高,风=强。我们需要预测在这种情况下是否应该打网球。

定义符号:

  • 类别 C1:打网球 = 是
  • 类别 C2:打网球 = 否
  • 特征 x1 (O):天气 (Outlook)
  • 特征 x2 (T):温度 (Temperature)
  • 特征 x3 (H):湿度 (Humidity)
  • 特征 x4 (W):风 (Wind)

未知数据:O=晴, T=凉, H=高, W=强

我们需要比较:
P(C1=是 | O=晴, T=凉, H=高, W=强)

P(C2=否 | O=晴, T=凉, H=高, W=强)

根据朴素贝叶斯公式,我们需要从训练数据中估计先验概率 P(C_j) 和条件概率 P(x_i | C_j)

以下是计算所需概率的步骤:

首先,我们计算类别先验概率 P(C_j)

  • P(是) = (打网球为“是”的天数) / (总天数) = 9 / 14
  • P(否) = (打网球为“否”的天数) / (总天数) = 5 / 14

接着,我们计算在“是”的条件下,各个特征的条件概率。

  • P(O=晴 | 是) = (是且天气晴的天数) / (是天总数) = 2 / 9
  • P(T=凉 | 是) = (是且温度凉的天数) / (是天总数) = 3 / 9
  • P(H=高 | 是) = (是且湿度高的天数) / (是天总数) = 3 / 9
  • P(W=强 | 是) = (是且风强的天数) / (是天总数) = 3 / 9

然后,我们计算在“否”的条件下,各个特征的条件概率。

  • P(O=晴 | 否) = (否且天气晴的天数) / (否天总数) = 3 / 5
  • P(T=凉 | 否) = (否且温度凉的天数) / (否天总数) = 1 / 5
  • P(H=高 | 否) = (否且湿度高的天数) / (否天总数) = 4 / 5
  • P(W=强 | 否) = (否且风强的天数) / (否天总数) = 3 / 5

现在,我们可以计算后验概率(忽略分母):

  • P(是 | 数据) ∝ P(是) * P(晴|是) * P(凉|是) * P(高|是) * P(强|是) = (9/14) * (2/9) * (3/9) * (3/9) * (3/9) ≈ 0.0053
  • P(否 | 数据) ∝ P(否) * P(晴|否) * P(凉|否) * P(高|否) * P(强|否) = (5/14) * (3/5) * (1/5) * (4/5) * (3/5) ≈ 0.0206

比较两个值,P(否 | 数据) 更大。因此,对于这个未知天气,朴素贝叶斯分类器的预测是 不打网球 (否)

数值计算技巧:使用对数

在计算过程中,我们将多个介于0和1之间的小概率值相乘,可能导致结果数值下溢(变得极小而不易比较)。

一个更好的计算方法是取对数,将乘法转换为加法:
log(P(C_j | x)) ∝ log(P(C_j)) + Σ_{i=1}^{D} log(P(x_i | C_j))

我们最终比较的是对数概率值,数值更大(即原始概率更大)的类别即为预测结果。这解决了数值下溢问题,并且加法运算在计算机中通常更快。

应用与优势

朴素贝叶斯分类器有广泛的应用,一个典型例子是文档分类。在这里,每个文档是一个数据实例,其特征可以是文档中出现的词。类别可以是文档主题,如“科幻”、“悬疑”等。通过训练已标记的文档集,我们可以对新的未知文档进行分类。

以下是朴素贝叶斯分类器的主要优势:

  • 性能有竞争力:尽管基于独立性假设,但在许多实际数据集和应用中表现良好。
  • 计算速度快:训练和预测过程主要涉及概率计数和简单运算,效率很高。
  • 易于维护和更新:当有新的训练数据加入时,只需更新相关的计数和概率估计即可,无需重新进行复杂训练。

正是由于这些优点,朴素贝叶斯分类器在实践中非常流行和常用。

总结

本节课中我们一起学习了朴素贝叶斯分类方法。我们了解到它是一种基于贝叶斯定理和特征条件独立假设的分类器。其核心思想是:通过计算使后验概率 P(类别 | 特征) 最大的类别来进行预测,其中后验概率通过先验概率 P(类别) 和条件概率 P(特征 | 类别) 的乘积来估计。我们通过“是否打网球”的例子,一步步演示了如何从训练数据中估计这些概率,并对新数据进行分类。最后,我们还探讨了其应用场景、数值计算技巧以及该方法的主要优势。

022:人工神经网络

概述

在本节课中,我们将学习人工神经网络的基本概念、结构和工作原理。我们将了解神经元如何接收输入、计算输出,以及如何通过多层网络结构进行复杂的数据处理。最后,我们将探讨如何通过训练来调整网络参数,使其能够进行准确的预测。


神经网络简介

在学习了朴素贝叶斯分类之后,我们接下来看看另一种有趣的方法,称为人工神经网络。正如其名,人工神经网络实际上受到了人类神经系统工作原理的启发。人类的神经网络系统能够学习、记忆事物并推广我们的学习经验。

这种灵感促使研究者们对生物神经系统进行算法建模。这意味着我们以人类为例子,研究人类如何学习,并试图让机器以类似的方式学习。生物神经元通过神经元之间传递信号进行通信,这些信号到达我们的感官和大脑,使我们能够学习并执行各种任务。在人工神经网络中,我们模拟了这一过程,其基本计算单元被称为神经元,也常被称为节点或单元。


神经元的结构

那么,什么是神经元呢?神经网络中的神经元实际上接收来自一个或多个节点的输入。每个输入都会关联一个权重。输入与权重相乘,权重控制着该输入相对于其他输入的重要性。因此,我们得到了加权输入。

节点会有一个传递函数或激活函数来处理这些加权输入的总和。加权输入的总和将被送入激活函数或传递函数,然后该函数会给出一个输出。因此,输入经过处理转化为输出。

除了加权输入之外,每个神经元还关联一个偏置项。偏置项也可以被视为一个权重为1的输入。


神经元的图示

让我们通过一些图示来了解人工神经网络中神经元的具体样子。左侧是一个单输入节点的神经元。它只接收一个输入,该输入乘以权重 W,即 X * W。此外,还有偏置项 θ。加权输入加上偏置项,得到的结果将传递给激活函数。激活函数接收这个值,并给出输出 O。这就是一个单节点的情况。

那么,如果我们有多个节点呢?如右侧所示,这里有三个输入。每个输入都关联一个权重。这三个输入的加权和为 W1*X1 + W2*X2 + W3*X3。然后,我们再加上偏置项 θ。偏置项允许我们调整激活函数的输入值。加上偏置项后,这个值被送入激活函数,激活函数根据加权输入和偏置项的总和给出输出 O

可以看到,我们可以有一个输入,也可以有多个输入。但观察两幅图,你会发现我们只有一个输出,因为激活函数将加权输入转化为一个输出值。因此,对于每个神经元,我们只有一个输出,但可以有任意多个输入。


神经网络的多层结构

我们讨论的是神经网络,所以不会只有一个神经元,而是有许多神经元和节点。这些节点通常被组织成多层结构。通常,我们会有一个输入层,输入层的节点将外部世界的信息传递给网络。这些节点被称为输入节点。输入节点不执行任何计算,它们只是将信息传递给隐藏层。

例如,这个节点会传递一个特定的输入值给另一个节点。另一个节点可能传递另一个值,比如 X2,给网络中相同或不同的节点。输入节点没有计算,只是传递信息。

输入节点将信息传递给另一个节点,那个节点就是隐藏节点,位于隐藏层。这意味着隐藏节点与外部世界没有直接连接。输入层中的输入节点与外部世界有直接连接,因此它从外部世界获取数据并传递给隐藏节点。隐藏节点接收来自输入节点的输入值,执行计算,转换输入信息,然后将输出传递给输出节点。

隐藏层负责处理输入数据,并将数据发送给其他节点。隐藏节点的集合被称为隐藏层。神经网络中还有另一种层,称为输出层。输出层包含输出节点,输出节点负责计算并将信息从网络传递到外部世界。这意味着隐藏层进行大量处理,结合来自外部世界的输入信息,生成一些信息,然后传递给输出节点。输出节点集体接收来自隐藏节点的所有值,计算最终输出,并将输出发送给我们,即发送到外部世界,然后我们使用输出来做出决策。

在神经网络中,通常我们有一个输入层和一个输出层,但可能有一个以上的隐藏层。每一层都可以有任意多个节点。例如,这里我们只有两个输入节点,但可以有更多。同样,我们只有三个隐藏节点,也可以有更多。这里只有一个输出节点,我们也可以有更多。根据应用和问题的不同,我们可能希望网络具有不同数量的隐藏层和节点。

如果我们有更多的隐藏层,我们的神经网络就会变得更复杂,或者用另一个术语来描述,就是“深度”。这意味着我们拥有一个深度网络。那么,我们如何通过深度学习来学习这样一个深度网络呢?深度学习意味着我们学习一个非常复杂的网络。当然,复杂的网络可以帮助我们解决许多复杂且有用的问题或应用。


神经网络的学习过程

现在我们知道神经网络有许多节点,节点可以位于输入层(我们在此接收输入),也可以有包含隐藏节点的隐藏层。输入经过隐藏层处理后,输出层会结合这些值并给出输出,该输出将帮助我们做出决策或预测。

那么,我们究竟如何利用神经网络,以及如何学习人工神经网络呢?让我们更详细地讨论一下。神经网络的学习是寻找最小化误差的方法,这通常通过梯度下降法来实现。

我们在讨论什么呢?让我们回到神经网络的图示。我们知道我们有输入,这些输入通过神经网络最终给出输出。这意味着我们有输入和输出,现在的问题是我们如何进行这种处理。

回想一下神经元是什么。神经元接收加权输入和偏置项,然后通过激活函数。这意味着我们需要能够确定从输入节点到隐藏节点的权重,以及从隐藏节点到输出节点的权重。我们希望确定所有权重。如果我们能找到一组能给出良好预测、良好结果的权重,那将是最佳的。除了权重,神经元还有什么?还有偏置项。因此,我们也想知道每个节点的偏置项应该是什么。

通过我们找到的估计权重和偏置项,我们将能够拥有一个在输入上表现良好、并能给出准确输出的神经网络。这就是目标,也是学习如何进行的方式。但具体的步骤是什么呢?为了实现这一目标,需要哪些步骤?

首先,我们只有输入,不知道权重。我们想要计算权重,但最初我们如何计算呢?我们可以通过将权重值初始化为随机值来开始。我们为权重选择一些随机值。

然后,我们从训练样本开始。这就是我们进行学习的原因,我们使用训练样本来学习。训练样本意味着它们是带有标签的数据。我们有类别,有期望的输出。因此,我们有了输入和期望的输出。利用给定的输入和期望的输出,我们将输入拟合到输入节点中。然后,基于初始的随机权重,我们计算出输出。我们根据给定的输入和随机权重计算输出。

接着,我们将计算出的输出与给定的期望输出进行比较。我们计算误差,因为我们知道期望的输出。我们将其与计算出的输出进行比较,从而知道误差。

然后,我们从输出节点开始,即从输出层开始,向后进行。我们尝试找到误差,然后与隐藏节点通信,调整隐藏节点和输出节点之间的权重。调整权重后,我们再次返回,调整连接隐藏节点和输入节点的权重。我们向后进行,调整权重。

现在,我们有了调整后的权重集合,这意味着我们有了一组新的权重。然后,我们再次处理原始输入,再次使用训练数据,基于调整后的权重计算输出,然后将计算出的输出与目标输出进行比较,从而知道误差。

如果结果不理想,我们就再次返回。我们从输出节点开始,再次向后调整权重,调整输入节点和隐藏节点之间的权重。然后,我们再次计算输出,并持续调整权重,直到达到期望的性能。

这就是我们学习人工神经网络的粗略步骤和流程。

那么,我们何时停止呢?理论上,当误差为零时我们应该停止,因为这意味着我们得到了我们期望的精确结果。但我们知道,在现实生活和实际应用中,我们不可能使误差为零。

因此,我们试图做的是最小化误差。或者当误差足够小时,我们停止,并认为这个网络足够好,能够在大多数时候给出准确的结果。这就是我们学习人工神经网络的方式。

基本上,你可以看到,当我们学习人工神经网络时,我们试图估计权重,即我们试图估计参数,使得给定输入我们能得到输出。这就像拥有一个函数。函数接收输入并将其转换为输出。因此,人工神经网络实际上就像一个函数。我们在这里学习人工神经网络,就像在进行函数估计。我们试图找到连接输入和输出的函数。通过学习,我们试图估计该函数的参数。这意味着我们通过人工神经网络的学习来找到这个函数。


神经网络的数学表示

我们将具体看看如何做到这一点,如何找到能最小化误差的最佳权重集合。但在那之前,我们先看一些符号表示,因为这些符号将帮助我们理解接下来要做什么。

我们知道在神经网络中有神经元,我们有输入,并且有不同的层。这意味着输入节点有输入,隐藏节点有输入,输出节点也有输入。为了表示它们,我们这样说:X_{L, j} 表示第 L 层第 j 个节点的输入。

在神经网络中,我们还有连接两个节点之间的所有权重,可能是输入节点到隐藏节点,隐藏节点到输出节点,或者隐藏节点到隐藏节点。这意味着我们需要表示来自两个不同层的两个节点之间的权重。

如果我们讨论 W_{L, L', i, j},那么我们讨论的是从第 L 层的节点 i 连接到第 L' 层的节点 j 的权重。例如,如果我们看这里的第一个节点,那么我们讨论的是从输入层 I 的节点连接到隐藏层 J 的第一个隐藏节点的权重。因此,我们有从输入层到隐藏层的权重 W_{I, J}

除了输入和权重,回想一下每个节点都有一个偏置项。偏置项是我们可以应用于加权和的值,以调整激活函数或传递函数的输入值。因此,每个节点都有一个偏置项。我们可以这样表示:θ_{L, j} 表示第 L 层第 j 个节点的偏置项。你可以看到,这里的每个节点(这个节点、那个节点)都有一个偏置项。输入节点呢?因为输入节点不进行任何处理,只是将数据传递给隐藏节点,所以没有偏置项。

对于神经元,它将结合加权输入和偏置项,然后通过激活函数给出输出。为了表示特定节点的神经元输出,我们将其写为 O_{L, j},表示第 L 层第 j 个节点的输出。

在学习过程中,我们需要将期望输出与计算输出进行比较。这意味着我们需要表示期望输出。我们说它是目标值,即期望的输出。对于特定节点,我们有期望输出,即目标值 T_j。通常,T_j 只针对输出层,因为隐藏层是处理层,我们没有它们的期望输出。因此,我们只对输出层中的输出节点有目标输出,这就是为什么用 T_j 表示。

好了,现在我们有了所有这些符号表示。稍后我们将讨论一个例子,展示一个示例。为了简单起见,我们可能会稍微简化符号表示,但你稍后会看到。


激活函数

我们已经多次提到激活函数,那么激活函数到底是什么?它用于结合加权输入和偏置项,然后将它们转换为输出。这就是为什么它被称为传递函数:它从某些神经元或节点接收输入,然后给出输出。

有许多激活函数可以用于神经网络,但一个非常常用的是 Sigmoid 函数。Sigmoid 函数经常被用作神经网络的传递函数或激活函数,原因是它是连续且可微的。

Sigmoid 函数会给出一个介于 0 到 1 之间的值。你可以看到这里的表示,这是 Sigmoid 函数的图示。你会看到,对于不同的输入 x 值,它给出介于 0 到 1 之间的值。它是连续的。

为什么 Sigmoid 函数对神经网络如此有用?因为它的导数非常简洁。求导的简便性使其成为学习神经网络时非常有用的激活函数。你可以看到,如果我们对 Sigmoid 函数关于 x 求导,会发现它实际上由 Sigmoid 函数本身组成。这是一个非常有趣的特性,当我们在进行学习时会非常有用。

既然我们讨论了 Sigmoid 函数的导数,那么让我们花点时间看看如何精确地对 Sigmoid 函数求导,以及如何得到这个有趣的表示。

让我们快速看一下。我们知道 Sigmoid 函数是这样的:σ(x) = 1 / (1 + e^{-x})。如果我们对这个 Sigmoid 函数求导,那么我们就是对 1 / (1 + e^{-x}) 关于 x 求导。我们也可以将其表示为 (1 + e^{-x})^{-1}

如果我们对此求导,我们将得到:dσ/dx = -1 * (1 + e^{-x})^{-2} * d(1 + e^{-x})/dx。计算 d(1 + e^{-x})/dx,这部分是常数,所以求导后为 0,剩下计算 e^{-x} 的导数。d(e^{-x})/dx = -e^{-x}

因此,继续计算:dσ/dx = -1 * (1 + e^{-x})^{-2} * (-e^{-x})。负号相互抵消,得到 dσ/dx = e^{-x} / (1 + e^{-x})^2

我们可以将其重写为 [1 / (1 + e^{-x})] * [e^{-x} / (1 + e^{-x})]。现在,第一部分已经是 Sigmoid 函数本身,即 σ(x)。剩下的部分如何表示呢?我们可以将其视为 (1 + e^{-x} - 1) / (1 + e^{-x}) = 1 - 1/(1 + e^{-x})。这意味着这是 1 - σ(x)

因此,我们有 dσ/dx = σ(x) * (1 - σ(x))。你可以看到,Sigmoid 函数的导数给出了这个有趣的结果,这在后续学习过程中会非常有帮助。我们知道了 Sigmoid 函数的特性。


误差计算

现在一切准备就绪,下一个问题是:当我们进行学习时,我们需要计算误差。我们如何计算误差呢?这意味着我们比较计算输出和目标值。我们有目标输出 T_k 和计算输出 O_k。我们想比较这两个值,即比较 O_kT_k 之间的差异。

但这可能是正值,也可能是负值。如果我们有负值,会很麻烦。这就是为什么我们要看绝对差值。我们不希望担心正负,我们希望关注差异的绝对值。

但在学习中,我们希望最小化这个误差。为了最小化误差,我们希望求误差的导数,然后找到对应的最小值。这意味着如果我们将误差定义为绝对值,求最小值会很麻烦。因此,我们改为取平方。这样我们得到正的差异,并且能更好地配合后续处理。

我们可能有多个输出,即可能有许多输出节点。因此,如果我们有许多输出,我们需要对总误差求和。这就是为什么我们对每个计算输出和相应目标输出之间的误差进行平方,然后求和所有误差,再除以 2。这里除以 2 的原因同样是为了后续求最小值时更方便。我们需要找到能最小化误差的权重集合,因此需要求导等操作。如果我们除以 2,会使后续计算更简单、更容易。

现在,我们将误差定义为计算输出值和目标值之间的总误差。然后,我们可以对误差关于相应的权重求导,因为我们想找到能最小化该误差的权重集合。这就是为什么我们对误差关于权重求导,以便最小化误差。

我们有哪些权重呢?我们有连接隐藏层和输出层的权重,连接输入层和隐藏层的权重,也可能有隐藏层之间的权重。我们有很多权重,这意味着我们需要对许多权重求导。

现在,我们有连接不同节点的不同权重,因此我们需要考虑两种情况来进行误差计算、权重更新和输出计算等。我们需要考虑两种情况:一种情况是输出层,我们关注连接隐藏层和输出层的权重;另一种情况是输入节点连接到隐藏节点,即我们关注输入节点和隐藏节点之间的权重,或者隐藏节点之间的权重。我们需要考虑这两种情况,并进行误差计算,以及以略有不同的方式定义和寻找最小化这些误差的权重。


情况一:输出层节点

让我们先看情况一,即讨论输出层节点。在这种情况下,例如,我们看输出节点 K,即输出层中的输出节点 K。这个输出节点将给出输出值,即计算输出 O_k。我们关注连接该节点与隐藏层节点的权重。这意味着有一个隐藏层 J 中的节点,该节点通过权重 W_{J, K} 与输出节点连接。因此,我们关注连接隐藏层中的隐藏节点和输出层中的输出节点的权重。

之前我们已经知道,在学习神经网络时,我们实际上试图最小化误差,并且我们想找到能最小化误差的权重。这意味着我们想找到能最小化误差的权重 W_{J, K}。我们知道误差是 E = 1/2 * Σ_k (O_k - T_k)^2。回想一下,O_k 是计算输出,T_k 是目标输出。我们找到这两个值之间的误差,然后对所有输出节点的误差求和。

现在,如果我们想找到对应的最小化权重,即能给出最小化误差的权重,我们需要对误差关于权重 W_{I, J} 求导。这意味着我们对整个表达式关于 W_{I, J} 求导。

我们只是泛化输出节点的情况。可能有许多连接,例如另一个权重连接另一个隐藏节点和输出节点。我们先关注这种情况,然后看如何应用。

如果我们对此求导,意味着我们看这个表达式的导数。但看这个图示,你会发现只有输出节点 K 与权重 W_{J, K} 相关。这意味着对于其他输出节点,其他计算输出和目标值之间的差异与 W_{J, K} 无关。因此,在求导时,我们可以忽略其他输出节点的求和。这意味着我们现在看的是 ∂E/∂W_{J, K} = (O_k - T_k) * ∂O_k/∂W_{J, K}

(O_k - T_k)^2 求导,提出 1/2 乘以 2,再乘以 (O_k - T_k),然后对 (O_k - T_k) 关于 W_{I, J} 求导。我们知道 T_k 是常数,关于 W_{I, J} 的导数为 0。因此,步骤变为 (O_k - T_k) * ∂O_k/∂W_{J, K}

那么 O_k 是什么?O_k 是通过激活函数对输出节点的输入进行处理后的输出。这意味着 O_k 实际上是 Sigmoid 函数作用于输出节点的输入 X_k 的结果。因此,O_k = σ(X_k)。所以,我们可以这样写:∂O_k/∂W_{J, K} = ∂σ(X_k)/∂X_k * ∂X_k/∂W_{J, K}

那么它的导数是什么?我们知道 Sigmoid 函数的导数将给出其自身的表达式。这意味着它将类似于 σ(X_k) * (1 - σ(X_k)),因为我们之前已经讨论过。那么剩下的是 ∂X_k/∂W_{J, K}

接下来,X_k 是什么?输出节点的输入实际上是加权输出,即权重乘以该节点的输出。隐藏节点 J 的输出乘以权重 W_{J, K},即 X_k = W_{J, K} * O_J。此外还有偏置项,但因为偏置项与 W_{J, K} 无关,为简单起见,我们可以将 ∂X_k/∂W_{J, K} 视为 ∂(W_{J, K} * O_J)/∂W_{J, K}。那么这意味着它只是 O_J

因此,结果是 (O_k - T_k) * σ(X_k) * (1 - σ(X_k)) * O_J。现在,由于这部分都是关于 O_k 的,我们可以用 δ_k 来表示。δ_k = (O_k - T_k) * O_k * (1 - O_k)。因此,误差关于 W_{J, K} 的导数是 δ_k * O_J,即隐藏节点的输出乘以计算输出和目标输出之间变化的部分。

你可以看到,基于误差,我们求导以便最小化误差,找到能最小化误差的 W_{J, K},然后得到这个结果。你可以看到求和可以被忽略,并且我们可以改变某些项的表示。如果我们将这部分表示为 δ_k,那么导数被重写为 ∂E/∂W_{J, K} = δ_k * O_J。这就是情况一。

你可以看到,这对于其他输出节点也是如此。对于其他输出节点,同样有权重连接隐藏节点和输出节点,我们需要求导,也会得到这种一般表示。


情况二:隐藏层节点

接下来,让我们看看情况二。情况二意味着我们关注隐藏层节点。这里的隐藏层节点是什么?我们有节点 J,即隐藏层节点 J。我们关注例如输入层 I 到隐藏节点 J 之间的节点。这意味着这里有权重 W_{I, J}。我们看这种情况。

这个隐藏节点也可能连接到其他节点。抱歉,因为隐藏节点的输出将被发送到不同的输出节点。你可以看到,当我们对误差关于 W_{I, J} 求导时,这次我们不能忽略求和。

让我们看看导数。和之前一样,我们知道误差 E = 1/2 * Σ_k (O_k - T_k)^2,即计算输出和目标输出之间的差异。然后我们想对误差关于 W_{I, J} 求导。

这次我们不能忽略求和,因为 W_{I, J} 会连接到不同的输出节点,所以 W_{I, J} 会影响不同的输出节点。这就是为什么我们不能忽略求和。那么我们需要处理这个。我们不能去掉求和,那我们应该怎么做呢?让我们先关注计算。

我们知道有 k 个输出节点。我们保留求和,但我们仍然可以对平方项求导。这意味着我们这样求导:∂E/∂W_{I, J} = Σ_k (O_k - T_k) * ∂O_k/∂W_{I, J}

1/22 相互抵消,所以我们有求和 Σ_k (O_k - T_k) * ∂O_k/∂W_{I, J}。因为 T_kW_{I, J} 无关,所以我们只有 ∂O_k/∂W_{I, J}

和之前类似,我们知道 O_k 是 Sigmoid 函数作用于节点 K 的输入 X_k 的结果。因此,如果我们对 O_k 关于 W_{I, J} 求导,那么我们对 σ(X_k) 关于 X_k 求导,然后 X_k 关于 W_{I, J} 求导。我们可以这样展开:∂O_k/∂W_{I, J} = ∂σ(X_k)/∂X_k * ∂X_k/∂W_{I, J}

我们知道这是 σ(X_k) * (1 - σ(X_k)),然后乘以 ∂X_k/∂W_{I, J}。因此,我们可以将这部分重写为 (O_k - T_k) * σ(X_k) * (1 - σ(X_k)) * ∂X_k/∂W_{I, J}

我们可以简化为 (O_k - T_k) * O_k * (1 - O_k) * ∂X_k/∂W_{I, J}。现在我们需要处理 ∂X_k/∂W_{I, J}

回想一下,X_k 实际上是 W_{J, K} * O_J。回想一下,输出节点的输入是隐藏节点和输出节点之间连接的权重乘以隐藏节点的输出。这意味着 ∂X_k/∂W_{I, J} 实际上与 ∂(W_{J, K} * O_J)/∂W_{I, J} 相同。我们可以这样重写:∂(W_{J, K} * O_J)/∂W_{I, J} = W_{J, K} * ∂O_J/∂W_{I, J}

我们可以再次重写,像这样。那么现在因为这部分会给我们 W_{J, K},然后我们有 ∂O_J/∂W_{I, J}。我们可以再次处理这部分。

这部分是什么?O_J 是什么?O_J 是激活函数作用于节点 J 的输入 X_j 的结果。因此,O_J = σ(X_j)。如果我们对其关于 W_{I, J} 求导,那么我们对 σ(X_j) 关于 X_j 求导,然后 X_j 关于 W_{I, J} 求导。这意味着我们将再次得到 σ(X_j) * (1 - σ(X_j)) * ∂X_j/∂W_{I, J}

这意味着现在这部分将给我们 O_J * (1 - O_J) * ∂X_j/∂W_{I, J}。到目前为止,这就是我们所有的。因为这些与 k 无关,所以我们可以将其从求和中取出并放在这里。

这意味着我们有 O_J * (1 - O_J) * ∂X_j/∂W_{I, J},然后我们只保留后面的其他部分,这样更容易关注前面的部分。第一部分是 Σ_k (O_k - T_k) * O_k * (1 - O_k) * W_{J, K}

现在让我们关注这部分。那么我们将得到什么?现在我们记得,X_j 可以表示为 W_{I, J} * O_I。这意味着 J 的输入实际上是连接节点的加权输出。这意味着我们看这个。

那么这里我们有什么?∂X_j/∂W_{I, J} = O_I。因此,我们有 O_J * (1 - O_J) * O_I,然后像这样。现在给定这个。

你可以看到这只是 O_I。因此,我们有 O_J * (1 - O_J) * O_I,然后像这样。和之前一样,如果我们将所有与 JK 相关的部分表示为 δ_j,那么我们可以将其表示为 O_I,即放在这里,其余部分用 δ_j 表示。因此,我们将能够将误差关于 W_{I, J} 的导数表示为 O_I * δ_j,即节点 J 上的变化。

这意味着现在我们有了这部分,然后我们继续处理,我们将看到这个。因此,如果我们将这部分表示为 δ_j,那么我们得到的就是这样。你可以看到,对于情况一,我们能够将误差关于 W_{J, K} 的导数表示为 O_J * δ_k;类似地,在这里我们能够将误差关于 W_{I, J} 的导数表示为 O_I * δ_j。你可以看到现在非常相似。


权重与偏置的更新

现在我们需要再考虑一件事。我们看关于 W_{I, J}W_{J, K} 的导数。因此,基于这两种情况,我们将能够这样总结:对于输出节点 K,导数将是 O_J * δ_k,其中 δ_k = (O_k - T_k) * O_k * (1 - O_k)。对于隐藏节点,我们将能够将其表示为误差的导数为 O_I * δ_j,其中 δ_j 会有所不同。它取决于节点 J 的输出,以及输出节点的 δ_k 和隐藏节点与输出节点之间的权重。

别忘了偏置项。我们之前提到过,对于每个节点(隐藏节点和输出节点),都有偏置项。我们将偏置项与加权输入相加,然后激活函数将使用该值并给出相应的输出。

如果我们像前两种情况一样对偏置项进行处理,你会发现输出关于偏置项的导数只是 1。因此,误差关于 θ 的导数实际上只是该层节点的 δ。这意味着它不依赖于输出。如果我们在讨论输出层节点,那么它就是 δ_k;如果是隐藏层,那么误差关于其相应偏置的导数将是 δ_j

现在我们看了误差关于权重和偏置的导数,那么我们将能够知道如何更新权重和偏置。如果我们能够计算输出,然后将输出与目标值进行比较,我们将知道如何更新权重和偏置。


反向传播算法

我们如何进行更新?如何优化权重?回想一下,整个神经网络的学习过程是:我们选择随机权重,然后计算输出,将输出与实际值和目标值进行比较,然后从输出节点开始反向通信,尝试调整隐藏节点和输出节点之间的权重,然后返回调整隐藏节点的权重。现在我们已经计算了 δ,因此我们可以利用 δ 和输出来更新权重和偏置。

基于之前的计算,我们知道我们计算了 δ_k,它取决于目标输出和计算输出之间的差异;我们还计算了 δ_j,它又取决于节点 J 的输出以及计算出的 δ_k 和输出节点的权重 W_{J, K}

有了 δ_kδ_j,我们将能够像这样更新权重和偏置。x 可以是隐藏节点,y 是输出节点;或者 xy 都是隐藏节点;或者 x 是输入节点,y 是隐藏节点,就像情况一和情况二一样。你知道,基于情况一和情况二的计算,它们可以这样泛化。你可以看到,现在如果我们讨论隐藏节点 J 和输出节点 K,那么它将取决于隐藏节点的输出乘以 δ_k;如果是隐藏节点和输入节点,那么是 W_{I, J},它取决于 I 的输出乘以 δ_j。你可以看到模式是相同的。

这就是为什么我们可以这样泛化。回想一下偏置的 δ,那么它只是没有输出的 δ。现在我们添加一个学习率 η 来控制更新的量。

在我们计算了 δ_{x, y, j} 或偏置的 δ 之后,那将是我们需要应用于更新权重和偏置的变化量。然后我们取旧的权重,加上变化量,得到新的权重。类似地,对于偏置也是如此,我们有旧值,加上变化量,然后得到新值。

然后你会看到,我们将能够从输出节点开始向后更新权重。我们计算 δ_k,更新输出节点的偏置和权重,然后我们准备计算 δ_j,并更新隐藏节点的权重和偏置。

因为我们从输出节点开始,然后返回到隐藏节点,我们说这是反向传播。

现在让我们回想一下我们如何进行学习。我们首先初始化随机权重,然后输入训练样本,即基于随机权重计算输出。这意味着我们从输入节点开始,计算输出节点的输出。我们说这是前向传播,因为我们从输入节点到隐藏节点,再到输出节点,是向前进行的。

在计算误差之后,我们需要更新权重,当我们更新权重时,我们以相反的方向进行,即向后方向。这意味着我们从输出节点开始,更新那里的权重,然后返回。这就是为什么它是反向传播。我们在向后方向更新权重。在我们更新权重之后,我们将在更新后的权重上进行前向传播,然后再次计算误差,如果需要,再次进行反向权重更新。这意味着这将是一系列前向传播和反向传播。这就是我们如何利用计算出的变化量来更新权重。


学习步骤与停止条件

现在剩下的问题是,如果我们看整个学习步骤,那么现在有几个问题我们可能想问。例如,如何初始化权重值?通常初始化为一些小的随机值,但也有关于如何选择初始值的讨论。初始值会影响学习的进展。

另一个我们想问的问题是什么时候停止。我们知道,如果误差不够好,误差仍然很大,那么我们需要一次又一次地重复。但我们知道不可能没有误差,总会有一定量的误差。那么我们应该何时停止呢?

有几种停止训练的方法。一种方法是控制迭代次数,即我们调整权重的次数。我们进行一定次数的迭代后停止,那将是我们的性能或学习结果。另一种可能性是,当我们计算出的误差在一个小值以内,低于某个阈值时,我们可以停止。这个误差可以是训练误差。

回想一下,我们可以有验证集。因此,我们可以再次使用验证集来估计泛化误差。这意味着我们在验证集误差最小时停止。

但你可以看到,因为这将需要多次迭代的前向传播和反向传播,然后我们将稍微、逐渐地更新权重,并且我们还将使用所有训练样本进行前向和反向传播,所以你可以看到,如果我们的神经网络变得更复杂,有更多的隐藏层、更多的处理,训练会变得非常慢。


神经网络的函数逼近能力

好了,这些是我们在使用人工神经网络进行学习时想知道的问题。现在回想一下,我们说过神经网络就像函数估计器,我们试图找到将输入转换为输出的函数,该函数将根据我们的目标输出给出准确的结果。这意味着神经网络将能够表示布尔函数、不同类型的函数。

这里有一些例子。每个布尔函数都可以用一个只有一个隐藏层的网络来表示,但可能需要指数数量的隐藏单元。有界连续函数可以用只有一个隐藏层的网络以较小的误差近似。任何函数都可以用一个有两个隐藏层的网络以任意精度近似。这会让你对当我们试图使用神经网络作为函数时,它会是什么样子有一些了解,比如布尔函数,或表示连续函数,或表示任何函数。


示例:异或函数

让我们看一个例子。在这个例子中,我们试图用神经网络表示异或函数。我们将有以下输入和输出。对于异或函数,如果我们的输入是 (0, 0),那么输出将是 0;如果其中一个输入是 0,另一个是 1,那么输出是 1;但如果两者都是 1,那么输出是 0。这就是为什么它是异或函数。

这意味着现在我们有了四个训练数据,包括输入和相应的期望目标值、期望输出。我们将使用这些数据来学习一个神经网络,该神经网络在给定这些输入时,应该给出非常接近实际输出、目标输出的估计。

让我们看看如何做到这一点。我们将首先使用前一行,即第一行,开始学习。这意味着输入是 (0, 0),输出是 0。因此,我们期望 x10x20,而 O 也为 0。对于我们将要学习权重的神经网络,我们实际上只有一个包含两个神经元的隐藏层。我们在这个例子中使用这个网络。

基于这个网络,我们将学习权重 W1, W2, W3, W4, W5, W6,因为我们连接输入层节点到隐藏层节点,以及隐藏层节点到输出层节点。对于每个隐藏层节点和输出层节点,我们还有偏置项。因此,有三个偏置项和六个权重。当我们进行前向传播和反向传播时,我们需要处理这六个权重和三个偏置项。

回想第一步是分配权重。假设我们只是随机选择一些权重值,因为我们刚刚开始。例如,我们随机选择一些值:W1 = -0.65, W2 = 0.64, W3 = 1.11, W4 = 0.84, W5 = 0.86, W6 = -1.38。这只是随机值。那么偏置项呢?对于偏置项 θ1, θ2, θ3,我们只是将它们初始化为 0

为了进行前向传播,我们对输入与其权重的乘积求和。然后我们加上偏置项,那将是隐藏层的值,这些值将被激活函数接收,然后我们将得到该特定节点的相应输出。

例如,对于这里的第一个节点,激活函数的总值将是输入的加权和。你可以看到,这里的隐藏层节点 J 的第一个节点实际上有两个输入和两个权重。我们计算加权和,然后加上偏置项,那将是激活函数的值。类似地,对于隐藏层中的另一个节点也是如此。

现在对于前向传播,我们得到这些总值。然后我们将激活函数应用于这些和,正如我们提到的,激活函数的目的是进行转换。我们称之为传递函数:它将输入信号转换为输出信号,这是神经网络建模复杂模式所需的。我们一直在讨论 Sigmoid 函数,但还有许多其他类型的激活函数,如线性函数、Sigmoid(我们已经使用)、阶跃函数或双曲正切等。我们可能需要尝试或看看哪种激活函数适合。

在这个例子中,我们将使用 Sigmoid 函数作为激活函数。回想一下,Sigmoid 函数是这样的:σ(x) = 1 / (1 + e^{-x})

让我们先用前向传播来处理这个例子。如前所述,我们选择第一行,输入 x1 = 0, x2 = 0。那么期望输出是 0,这意味着我们期望 T_k0。然后我们将基于当前权重计算输入的输出。

如前所述,我们需要选择学习率。假设我们选择 0.5。回想一下,我们为权重随机选择了一些值。这些是随机选择的值,而我们将偏置项初始化为 0,并使用 Sigmoid 函数作为激活函数。让我们开始计算。

现在我们将从输入开始,然后计算这里的输出。在计算了这些输出之后,我们将能够计算输出层节点的输出。首先,让我们计算隐藏层第一个节点的输出 O_{J1}

和之前一样,我们需要计算值的总和,即加权和加上偏置项 θ1。这将是 Sigmoid 函数作为输入并转换为输出的值。因此,sum1 + θ1sum1 意味着我们有加权和,即 W1 * x1 + W2 * x2。然后加上偏置项 θ1。因此,我们有 0 * (-0.65) + 0 * 0.64 + 0,一切都是 0。因此,总值为 0。这意味着 O_{J1},即 sum1 + θ1 的 Sigmoid 结果,是 σ(0)。即 1 / (1 + e^{-0}),也就是 1/2,即 0.5。我们计算了 O_{J1}

现在让我们计算 O_{J2}O_{J2} 是什么?同样,计算 sum2 + θ2sum2 是 `W3 * x1 +

023:数据匹配问题定义与核心方法 🎯

在本节课中,我们将要学习数据集成中的一个核心步骤——数据匹配。我们将了解数据匹配的定义、其在不同场景下的应用,并深入探讨解决数据匹配问题的几种主要方法。


数据匹配的定义与重要性

在完成模式对齐之后,我们面临来自不同数据源的众多记录。此时,我们需要思考是否存在重复记录,或者来自不同源的记录是否实际上相关或指向同一个实体。这个过程就是记录链接。

记录链接有许多名称,它们都指向类似的概念。最常用的术语是数据匹配,因为它明确表示我们试图匹配数据以判断它们是否相同。在数据集成中,数据匹配意味着我们查看不同的记录,它们可能来自同一个数据库、同一个数据源,也可能来自不同的数据库或数据源。数据匹配的目标是识别那些实际上指向同一实体的记录,然后决定下一步如何处理。

其他含义相似的术语包括:

  • 记录链接:关注不同记录之间是否存在链接。
  • 实体解析:试图判断记录是否指向某个实体,即解析它们之间的关系。
  • 消歧:判断两条记录是否相同,如果相同则需要合并处理,例如名称消歧或引文消歧。
  • 去重:识别重复的记录。
  • 重复检测身份不确定性也与此相关。

数据匹配的核心问题

上一节我们介绍了数据匹配的基本概念,本节中我们来看看其具体定义和挑战。

我们使用术语“数据匹配”,它与记录链接含义相同。假设我们处理的是结构化数据,那么每条记录就是一个元组,包含多个不同的属性。

例如,一个元组可能包含姓名、电话号码和地区等属性。数据匹配就是比较两个这样的元组,判断它们是否指向同一个人(或实体)。元组可能以不同格式存在,如结构化数据库、Excel文档或RDF三元组。

数据匹配不能简单地视为字符串匹配。虽然我们之前讨论过字符串匹配,即比较两个字符串的相似度,但元组匹配涉及多个属性,每个属性都有自己的特性。因此,我们需要更复杂的技术。

数据匹配在数据集成中非常有用且重要,出现在多种集成场景中:

  • 合并具有相同模式的数据库:这是数据集成的第二阶段。在模式对齐后,我们需要合并数据库,即识别相同的记录、去除重复项,并将所有不同的记录整合在一起。
  • 连接来自不同模式数据源的行:例如,我们可能使用网络表格来扩展现有数据,添加新的列或行。
  • 处理用户查询:同样需要进行某种形式的匹配。

问题形式化与示例

了解了数据匹配的应用场景后,我们接下来正式定义这个问题。

我们可以将数据匹配问题定义为:查看两个已经模式对齐(即具有相同模式)的表,并假设表中的每条记录描述一个实体(如人、地点、组织)。我们希望判断表X中的元组x与表Y中的元组y是否匹配,即它们是否指向同一个真实实体。我们的目标是识别出这两个表中所有匹配的元组对。

让我们看一个例子。假设有表X(包含x1, x2, x3三个元组)和表Y(包含y1, y2两个元组)。数据匹配需要检查所有可能的元组对:(x1, y1), (x1, y2), (x2, y1), (x2, y2), (x3, y1), (x3, y2),并判断哪些对指向同一实体。

对人眼来说,这很容易。例如,“Dave Smith”和“David Smith”显然指向同一个人(x1, y1),因为电话号码、城市、州都相同。同样,“Dan Smith”和“Daniel Smith”也很可能指向同一个人(x3, y2),因为“Dan”是“Daniel”的简称,且电话号码相同。

然而,要让模型自动完成这项工作,我们需要应用更复杂的方法。我们需要考虑姓名匹配(可能使用姓名本体库)、电话号码规范化、城市匹配等,并且需要处理不确定性(例如x3和y2的城市不同)。接下来,我们将讨论如何系统地考虑这些因素。

目前我们只讨论了两个具有相同模式的表。显然,还存在其他更复杂的情况,例如两个表模式不同、在同一表内进行匹配,或者数据不是关系型数据库格式等。


为何不能直接使用字符串匹配?

前面提到数据匹配与字符串匹配有相似之处,但不能直接使用字符串匹配方法。理论上,我们可以将所有属性拼接成一个长字符串,然后通过字符串匹配比较记录。

例如,将元组x1记录转换为“DaveSmith1234567NYCNewYork”这样的长字符串,然后与其他记录进行字符串比较。我们可以这样做,但这只是计算有多少字符或位置不同。

这种方法没有利用领域特定知识。例如,对于姓名,姓氏通常应该相同,如果姓氏不同,则很可能不是同一个人;而名字的变体可能较多。对于电话号码,我们需要进行规范化处理;对于州名,我们需要考虑是否在同一州的不同城市,或者是否存在拼写错误。

这意味着不同的属性应该使用不同的匹配方式。因此,我们希望应用领域知识和更复杂的技术,需要将属性分开比较。


数据匹配的挑战与方法分类

数据匹配的挑战与字符串匹配类似。核心问题是如何准确地进行匹配,因为数据存在许多变体,如缩写、昵称、拼写错误、录入错误、机构名称简写等。

与字符串匹配类似,我们可以使用不同的方法来解决。主要可以分为以下几类:

  1. 基于规则的方法
  2. 基于学习的方法
  3. 聚类方法
  4. 概率方法
  5. 集体匹配方法

另一个挑战是可扩展性问题,这与字符串匹配相同。


基于规则的数据匹配

让我们从基于规则的方法开始。这种方法需要应用领域知识,即编写规则来指定如何匹配元组。

通常,我们需要查看大量匹配或不匹配的元组对作为参考来制定规则,然后对规则进行测试和优化。规则可以有多种类型,例如线性组合权重:为各个属性的相似度得分分配权重,然后合并这些得分。这类似于我们在描述字符串匹配或模式对齐时使用的模型。

以下是具体步骤:

  • 计算两个元组的总相似度得分。
  • 判断该得分是否超过某个阈值,以确定它们是否指向同一实体。
  • 总得分可以是各个属性相似度得分的加权组合。
  • 对于每个属性,可以应用不同的相似度度量方法。

示例:假设我们比较姓名、电话、城市和州四个属性。

  • 姓名:使用Jaro-Winkler距离计算相似度。
  • 电话:使用编辑距离,主要处理数字录入错误。
  • 城市:同样使用编辑距离处理拼写错误。
  • :使用精确匹配。
  • 最后,为每个属性的相似度得分分配不同的权重(例如,城市权重较低,其他属性权重较高),计算加权总得分。如果总分超过阈值,则判定为匹配。

基于规则方法的优点

  • 易于理解。
  • 相对容易实现。
  • 可以从训练数据中学习权重。

基于规则方法的缺点

  • 任何单个相似度得分的增加都会导致总分的增加,这可能并不理想。当某个得分已经足够高时,我们更希望看到其他属性也提供支持证据,即希望存在“收益递减”效应。
  • 逻辑回归规则可以解决这个问题,它不要求所有信号都存在,只要有合理数量的信号支持,就能做出肯定决策。

当然,我们可以编写更复杂的多级规则。例如,如果姓名匹配,则直接判定为匹配;如果姓名相似度低于阈值,则判定为不匹配;否则,需要更多证据。

基于规则的方法易于理解,可以融入复杂的领域知识,但这也可能成为缺点,因为需要花费大量时间调查数据以获取领域知识,这是一项劳动密集型工作。有时数据可能不容易用规则描述,因此我们需要其他方法。


基于学习的数据匹配

当数据不易用规则描述时,我们可以使用基于学习的方法。这类似于模式对齐中的学习方法,可以视为一种监督学习。

我们将数据匹配问题视为一个分类问题:判断一对元组是否匹配。具体步骤如下:

  1. 准备训练数据:已知哪些元组对是匹配的(标签为“是”或“否”)。
  2. 提取特征:特征可以是属性之间的相似度得分,也可以是关于属性的某些规则。例如,姓名的相似度可以使用Jaro-Winkler距离作为一个特征,使用编辑距离作为另一个特征;电话、城市、州的匹配得分也可以作为特征;还可以添加启发式约束,如检查区号与城市是否矛盾。
  3. 选择模型:使用训练数据拟合分类模型,如逻辑回归或决策树。
  4. 应用模型:将训练好的模型应用于新的元组对,预测它们是否匹配。

与基于规则方法的比较

  • 基于规则:需要手动确定规则和权重。
  • 基于学习:可以处理大量特征和训练样本,不需要太多领域知识(即使不确定哪种相似度度量最好,也可以全部加入让模型决定)。能够构建非常复杂的规则(如决策树)。

基于学习方法的缺点

  • 需要足够数量的训练样本来构建准确的模型。如果训练数据不足,模型效果会受影响。

基于聚类的数据匹配

如果训练样本不足,我们可以使用聚类方法。这种方法试图将元组分组,使得每个簇内的所有元组都指向同一个实体,而不同簇的元组指向不同实体。

可以使用多种聚类技术,如凝聚层次聚类、K均值、图论方法等。我们重点介绍凝聚层次聚类。

凝聚层次聚类步骤

  1. 开始时,每个元组自成一个簇。
  2. 计算所有簇对之间的距离或相似度。
  3. 合并最相似的两个簇。
  4. 重复步骤2和3,直到满足停止条件(如达到预定簇数,或相似度低于某个阈值)。

如何度量簇间距离

  • 与基于规则的方法类似,我们需要计算簇的代表元组之间的相似度。这通常涉及为不同属性(如姓名、电话、城市、州)的相似度得分进行线性加权组合。
  • 关键问题是如何表示一个簇(包含多个元组)以计算簇间相似度。有几种方法:
    • 单链接:取两个簇中所有元组对之间相似度的最小值
    • 全链接:取最大值
    • 平均链接:取所有元组对相似度的平均值
    • 规范元组法:为每个簇创建一个最具代表性的元组(规范元组),然后计算两个规范元组之间的相似度。例如,一个包含“Mike Williams”和“MJ Williams”的簇,其规范元组可以是“Mike J Williams”。

聚类方法是一种迭代的、自底向上的方法,它基于当前已有的信息构建实体画像。


基于概率的数据匹配

除了上述方法,我们还可以应用概率方法。这种方法试图利用概率分布进行建模。

优点

  • 自然地融入了领域知识。
  • 利用了概率表示和推理技术的优势。

缺点

  • 通常计算开销较大。
  • 难以调试。

概率方法通常涉及生成式模型(有时也涉及判别式模型)。生成式模型试图描述数据是如何生成的,例如使用贝叶斯网络来表示完整的概率分布。

以朴素贝叶斯模型为例,其核心思想是:计算给定两个元组时,它们匹配的概率。如果匹配的概率大于不匹配的概率,则判定为匹配。

该模型基于特征独立性假设。我们计算在给定特征(如姓氏是否匹配、社会安全号编辑距离、首字母是否匹配等)的条件下,元组对匹配的概率。通过训练数据,我们可以学习这些条件概率表。

然而,朴素贝叶斯的独立性假设在现实中往往不成立。特征之间可能存在依赖关系。

生成式模型从另一个角度思考:假设世界中存在一组实体(如篮球运动员)。当我们选择一个实体时,它会以多种表述形式(提及)出现在文本或记录中。生成式模型就是描述从实体到各种提及的生成过程。


集体数据匹配

之前介绍的方法都是独立地看待每一对元组,假设一对元组的匹配决策不会影响另一对。但在现实中,这些匹配决策可能是相关的。集体匹配方法就是将匹配决策关联起来考虑,而不是将它们视为独立的。

示例:引文匹配中的共作者关系
假设我们有四篇引文,需要匹配其中的作者。作者姓名可能以不同形式出现(有或没有中间名首字母)。如果我们独立地匹配每对作者(如a1与a2,a1与a9),就不会考虑共作者关系。

共作者关系能提供额外信息。例如,如果a1和a4拥有相同的共作者(比如a3和a5是匹配的),那么a1和a4也更可能匹配。因此,我们在做决策时,不仅看a1和a4本身,还要考虑其他相关对(如a3和a5)。

如何实现集体匹配?

  1. 简单方法:将共作者姓名作为额外属性加入特征。但问题在于,这仅使用了简单的字符串相似度来匹配共作者名,而不是像匹配主元组那样使用复杂的多属性相似度组合,可能无法正确贡献到最终匹配决策中。
  2. 更好的方法:使用集体匹配方法,如改进的聚类或概率方法,同时考虑元组本身的相似度和其邻居(关系)的相似度。
    • 将数据视为图,节点是元组,边表示关系(如共作者)。
    • 在聚类时,不仅计算两个簇(节点集)本身属性的相似度,还计算它们邻居簇的相似度。例如,可以计算两个节点邻居簇集合的Jaccard相似度(重叠程度)。
    • 这样,我们就同时考虑了共作者姓名本身的相似性,以及共作者关系的模式相似性。

通过这种方式,我们能够更准确地区分不同的实体,尤其是在共作者关系模式相似的情况下。


总结

在本节课中,我们一起学习了数据匹配的核心概念。我们首先定义了数据匹配问题及其在数据集成中的重要性,并通过示例说明了其复杂性。随后,我们系统地探讨了解决数据匹配问题的五种主要方法:

  1. 基于规则的方法:直观易懂,依赖领域知识,但可能劳动密集且难以处理复杂情况。
  2. 基于学习的方法:将问题转化为分类任务,能处理大量特征,但需要足够的标注数据。
  3. 基于聚类的方法:无监督或弱监督,通过迭代分组识别实体,适合训练数据少的场景。
  4. 基于概率的方法:利用概率模型描述数据生成过程,能自然融入不确定性,但计算成本较高。
  5. 集体匹配方法:考虑元组之间的关联关系(如共作者网络),通过同时评估多个匹配决策来提高准确性,尤其适用于关系型数据。

每种方法都有其适用场景和优缺点。在实际应用中,需要根据数据的特性、可用的领域知识以及计算资源来选择和组合适当的方法。理解这些核心方法为我们在实际数据集成项目中设计和实施数据匹配解决方案奠定了坚实的基础。

024:数据匹配的规模化扩展

在本节课中,我们将要学习如何应对数据匹配(记录链接)中的规模化挑战。当数据量巨大时,直接比较所有可能的记录对是不可行的。我们将探讨几种关键技术,如分块、哈希和负载均衡,来高效地处理大规模数据匹配问题。

数据匹配的规模化挑战

上一节我们介绍了数据匹配的基本概念。本节中我们来看看当数据量巨大时,我们面临的核心挑战。

候选记录对的数量可能非常庞大。例如,在学术文献引用或人口数据集中,记录数量可能达到数十亿级别。直接比较所有可能的记录对在计算上是不可行的。

因此,我们需要处理可扩展性问题。

借鉴字符串匹配的扩展方法

借鉴字符串匹配中的可扩展性方法,我们可以使用不同的技术来筛选候选对。

以下是几种关键方法:

  • 过滤:使用索引或哈希等技术来帮助筛选候选对。
  • 哈希:将元组哈希到桶中,只匹配同一桶内的元组。这类似于我们之前学过的均值哈希局部敏感哈希方法。局部敏感哈希是一种分块方法,我们将字符串哈希到不同的块中,然后只比较同一块内的候选对。
  • 分组:基于特定特征进行分组,例如仅使用邮政编码进行哈希,就能显著减少候选对数量。
  • 排序:基于ID、姓名、声音码等特征进行排序,以缩小候选对范围。
  • 启发式规则:应用特定规则,例如设定相似度阈值,要求记录对至少达到某种程度的相似性,或在特定约束内(如字符数)。

索引也是方法之一,例如在姓名上构建倒排索引,然后查找具有相同或最相似姓名的候选对。

我们还可以结合多种技术。例如,首先使用邮政编码将房屋哈希到桶中,然后在桶内使用街道名称对房屋进行排序,并使用滑动窗口等方法进行匹配。你可以制定一系列规则来完成匹配。

使用分块技术减少候选对

为了最小化匹配记录对的时间,一个核心思路是首先识别潜在的对,然后再实际计算相似度得分。这与均值哈希和局部敏感哈希的思路相似。

从大数据视角看,记录链接可以拆分为多个步骤,类似于文档处理中的降维和分块。

以下是记录链接的典型步骤:

  1. 分块:减少可能的候选对。这类似于局部敏感哈希,是一种分块方法,旨在将元组放入不同的块中,只匹配块内的对。
  2. 成对匹配:计算元组对之间的相似度得分。
  3. 聚类与集体匹配:相似度得分本身可能不足以决定它们是否匹配或属于同一实体组。我们可能希望使用聚类来进行集体匹配,将提及分组以真正指向实体。

因此,我们有多个步骤:分块以减少候选对,获取成对相似度得分,最后将元组分组以指向实体。

大数据四维挑战下的记录链接

回到大数据的四个V(Volume, Velocity, Variety, Veracity),记录链接需要应对这些挑战。

  • 数据量:我们有数十亿条记录,需要分布式处理。MapReduce框架可能对此有帮助。显然,分块因为减少了候选对,也是必要的。
  • 速度:数据可能持续大量涌入,我们可能无法一次性完成所有匹配。解决方案是增量匹配:基于现有数据进行匹配,当有新数据到来时,继续匹配更多数据。
  • 多样性:数据存在多种形式。之前讨论的是匹配结构化数据,但如果我们有非结构化甚至半结构化数据呢?此外,在讨论模式对齐时,我们谈到了如何匹配网络表格。
  • 准确性:准确性涉及数据的不确定性。数据可能随时间变化,有时数据并非不准确,只是过时了。数据的时效性是否最新,可能会影响匹配结果。

可以看到,在大数据维度下进行数据匹配,需要考虑所有这些V。这意味着仅仅匹配成对的事物是不够的,我们需要考虑更多因素,问题也变得越来越复杂。

使用MapReduce进行并行匹配与负载均衡

对于记录链接,我们当然可以使用MapReduce来并行处理。但在使用MapReduce进行并行匹配时,也存在问题。

在并行处理元组之前,我们需要进行分块,以决定哪些匹配可以并行执行。例如,基于邮政编码将元组分割到不同的块中,然后只需要比较块内的候选对。这意味着一个块内的所有元组可以在一个MapReduce任务中处理,另一个块在另一个任务中处理,从而实现并行。

然而,这可能导致跨工作节点的负载非常不均衡。一个工作节点可能处理包含9个元组的块(需要匹配36对),而另一个节点只处理包含3个元组的块(只需匹配3对)。即使我们进行了并行化,加速效果也不明显,因为大块的处理将占据大部分时间。

因此,我们可能需要负载均衡

以下是两种负载均衡策略:

  • 块分割:将大块分割成子块。小块的匹配在一个任务中完成。对于大块,我们首先将其随机分割成更小的子块。每个子块的匹配在一个任务(工作节点)上执行。我们仍然需要考虑跨越两个子块的记录对,这将成为另一个任务,处理笛卡尔积匹配。通过这种方式,最耗时的任务所需处理的对数会减少,从而获得加速。
  • 对分割:基本思想是枚举所有可能的匹配对,然后重新分配。这种方法需要事先了解所有可能的匹配并进行枚举,在消除和重新分配方面需要更多开销。

分块技术的问题与改进

回到分块技术,分块无疑是解决可扩展性挑战最常用的方法之一,但其本身也存在问题。

假设我们仅使用单一分块,例如仅按姓氏分块。我们将得到几个块。如果只在这些块内进行匹配,我们可能会错过某些潜在的匹配对,例如不同块中但实际上匹配的记录。因此,单一分块方法可能导致召回率低,即无法识别出一些潜在的匹配对。

解决方案是应用多重分块,例如依次按姓氏、名字、出生年份、所在州等进行分块。这样,我们不会遗漏记录,肯定会考虑所有情况。但这也意味着某些记录对会在多个块中被重复比较多次,比较次数反而增加,这显然不可取。我们提高了召回率,但使过程更耗时。

因此,我们可能需要进行块净化,即剔除某些块。这可以通过评估分块方法的质量来实现,例如查看块内是否包含过多元组、是否使用了不同的信息等,然后决定是否考虑该结果块。可见,解决一个问题的同时,我们可能遇到另一个问题。

考虑时间因素的时序记录链接

接下来讨论时序匹配。对于某些实体(如个人),信息会随时间变化。数据库中的数据可能不是最新的。不同组织整合数据时,一个可能是几年前的,另一个可能是最新的。数据本身没有错误,只是有些数据未更新。因此,时间差异也需要考虑。

例如,查看一个人在不同时间点的 affiliation(所属机构)。我们可能有多条记录。时间上的大间隔可能暗示第一条记录与其他记录不属于同一实体。在短时间内频繁更换所属机构的情况较少见,因此短时间内出现的多条不同机构记录也可能不属于同一实体。

因此,时间窗口和数据的异同可以为我们提供信息,判断不同元组是否指向同一实体。这就是链接时序记录的核心思想。

我们可以将这类考虑转化为定量评估。例如,如果在短时间内出现高度不一致,则给予高惩罚以表示可能性低;随时间推移发生变化,则给予较低惩罚以表示更可能发生;在短时间内保持一致,则给予较高奖励或分数;如果存在长时间间隔,则给予较低分数。在进行匹配时,我们可以将这些考虑纳入,这有助于将时间因素也考虑进去。

课程总结

本节课中我们一起学习了数据匹配在大数据环境下面临的规模化扩展挑战及其解决方案。

我们讨论了如何借鉴字符串匹配中的技术(如哈希、索引、分块)来减少候选对。重点介绍了分块技术作为核心方法,以及其在并行计算中可能引起的负载不均衡问题及相应的块分割对分割策略。我们还探讨了单一分块可能导致低召回率,而多重分块又可能增加计算量的问题。最后,我们引入了时序记录链接的概念,强调了在匹配中考虑数据时效性和时间变化模式的重要性。

目前,对于复杂的数据集成问题(包括记录链接),尚无完全自动化的解决方案。我们开发的是辅助各个阶段(如模式对齐、记录匹配、数据融合)的工具。基于具体问题(如处理个人或组织随时间变化的数据,或需要集体匹配的情况),我们需要思考不同的方法,并利用分块、负载均衡等技术来加速处理,确保以最合适的方式完成工作。

025:数据集成之数据融合

概述

在本节课中,我们将要学习数据集成中的第三个核心组成部分:数据融合。数据融合旨在解决来自不同数据源的冲突数据值,以确定最能反映真实世界情况的值。我们将探讨其基本概念、面临的挑战以及一些核心解决方法。


数据融合简介

上一节我们介绍了记录链接,本节中我们来看看数据集成流程的最后一步——数据融合。

当集成不同数据源时,同一实体的同一属性可能由不同数据源提供相互冲突的值。这些冲突可能源于录入错误、基于过时信息的错误计算,或对语义的不一致解释。问题也可能由数据源之间的共享和复制引起。由于数据量庞大,我们无法保证数据完美无缺,因此需要处理这些冲突值。

数据融合的目标是解决不一致性,并决定哪个值真实反映了现实世界。与模式对齐和记录链接相比,数据融合是一个相对较新的领域。


解决不一致性的基本方法

要解决数据融合中的不一致性,给定多个提供不同属性值的数据源,可以采用一些简单的方法。

以下是几种基本策略:

  • 选择最新值
  • 如果值是数值,可以取所有值的平均值、最大值或最小值
  • 简单地应用投票机制。

考虑以下例子,我们有三个数据源(S1, S2, S3)和五个人的数据:

人物 S1 S2 S3 投票结果
人物A UW UW UW UW
人物B MSR MSR UW MSR
人物C UW UW UW UW
人物D UW UW UW UW
人物E MSR MSR UW MSR

可以看到,并非所有值都相同。例如,对于人物B,S1和S2提供“MSR”,而S3提供“UW”。通过多数投票,我们可以统计最频繁出现的值,并将其视为真实值。例如,对于人物B,“MSR”获得了多数票。


数据融合的挑战与核心组件

然而,如果数据源之间存在复制行为,多数投票可能不是最佳方法,因为它可能导致错误决策。

因此,在进行数据融合时,我们可能需要进一步评估数据源质量,并检测复制行为,以便真正识别出正确的值。

例如,在评估数据源质量时,基于多数投票,S1提供真实值的频率最高,因此可能被视为质量较高的数据源。进一步观察数值,可能会发现S3和S4提供的值非常相似,S4和S5提供的值也非常相似。通过复制检测,我们或许能识别出S4和S5在相互复制,从而降低这些数据源的权重,使投票结果更可靠。

因此,数据融合包含三个主要组件:

  1. 投票:决定候选值。
  2. 数据源质量评估:衡量数据源的准确性。
  3. 复制检测:识别数据源间的依赖关系。

数据融合面临的“4V”挑战

与记录链接类似,数据融合也面临大数据的“4V”挑战:

  • 真实性:数据融合与数据真实性密切相关。
  • 体量:类似记录链接,可以使用MapReduce等并行计算框架实现。但也可能需要处理在线数据融合,以便在查询时获得估算结果。
  • 速度:世界不是静态的,数据会随时间演变和变化。我们需要考虑数据如何随时间变化,以确定哪个值是正确的,以及它在何时是正确的。
  • 多样性:数据融合不是一个独立的过程;它可能影响模式对齐和记录链接,反之亦然。

核心概念深入探讨

接下来,让我们深入探讨一些核心概念。

数据源准确性评估

如前所述,投票是最基本的解决方案。当数据源彼此独立且具有相似的准确性时,它效果良好。但在现实世界中,并非所有数据源都具有相同的准确性。有些数据源可能不如其他数据源准确,因此最好给它们分配不同的权重,特别是给知识更丰富的源分配更高的权重。

这意味着我们需要能够衡量数据源的准确性和可信度。数据源准确性可以定义为数据源提供的值是真实值的概率

问题在于如何计算一个值为真的概率。首先,假设数据源是独立的,可以应用贝叶斯分析。考虑一个数据项D,它有n+1个可能的值(1个真实值和n个错误值)。观测值φ表示一个数据源为该数据项提供了哪个值。我们需要找到的是在给定某个值为真的条件下,观测到φ的概率,这就是数据源S的准确性A_S。如果数据源没有提供真实值,那么概率是(1 - A_S) / n(在错误值均匀分布的假设下)。

如果我们知道了数据源的准确性,就可以计算每个值的投票计数,进而找到一个值为真的概率。可以看到,数据源准确性、投票计数和值为真的概率之间存在相互依赖关系。

数据源间复制检测

数据源间的复制检测是一个挑战,因为共享数据并不意味着复制——数据源可能各自独立地提供正确数据。

复制检测的直觉是:复制更可能发生在共享值的数据源之间,但共享真实值不太可能涉及复制。相反,共享不常见的值可能是复制的一个提示,因为当数据源独立时,不常见的值是一个低概率事件。这意味着,如果数据源共享大量错误值,则表明存在复制。

基于这种直觉,可以构建贝叶斯模型来计算一对数据源S1和S2在给定观测数据条件下彼此独立的概率,以及存在复制关系的概率。根据贝叶斯定理,我们需要的是在数据源独立(或复制)的条件下,观测到数据的概率

组件间的相互依赖关系

评估数据源准确性需要从真实值发现中获得值正确性的知识,而数据源准确性的知识又有助于获得更好的真实值发现结果。同时,复制检测需要数据源准确性和值正确性,其结果也有益于真实值发现。因此,在真实值发现、准确性计算和复制检测这三个组件之间存在相互依赖关系。这些组件通常迭代计算,直到达到收敛。


动态世界中的时序数据融合

现在让我们讨论数据融合的另一个挑战或需求。回想在记录链接中,我们提到了链接时序记录。现在我们考虑类似的情况:现实世界不是静态的,真实情况会随时间变化。

因此,这里的目的是进行时序数据融合,以找出历史中所有过时的值及其有效时间段。传统的数据融合将值视为静态的,但事实上值是动态的,与时间相关联。我们想要做的是识别出对应时间段的真实值。

例如,随着时间的推移,一些数据源可能在某个时刻提供了错误的值,而一些值可能已经过时。数据错误的原因,除了简单地给出错误值外,还可能是完全未能更新数据,或未能及时更新数据。

因此,我们需要修改问题的定义。在动态世界中,对象与值相关联,同时也与一个生命周期相关联。对于数据源,不同于静态世界中每个源为对象提供一个单一值,现在每个源可以为对象提供一系列更新。例如,源S1可能在2000年提供更新,对象的隶属关系是“UW”,然后在2007年,值变为“Google”。输出结果也随之改变。在静态世界中,每个对象只有一个真实值。现在,对于每个对象,根据生命周期,可能存在多个真实值。因此,除了确定真实值,我们还希望确定该值在哪个时间段内为真。


总结

本节课中,我们一起学习了数据集成的三个组成部分:模式对齐、记录链接和数据融合。我们提到了许多不同的技术。数据集成领域仍在不断发展,许多新技术被提出。我们希望这些内容能给你一个基本的概念,以便日后遇到该问题的不同方面时,你能够有一个起点,并探索最佳的解决方案。

026:为何数据隐私至关重要 🛡️

在本节课中,我们将要学习数据隐私为何在当今大数据时代变得至关重要。我们将探讨数据无处不在的现象,理解数据隐私面临的新挑战,并初步了解保护数据隐私的基本策略。

近年来,我们越来越多地听到“数据隐私”这个词。我们从新闻中听到数据隐私,从文章中读到关于数据隐私问题的报道。同时,我们在使用各种服务时,也越来越多地看到与数据隐私相关的声明或指南。例如,在使用网上银行时,我们通常会看到许多关于数据收集和使用的指南或声明的更新。甚至在进行网上购物时,在您完成订单并让产品发货给您之前,您也需要再次同意数据收集和使用条款。同样,在我们的手机或电脑上安装应用程序时,我们也经常需要同意这些数据收集和使用的协议。

此外,许多组织也在发布关于数据隐私的信息。例如,香港科技大学也有这样一个页面,说明他们如何重视数据隐私、有哪些保护措施和指南,以及他们的数据隐私声明。我们现在看到越来越多这样的内容。为什么会这样呢?当然,这是因为技术的进步。在过去,我们的计算能力有限,数据通常以有限的规模被收集,并以小规模进行分析,由一小群人管理和处理。

因此,数据隐私在当时并不是一个非常严重的问题,它仍然是个问题,但不像现在这么严重。如今情况不同了,我们处于大数据时代,数据无处不在。我们自己也在各处生成数据。让我们快速回顾一下当今数据的规模和数量。例如,有分析显示2020年互联网用户数量。我们可以看到,2014年只有29亿,而到2020年已增至45亿。仅仅几年时间,数量几乎翻了一番。

那么,我们在互联网上做什么呢?我们经常进行搜索,使用谷歌等搜索引擎在线查找各种信息或资料。每分钟有200万次搜索,其中70%来自手机。如今,我们所有人都非常习惯于使用手机、电脑连接互联网进行搜索。当然,我们寻找的是数据,同时我们也在生产数据。例如,我们都在使用社交媒体。当我们使用社交媒体时,我们实际上在主动生成数据,因为我们发布动态、发推文、发送消息、发布照片和视频,所有这些都包含了关于我们自己的信息或数据,我们正在生成大量的数据。

除了社交媒体,还有其他的通信方式。即使我们不使用Facebook、WhatsApp、Instagram等社交媒体应用,我们也可能通过短信或WhatsApp消息发送信息进行交流。还有Zoom,我们几乎每天都在进行Zoom会议。所有这些都意味着数据。多媒体方面呢?现在我们每个人要么在看视频,要么甚至在制作视频,就像我们现在正在做的一样。例如,在YouTube上,每分钟有500小时的视频被上传。TikTok上,每天有超过10亿的视频被观看。Spotify上,每分钟有28首曲目被添加到音乐库。Netflix上被观看的内容时长呢?所有这些都意味着数据无处不在。更不用说我们简要提到的在社交媒体上发布照片。据统计,2020年拍摄了1.4万亿张照片。

那么物联网呢?据估计,到2021年将有460亿台联网设备,到2021年底全球将安装310亿台设备。你可以看到这些数字实际上增长得非常快。物联网意味着数据正在被收集,因为我们有通过互联网、Wi-Fi或蓝牙连接的设备,它们会收集数据。所以数据无处不在,每一秒、每一分钟都有数据生成和被收集。但这还不是全部。数据被收集后,会被分析、共享。数据被视为新的石油,是新的财富。正因为数据如此重要,我们才在这里讨论它。

因为数据正在被生成、收集和分析,那么我们收集、生成和分析的主要数据种类或来源是什么?是个人数据,关于我们自己的数据。这就是为什么大数据隐私问题非常重要。我认为我们没有人希望自己的数据被泄露或让所有人知道。我们希望能够保护自己的数据,这意味着我们要维护我们的数据隐私。

你可以看到,由于大数据,数据隐私问题现在达到了一个新的规模水平,这是以前没有预见到的。这就是为什么数据隐私在近年来变得越来越重要,也是为什么我们现在要讨论它。当我们作为进行数据收集、数据分析、数据处理的人时,我们需要小心并意识到我们可以做些什么来帮助保护数据隐私,不侵犯个人的数据隐私。

上一节我们介绍了数据隐私日益受到关注的背景,本节中我们来看看数据无处不在的具体表现及其带来的隐私挑战。

我们正处于大数据时代,大数据也给数据隐私带来了更多挑战。首先,让我们简要回顾一下“数据无处不在”意味着什么。

现在有一些关于互联网用户的统计和分析。例如,2020年互联网用户数量已超过45亿,与2014年的29亿相比,短短几年内几乎翻了一番。我们在互联网上的用户更多了。那么,在互联网上搜索数据呢?我们所有人都越来越习惯于在线搜索事物。例如,我们正在谈论数据隐私,可能你们中的一些人已经在尝试搜索什么是数据隐私,以及可以在线获得哪些额外信息。这显示了我们对使用互联网的适应程度。我们也越来越习惯于使用电脑以外的设备。

例如,在谷歌上进行的搜索中,有70%来自手机。你可以看到,人们连接互联网、搜索信息、通过互联网进行交流变得越来越普遍。由于互联网用户增多,意味着有更多的数据被生成和收集。当我们使用互联网时,大多数人会使用社交媒体类的应用。例如,有一个名为“数据永不眠”的信息图,它提供了一些关于每分钟生成多少数据的数据,现在已经更新到第8版。

该信息图告诉我们每分钟生成的数据量。例如,在Instagram上,每分钟有34.7万个故事被发布。在Facebook的使用上,每分钟有14.7万张照片被上传,每分钟有15万条消息被分享。实际上,我认为很多人都在分享他们的位置、他们发现的有趣事物,一点一滴地分享他们的生活。这些是我们主动生成的数据。除了使用社交网络,在线通信呢?如果我们不在Instagram或Facebook上发布内容,我们可能会发送消息,可能是短信、WhatsApp消息或其他类型的通信应用。同样,我们在发送消息时也在生成数据。

那么像在线会议这样的其他通信形式呢?近年来我们都在使用Zoom。你可以看到,实际上有大量的人也在使用这类通信应用。同样,当我们通过互联网通信时,我们每分钟、每秒钟都在生成数据。除了消息和通信,多媒体数据呢?例如,现在我们所有人要么在线观看视频,要么实际上在线生成、制作视频。例如,YouTube用户每分钟上传500小时的视频。TikTok每天有超过10亿的视频被观看。除了人们生成或观看的视频,像公司或组织生成的视频或内容呢?Spotify每分钟添加28首音乐曲目。这又是另一种形式的数据。当我们有内容被上传时,当然也有音乐被收听。同样,有数据传输。还有Netflix上的内容。如今,越来越多的用户使用这类流媒体服务观看内容。所有这些都是数据。你可以看到,要么我们在主动生成数据,要么我们的数据以不同形式被生成。

更不用说照片了。现在我们每个人都在用手机或电子相机拍摄电子照片。据估计,2020年拍摄了1.4万亿张照片。这是巨大的数据量。无论我们把数据放在哪里,很可能它们都被存储在网上。那么除了电脑或手机之外的设备呢?物联网。现在,如果我们环顾四周,越来越多的设备通过互联网连接,无论是通过Wi-Fi还是蓝牙。当设备连接时,它们连接是有原因的——它们在收集数据。例如,我们经常有测量身体状况的设备,比如体重、身高、心率等身体测量数据。我们希望能够在例如手机等设备上查看这些历史数据或身体数据。

这意味着数据被收集、存储,并在互联网上,我们将能够查看这些历史数据。同样,数据被收集。还有那些监控我们或监控资源、产品使用情况的设备,以及智能设备,所有这些实际上都在收集关于我们的数据或信息,无论我们是否知情。可以说,我们的整个生活、整个生存状态实际上都在被收集。当然,收集如此大量的数据并非没有原因。数据一旦被收集,我们就想进行分析,希望能够创造价值。这就是大数据价值链的目的。

那么,当数据被分析、被收集和分析时,数据隐私或数据安全被侵犯或泄露的可能性就更大,风险也更高。这就是为什么人们对数据隐私越来越关注,因为收集的数据是关于我们、关于个人的,是我们自己的数据。我认为没有人希望自己的数据在不知情的情况下被披露。我们希望知道我们的数据在哪里、被用于什么、谁在使用它。这就是为什么对数据隐私的关注日益增加,也是为什么我们现在要讨论这个问题。

你可以看到,通过所有这些讨论,实际上大数据是我们想要讨论数据隐私的原因。大数据实际上将隐私问题带到了一个我们以前未曾预见的新规模水平。因为大数据意味着数据无处不在,也意味着我们拥有更好的技术、更强的计算能力来进行分析、数据收集,所有这些都增加了数据隐私的风险。

上一节我们看到了数据量的爆炸式增长,本节中我们来探讨大数据具体如何带来了新的隐私风险。

数据隐私风险意味着人们的隐私可能因不同的数据收集或数据处理而被侵犯。让我们看几种个人或用户隐私可能被侵犯的情况。

例如,现在越来越有可能将不同来源的数据或外部数据结合起来,以推断更多信息。如果我们将个人数据与外部数据整合或结合,这意味着将向我们当前的数据集添加更多数据或信息,这实际上会增加关于个人或用户的新事实或新信息。因为这是实际上未被预见的,我们在添加数据,添加新东西。所以用户很可能会认为,在他们不知情、未经同意的情况下,我们了解了更多关于他们的信息。这就是个人数据、个人隐私可能被侵犯的一种可能性。

另一种情况是,数据被收集和分析以增加商业价值。例如,公司可能分析数据以便向用户发送定向广告。这意味着,在用户不知情的情况下,公司可能将数据用于其他目的。这又是一种侵犯特定个人数据隐私的可能性,因为同样,这对用户来说是一种未预见和未知的情况。

用户可能会觉得他或她的隐私受到了侵犯。现在,因为数据被收集和存储,同样由于大数据,数据存储不安全的风险也在增加。这意味着数据可能被泄露或被黑客攻击。在存储或处理阶段,当数据被泄露或黑客攻击时,就意味着数据将被不当使用。这同样是对个人隐私的侵犯。

你可以看到,随着大数据、数据收集量的巨大增长,以及分析变得更加复杂、连接不同的数据源,这些都增加了数据隐私问题的风险。

除了这些,大数据还带来了其他问题。我们知道数据有多么重要,数据实际上为我们带来价值,是数据分析和创造价值的重要燃料。因此,组织收集越来越多数据的可能性或动机也在增加。不仅收集更多数量的数据,而且组织或公司也更可能收集更深层次的数据。因为我们希望能够进行更全面的分析,组织或公司更可能将数据保留更长时间。

由于保留时间更长、数据范围更广、数据收集更深,这可能再次揭示更多关于个人的信息。这同样增加了特定个人数据隐私被侵犯的可能性。

现在,除了我们如何为商业增加价值,收集的数据更可能被用于预测性分析、规范性分析。一旦我们有了这些预测,它们很可能会被用于决策。如果决策基于这些算法,并且由于数据挖掘或其他类型的数据处理,很可能导致对用户的分类或引发关于用户的伦理问题。这也是数据隐私问题的一种可能性或风险。

上一节我们讨论了大数据带来的隐私风险,本节中我们来看看用户感知与数据质量之间的关系。

尽管数据隐私问题的风险在增加,但如果人们意识到这一点,如果人们意识到有多少关于他们自己的信息被收集,那么在用户知情、意识到被收集的数据量的情况下,可能仍然可以接受。但是,实际上现在数据正在被收集,但对于大多数用户来说,他们并不知道有多少数据被收集。

因为他们不知道有多少数据被收集,人们可能会觉得他们的隐私受到了侵犯。例如,如今我们所有人可能都在我们的社交网络应用上看到过让我们有点惊讶的广告。例如,我们昨天刚和朋友讨论了某件事,然后就开始在我们的社交网络应用上看到相关的广告。如果我们不知道这些应用收集了多少数据,我们会感到惊讶。人们会觉得他们的隐私受到了侵犯,他们的数据被收集了,例如我们的对话被记录了等等。

但对我们来说,我们知道我们的数据正在被大规模收集。例如,我们有社交网络,我们朋友的数据可能被收集,他们在社交网络上的动态当然会被分析,我们与朋友的关系因为我们连接在社交网络上,所以我们的朋友看到什么或发布了什么,都会成为被分析的数据。这就是为什么我们看到某种广告。但如果我们不知道这些,我们就会觉得我们的数据隐私受到了侵犯。如果人们觉得他们的隐私受到了侵犯,他们就会不太愿意分享他们的数据,或者提供他们的数据,他们甚至可能伪造他们的数据。这是我们不希望看到的,因为如果我们想做数据分析,就需要高质量的数据。如果我们的数据中有伪造的数据,那就意味着我们有低质量的数据,我们将无法进行准确的数据处理、数据预测或数据分析。这是我们不希望发生的事情。

这就是为什么对于我们这些进行数据生成、数据收集和数据处理的人来说,意识到数据隐私问题或数据隐私风险,以及我们可以做些什么来保护个人数据隐私非常重要。这就是为什么接下来我们将讨论保护数据隐私的措施。

本节课中我们一起学习了数据隐私为何在大数据时代变得至关重要。我们回顾了数据量的爆炸式增长,理解了大数据如何带来了前所未有的隐私挑战,包括数据整合、商业利用、安全存储和决策影响等方面。我们也认识到用户感知对数据质量的影响。在接下来的课程中,我们将深入探讨保护数据隐私的具体技术措施和设计策略。

027:数据隐私保护方法

在本节课中,我们将要学习数据隐私保护的核心方法,特别是匿名化处理及其相关技术。我们将探讨匿名化的基本概念、常用技术、其局限性,以及如何通过更高级的方法(如K-匿名性和L-多样性)来应对重识别攻击。最后,我们也会简要了解加密等其他隐私保护手段。

匿名化概述 😊

上一节我们介绍了数据隐私的重要性,本节中我们来看看最常用的隐私保护方法之一:匿名化。匿名化旨在移除、隐藏或掩盖数据记录与特定个体之间的关联,使得我们无法根据数据记录识别出对应的个人。这种方法在数据收集、存储、分析和共享等数据价值链的各个阶段都可能被应用。

匿名化可以由数据使用者(例如进行数据分析的人员)在分析前执行,也可以由数据提供者在收集数据后、存储前或共享/出售数据前执行。

匿名化基本技术

以下是实现匿名化的几种基本技术。

1. 移除
对于直接标识符,例如姓名、邮箱地址、IP地址、生物特征信息、手机号码、医疗设备标识符等,可以直接将其从数据集中移除。因为仅凭这些信息本身就能唯一识别个体。
对于准标识符,例如出生日期、年龄、性别等,也可能需要考虑通过移除或省略来进行匿名化。因为当这些信息组合在一起时,仍有可能揭示个体身份。

2. 假名化
有时我们需要区分不同个体或将数据与其他数据集链接,但又不能暴露真实的标识符。此时可以使用假名化技术,即用代码编号(通过加密或哈希算法生成)替换个人详细信息。

  • 可逆假名化:生成的代码可以转换回原始标识符。这在后续可能需要识别个体时有用。
  • 不可逆假名化:生成的代码无法转换回原始标识符。这能提供更强的隐私保护,但在需要回溯识别时无法使用。

3. 分组/聚合/分类
通过将数据按年龄、性别、邮编等进行分组或聚合,可以降低数据粒度,使得属性值的组合不足以唯一识别出个体。

匿名化的局限性与重识别攻击 😊

然而,匿名化并不能完全防止重识别攻击。即使数据已经过匿名化处理,攻击者仍可能通过整合其他数据源来重新识别出个体。

重识别攻击是指故意识别个体并揭露其个人详细信息的行为。当匿名化数据集与另一个包含标识信息的数据集(可能来自不同来源)进行整合或链接时,额外的信息可能通过数据匹配揭示出个体的身份,或者产生能够唯一识别个体的属性值组合。

著名研究案例
拉坦娅·斯威尼博士的研究表明,将已移除标识符的医疗记录(包含准标识符如性别、出生日期、邮编)与选民登记记录(包含姓名、地址等标识符)进行匹配,仅通过出生日期和邮编就能识别出69%的选民。如果结合邮编、性别和出生日期,则有90%的个体具有唯一的组合,从而能被重识别。

其他案例

  • Netflix案例:研究人员发现,仅凭对订阅者背景的粗略了解(如大致年龄范围和地理位置),就能以高概率从50万匿名化的用户电影评分记录中识别出特定用户。
  • AOL案例:2006年,AOL发布了2000万用户几个月内的匿名化搜索查询记录。尽管移除了标识符,但《纽约时报》记者通过将搜索历史(包含特定关键词和地点)与电话簿列表进行交叉比对,在几小时内就成功识别出用户4417749对应佐治亚州一位62岁的寡妇。

重识别攻击的类型

重识别攻击主要可分为三种类型。

1. 关联攻击
通过将一个数据集与其他来源的数据集链接,以创建更细粒度、更独特的数据条目。例如,将药房的假名化客户数据与医院目录关联,以查看哪些医院从哪些药房购买了药品。

2. 任意攻击
无意中通过链接数据集导致个体被识别。例如AOL案例中,记者并非有意针对某人,但链接搜索记录和电话簿后意外识别出了个体。

3. 目标识别攻击
这是最严重的一种,攻击者拥有特定目标的背景知识,并有意利用这些知识交叉核对其他数据集,以获取关于该目标的更多信息。例如,雇主可能利用对潜在员工的了解,去匹配医疗或保险记录以探查其健康状况;保险公司也可能利用申请人的信息去其他数据库挖掘更多细节。

增强的隐私保护方法:K-匿名性 😊

由于匿名化不足以防止重识别攻击,我们需要其他措施来确保即使数据集与其他数据合并,也无法唯一识别个体。其中一种方法是K-匿名性

K-匿名性要求:在数据集中,任何个体的记录至少在K-1条其他记录中是不可区分的。例如,若K=3,则对于任何一组准标识符组合,至少存在3条记录共享该组合,使得攻击者无法确定目标对应哪条记录。

实现K-匿名性的技术

  • 抑制:用特定符号(如*)替换某些属性的部分或全部值。
  • 泛化:将具体的属性值替换为一个范围或类别。例如,将年龄“28”替换为“<30”。

K-匿名性的示例
假设原始数据中,通过年龄和国籍的组合可以唯一识别个人并获知其疾病。通过实施K=4的匿名性(例如,将年龄泛化为“<30”,抑制部分邮编),使得共享相同准标识符组合(如特定邮编前缀、年龄范围、国籍)的记录至少有4条。这样,即使知道某人的年龄范围和国籍,也无法确定其对应的具体记录和疾病。

K-匿名性的不足
K-匿名性可能无法防御目标识别攻击。考虑上述示例中最后4条记录,它们共享相同的准标识符组合,但敏感属性“疾病”的值全部是“癌症”。如果攻击者知道目标属于这个组,即使无法确定具体是哪条记录,也能断定目标患有癌症,从而泄露了敏感信息。

增强的隐私保护方法:L-多样性 😊

为了解决K-匿名性的不足,提出了L-多样性作为增强。

L-多样性旨在减少数据表示的粒度,其核心思想是:对于共享同一组准标识符的每个记录组,其敏感属性至少应有L个不同的值。

L-多样性的示例
K=4匿名性的基础上,要求L=3多样性。这意味着在每个由4条记录组成的组内,疾病类型至少要有3种不同的值。例如,一个组内可能包含“心脏病”、“病毒感染”和“癌症”。这样,即使攻击者知道目标属于该组,也无法确定其究竟患有何种疾病。

其他隐私保护方法

除了匿名化及其增强方案,还有其他多种隐私保护技术。

1. 差分隐私
通过向数据中添加噪声或生成合成数据集来保护隐私。其理念是:对包含某个个体的数据集进行查询的结果,与不包含该个体的数据集进行相同查询的结果,差异应该非常小,从而无法推断出个体的信息。需要在降低重识别风险和保持查询准确性之间进行权衡。

2. 数据聚合
在发布数据前,将记录汇总为基于报告的摘要形式(如总和、平均值)。这类似于K-匿名性中的分组,但会使得细粒度的分析变得困难,并可能产生原始数据中不存在的新关系。

3. 数据抑制
不发布全部数据值,部分数据被移除、保留或不披露。这会影响数据挖掘或分析的完整性。

4. 数据交换
交换某些选定记录的属性值,以隐藏记录的真实对应关系。但高交换率可能会破坏变量间的原始关系。

5. 数据随机化
向数据变量添加随机生成的数值噪声,以扭曲敏感变量的值。这会改变数据分布,可能影响后续数据分析(如回归分析)的准确性。

6. 数据合成
用通过模拟生成的合成值替换敏感变量。同样,这会改变原始数据,可能影响数据处理结果。

加密作为隐私保护手段 😊

接下来我们看看另一类非常重要的隐私保护措施:加密。

加密是通过算法将原始数据(明文)转换为另一种形式(密文)的过程。查看密文的人无法得知原始数据内容,从而保护了隐私。加密常用于保护分布式存储的大数据。

挑战与演进
一个关键挑战是:如何在数据保持加密的状态下进行数据分析?如果解密后再分析,则隐私保护失效。因此,隐私保护计算领域正在研究能够直接在密文上进行计算的加密方法,例如可搜索加密、同态加密等。

几种加密方案

  • 基于身份的加密:访问控制基于用户的身份。允许用户访问所有资源,但难以实现细粒度的访问控制,且更改密文接收者困难。
  • 基于属性的加密:访问控制基于用户的属性。能实现更细粒度、更安全灵活的访问控制,但同样存在计算开销大、更改接收者困难的问题。
  • 代理重加密:可用于处理更新密文接收者的问题,可与IBE或ABE结合使用,但计算时间仍较长。
  • 同态加密:允许直接在密文上进行计算,无需解密,安全性最高。但其算法非常复杂,计算开销极大。

隐私保护数据处理

之前我们探讨了适用于数据价值链不同阶段的隐私保护措施。接下来,我们将具体关注隐私保护的数据处理技术,这涉及到如何在保护隐私的前提下进行有效的数据分析和挖掘。


本节课中我们一起学习了数据隐私保护的核心方法。我们从基础的匿名化技术入手,了解了其实现方式(移除、假名化、分组)及其局限性——无法完全防止重识别攻击。接着,我们探讨了更高级的防护措施,如K-匿名性和L-多样性,它们通过抑制和泛化技术来降低重识别风险。此外,我们还简要介绍了差分隐私、数据聚合、加密等多种其他保护手段,认识到在增强隐私保护的同时,往往需要在数据效用和分析准确性之间进行权衡。理解这些方法是设计和实施负责任的数据分析流程的基础。

028:隐私保护数据处理 📊🔒

在本节课中,我们将要学习如何在数据分析过程中保护数据隐私。我们将探讨几种关键的隐私保护技术,并了解它们如何在保证数据处理准确性的同时,确保个人敏感信息不被泄露。


隐私保护技术概述

我们之前讨论了许多不同的数据隐私保护技术或措施。可以看到,许多措施需要在数据保护(隐私)与数据处理(准确性)之间进行权衡。因此,当进行数据处理时,我们确实需要一些技术或措施,以便在保护隐私的同时,允许我们进行准确的数据处理。这就是为什么近年来,相关技术的研究领域备受关注。

这些需要技术措施来保证隐私、保护并确保准确数据处理的领域包括:

  • 隐私保护数据挖掘:专注于研究那些同时能保证隐私的数据挖掘方法,或是在保护隐私的同时进行数据挖掘的问题。
  • 隐私保护生物特征认证:指在进行生物特征认证时,我们不希望泄露生物特征信息,而是希望能够保护隐私。
  • 隐私保护数据或记录匹配:同样,我们希望实现隐私保护下的数据或记录匹配。

接下来,让我们更详细地讨论每一个领域。


隐私保护数据挖掘 🔍

隐私保护数据挖掘意味着,当我们进行数据挖掘时,通常希望对整合后的数据进行挖掘。我们查看来自不同数据集或数据源的数据,或将数据整合到一个集中的位置,然后在该集中的整合数据上进行挖掘。但是,如果我们想确保数据隐私,就意味着我们可能无法拥有包含私人和敏感数据的原始数据。

为了保护数据隐私,例如,我们可以对数据添加随机噪声或进行几何旋转,使数据受到扰动。然后,我们整合这些受扰动的数据,并在其上执行数据挖掘。这意味着我们将无法直接访问那些敏感信息或私人数据,从而保证了数据隐私。但问题是,如果数据被修改了,那么数据挖掘所构建的模型、我们试图发现的模式以及后续的预测是否会受到影响?如果受到影响,那就不是一个好的数据挖掘算法。因此,隐私保护数据挖掘这个领域,专注于研究如何在受扰动的数据上进行数据挖掘。

受扰动的数据应该在聚合层面上重建其分布。因为数据的分布在扰动数据中得以保持,我们就能够构建模型、提取模式,并准确地执行数据挖掘任务。

除了进行隐私保护数据挖掘,该领域的另一个关注点是:传统上,数据挖掘通常在集中的数据仓库上进行。但是,当我们收集数据、将数据整合到集中位置时,会增加数据隐私和机密性的担忧,因为多组织的数据将被合并并放在一个地方,这意味着存在未经授权使用的潜在风险。因此,数据挖掘可能更倾向于在分布式数据上进行,而不是在集中的数据仓库中。这意味着每个组织将保留自己的数据集和原始存储位置,然后通过协作数据挖掘,我们能够获得全局的数据挖掘结果。当然,你可以想象这有多困难。数据是分布式的,而我们仍然能够成功地进行数据挖掘。因此,这个领域正引起越来越多的关注,并且越来越重要。当然,这很困难、很复杂,所以这些技术目前效率仍然不高。我们需要新的方法,这些方法需要基于云计算,并且需要新的密码学原语。


隐私保护生物特征认证 👁️

在进行生物特征认证时,通常用户提供他们的生物特征信息,然后与记录或存储的用户生物特征模板进行匹配。生物特征模板代表了敏感信息,因为它们可以唯一地识别特定用户。这意味着我们不想直接访问生物特征信息。

我们希望能够在加密的生物特征信息上工作,然后基于加密的信息进行认证。这意味着我们需要结合哈希技术、编码技术以及一些零知识证明协议。零知识证明协议意味着我们能够证明这些数据、这些模板、这些生物特征信息是匹配的,而无需泄露实际的生物特征信息。

现在,如果我们在加密数据上工作,很可能会匹配失败,这可能导致错误拒绝率。对于生物特征认证来说,如果我们有错误拒绝率,人们如何被认证并访问资源呢?这是不可取的。因此,我们需要能够降低错误拒绝率的方法或措施。当然,因为我们是在加密数据上工作,所以我们需要适当的同态加密技术。同态加密技术指的是在加密数据上进行数据处理和数据分析的技术。


隐私保护记录匹配 🔗

我们知道,记录匹配是通过整合不同的数据源来执行的,我们希望识别共同的信息。例如,我们希望从不同的数据集中识别出可能指向同一个人或同一身份的记录。正如之前的例子所示,匹配来自不同数据源的记录很可能会导致数据隐私问题。例如,通过将记录匹配在一起,我们可能会遭受重新识别攻击。

因此,为了防止这些数据隐私问题,我们需要一些方法来进行数据转换。这样我们就不会直接拥有敏感数据(如社保号),而是拥有编码或转换后的数据。然后,我们仍然能够在编码或转换后的数据上进行匹配。这就是为什么许多最近的方法考虑数据转换和映射到特征空间,然后在其上进行匹配;或者考虑结合安全多方计算以及数据清理或数据匿名化技术,如差分隐私和匿名化。

现在,当我们进行记录匹配时,通常希望进行近似匹配,而不仅仅是精确匹配。但是,如果我们在匿名化数据或编码数据上工作,通常会被限制为直接精确匹配。这意味着我们将无法进行其他更复杂的匹配,例如近似匹配或模糊匹配。然而,为了获得良好和准确的记录匹配,我们通常需要进行更复杂的匹配,因为我们的数据中可能存在变化和噪声。

此外,因为要进行数据转换和数据映射等操作,所以我们还需要安全模型,并进行安全性分析,以保证数据的完整性,确保数据不被扭曲或破坏。这就是为什么我们需要新的方法、新的技术和新的安全模型等。


隐私保护数据匹配的重要性

你可以看到,我们提到的这三个领域,确实需要一些新的或更先进的方法,以实现数据处理的同时保护数据隐私。

接下来,让我们重点讨论隐私保护数据匹配。你可以看到,数据匹配在本课程中讨论过,并且在数据处理中非常重要。我们提到过在模式对齐中使用数据匹配,以对齐不同数据集或数据源之间的模式;我们也在记录链接或去重中使用数据匹配,比较来自不同数据的记录,以识别它们是否与特定对象或实体相关。

当我们进行数据匹配时,可以看到我们提到过的数据匹配技术(例如相似性度量、记录匹配方法或算法)都假设数据是原始格式的。它们不应该被加密或编码。如果数据被加密或编码,我们将无法进行匹配,因为我们查看的是实际的值或文本。

但是,我们知道我们通常匹配的数据库实际上是关于个人的记录。因此,当我们进行数据匹配时,数据隐私问题的风险会增加,因为数据匹配会给原始数据增加更多信息。当我们进行数据匹配时,通常没有跨数据集的唯一标识符来直接匹配或链接记录。我们通常查看记录的详细属性值来进行匹配,例如查看姓名、电话号码、出生日期等。这些通常是敏感数据,或者即使不是标识符,也是准标识符。那么,我们如何在确保数据隐私的同时进行数据匹配呢?这有很多需要讨论和研究的。


数据匹配的不同场景与隐私问题

数据匹配实际上可以在不同的场景下执行。我们将看看这些不同的场景,并研究不同场景下是否存在隐私问题。

首先,如果我们看单个组织内部的数据匹配,隐私通常不是问题。因为在单个组织内部,我们可以假设每个人都了解数据隐私政策,或者他们知道数据安全和数据保护的政策。在公司内部,因为我们不向他人披露数据,所以数据隐私通常不是问题。即使是匹配后的数据,它们通常也用于组织内部目的,例如,公司内部整合数据以识别欺诈,或整合数据以获取客户邮寄列表,进行一些内部研究为公司增值,或进行一些客户关系相关的调查等。在公司内部,因为数据只在公司内部使用,通常会采取措施防止未经授权的访问,并且数据不会公开给他人,所以同样没有隐私问题,只要数据安全得到维护。

但是,今天存在另一种场景,其中数据隐私会成为问题。例如,当我们与其他组织进行数据匹配时。那么,匹配后的数据可能需要与他人共享,可能需要传递给某个组织,或者匹配后的数据可能需要发布以供进一步研究,例如公共卫生研究。公共卫生研究可能由不同的大学进行,因此,由不同大学进行的公共卫生研究需要向公众发布,以引起公众对健康问题的关注。所以匹配后的数据需要公开。当然,隐私问题就出现了,因为匹配后的数据可能泄露更多关于个人的信息,并且你现在将数据发布给他人,这意味着可能存在重新识别攻击和隐私问题。因此,在发布数据时,我们需要考虑隐私和保密法规。当然,当我们发布数据时,数据应仅包含不会导致个人识别的信息,否则数据不应公开。你可以看到为什么隐私在这里很重要。

当然,当我们进行跨组织的数据匹配时,数据可能需要共享。那么,那些包含标识符或身份信息的数据在交换或共享时,隐私问题就出现了,因为其他公司或组织可能会知道更多信息,或者能够识别出他们原本无法识别的某些个人。因此,数据隐私将成为我们关注的问题。

在最后一种场景中,因为数据将被共享或传输给其他组织,这意味着一旦数据被传输或共享,我们就失去了对包含个人详细信息的敏感数据的控制,因为它们被他人共享了。因此,我们失去了对数据将如何被其他方使用的控制。所以,为了保护数据隐私,这意味着我们希望数据被加密。但是,我们提到大多数现有方法要求数据是原始未加密的。你可以看到这里存在矛盾。那么,我们如何在保护隐私的同时进行匹配呢?这就是为什么我们需要隐私保护数据匹配。理想情况下,我们希望进行准确的数据匹配,而不需要提供身份识别数据。这意味着我们既不需要数据是原始未加密格式,也不需要将数据直接共享给其他组织。


隐私保护数据匹配的挑战与协议

除了之前关于控制数据、不希望失去数据控制权以及希望数据加密等担忧之外,另一个担忧是:匹配后的数据,即组合信息,通常高度敏感。例如,如果我们匹配或组合不同的健康数据库,我们可能能够进行重新识别攻击。这意味着某个特定的个人,例如高知名度的人物(如政治家、政府官员或名人),如果患有严重的健康问题(例如传染病),那么通过匹配健康数据库,这些信息可能会被泄露给公众,我们可能识别出这些个人,这将破坏数据隐私。

其他例子包括:如果我们将患者的医疗详细信息与社会经济信息进行匹配,可能会出现我们发现特定种族或特定文化背景的人群与某种疾病高度相关的情况。因为它与特定种族或特定文化背景的人群相关联,所以需要谨慎处理,这可能引发伦理问题,可能导致歧视或对人群的刻板印象。

还有一些例子可能是:当我们进行数据匹配以识别可能涉及犯罪或恐怖袭击的潜在个人时,如果我们使用隐私保护数据匹配,那么错误匹配的几率会增加。错误匹配对会对个人生活产生严重影响,如果错误地将某人匹配为潜在的恐怖分子或罪犯,那将毁掉那个人的生活。因此,这同样是不可取的。所有这些都是在匹配数据中我们需要防止的情况。

因此,为了实现隐私保护数据匹配,人们已经提出或采用了不同的措施和协议。其中一种建议的协议是两方数据匹配协议。两方数据匹配协议可以应用于商业合作的场景,例如两家公司计划合并业务,他们希望识别共同的客户和供应商。这意味着,因为是两家公司合并业务,他们肯定不希望涉及第三方进行匹配,他们希望在两公司之间进行匹配。

这意味着他们要做的是识别来自两家公司两个数据库中相似的记录,并且只有那些匹配记录的标识符会透露给两个组织。这里的目标是,我们不希望任何一方了解对方公司的机密数据。这意味着公司会试图保护自己的数据,他们不想向他人泄露机密数据。那么,两方数据匹配协议如何实现呢?你可以在这里看到。

在两方组织中,我们用两个人名Alice和Bob来代表两个组织,以便于解释。但你可以想象Alice代表一家公司,Bob代表另一家公司。那么,Alice和Bob拥有的两个数据库首先会相互通信,决定使用哪些属性进行匹配,以及使用哪些技术进行预处理。因为预处理步骤必须相同、必须标准化,匹配才能成功。同时,因为他们将要共享数据,他们应该如何加密数据,以及是否需要任何编码或加密密钥。当然,我们不希望对方能够解密数据。我们希望保护数据免受对方侵害。因此,加密或编码密钥不应被其他组织知晓。

然后,每家公司将数据编码后发送给对方,双方通过计算记录之间的相似度来进行匹配。然后,被分类为匹配的记录(即彼此具有高相似度的记录)的标识符将发送回两个数据库所有者。之后,数据库所有者可以决定是否要交换匹配记录的详细信息,或者他们希望向对方发送哪些属性值,以进行进一步的操作或分析。

总的来说,在两方数据匹配协议下,通常更安全,因为公司通常希望向对方隐藏私人和机密数据。因此,由于数据将更安全,计算也将更复杂。

除了两方数据匹配协议,在某些情况下,我们可能希望三方数据匹配协议来帮助确保或增加数据隐私的保护。例如,在公共卫生研究场景中。我们提到,来自不同医院、医生、私人健康保险公司甚至政府卫生部门或警察的数据集希望提供数据并进行数据匹配,以便为后续分析提供匹配结果。

因此,由于涉及多方,数据库必须发送给一个受信任的匹配单元,这个受信任的匹配单元就是第三方。这就是为什么现在我们有两个组织和一个第三方,所以是三方数据匹配协议。在这个协议场景中,任何数据库所有者都无法了解正在匹配的其他数据库的任何信息,因为所有数据都发送给了第三方。同样,我们不希望任何外部对手了解源数据库,即使他们能够访问任何数据交换。是的,匹配后,只有匹配记录的选定属性会透露给研究团队。

那么,三方数据匹配协议通过三个主要步骤完成。第一步,两个数据库所有者交换详细信息,就像前面的两方数据匹配协议例子一样,交换用于预处理的技术、使用的属性、使用的编码或加密方法以及所需的任何编码或加密密钥。同样,加密密钥或编码应与对方分开保存。

然后,编码后的数据库应发送给匹配单元(这里我们多了一个参与方Carol)。编码后的数据库被发送给Carol,Carol通过计算记录之间的相似度来进行匹配,Carol是在加密记录之上进行计算的。然后,被识别为匹配的记录对的标识符将发送回两个数据库所有者。同样,数据库所有者Alice和Bob可以讨论他们希望如何交换数据、如何使用数据。

现在,这个三方数据匹配协议存在一个缺点。缺点是,即使Carol没有接收任何未编码的数据(Carol只处理所有编码数据,因此Carol不知道两个数据集的内容),但Carol有可能与另一方(例如,一个数据库所有者,比如Bob)串通。那么Carol将能够解码数据,并能够了解有关数据的更多信息。这就是三方数据匹配协议的潜在风险。

在两方和三方数据匹配协议下,我们仍然需要适当的数据匹配措施。


隐私保护匹配技术

接下来,我们将讨论一些可以在两方或三方数据匹配协议中使用的隐私保护匹配技术。

首先,我们来看精确隐私保护匹配技术。这些技术将确保数据隐私,但只对数据进行精确匹配。例如,其中一种技术是使用单向哈希编码函数,如SHA(安全哈希算法)或消息摘要MD函数,来编码我们想要匹配的消息。

例如,你可以看到这里,字符串“Peter”将被编码成一个代码。如果我们使用SHA-1哈希编码函数,可以看到不同的字符串会被哈希成不同的代码。即使只有一个字符的差异(例如,缺少一个额外字符),也会产生完全不同的协议(代码)。甚至大小写字符的不同(例如,首字母大写的“Peter”和首字母小写的“peter”)也会给我们不同的哈希码。这意味着,如果我们使用这些哈希码进行匹配,我们只能进行精确匹配,甚至精确到字母大小写。

那么,使用单向哈希编码函数意味着我们只能在哈希码上进行精确匹配。显然,仅靠精确匹配是不可行的。我们可以做的增强匹配的方法可能是进行预处理,例如词干提取,并将输入标准化为某种基本形式以进行匹配。这样,我们或许能够增强匹配。

但是,对于这种匹配的使用,它可以用于三方协议。它可以与三方协议一起使用,因为匹配是由第三方Carol完成的,而Carol只基于哈希码进行匹配。因此,第三方Carol不会从两个数据库所有者那里了解到更多关于数据的信息。但是,如果我们讨论的是两方协议,那么它不会向数据库所有者隐藏信息。这意味着单向哈希编码函数不适用于两方场景,只适用于三方场景。但是,即使对于三方协议,单向哈希编码匹配仍然容易受到字典攻击或频率攻击。因为攻击者可以对字典中的术语进行哈希,然后将这些代码与提供的数据集进行比较,从而揭示编码后的实际术语。我们实际上可以比较其频率,例如,特定哈希码在数据中的频率,然后与真实数据中术语的频率进行比较,频率的相似性实际上会揭示术语或字符串。这就是为什么单向哈希编码函数可能无法防止字典攻击或频率攻击。那么,解决方案是在三方协议中添加一个秘密密钥。

之前的单向哈希编码函数措施是针对精确匹配的。我们知道,对于数据匹配,仅仅进行精确匹配并不能让我们识别相似的记录。因为数据中经常存在错误和变化,我们需要能够处理这些错误,这意味着我们需要进行近似匹配。这就是为什么我们需要一些近似隐私保护匹配技术。我们将讨论几种不同的技术。

我们要讨论的第一个技术是用于安全计算编辑距离的两方协议。当我们计算编辑距离时,会有一个编辑距离矩阵(距离矩阵),填充完矩阵后,我们就能识别出两条记录或两个字符串之间的编辑距离。

那么,近似隐私保护匹配技术使用编辑距离。编辑距离进行的是近似匹配。但是,正如我们提到的,我们不希望对方了解对方数据的更多信息。因此,我们不希望距离矩阵被双方看到。这意味着我们希望距离矩阵以共享的方式存储在两个数据库所有者之间,同时距离矩阵的生成是迭代进行的,而不泄露每个数据库所有者的实际计算。显然,这必须通过同态加密方法来完成,这意味着我们必须在加密数据之上进行数据处理和分析。

另一种技术是盲记录链接。它用于三方设置,用于计算Dice系数。什么是Dice系数?Dice系数是取两个字符串之间共同标记(token)的数量,然后乘以2,再除以字符串x中的标记数和字符串y中的标记数。

对于盲记录链接,我们考虑的是标记(例如n-gram,n元语法)。这意味着我们首先处理n-gram,而不是完整的字符串值。我们对n-gram进行哈希和引用。让我们看一个例子。

假设我们试图匹配两个字符串:“Peter”和“Pete”。我们称Alice是一个组织,Bob是另一个组织。首先,Alice和Bob分别为他们的字符串生成n-gram列表。例如,Alice为“Peter”生成不同的2-gram列表或可能的2-gram列表,比如完整的2-gram列表:[PE, ET, TE, ER]。同时它也生成了子2-gram列表。Bob也为“Pete”做类似的事情。“Pete”有三个2-gram,所以完整列表是三个2-gram。Bob也生成了子列表,例如,三个2-gram中的两个,另外两个2-gram中的两个等。

对于匹配,Alice将发送哈希码形式的2-gram列表,连同记录ID、列表中的2-gram数量以及原始字符串中的2-gram总数。Alice会为完整的2-gram列表和其他子2-gram列表生成这些信息。这就是整个列表:四个2-gram的哈希码,以及标记数量、记录身份标识和原始字符串中的2-gram总数,发送给第三方Carol。同样,Bob也做类似的事情,将哈希码连同该列表中的2-gram数量以及要匹配的字符串中的2-gram总数发送给Carol。

然后,Carol会比较这两个列表,并找到匹配的项(如下划线的项)。基于这个匹配的2-gram列表,就能够计算Dice系数。匹配的2-gram数量是3。因此我们乘以2得到6。Alice字符串中的2-gram数量是4,Bob字符串中的2-gram数量是3。因此,Dice系数是6除以7。这意味着当Carol进行匹配时,Carol不知道实际的2-gram,也不知道实际的字符串。Carol只是盲目地比较和匹配代码。但是,通过匹配2-gram,我们能够获得相似度分数。

另一种技术是使用布隆过滤器来计算Dice系数。每个数据库所有者将n-gram哈希到布隆过滤器中。例如,对于“Peter”,有5个位被设置为1;对于“Pete”,也有5个位被设置为1(其中有共同设置的位)。那么,Dice系数就是共同设置为1的位数(5)乘以2,除以“Peter”字符串设置的位数和“Pete”字符串设置的位数。这将给我们Dice系数10/12。因为我们在布隆过滤器上进行匹配,而不是直接在原始字符串上匹配。同样,这是盲记录链接,意味着我们不知道原始文本。同样,布隆过滤器,就像盲记录链接一样,应该应用于三方协议。

这些方法是关于如何实现近似隐私保护匹配的一些例子。因为我们在n-gram上进行匹配,并且实际上获得了相似度分数,所以我们不是在精确匹配,而是近似匹配。你可以看到,因为我们没有匹配原始文本,我们没有匹配原始的敏感属性值或标识属性值,这就是它如何在保证隐私的同时进行匹配的。


总结与思考

我们已经看到了许多不同的算法,实际上还有更多。在本节中,我们想要做的是,在进行数据处理时,能够意识到数据隐私的重要性。因为当我们面对大数据时,存在多样性、体量、变化性等问题,这意味着我们面临着日益增长的数据隐私挑战。因此,在进行数据分析时,在进行分析的同时保护数据隐私非常重要。这就是为什么这是最后一个主题,也是为什么我们想在这里介绍和讨论它。这样,如果你将来要进行进一步的数据处理,并且要管理、收集、分析和处理大量数据,那么有很多问题需要我们注意,我们可能需要考虑不同类型的技术,如常见的匿名化技术及其增强版本(如K-匿名、L-多样性)。当然,当我们进行不同的数据处理时,我们也必须思考如何在数据处理(如隐私保护数据挖掘、隐私保护数据匹配等)的同时保护数据隐私。这就是我们要讨论的内容,也是我们已经讨论过的关于数据隐私的内容。

当然,由于时间有限,我们无法涵盖所有内容。但我希望这节课能给你一些关于大数据和数据隐私问题以及数据处理的思考和启示。

posted @ 2026-03-26 08:48  布客飞龙II  阅读(0)  评论(0)    收藏  举报