【问题标题】:Calclulate the Mahalanobis distance with org.apache.commons.math3 only仅使用 org.apache.commons.math3 计算马氏距离
【发布时间】:2021-09-18 10:39:03
【问题描述】:

有没有一种方法可以计算马氏距离而忽略org.apache.mahout 的使用(仅使用org.apache.commons.math3)?

【问题讨论】:

    标签: java mahalanobis


    【解决方案1】:

    仅使用org.apache.commons.math3 方法的方法如下:

    import org.apache.commons.math3.linear.ArrayRealVector;
    import org.apache.commons.math3.linear.RealMatrix;
    import org.apache.commons.math3.linear.RealVector;
    
    ...
    
    double[][] data = new double[][]{
    ...
    };
    
    
    RealMatrix covarianceMatrix = new Covariance(data, false).getCovarianceMatrix();
    RealMatrix inverseCovarianceMatrix = MatrixUtils.inverse(covarianceMatrix);
    
    VectorialMean Mean = new VectorialMean(covarianceMatrix.getColumnDimension());
    Arrays.stream(data).forEach(x -> Mean.increment(x));
    RealVector meanVector = new ArrayRealVector(Mean.getResult());
    
    
    //Calculate Mahalanobis distance for first row
    RealVector v = new ArrayRealVector(data[0]);
    
    double distance = Math.sqrt(v.minus(meanVector).dot(Algebra.mult(inverseCovarianceMatrix, v.minus(meanVector))));
    

    使用类代替org.apache.mahout.common.distance.MahalanobisDistanceMeasure:

    package Demo;
    
    import org.apache.commons.math3.linear.MatrixUtils;
    import org.apache.commons.math3.linear.RealMatrix;
    import org.apache.commons.math3.linear.RealVector;
    
    public class MahalanobisDistanceMeasure {
    
        RealMatrix inverseCovarianceMatrix;
    
        RealVector meanVector;
    
        public void setCovarianceMatrix(RealMatrix covarianceMatrix) {
            this.inverseCovarianceMatrix = MatrixUtils.inverse(covarianceMatrix);
        }
    
        public void setMeanVector(RealVector meanVector) {
            this.meanVector = meanVector;
        }
    
        public double distance(RealVector vector) {
            RealVector subtract = vector.subtract(meanVector);
    
            return Math.sqrt(subtract.dotProduct(inverseCovarianceMatrix.operate(subtract)));
        }
    }
    

    类的用法:

    MahalanobisDistanceMeasure measure = new MahalanobisDistanceMeasure();
    measure.setCovarianceMatrix(covarianceMatrix);
    measure.setMeanVector(meanVector);
    
    double distance = measure.distance(vector);
    

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2018-06-29
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多