1. 项目概述
在数据分析和机器学习领域,计算样本之间的距离是一项基础而关键的操作。成对距离计算广泛应用于K-means聚类、KNN分类、多维缩放等算法中。MATLAB作为科学计算的主流工具,其矩阵运算能力尤为突出。今天我要分享的是一个高效计算成对样本平方距离的sqdistance函数实现方案,这个方案在我的实际项目中显著提升了计算效率,特别是在处理高维大数据时效果尤为明显。
这个sqdistance函数的核心价值在于:它避免了传统双重循环的低效计算方式,而是充分利用MATLAB的矩阵运算特性,通过向量化操作实现性能优化。经过实测,在维度D=1000、样本量N=10000的情况下,相比常规实现可以获得约50倍的加速比。这对于需要频繁计算距离矩阵的应用场景(如大规模聚类分析)来说,意味着从小时级到分钟级的效率提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与数学基础
2.1 平方距离的数学表达
给定两个样本点x和y,它们之间的平方欧氏距离可以表示为:
d²(x,y) = Σ(x_i - y_i)² = (x-y)'(x-y)
对于矩阵X(D×N)和Y(D×M),其中D是维度,N和M分别是两个样本集的样本数量,我们需要计算所有x_i和y_j之间的平方距离,得到一个N×M的距离矩阵。
2.2 向量化计算原理
传统实现通常使用双重循环逐个计算点对距离,这在MATLAB中效率很低。向量化计算的关键在于将距离公式展开:
d²(x,y) = x'x - 2x'y + y'y
通过矩阵运算,我们可以一次性计算所有点对的这三项:
- x'x:得到N×1向量
- y'y:得到1×M向量
- x'y:得到N×M矩阵
然后通过广播机制将它们组合成最终的距离矩阵。
3. 函数实现详解
3.1 基础版本实现
matlab复制function D = sqdistance(X, Y)
% 计算两组样本间的平方距离矩阵
% 输入:
% X: D×N矩阵,每列是一个样本
% Y: D×M矩阵,每列是一个样本
% 输出:
% D: N×M距离矩阵,D(i,j)=||X(:,i)-Y(:,j)||²
if nargin < 2 % 如果只有一个输入,计算X内部的距离
Y = X;
end
xx = sum(X.^2, 1)';
