Skip to content

Commit 616a8db

Browse files
committed
Fixed incorrect implementation of Bhattacharyya Distance and updated Bhattacharyya distance unit test
1 parent 0591860 commit 616a8db

File tree

2 files changed

+17
-24
lines changed

2 files changed

+17
-24
lines changed

src/com/jgaap/distances/BhattacharyyaDistance.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111
/**
1212
* Bhattacharyya Distance
13-
* d = abs( log( sum( sqrt( abs(xi - yi) ) ) / sum(xi) ) )
13+
* d = -log(sum(sqrt(xi * yi)))
1414
*
15-
* @author Adam Sargent
16-
* @version 1.0
15+
* @author David Berdik
16+
* @version 2.0
1717
*/
1818

1919
public class BhattacharyyaDistance extends DistanceFunction {
@@ -36,16 +36,13 @@ public boolean showInGUI() {
3636
@Override
3737
public double distance(Histogram unknownHistogram, Histogram knownHistogram)
3838
throws DistanceCalculationException {
39-
4039
Set<Event> events = Sets.union(unknownHistogram.uniqueEvents(), knownHistogram.uniqueEvents());
40+
double distance = 0.0;
4141

42-
double distance = 0.0, sumNumer = 0.0, sumDenom = 0.0;
43-
44-
for(Event event: events){
45-
sumNumer += Math.sqrt(Math.abs(unknownHistogram.relativeFrequency(event) - knownHistogram.relativeFrequency(event)));
46-
sumDenom += unknownHistogram.relativeFrequency(event);
47-
}
48-
distance = Math.abs(Math.log(sumNumer / sumDenom));
42+
for(Event event : events)
43+
distance += Math.sqrt(unknownHistogram.relativeFrequency(event) * knownHistogram.relativeFrequency(event));
44+
45+
distance = -Math.log(distance);
4946
return distance;
5047
}
5148

unittests/com/jgaap/distances/BhattacharyyaDistanceTest.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,17 @@ public void testDistance()
1919
EventSet set1 = new EventSet();
2020
EventSet set2 = new EventSet();
2121
Vector<Event> test1 = new Vector<Event>();
22-
test1.add(new Event("one", null));
23-
test1.add(new Event("two", null));
24-
test1.add(new Event("three", null));
25-
test1.add(new Event("four", null));
26-
test1.add(new Event("five", null));
27-
test1.add(new Event("six", null));
28-
test1.add(new Event("seven", null));
29-
test1.add(new Event("eight", null));
30-
test1.add(new Event("nine", null));
31-
test1.add(new Event("ten", null));
22+
test1.add(new Event("Lorem", null));
23+
test1.add(new Event("Lorem", null));
24+
test1.add(new Event("ipsum", null));
25+
test1.add(new Event("ipsum", null));
26+
test1.add(new Event("ipsum", null));
27+
test1.add(new Event("ipsum", null));
28+
test1.add(new Event("ipsum", null));
3229
set1.addEvents(test1);
3330
set2.addEvents(test1);
3431
double result = new BhattacharyyaDistance().distance(new EventMap(set1), new EventMap(set2));
35-
assertTrue(Double.isInfinite(result));
36-
32+
assertTrue(result == 0);
3733

3834
set2 = new EventSet();
3935
Vector<Event> test2 = new Vector<Event>();
@@ -49,7 +45,7 @@ public void testDistance()
4945
test2.add(new Event("10", null));
5046
set2.addEvents(test2);
5147
result = new BhattacharyyaDistance().distance(new EventMap(set1), new EventMap(set2));
52-
assertTrue(DistanceTestHelper.inRange(result, Math.log(20 * Math.sqrt(.1)), 0.0000000001));
48+
assertTrue(Double.isInfinite(result));
5349
}
5450

5551
}

0 commit comments

Comments
 (0)