📑 查看全课大纲(第 4 / 20 节)

样品与变量相似性度量(距离与相似系数)

约 48 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

样品与变量相似性度量

小象实战讲义 · 多元统计分析

聚类分析是多元统计中探索数据内在结构的重要工具。在正式进行聚类之前,我们首先需要解决一个根本问题:如何量化地衡量两个对象(无论是样品还是变量)之间的“相似”或“相异”程度?本节将系统介绍用于度量相似性的核心概念——距离与相似系数,它们是后续所有聚类方法的基石。学完本节,你将能根据数据特点,为聚类分析选择合适的相似性度量标准。

💡 核心导读

  • 距离 vs 相似系数:距离衡量“相异性”,值越大越不相似;相似系数衡量“相似性”,值越大越相似。
  • 样品相似性度量:重点掌握明氏距离(含欧氏距离、曼哈顿距离)、马氏距离和兰氏距离的公式、优缺点及适用场景。
  • 变量相似性度量:理解夹角余弦和相关系数(皮尔逊相关系数)的几何与统计意义。
  • 数据预处理:了解标准化(如极差正规化)对消除量纲影响的重要性。
  • Python实战:使用 scipynumpy 快速计算多种距离与相似系数。

一、聚类分析概述与相似性度量的意义

聚类分析旨在根据研究对象在多个特征上的表现,将其划分为若干个“相似”的组(类)。与有监督的分类(如判别分析)不同,聚类是一种无监督学习方法,我们事先并不知道数据应分为几类,也不知道每个样品属于哪一类,完全由数据本身的内在结构决定。

核心挑战:如何定义“相似”?例如,将美国各州按人口、面积、教育程度等指标聚类,我们无法像人眼识别散点图上的聚集点那样直观判断。当数据维度很高时,必须依赖数学上的相似性度量

根据聚类对象的不同,聚类分析分为:

  • Q型聚类:对样品(行)进行分类。例如,将不同的城市聚成几类。
  • R型聚类:对变量(列)进行分类。例如,探究“人口”和“面积”这两个指标是否可归为反映“规模”的同一类变量。

无论是Q型还是R型,第一步都是选择合适的度量方法来计算两两对象之间的相似/相异程度。

二、样品相似性的度量:距离

对于包含 nn 个样品、pp 个变量的数据矩阵 X=(xij)n×p\mathbf{X} = (x_{ij})_{n \times p},任何两个样品 Xi\mathbf{X}_iXj\mathbf{X}_j(即矩阵的第 ii 行和第 jj 行)之间的相似性,可以通过它们在 pp 维空间中的“距离”来刻画。距离 dijd_{ij} 越小,表示两个样品越相似。

1. 明考夫斯基距离(明氏距离)

明氏距离是一个通用的距离族,其公式为: dij(q)=(k=1pxikxjkq)1/q,q1.d_{ij}(q) = \left( \sum_{k=1}^{p} |x_{ik} - x_{jk}|^q \right)^{1/q}, \quad q \ge 1. 通过取不同的 qq 值,可以得到几种常用的特例:

  • 绝对距离(曼哈顿距离) (q=1q=1): dij(1)=k=1pxikxjk.d_{ij}(1) = \sum_{k=1}^{p} |x_{ik} - x_{jk}|.
  • 欧氏距离 (q=2q=2): dij(2)=k=1p(xikxjk)2.d_{ij}(2) = \sqrt{\sum_{k=1}^{p} (x_{ik} - x_{jk})^2}.
  • 切比雪夫距离 (qq \to \infty): dij()=max1kpxikxjk.d_{ij}(\infty) = \max_{1 \le k \le p} |x_{ik} - x_{jk}|.

明氏距离的不足与改进

  1. 受量纲影响:各变量量纲(单位)不同或数量级相差悬殊时,计算结果失真。
    • 改进:先对数据进行标准化(如极差正规化、Z-score标准化),再用标准化后的数据计算距离。
  2. 未考虑变量变异性与相关性:欧氏距离默认各坐标轴贡献同等,且变量间相互独立。若变量方差差异大或存在相关性,欧氏距离不能如实反映情况。
    • 改进:对坐标加权,或采用更全面的马氏距离

