Skip to content

Commit f3788f0

Browse files
committed
SimilarityCalculator refactoring.
1 parent 254fc2e commit f3788f0

8 files changed

+54
-29
lines changed

src/main/java/com/github/felipexw/evaluations/metrics/EuclidianSimilarityCalculator.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 23/08/2016.
57
*/
68
public class EuclidianSimilarityCalculator implements SimilarityCalculator {
9+
710
@Override
8-
public double calculate(double[] a, double[] b) {
9-
if (a == null || a.length == 0 || (a.length != b.length))
11+
public double calculate(List<Double> a, List<Double> b) {
12+
if (a == null || a.isEmpty() || (a.size()!= b.size()))
1013
throw new IllegalArgumentException("The params can't be null or empty.");
1114
double distance = 0;
1215

13-
for (short i = 0; i < a.length; i++) {
14-
double difference = b[i] - a[i];
16+
for (int i = 0; i < a.size(); i++) {
17+
double difference = b.get(i) - a.get(i);
1518
distance += Math.pow(difference, 2);
1619
}
1720
return Math.round(Math.sqrt(distance));

src/main/java/com/github/felipexw/evaluations/metrics/JaccardSimilarityCalculator.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 25/08/2016.
57
*/
68
public class JaccardSimilarityCalculator implements SimilarityCalculator {
79
@Override
8-
public double calculate(double[] a, double[] b) {
9-
if (a == null || b == null)
10+
public double calculate(List<Double> a, List<Double> b) {
11+
if (a == null || b == null || a.size() != b.size())
1012
throw new IllegalArgumentException("args can't be invalid");
1113
double similarity = 0d;
12-
for(int i =0; i < a.length; i++){
13-
similarity += Math.abs(a[i] - b[i]);
14+
for(int i =0; i < a.size(); i++){
15+
similarity += Math.abs(a.get(i) - b.get(i));
1416
}
1517
return similarity;
1618
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 25/08/2016.
57
*/
68
public class MahalanobisSimilarityCalculator implements SimilarityCalculator{
79
@Override
8-
public double calculate(double[] a, double[] b) {
10+
public double calculate(List<Double> a, List<Double> b) {
911
return 0;
1012
}
1113
}

src/main/java/com/github/felipexw/evaluations/metrics/ManhattanSimilarityCalculator.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 25/08/2016.
57
*/
68
public class ManhattanSimilarityCalculator implements SimilarityCalculator {
79
@Override
8-
public double calculate(double[] a, double[] b) {
9-
if (a == null || a.length == 0)
10+
public double calculate(List<Double> a, List<Double> b) {
11+
if (a == null || a.size() == 0)
1012
throw new IllegalArgumentException("The params can't be null or empty.");
1113
double distance = 0;
1214

13-
for (short i = 0; i < a.length; i++) {
14-
double difference = Math.abs(b[i] - a[i]);
15+
for (short i = 0; i < a.size(); i++) {
16+
double difference = Math.abs(b.get(i) - a.get(i));
1517
distance += difference;
1618
}
1719
return distance;
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 25/08/2016.
57
*/
68
public class MinkowskiSimilarityCalculator implements SimilarityCalculator {
79

810
@Override
9-
public double calculate(double[] a, double[] b) {
11+
public double calculate(List<Double> a, List<Double> b) {
1012
return 0;
1113
}
1214
}

src/main/java/com/github/felipexw/evaluations/metrics/PearsonSimilarityCalculator.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 25/08/2016.
57
*/
@@ -16,8 +18,8 @@ public class PearsonSimilarityCalculator implements SimilarityCalculator {
1618
* * 0 means the datapoints doesn't have a correlation among them.
1719
*/
1820
@Override
19-
public double calculate(double[] a, double[] b) {
20-
if (a == null || a.length == 0)
21+
public double calculate(List<Double> a, List<Double> b) {
22+
if (a == null || a.size() == 0)
2123
throw new IllegalArgumentException("The params can't be null or empty.");
2224
double distance = 0;
2325

@@ -26,9 +28,9 @@ public double calculate(double[] a, double[] b) {
2628
double aVariance= 0;
2729
double bVariance = 0;
2830

29-
for (short i = 0; i < a.length; i++) {
30-
aVariance += a[i] * avgFeaturesA;
31-
bVariance += b[i] * avgFeaturesB;
31+
for (short i = 0; i < a.size(); i++) {
32+
aVariance += a.get(i) * avgFeaturesA;
33+
bVariance += b.get(i) * avgFeaturesB;
3234
}
3335

3436
double numerator = aVariance * bVariance;
@@ -37,12 +39,12 @@ public double calculate(double[] a, double[] b) {
3739
return numerator/denominator;
3840
}
3941

40-
private double getAvearageFromFeatures(double[] features){
42+
private double getAvearageFromFeatures(List<Double> features){
4143
double average = 0;
4244

43-
for(int i =0; i < features.length; i++)
44-
average += features[i];
45+
for(int i =0; i < features.size(); i++)
46+
average += features.get(i);
4547

46-
return average/features.length;
48+
return average/features.size();
4749
}
4850
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.github.felipexw.evaluations.metrics;
22

3+
import java.util.List;
4+
35
/**
46
* Created by felipe.appio on 23/08/2016.
57
*/
68
public interface SimilarityCalculator {
79

8-
double calculate(double[] a, double[] b);
10+
double calculate(List<Double> a, List<Double> b);
11+
12+
913
}

src/test/java/SimilarityCalculatorCalculatorTest.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
import com.google.common.truth.Truth;
33
import org.junit.Test;
44

5+
import java.util.Arrays;
6+
import java.util.List;
7+
58

69
/**
710
* Created by felipe.appio on 24/08/2016.
@@ -18,7 +21,7 @@ public void itShouldRaiseAnExceptionWithNullArgs() {
1821
@Test
1922
public void it_should_calculate_the_euclidian_distance_between_5_And_2() {
2023
SimilarityCalculator similarityCalculator = new EuclidianSimilarityCalculator();
21-
double found = similarityCalculator.calculate(new double[]{3}, new double[]{5});
24+
double found = similarityCalculator.calculate(Arrays.asList(0d, 1d), Arrays.asList(0d));
2225
double expected = Math.round(2.449489742783178);
2326
Truth.assertThat(found).isEqualTo(expected);
2427
}
@@ -38,7 +41,7 @@ public void when_calculate_the_manhattan_distance_with_empty_point_it_should_rai
3841
@Test
3942
public void it_should_calculate_the_mahattan_distance_between_5_And_2() {
4043
SimilarityCalculator similarityCalculator = new ManhattanSimilarityCalculator();
41-
double found = similarityCalculator.calculate(new double[]{3, 2, 50}, new double[]{5, 2, 10});
44+
double found = similarityCalculator.calculate(Arrays.asList(3d, 2d, 50d), Arrays.asList(5d, 2d, 10d));
4245
double expected = 42d;
4346

4447
Truth.assertThat(found).isEqualTo(expected);
@@ -59,7 +62,7 @@ public void when_calculate_the_cosine_distance_with_invalid_args_it_should_raise
5962
@Test(expected = IllegalArgumentException.class)
6063
public void when_calculate_the_cosine_distance_with_different_args_dimensions_it_should_raise_an_exception() {
6164
SimilarityCalculator similarityCalculator = new CosineSimilarityCalculator();
62-
similarityCalculator.calculate(new double[3], new double[2]);
65+
similarityCalculator.calculate(Arrays.asList(1d), Arrays.asList(2d, 3d));
6366
}
6467

6568
@Test()
@@ -68,8 +71,10 @@ public void when_calculate_the_jaccard_distance_between_two_feature_vectors() {
6871
* A(2,2); B(2,2)
6972
*/
7073
SimilarityCalculator similarityCalculator = new JaccardSimilarityCalculator();
71-
double similarity = similarityCalculator.calculate(new double[]{2d, 2d}, new double[]{2d, 2d});
74+
List<Double> a = Arrays.asList(2d, 2d);
75+
List<Double> b = Arrays.asList(2d, 2d);
7276
double expectedSimilarity = 0d;
77+
double similarity = similarityCalculator.calculate(a,b);
7378

7479
Truth.assertThat(similarity)
7580
.isEqualTo(expectedSimilarity);
@@ -81,7 +86,10 @@ public void when_calculate_the_cosine_distance_between_two_feature_vectors() {
8186
* A(2,2); B(2,2)
8287
*/
8388
SimilarityCalculator similarityCalculator = new JaccardSimilarityCalculator();
84-
double similarity = similarityCalculator.calculate(new double[]{2d, 2d}, new double[]{2d, 2d});
89+
List<Double> a = Arrays.asList(2d, 2d);
90+
List<Double> b = Arrays.asList(2d, 2d);
91+
92+
double similarity = similarityCalculator.calculate(a, b);
8593
double expectedSimilarity = 0d;
8694

8795
Truth.assertThat(similarity)

0 commit comments

Comments
 (0)