You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by gs...@apache.org on 2009/08/09 13:08:35 UTC

svn commit: r802515 - in /lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix: AbstractVector.java Vector.java

Author: gsingers
Date: Sun Aug  9 11:08:34 2009
New Revision: 802515

URL: http://svn.apache.org/viewvc?rev=802515&view=rev
Log:
MAHOUT-161: refactor norms to allow for norm and normalize

Modified:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/Vector.java

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java?rev=802515&r1=802514&r2=802515&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java Sun Aug  9 11:08:34 2009
@@ -130,29 +130,33 @@
 
   @Override
   public Vector normalize() {
-    double divSq = Math.sqrt(dot(this));
-    return divide(divSq);
+    return divide(Math.sqrt(dot(this)));
   }
 
   @Override
   public Vector normalize(double power) {
+    return divide(norm(power));
+  }
+
+  @Override
+  public double norm(double power) {
     if (power < 0.0) {
       throw new IllegalArgumentException("Power must be >= 0");
     }
     // we can special case certain powers
     if (Double.isInfinite(power)) {
-      return divide(maxValue());
+      return maxValue();
     } else if (power == 2.0) {
-      return normalize();
+      return Math.sqrt(dot(this));
     } else if (power == 1.0) {
-      return divide(zSum());
+      return zSum();
     } else if (power == 0.0) {
       // this is the number of non-zero elements
       double val = 0.0;
       for (int i = 0; i < size(); i++) {
         val += getQuick(i) == 0 ? 0 : 1;
       }
-      return divide(val);
+      return val;
     } else {
       double val = 0.0;
       Iterator<Element> iter = this.iterateNonZero();
@@ -160,8 +164,7 @@
         Element element = iter.next();
         val += Math.pow(element.get(), power);
       }
-      double divFactor = Math.pow(val, 1.0 / power);
-      return divide(divFactor);
+      return Math.pow(val, 1.0 / power);
     }
   }
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/Vector.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/Vector.java?rev=802515&r1=802514&r2=802515&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/Vector.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/Vector.java Sun Aug  9 11:08:34 2009
@@ -256,6 +256,21 @@
    */
   Vector normalize(double power);
 
+  /**
+   * Return the k-norm of the vector. <p/> See 
+   * http://en.wikipedia.org/wiki/Lp_space <p/> Technically, when 
+   * 0 &gt; power &lt; 1, we don't have a norm, just a metric, but 
+   * we'll overload this here. Also supports power == 0 (number of non-zero elements) and
+   * power = {@link Double#POSITIVE_INFINITY} (max element). Again, see the Wikipedia page
+   * for more info.
+   *
+   * @param power The power to use.
+   *
+   * @see #normalize(double) 
+   *
+   */
+  double norm(double power);
+
   /** @return The maximum value in the Vector */
   double maxValue();
 



Re: svn commit: r802515 - in /lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix: AbstractVector.java Vector.java

Posted by Grant Ingersoll <gs...@apache.org>.
Yes, will fix.

On Aug 9, 2009, at 2:40 PM, Ted Dunning wrote:

> Shouldn't this iterate over non-zeros instead of over all elements?
>
> On Sun, Aug 9, 2009 at 4:08 AM, <gs...@apache.org> wrote:
>
>>      // this is the number of non-zero elements
>>      double val = 0.0;
>>      for (int i = 0; i < size(); i++) {
>>        val += getQuick(i) == 0 ? 0 : 1;
>>      }
>> -      return divide(val);
>> +      return val;
>>
>
>


Re: svn commit: r802515 - in /lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix: AbstractVector.java Vector.java

Posted by Ted Dunning <te...@gmail.com>.
Shouldn't this iterate over non-zeros instead of over all elements?

On Sun, Aug 9, 2009 at 4:08 AM, <gs...@apache.org> wrote:

>       // this is the number of non-zero elements
>       double val = 0.0;
>       for (int i = 0; i < size(); i++) {
>         val += getQuick(i) == 0 ? 0 : 1;
>       }
> -      return divide(val);
> +      return val;
>



-- 
Ted Dunning, CTO
DeepDyve