仅使用org.apache.commons.math3计算Mahalanobis距离



是否有一种方法来计算马氏距离承诺org.apache.mahout使用(仅使用org.apache.commons.math3)?

使用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);

最新更新