Its also not a good idea to put the vectors into a hashset, i don't think
we have equals and hashcode correctly implemented for that
Am 16.06.2014 18:21 schrieb "Ted Dunning" <ted.dunning@gmail.com>:
> Patrice,
>
> This sounds like a classpath problem more than code error. Are you sure
> that you can run any program that use Mahout? Do you perhaps have two
> versions of Mahout floating around?
>
> Regarding the code, this is a more compact idiom for the same thing:
>
> Matrix m = ...;
> Vector centroid = m.aggregateColumns(new VectorFunction() {
> @Override
> public double apply(Vector f) {
> return f.zSum() / f.size();
> }
> });
>
> This uses a matrix as a container for vectors rather than a set of Vectors.
> If you really want to use a set, then your iteration based approach should
> be fine.
>
> In your code, you could also be much tighter. For instance, the last three
> lines could simply be:
>
> return sum.divide(vectors.size);
>
> None of the stuff with the Integer or casting is necessary.
>
>
>
> On Mon, Jun 16, 2014 at 9:01 AM, Patrice Seyed <apseyed@gmail.com> wrote:
>
> > Hi all,
> >
> >
> > I have attempted to write a method centroid() that
> >
> > 1) sums a HashSet of org.apache.mahout.math.Vector (vectors that are
> > DenseVector), and
> > 2) (org.apache.mahout.math.Vector.divide) divides the summed vector by
> > its size, as a double.
> >
> > I get an error:
> >
> > Exception in thread "main" java.lang.IncompatibleClassChangeError:
> > class org.apache.mahout.math.function.Functions$1 has interface
> > org.apache.mahout.math.function.DoubleFunction as super class
> >
> > I've tried this with a set of DenseVector and
> > SequentialAccessSparseVector with the same result.
> >
> > Any help appreciated, the actual method is below.
> > I noticed a class Centroid in the mahout distribution, but seems to
> > cover a different sense of centroid than that I'm implementing here.
> >
> > Thanks,
> > Patrice
> >
> >
> > public Vector centroid (HashSet<Vector> vectors){
> >
> > Iterator<Vector> it = vectors.iterator();
> >
> > Vector sum = it.next();
> >
> > while(it.hasNext()){
> >
> > Vector aVector = it.next();
> >
> >
> > sum = sum.plus(aVector);
> >
> > System.out.println(sum.toString());
> >
> > }
> >
> > Integer totalVectors = vectors.size();
> >
> > double dlTotalVectors = totalVectors.doubleValue();
> >
> > return sum.divide(dlTotalVectors);
> >
> >
> > }
> >
>
