File outputDir = getTestTempDir("output");
outputDir.delete();
File tmpDir = getTestTempDir("tmp");
Double na = Double.NaN;
Matrix preferences = new SparseRowMatrix(new int[] { 4, 4 }, new Vector[] {
new DenseVector(new double[] {5.0, 5.0, 2.0, na }),
new DenseVector(new double[] {2.0, na, 3.0, 5.0 }),
new DenseVector(new double[] { na, 5.0, na, 3.0 }),
new DenseVector(new double[] {3.0, na, na, 5.0 }) });
StringBuilder prefsAsText = new StringBuilder();
String separator = "";
Iterator<MatrixSlice> sliceIterator = preferences.iterateAll();
while (sliceIterator.hasNext()) {
MatrixSlice slice = sliceIterator.next();
Iterator<Vector.Element> elementIterator = slice.vector().iterateNonZero();
while (elementIterator.hasNext()) {
Vector.Element e = elementIterator.next();
if (!Double.isNaN(e.get())) {
prefsAsText.append(separator).append(slice.index()).append(',').append(e.index()).append(',').append(e.get());
separator = "\n";
}
}
}
logger.info("Input matrix:\n" + prefsAsText);
writeLines(inputFile, prefsAsText.toString());
ParallelALSFactorizationJob alsFactorization = new ParallelALSFactorizationJob();
Configuration conf = new Configuration();
conf.set("mapred.input.dir", inputFile.getAbsolutePath());
conf.set("mapred.output.dir", outputDir.getAbsolutePath());
conf.setBoolean("mapred.output.compress", false);
alsFactorization.setConf(conf);
int numFeatures = 3;
int numIterations = 5;
double lambda = 0.065;
alsFactorization.run(new String[] { "--tempDir", tmpDir.getAbsolutePath(), "--lambda", String.valueOf(lambda),
"--numFeatures", String.valueOf(numFeatures), "--numIterations", String.valueOf(numIterations) });
Matrix u = MathHelper.readEntries(conf, new Path(outputDir.getAbsolutePath(), "U/part-r-00000"),
preferences.numRows(), numFeatures);
Matrix m = MathHelper.readEntries(conf, new Path(outputDir.getAbsolutePath(), "M/part-r-00000"),
preferences.numCols(), numFeatures);
RunningAverage avg = new FullRunningAverage();
sliceIterator = preferences.iterateAll();
while (sliceIterator.hasNext()) {
MatrixSlice slice = sliceIterator.next();
Iterator<Vector.Element> elementIterator = slice.vector().iterateNonZero();
while (elementIterator.hasNext()) {
Vector.Element e = elementIterator.next();