You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mahout.apache.org by "Paul Hubenig (JIRA)" <ji...@apache.org> on 2012/09/26 07:52:07 UTC

[jira] [Created] (MAHOUT-1078) matrixmult gives wrong answer

Paul Hubenig created MAHOUT-1078:
------------------------------------

             Summary: matrixmult gives wrong answer
                 Key: MAHOUT-1078
                 URL: https://issues.apache.org/jira/browse/MAHOUT-1078
             Project: Mahout
          Issue Type: Bug
          Components: Math
    Affects Versions: 0.7
            Reporter: Paul Hubenig


Create a simple matrix: 
1 2
3 4

package exp

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io.{IOUtils, IntWritable, SequenceFile}
import org.apache.mahout.math.{SequentialAccessSparseVector, VectorWritable, RandomAccessSparseVector}

object MakeMatrix extends App with CommonMethods {
  val matrixFileOutput = "/Users/phubenig/matrixFile.sf"

  val conf = new Configuration()

  val fs = getFileSystem(true, conf)
  val path = new Path(matrixFileOutput)
  val arr = Array(Array(1, 2), Array(3, 4))
  val rank = 2

  val key = new org.apache.hadoop.io.IntWritable()
  val writer = SequenceFile.createWriter(fs, conf, path, classOf[IntWritable], classOf[VectorWritable])

  for (i <- 0 until rank) {
    key.set(i)
    val v = new SequentialAccessSparseVector(rank)
    for (j <- 0 until rank) {
      v.setQuick(j, arr(i)(j))
    }
    writer.append(key, new VectorWritable(v))
  }

  IOUtils.closeStream(writer)
}

Engage mahout to square this matrix.

$ mahout matrixmult --numRowsA 2 --numColsA 2 --numRowsB 2 --numColsB 2 --inputPathA matrixFile.sf --inputPathB matrixFile.sf

Read back the result:


I get the answer:??

(0, 0): 10.0
(0, 1): 14.0
(1, 0): 14.0
(1, 1): 20.0

i.e.,

10 14
14 20

Correct answer??
1 2    1 2         7 10
      x         =
3 4     3 4        15 22

I tried mahout transpose and that seems to work.

Am I specifying the matrix wrong somehow?

10 =|(1, 3)| * |(1,3)|
20 =|(2,4)| * |(2,4)|
14 = (1,3) , (2,4)  

but why is it doing this?

Instead of two vectors in the matrix creation program, I also tried one vector consisting of:  (1, 2, 3, 4) - matrixmult also give the wrong answer.

Regardless of convention used (???) that I don't understand, here is no documentation and no error checking.



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

[jira] [Commented] (MAHOUT-1078) matrixmult gives wrong answer

Posted by "Smita Wadhwa (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/MAHOUT-1078?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13463552#comment-13463552 ] 

Smita Wadhwa commented on MAHOUT-1078:
--------------------------------------

Ya, the present matrix multiplication works like this a.transpose().times(b) where a,b are input matrix. 

If you give the transpose of a then u get a.times(b). Hope this helps.
                