2. 马氏距离

设样品 Xi\mathbf{X}_iXj\mathbf{X}_j 来自均值为 μ\boldsymbol{\mu}、协方差矩阵为 Σ\boldsymbol{\Sigma} 的总体 GG,则它们之间的马氏距离定义为: dij2(M)=(XiXj)Σ1(XiXj).d_{ij}^2(M) = (\mathbf{X}_i - \mathbf{X}_j) \boldsymbol{\Sigma}^{-1} (\mathbf{X}_i - \mathbf{X}_j)'. 实践中,总体协方差阵 Σ\boldsymbol{\Sigma} 未知,常用样本协方差阵 S\mathbf{S} 代替。

马氏距离的优点

  • 广义欧氏距离:当 Σ=I\boldsymbol{\Sigma} = \mathbf{I}(单位阵)时,马氏距离退化为欧氏距离的平方。
  • 克服量纲影响:由于 Σ1\boldsymbol{\Sigma}^{-1} 的调节作用,计算结果不受各指标量纲影响。
  • 考虑变异性与相关性Σ\boldsymbol{\Sigma} 的对角线元素(方差)调整了各变量的离散程度,非对角线元素(协方差)则考虑了变量间的相关性。
  • 线性变换不变性:对原始数据作线性变换,马氏距离保持不变。

3. 兰氏距离

兰氏距离适用于所有 xij>0x_{ij} > 0 的情况,其公式为: dij(L)=1pk=1pxikxjkxik+xjk.d_{ij}(L) = \frac{1}{p} \sum_{k=1}^{p} \frac{|x_{ik} - x_{jk}|}{x_{ik} + x_{jk}}.

兰氏距离的特点

  • 自身标准化:通过除以 (xik+xjk)(x_{ik} + x_{jk}) 消除了量纲的影响。
  • 对奇异值不敏感:适合处理高度偏倚(有极端大值)的数据。
  • 未考虑指标相关性:与明氏距离一样,它没有考虑变量之间的相关性。

4. 距离选择与数据标准化原则

距离选择需综合考虑:

  1. 距离公式的实际意义。
  2. 数据预处理方法及后续拟采用的聚类方法。
  3. 研究对象的特点和计算量(如马氏距离计算量较大)。

数据标准化常用方法:

  • 中心化xij=xijxˉjx_{ij}^* = x_{ij} - \bar{x}_j,使每列均值为0,协方差阵不变。
  • 标准化(Z-score)xij=xijxˉjsjx_{ij}^* = \frac{x_{ij} - \bar{x}_j}{s_j},使每列均值为0,标准差为1。
  • 极差正规化xij=xijmin(xj)max(xj)min(xj)x_{ij}^* = \frac{x_{ij} - \min(x_j)}{\max(x_j) - \min(x_j)},将数据压缩到 [0,1][0, 1] 区间。
  • 对数变换xij=log(xij)x_{ij}^* = \log(x_{ij}),将指数型数据结构转换为线性结构。

三、变量相似性的度量:相似系数

对于R型聚类,我们关心变量之间的相关性或“方向”的相似性。常用的度量是相似系数 cijc_{ij},其绝对值越接近1,表示变量 Xi\mathbf{X}_iXj\mathbf{X}_j(数据矩阵的第 ii 列和第 jj 列)越相似。

1. 夹角余弦

将变量 Xi\mathbf{X}_iXj\mathbf{X}_j 视为 nn 维空间(由 nn 个样品张成)中的两个向量,它们夹角的余弦值为: cosθij=k=1nxkixkjk=1nxki2k=1nxkj2.\cos \theta_{ij} = \frac{\sum_{k=1}^{n} x_{ki} x_{kj}}{\sqrt{\sum_{k=1}^{n} x_{ki}^2} \sqrt{\sum_{k=1}^{n} x_{kj}^2}}. 若两变量正向关系密切,夹角 θij\theta_{ij} 接近0,cosθij\cos \theta_{ij} 接近1;若负向关系密切,夹角 θij\theta_{ij} 接近 π\picosθij\cos \theta_{ij} 接近 1-1。因此应以 cosθij|\cos \theta_{ij}| 衡量两变量的相似程度。

