Thanks Chris and Ted. I see where the problem is now.
And thanks to Chris for your reminder of the transposes.
if (arg.numRows() < arg.numCols()) {
transpositionNeeded = true;
}
...
public Matrix getU() {
if (transpositionNeeded) { //case numRows() < numCols()
return new DenseMatrix(v);
} else {
...
On 2014-6-14 0:27, Ted Dunning wrote:
Chris is just right.
See the compact SVD definition here:
http://en.wikipedia.org/wiki/Singular_value_decomposition#Reduced_SVDs
On Fri, Jun 13, 2014 at 4:47 AM, Chris Baker <[email protected]> wrote:
MATLAB's svd() function computes the singular value decomposition, with
orthogonal matrices U and V. Mahout computes a singular value
factorization, which does not contain the subspaces that do not contribute
to the data matrix. Compare against
svd(x,0) instead. Also, watch out for transposes.
On Jun 13, 2014 3:10 AM, "Han Fan" <[email protected]> wrote:
import org.apache.mahout.math.DenseMatrix;
import org.apache.mahout.math.Matrix;
import org.apache.mahout.math.SingularValueDecomposition;
public class testMPInverse {
public void test() {
Matrix matrix = new DenseMatrix(new double[][] {
{1,2},
{3,4},
{5,6}
});
SingularValueDecomposition svd = new
SingularValueDecomposition(matrix);
Matrix u = svd.getU();
Matrix v = svd.getV();
Matrix s = svd.getS();
System.out.println(u);
System.out.println(v);
System.out.println(s);
}
public static void main(String[] args) {
testMPInverse t = new testMPInverse();
t.test();
}
}
v is
{
0 => {0:0.42866713354862623,1:-0.8059639085892977}
1 => {0:0.5663069188480352,1:-0.1123824140965937}
2 => {0:0.7039467041474443,1:0.5811990803961101}
}
MATLAB gives a different answer
x=[1,2,3;4,5,6];
[u s v]=svd(x);
v
v =
-0.4287 0.8060 0.4082
-0.5663 0.1124 -0.8165
-0.7039 -0.5812 0.4082
Why the last column of v produced by Mahout SingularValueDecomposition is
0?
Thanks for your time.