> matrixmult gives wrong answer
> -----------------------------
>
>                 Key: MAHOUT-1078
>                 URL: https://issues.apache.org/jira/browse/MAHOUT-1078
>             Project: Mahout
>          Issue Type: Bug
>          Components: Math
>    Affects Versions: 0.7
>            Reporter: Paul Hubenig
>
> Create a simple matrix: 
> 1 2
> 3 4
> package exp
> import org.apache.hadoop.conf.Configuration
> import org.apache.hadoop.fs.Path
> import org.apache.hadoop.io.{IOUtils, IntWritable, SequenceFile}
> import org.apache.mahout.math.{SequentialAccessSparseVector, VectorWritable, RandomAccessSparseVector}
> object MakeMatrix extends App with CommonMethods {
>   val matrixFileOutput = "/Users/phubenig/matrixFile.sf"
>   val conf = new Configuration()
>   val fs = getFileSystem(true, conf)
>   val path = new Path(matrixFileOutput)
>   val arr = Array(Array(1, 2), Array(3, 4))
>   val rank = 2
>   val key = new org.apache.hadoop.io.IntWritable()
>   val writer = SequenceFile.createWriter(fs, conf, path, classOf[IntWritable], classOf[VectorWritable])
>   for (i <- 0 until rank) {
>     key.set(i)
>     val v = new SequentialAccessSparseVector(rank)
>     for (j <- 0 until rank) {
>       v.setQuick(j, arr(i)(j))
>     }
>     writer.append(key, new VectorWritable(v))
>   }
>   IOUtils.closeStream(writer)
> }
> Engage mahout to square this matrix.
> $ mahout matrixmult --numRowsA 2 --numColsA 2 --numRowsB 2 --numColsB 2 --inputPathA matrixFile.sf --inputPathB matrixFile.sf
> Read back the result:
> I get the answer:??
> (0, 0): 10.0
> (0, 1): 14.0
> (1, 0): 14.0
> (1, 1): 20.0
> i.e.,
> 10 14
> 14 20
> Correct answer??
> 1 2    1 2         7 10
>       x         =
> 3 4     3 4        15 22
> I tried mahout transpose and that seems to work.
> Am I specifying the matrix wrong somehow?
> 10 =|(1, 3)| * |(1,3)|
> 20 =|(2,4)| * |(2,4)|
> 14 = (1,3) , (2,4)  
> but why is it doing this?
> Instead of two vectors in the matrix creation program, I also tried one vector consisting of:  (1, 2, 3, 4) - matrixmult also give the wrong answer.
> Regardless of convention used (???) that I don't understand, here is no documentation and no error checking.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Re: [jira] [Resolved] (MAHOUT-1078) matrixmult gives wrong answer

Posted by Lance Norskog <go...@gmail.com>.
Perhaps the command-line help could mention this? Since it is an obvious confusion factor?

----- Original Message -----
| From: "Sebastian Schelter (JIRA)" <ji...@apache.org>
| To: dev@mahout.apache.org
| Sent: Tuesday, September 25, 2012 11:06:07 PM
| Subject: [jira] [Resolved] (MAHOUT-1078) matrixmult gives wrong answer
| 
| 
|      [
|      https://issues.apache.org/jira/browse/MAHOUT-1078?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
|      ]
| 
| Sebastian Schelter resolved MAHOUT-1078.
| ----------------------------------------
| 
|     Resolution: Not A Problem
| 
| As one commenter already said, matrixmult computes A'B not AB.
|                 
| > matrixmult gives wrong answer
| > -----------------------------
| >
| >                 Key: MAHOUT-1078
| >                 URL:
| >                 https://issues.apache.org/jira/browse/MAHOUT-1078
| >             Project: Mahout
| >          Issue Type: Bug
| >          Components: Math
| >    Affects Versions: 0.7
| >            Reporter: Paul Hubenig
| >
| > Create a simple matrix:
| > 1 2
| > 3 4
| > package exp
| > import org.apache.hadoop.conf.Configuration
| > import org.apache.hadoop.fs.Path
| > import org.apache.hadoop.io.{IOUtils, IntWritable, SequenceFile}
| > import org.apache.mahout.math.{SequentialAccessSparseVector,
| > VectorWritable, RandomAccessSparseVector}
| > object MakeMatrix extends App with CommonMethods {
| >   val matrixFileOutput = "/Users/phubenig/matrixFile.sf"
| >   val conf = new Configuration()
| >   val fs = getFileSystem(true, conf)
| >   val path = new Path(matrixFileOutput)
| >   val arr = Array(Array(1, 2), Array(3, 4))
| >   val rank = 2
| >   val key = new org.apache.hadoop.io.IntWritable()
| >   val writer = SequenceFile.createWriter(fs, conf, path,
| >   classOf[IntWritable], classOf[VectorWritable])
| >   for (i <- 0 until rank) {
| >     key.set(i)
| >     val v = new SequentialAccessSparseVector(rank)
| >     for (j <- 0 until rank) {
| >       v.setQuick(j, arr(i)(j))
| >     }
| >     writer.append(key, new VectorWritable(v))
| >   }
| >   IOUtils.closeStream(writer)
| > }
| > Engage mahout to square this matrix.
| > $ mahout matrixmult --numRowsA 2 --numColsA 2 --numRowsB 2
| > --numColsB 2 --inputPathA matrixFile.sf --inputPathB matrixFile.sf
| > Read back the result:
| > I get the answer:??
| > (0, 0): 10.0
| > (0, 1): 14.0
| > (1, 0): 14.0
| > (1, 1): 20.0
| > i.e.,
| > 10 14
| > 14 20
| > Correct answer??
| > 1 2    1 2         7 10
| >       x         =
| > 3 4     3 4        15 22
| > I tried mahout transpose and that seems to work.
| > Am I specifying the matrix wrong somehow?
| > 10 =|(1, 3)| * |(1,3)|
| > 20 =|(2,4)| * |(2,4)|
| > 14 = (1,3) , (2,4)
| > but why is it doing this?
| > Instead of two vectors in the matrix creation program, I also tried
| > one vector consisting of:  (1, 2, 3, 4) - matrixmult also give the
| > wrong answer.
| > Regardless of convention used (???) that I don't understand, here
| > is no documentation and no error checking.
| 
| --
| This message is automatically generated by JIRA.
| If you think it was sent incorrectly, please contact your JIRA
| administrators
| For more information on JIRA, see:
| http://www.atlassian.com/software/jira
| 

