Author: gsingers
Date: Thu Nov 3 00:39:52 2011
New Revision: 1196892
URL: http://svn.apache.org/viewvc?rev=1196892&view=rev
Log:
MAHOUT-866: move preconditions to other places that are not in the distance
calculation
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/MahalanobisDistanceMeasure.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/MahalanobisDistanceMeasure.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/MahalanobisDistanceMeasure.java?rev=1196892&r1=1196891&r2=1196892&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/MahalanobisDistanceMeasure.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/MahalanobisDistanceMeasure.java
Thu Nov 3 00:39:52 2011
@@ -17,12 +17,7 @@
package org.apache.mahout.common.distance;
-import java.io.DataInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-
+import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.io.Closeables;
import org.apache.hadoop.conf.Configuration;
@@ -32,30 +27,34 @@ import org.apache.mahout.common.ClassUti
import org.apache.mahout.common.parameters.ClassParameter;
import org.apache.mahout.common.parameters.Parameter;
import org.apache.mahout.common.parameters.PathParameter;
+import org.apache.mahout.math.Algebra;
import org.apache.mahout.math.CardinalityException;
import org.apache.mahout.math.DenseMatrix;
import org.apache.mahout.math.DenseVector;
-import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Matrix;
-import org.apache.mahout.math.Algebra;
+import org.apache.mahout.math.MatrixWritable;
import org.apache.mahout.math.SingularValueDecomposition;
+import org.apache.mahout.math.Vector;
import org.apache.mahout.math.VectorWritable;
-import org.apache.mahout.math.MatrixWritable;
-import com.google.common.base.Preconditions;
+import java.io.DataInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
//See http://en.wikipedia.org/wiki/Mahalanobis_distance for details
public class MahalanobisDistanceMeasure implements DistanceMeasure {
-
+
private Matrix inverseCovarianceMatrix;
private Vector meanVector;
-
+
private ClassParameter vectorClass;
private ClassParameter matrixClass;
private List<Parameter<?>> parameters;
private Parameter<Path> inverseCovarianceFile;
private Parameter<Path> meanVectorFile;
-
+
/*public MahalanobisDistanceMeasure(Vector meanVector,Matrix inputMatrix,
boolean inversionNeeded)
{
this.meanVector=meanVector;
@@ -64,7 +63,7 @@ public class MahalanobisDistanceMeasure
else
setInverseCovarianceMatrix(inputMatrix);
}*/
-
+
@Override
public void configure(Configuration jobConf) {
if (parameters == null) {
@@ -85,8 +84,9 @@ public class MahalanobisDistanceMeasure
Closeables.closeQuietly(in);
}
this.inverseCovarianceMatrix = inverseCovarianceMatrix.get();
+ Preconditions.checkArgument(inverseCovarianceMatrix != null,
"inverseCovarianceMatrix not initialized");
}
-
+
if (meanVectorFile.get() != null) {
FileSystem fs = FileSystem.get(meanVectorFile.get().toUri(), jobConf);
VectorWritable meanVector =
@@ -101,76 +101,73 @@ public class MahalanobisDistanceMeasure
Closeables.closeQuietly(in);
}
this.meanVector = meanVector.get();
+ Preconditions.checkArgument(meanVector != null, "meanVector not
initialized");
}
-
+
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
-
+
@Override
public Collection<Parameter<?>> getParameters() {
return parameters;
}
-
+
@Override
public void createParameters(String prefix, Configuration jobConf) {
parameters = Lists.newArrayList();
inverseCovarianceFile = new PathParameter(prefix, "inverseCovarianceFile",
jobConf, null,
- "Path on DFS to a file
containing the inverse covariance matrix.");
+ "Path on DFS to a file containing the inverse covariance matrix.");
parameters.add(inverseCovarianceFile);
matrixClass = new ClassParameter(prefix, "maxtrixClass", jobConf,
DenseMatrix.class,
- "Class<Matix> file specified in parameter inverseCovarianceFile has
been serialized with.");
- parameters.add(matrixClass);
-
+ "Class<Matix> file specified in parameter inverseCovarianceFile
has been serialized with.");
+ parameters.add(matrixClass);
+
meanVectorFile = new PathParameter(prefix, "meanVectorFile", jobConf, null,
- "Path on DFS to a file containing the
mean Vector.");
+ "Path on DFS to a file containing the mean Vector.");
parameters.add(meanVectorFile);
-
- vectorClass = new ClassParameter(prefix, "vectorClass", jobConf,
DenseVector.class,
- "Class file specified in parameter
meanVectorFile has been serialized with.");
- parameters.add(vectorClass);
+
+ vectorClass = new ClassParameter(prefix, "vectorClass", jobConf,
DenseVector.class,
+ "Class file specified in parameter meanVectorFile has been
serialized with.");
+ parameters.add(vectorClass);
}
-
- /**
+
+ /**
+ * @param v The vector to compute the distance to
* @return Mahalanobis distance of a multivariate vector
*/
public double distance(Vector v) {
- Preconditions.checkArgument(meanVector != null, "meanVector not
initialized");
- Preconditions.checkArgument(inverseCovarianceMatrix != null,
"inverseCovarianceMatrix not initialized");
return
Math.sqrt(v.minus(meanVector).dot(Algebra.mult(inverseCovarianceMatrix,
v.minus(meanVector))));
}
-
+
@Override
public double distance(Vector v1, Vector v2) {
if (v1.size() != v2.size()) {
throw new CardinalityException(v1.size(), v2.size());
}
- Preconditions.checkArgument(meanVector != null, "meanVector not
initialized");
- Preconditions.checkArgument(inverseCovarianceMatrix != null,
"inverseCovarianceMatrix not initialized");
-
return Math.sqrt(v1.minus(v2).dot(Algebra.mult(inverseCovarianceMatrix,
v1.minus(v2))));
}
-
+
@Override
public double distance(double centroidLengthSquare, Vector centroid, Vector
v) {
return distance(centroid, v); // TODO
}
-
+
public void setInverseCovarianceMatrix(Matrix inverseCovarianceMatrix) {
+ Preconditions.checkArgument(inverseCovarianceMatrix != null,
"inverseCovarianceMatrix not initialized");
this.inverseCovarianceMatrix = inverseCovarianceMatrix;
}
-
-
+
+
/**
* Computes the inverse covariance from the input covariance matrix given in
input.
- * @param m
- * A covariance matrix.
- * @throws IllegalArgumentException
- * if <tt>eigen values equal to 0 found</tt>.
+ *
+ * @param m A covariance matrix.
+ * @throws IllegalArgumentException if <tt>eigen values equal to 0
found</tt>.
*/
- public void setCovarianceMatrix(Matrix m) {
+ public void setCovarianceMatrix(Matrix m) {
if (m.numRows() != m.numCols()) {
throw new CardinalityException(m.numRows(), m.numCols());
}
@@ -181,7 +178,7 @@ public class MahalanobisDistanceMeasure
Matrix sInv = svd.getS();
// Inverse Diagonal Elems
for (int i = 0; i < sInv.numRows(); i++) {
- double diagElem = sInv.get(i,i);
+ double diagElem = sInv.get(i, i);
if (diagElem > 0.0) {
sInv.set(i, i, 1 / diagElem);
} else {
@@ -189,16 +186,18 @@ public class MahalanobisDistanceMeasure
}
}
inverseCovarianceMatrix =
svd.getU().times(sInv.times(svd.getU().transpose()));
+ Preconditions.checkArgument(inverseCovarianceMatrix != null,
"inverseCovarianceMatrix not initialized");
}
-
+
public Matrix getInverseCovarianceMatrix() {
return inverseCovarianceMatrix;
}
-
+
public void setMeanVector(Vector meanVector) {
+ Preconditions.checkArgument(meanVector != null, "meanVector not
initialized");
this.meanVector = meanVector;
}
-
+
public Vector getMeanVector() {
return meanVector;
}