~ubuntu-branches/ubuntu/vivid/elki/vivid

« back to all changes in this revision

Viewing changes to src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski2SimilarityFunction.java

  • Committer: Package Import Robot
  • Author(s): Erich Schubert
  • Date: 2014-01-22 16:23:20 UTC
  • mfrom: (1.1.8)
  • Revision ID: package-import@ubuntu.com-20140122162320-dtqtgcdiki8t9unc
Tags: 0.6.0-1
* New upstream final.
* 3DPC extension is not included, but may be uploaded as a separate
  package when there is actual need (it is a demo software, not meant
  for use outside of research, so just get the source code!)
* Upgrade to policy 3.9.5.0 (no changes)

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
 */
25
25
 
26
26
import de.lmu.ifi.dbs.elki.data.NumberVector;
27
 
import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
28
 
import de.lmu.ifi.dbs.elki.data.type.TypeUtil;
29
 
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
 
27
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction;
30
28
import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
31
29
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
32
30
 
44
42
 * @author Erich Schubert
45
43
 */
46
44
@Reference(authors = "M.-M. Deza and E. Deza", title = "Dictionary of distances", booktitle = "Dictionary of distances")
47
 
public class Kulczynski2SimilarityFunction extends AbstractPrimitiveSimilarityFunction<NumberVector<?>, DoubleDistance> {
 
45
public class Kulczynski2SimilarityFunction extends AbstractVectorDoubleSimilarityFunction {
48
46
  /**
49
47
   * Static instance.
50
48
   */
61
59
  }
62
60
 
63
61
  @Override
64
 
  public DoubleDistance getDistanceFactory() {
65
 
    return DoubleDistance.FACTORY;
66
 
  }
67
 
 
68
 
  @Override
69
 
  public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
70
 
    return TypeUtil.NUMBER_VECTOR_FIELD;
71
 
  }
72
 
 
73
 
  @Override
74
 
  public DoubleDistance similarity(NumberVector<?> o1, NumberVector<?> o2) {
75
 
    return new DoubleDistance(doubleSimilarity(o1, o2));
76
 
  }
77
 
 
78
 
  /**
79
 
   * Compute the similarity.
80
 
   * 
81
 
   * @param v1 First vector
82
 
   * @param v2 Second vector
83
 
   * @return Similarity
84
 
   */
85
62
  public double doubleSimilarity(NumberVector<?> v1, NumberVector<?> v2) {
86
 
    final int dim1 = v1.getDimensionality();
87
 
    if (dim1 != v2.getDimensionality()) {
88
 
      throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n  first argument: " + v1.toString() + "\n  second argument: " + v2.toString() + "\n" + v1.getDimensionality() + "!=" + v2.getDimensionality());
89
 
    }
 
63
    final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(v1, v2);
90
64
    double sumx = 0., sumy = 0., summin = 0.;
91
 
    for (int i = 0; i < dim1; i++) {
 
65
    for (int i = 0; i < dim; i++) {
92
66
      double xi = v1.doubleValue(i), yi = v2.doubleValue(i);
93
67
      sumx += xi;
94
68
      sumy += yi;
95
69
      summin += Math.min(xi, yi);
96
70
    }
97
 
    return dim1 * .5 * (dim1 / sumx + dim1 / sumy) * summin;
 
71
    return dim * .5 * (dim / sumx + dim / sumy) * summin;
98
72
  }
99
73
 
100
74
  /**