[jira] [Resolved] (MAHOUT-1078) matrixmult gives wrong answer

Posted by "Sebastian Schelter (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/MAHOUT-1078?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sebastian Schelter resolved MAHOUT-1078.
----------------------------------------

    Resolution: Not A Problem

As one commenter already said, matrixmult computes A'B not AB.
                
> matrixmult gives wrong answer
> -----------------------------
>
>                 Key: MAHOUT-1078
>                 URL: https://issues.apache.org/jira/browse/MAHOUT-1078
>             Project: Mahout
>          Issue Type: Bug
>          Components: Math
>    Affects Versions: 0.7
>            Reporter: Paul Hubenig
>
> Create a simple matrix: 
> 1 2
> 3 4
> package exp
> import org.apache.hadoop.conf.Configuration
> import org.apache.hadoop.fs.Path
> import org.apache.hadoop.io.{IOUtils, IntWritable, SequenceFile}
> import org.apache.mahout.math.{SequentialAccessSparseVector, VectorWritable, RandomAccessSparseVector}
> object MakeMatrix extends App with CommonMethods {
>   val matrixFileOutput = "/Users/phubenig/matrixFile.sf"
>   val conf = new Configuration()
>   val fs = getFileSystem(true, conf)
>   val path = new Path(matrixFileOutput)
>   val arr = Array(Array(1, 2), Array(3, 4))
>   val rank = 2
>   val key = new org.apache.hadoop.io.IntWritable()
>   val writer = SequenceFile.createWriter(fs, conf, path, classOf[IntWritable], classOf[VectorWritable])
>   for (i <- 0 until rank) {
>     key.set(i)
>     val v = new SequentialAccessSparseVector(rank)
>     for (j <- 0 until rank) {
>       v.setQuick(j, arr(i)(j))
>     }
>     writer.append(key, new VectorWritable(v))
>   }
>   IOUtils.closeStream(writer)
> }
> Engage mahout to square this matrix.
> $ mahout matrixmult --numRowsA 2 --numColsA 2 --numRowsB 2 --numColsB 2 --inputPathA matrixFile.sf --inputPathB matrixFile.sf
> Read back the result:
> I get the answer:??
> (0, 0): 10.0
> (0, 1): 14.0
> (1, 0): 14.0
> (1, 1): 20.0
> i.e.,
> 10 14
> 14 20
> Correct answer??
> 1 2    1 2         7 10
>       x         =
> 3 4     3 4        15 22
> I tried mahout transpose and that seems to work.
> Am I specifying the matrix wrong somehow?
> 10 =|(1, 3)| * |(1,3)|
> 20 =|(2,4)| * |(2,4)|
> 14 = (1,3) , (2,4)  
> but why is it doing this?
> Instead of two vectors in the matrix creation program, I also tried one vector consisting of:  (1, 2, 3, 4) - matrixmult also give the wrong answer.
> Regardless of convention used (???) that I don't understand, here is no documentation and no error checking.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira