如何不依赖org.apache.mahout仅用org.apache.commons.math3计算Mahalanobis距离
可行实现方案说明
完全可以仅依赖 org.apache.commons.math3 库完成马氏距离计算,不需要引入任何Mahout相关依赖,commons-math3原生提供了对应的工具类,实现成本极低。
前置依赖引入
Maven项目可以直接引入稳定版的commons-math3依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-math3</artifactId> <version>3.6.1</version> </dependency>
核心实现逻辑
马氏距离计算依赖样本总体的协方差矩阵,commons-math3已经封装了协方差计算、矩阵求逆、距离计算的全流程能力:
- 使用
Covariance类计算样本集的协方差矩阵 - 使用
MahalanobisDistance类直接完成距离计算
完整可运行代码示例
import org.apache.commons.math3.linear.Array2DRowRealMatrix; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.stat.correlation.Covariance; import org.apache.commons.math3.ml.distance.MahalanobisDistance; public class MahalanobisCalcExample { public static void main(String[] args) { // 1. 构造样本数据集,每行对应一个样本向量 double[][] sampleDataset = { {1.1, 2.3, 3.2}, {2.2, 3.4, 4.1}, {3.1, 4.3, 5.2}, {4.2, 5.4, 6.1}, {5.1, 6.3, 7.2} }; RealMatrix sampleMatrix = new Array2DRowRealMatrix(sampleDataset); // 2. 计算样本协方差矩阵 Covariance covariance = new Covariance(sampleMatrix); RealMatrix covarianceMatrix = covariance.getCovarianceMatrix(); // 3. 初始化马氏距离计算器 MahalanobisDistance distanceCalculator = new MahalanobisDistance(covarianceMatrix); // 4. 计算两个目标向量的马氏距离 double[] vectorX = {2.4, 3.5, 4.3}; double[] vectorY = {3.3, 4.4, 5.2}; double result = distanceCalculator.compute(vectorX, vectorY); System.out.printf("马氏距离计算结果:%.4f", result); } }
注意事项
- 若输入的样本集导致协方差矩阵为奇异矩阵(不可逆),初始化
MahalanobisDistance时会抛出异常,需要提前对样本做降维或正则化处理 - 待计算的两个向量维度必须和协方差矩阵的维度一致,否则会触发参数校验异常
- 如果已经提前计算好协方差矩阵的逆矩阵,可以直接传入
MahalanobisDistance构造方法,避免重复计算
内容的提问来源于stack exchange,提问作者AndreyP
相关产品推荐
相关产品推荐