2. 相关系数(皮尔逊相关系数)

变量 Xi\mathbf{X}_iXj\mathbf{X}_j 的相关系数定义为: rij=k=1n(xkixˉi)(xkjxˉj)k=1n(xkixˉi)2k=1n(xkjxˉj)2.r_{ij} = \frac{\sum_{k=1}^{n} (x_{ki} - \bar{x}_i)(x_{kj} - \bar{x}_j)}{\sqrt{\sum_{k=1}^{n} (x_{ki} - \bar{x}_i)^2} \sqrt{\sum_{k=1}^{n} (x_{kj} - \bar{x}_j)^2}}. 相关系数实质上是对数据中心化后的夹角余弦。当 rij=1|r_{ij}|=1 时完全线性相关,rij=0|r_{ij}|=0 时无线性相关。

3. 从相似系数到距离

相似系数 cijc_{ij} 越大表示越相似,这与距离的含义相反。为了用距离进行聚类,常将相似系数转化为距离,例如: dij=1cijdij=1cij2.d_{ij} = 1 - |c_{ij}| \quad \text{或} \quad d_{ij} = \sqrt{1 - c_{ij}^2}. 这样,dijd_{ij} 越小,表示两变量越相似。

四、Python实战:计算距离与相似系数

下面我们使用 Python 演示如何计算样品间的多种距离以及变量间的相关系数。

"""
多元统计分析 3.1 样品与变量相似性度量
实战演示:计算欧氏距离、曼哈顿距离、余弦距离、马氏距离与皮尔逊相关系数
"""
import numpy as np
from scipy.spatial.distance import cdist

# 固定随机种子,确保结果可复现
np.random.seed(42)

# 构造一个包含5个样品、4个变量的示例数据矩阵 X (5x4)
X = np.array([
    [1.0, 2.0, 3.0, 4.0],   # 样品0
    [1.5, 1.8, 3.2, 4.5],   # 样品1
    [5.0, 6.0, 7.0, 8.0],   # 样品2
    [5.2, 5.9, 7.1, 8.2],   # 样品3
    [2.0, 2.5, 1.0, 0.5]    # 样品4
])

print("数据矩阵 X (5个样品 x 4个变量):")
print(X)
print()

# 1. 计算样品间的距离矩阵 (Q型聚类)
# 使用 scipy 的 cdist 函数,高效计算所有样品对之间的距离
dist_euclidean = cdist(X, X, metric='euclidean')  # 欧氏距离
dist_cityblock = cdist(X, X, metric='cityblock')  # 曼哈顿距离(绝对距离)
dist_cosine = cdist(X, X, metric='cosine')        # 余弦距离 (1 - 余弦相似度)

print("欧氏距离矩阵 (样品间):")
print(np.round(dist_euclidean, 4))
print()

# 2. 计算马氏距离
# 马氏距离需要数据的协方差逆矩阵
cov_mat = np.cov(X, rowvar=False)  # rowvar=False 表示每列是一个变量
# 为避免协方差矩阵奇异,添加一个小的正则项
cov_mat_reg = cov_mat + np.eye(cov_mat.shape[0]) * 1e-4
inv_cov = np.linalg.inv(cov_mat_reg)  # 计算协方差逆矩阵
# 使用 cdist 计算马氏距离,需传入逆协方差矩阵 VI
dist_mahalanobis = cdist(X, X, metric='mahalanobis', VI=inv_cov)

print("马氏距离矩阵 (样品间):")
print(np.round(dist_mahalanobis, 4))
print()

# 3. 计算变量间的皮尔逊相关系数矩阵 (R型聚类)
var_corr = np.corrcoef(X, rowvar=False)  # rowvar=False 计算列(变量)间的相关系数
print("变量间的皮尔逊相关系数矩阵:")
print(np.round(var_corr, 4))
print()

