package ml.humaning.util;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import com.aliasi.matrix.SvdMatrix;
public class SVD {
// reference page: http://alias-i.com/lingpipe/demos/tutorial/svd/read-me.html
double [][] matrix;
Point [] allData;
public SVD(int numberOfAttributes, String trainFile) throws IOException{
allData = Reader.readPoints(trainFile);
matrix = new double[numberOfAttributes][allData.length];
for(int i = 0;i < allData.length;i++){
Dimension [] dimensionArray = allData[i].getDimensionArray();
for(Dimension d : dimensionArray){
matrix[d.getDimension()-1][i] = d.getValue();// 1-based dimension
}
}
}
public void decompose(int reduceDimension, String outputFile) throws IOException{
double featureInit = 0.01;
double initialLearningRate = 0.005;
int annealingRate = 1000;
double regularization = 0.00;
double minImprovement = 0.0000;
int minEpochs = 10;
int maxEpochs = 50000;
System.out.println("before svd");
SvdMatrix svdMatrix = SvdMatrix.svd(matrix,
reduceDimension,
featureInit,
initialLearningRate,
annealingRate,
regularization,
null,
minImprovement,
minEpochs,
maxEpochs);
System.out.println("after svd");
//double[][] termVectors = svdMatrix.leftSingularVectors();
double[][] instanceVectors = svdMatrix.rightSingularVectors();
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
for(int i = 0;i < instanceVectors.length;i++){
String reducedInstance = allData[i].getZodiac()+ " ";
for(int j = 0;j < instanceVectors[i].length;j++){
reducedInstance += (j+1) + ":" + instanceVectors[i][j] + " ";
}
bw.write(reducedInstance.trim()+"\n");
}
bw.close();
}
}