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 > power < 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