# 4. 提取并展示关键结果
print("=== 关键结果对比 ===")
print(f"样品 0 与样品 1 的欧氏距离: {dist_euclidean[0, 1]:.4f}")
print(f"样品 0 与样品 2 的欧氏距离: {dist_euclidean[0, 2]:.4f}")
print(f"样品 0 与样品 1 的曼哈顿距离: {dist_cityblock[0, 1]:.4f}")
print(f"样品 0 与样品 1 的余弦距离: {dist_cosine[0, 1]:.4f}")
print(f"样品 0 与样品 1 的马氏距离: {dist_mahalanobis[0, 1]:.4f}")
print(f"变量 0 与变量 1 的皮尔逊相关系数: {var_corr[0, 1]:.4f}")

运行结果与解读: 运行上述代码,关键输出如下:

样品 0 与样品 1 的欧氏距离: 0.7616
样品 0 与样品 2 的欧氏距离: 8.0000
样品 0 与样品 1 的曼哈顿距离: 1.4000
样品 0 与样品 1 的余弦距离: 0.0047
样品 0 与样品 1 的马氏距离: 2.6873
变量 0 与变量 1 的皮尔逊相关系数: 0.9905
  • 样品相似性:样品0和1在所有距离度量下都显示出较小的值(欧氏0.76,曼哈顿1.4,余弦0.0047,马氏2.69),表明它们非常相似。样品0和2的欧氏距离为8.0,差异显著。
  • 变量相关性:变量0和1的相关系数高达0.9905,说明这两个变量高度线性相关,在R型聚类中很可能被聚为一类。
  • 度量对比:马氏距离由于考虑了变量间的协方差结构,其数值标度与欧氏距离不同,但相对大小关系(谁更近)保持一致。

📝 动手练一练

  1. 距离计算:对于上述数据矩阵 X,请手动验证样品0与样品1的曼哈顿距离是否为1.4。(提示:对每个变量取绝对差后求和)
  2. 相似系数转换:假设两个变量 Xi\mathbf{X}_iXj\mathbf{X}_j 的夹角余弦 cosθij=0.8\cos \theta_{ij} = 0.8。如果采用距离 dij=1cij2d_{ij} = \sqrt{1 - c_{ij}^2} 进行聚类,计算出的距离是多少?这个距离值表明这两个变量的相似程度如何?

参考答案

  1. 1.01.5+2.01.8+3.03.2+4.04.5=0.5+0.2+0.2+0.5=1.4|1.0-1.5| + |2.0-1.8| + |3.0-3.2| + |4.0-4.5| = 0.5 + 0.2 + 0.2 + 0.5 = 1.4,验证正确。
  2. dij=10.82=10.64=0.36=0.6d_{ij} = \sqrt{1 - 0.8^2} = \sqrt{1 - 0.64} = \sqrt{0.36} = 0.6。距离值为0.6(在0到1之间),属于中等偏小的距离,表明这两个变量有较强的正相关性,相似度较高。

本章小结

本节奠定了聚类分析的基础——相似性度量。我们系统地学习了:

  • 样品间距离:明氏距离(欧氏、曼哈顿)、马氏距离、兰氏距离的公式、几何意义、优缺点及改进方法。
  • 变量间相似系数:夹角余弦与相关系数的定义与联系,以及如何将其转化为距离。
  • 核心思想:选择合适的度量必须结合数据特点(量纲、变异性、相关性)和分析目的。
  • 实践工具:掌握了使用 Python (scipy, numpy) 快速计算多种距离与相关系数的方法。

行动清单

  1. 审视你的数据:打开一个数据集,观察各变量的量纲和分布,判断是否需要标准化。
  2. 尝试不同度量:对同一份数据,分别用欧氏距离和马氏距离计算样品间距离,观察聚类结果(如通过热力图)的差异。
  3. 探索变量关系:计算数据集中所有变量对的相关系数矩阵,找出高度相关(如 r>0.8|r| > 0.8)的变量组,思考它们是否可能反映同一潜在维度。

— 小象教研组

配套学习资源与课件
  • 第3章课件:聚类分析
    下载
  • 多元统计分析参考讲义与常用函数(多元分析与主成分常用函数速查)
    下载
  • 课程配套数据集(全课程实战数据包)
    下载
  • 课程全套源代码(课程相关代码汇总)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问