Added kNearestNeighbour and refactored Vector to a package level above and added a constructor

This commit is contained in:
Niklas Birk
2019-06-27 00:01:49 +02:00
parent 5264853c8e
commit 54cfe2dece
7 changed files with 189 additions and 21 deletions

View File

@ -1,9 +1,7 @@
package machine_learning.perceptron;
package machine_learning;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class VectorTest
@ -14,7 +12,7 @@ class VectorTest
{
var v = new Vector(3);
var expected = new Vector(List.of(0d, 0d, 0d));
var expected = new Vector(0d, 0d, 0d);
assertEquals(3, v.dimension());
assertEquals(expected, v);
@ -23,11 +21,11 @@ class VectorTest
@Test
void shouldReturnCorrectVectorWhenAdding()
{
var v1 = new Vector(List.of(1d, 2d));
var v2 = new Vector(List.of(3d, 4d));
var v1 = new Vector(1d, 2d);
var v2 = new Vector(3d, 4d);
var result = v1.add(v2);
var expected = new Vector(List.of(4d, 6d));
var expected = new Vector(4d, 6d);
assertEquals(expected, result);
}
@ -35,11 +33,11 @@ class VectorTest
@Test
void shouldReturnCorrectVectorWhenSubtracting()
{
var v1 = new Vector(List.of(1d, 2d));
var v2 = new Vector(List.of(3d, 4d));
var v1 = new Vector(1d, 2d);
var v2 = new Vector(3d, 4d);
var result = v1.subtract(v2);
var expected = new Vector(List.of(-2d, -2d));
var expected = new Vector(-2d, -2d);
assertEquals(expected, result);
}
@ -47,8 +45,8 @@ class VectorTest
@Test
void shouldReturnCorrectVectorWhenScalarMultiplying()
{
var v1 = new Vector(List.of(1d, 2d));
var v2 = new Vector(List.of(3d, 4d));
var v1 = new Vector(1d, 2d);
var v2 = new Vector(3d, 4d);
var result = v1.scalar(v2);
var expected = 11d;
@ -59,7 +57,7 @@ class VectorTest
@Test
void shouldReturnCorrectVectorWhenEuclid()
{
var v1 = new Vector(List.of(1d, 2d));
var v1 = new Vector(1d, 2d);
var result = v1.euclid();
var expected = Math.sqrt(5);
@ -67,14 +65,26 @@ class VectorTest
assertEquals(expected, result);
}
@Test
void shouldReturnCorrectDistance()
{
var v1 = new Vector(1d, 2d);
var v2 = new Vector(3d, 4d);
var result = v1.distance(v2);
var expected = Math.sqrt(8);
assertEquals(expected, result);
}
@Test
void shouldReturnCorrectVectorWhenDividing()
{
var v1 = new Vector(List.of(1d, 2d));
var v1 = new Vector(1d, 2d);
var div = 2d;
var result = v1.divide(div);
var expected = new Vector(List.of(0.5d, 1d));
var expected = new Vector(0.5d, 1d);
assertEquals(expected, result);
}

View File

@ -0,0 +1,62 @@
package machine_learning.nearest_neighbour;
import machine_learning.Vector;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class KNearestNeighbourTest
{
List<Vector> positives;
List<Vector> negatives;
@BeforeAll
void initLearnData()
{
this.positives = new ArrayList<>(List.of(
new Vector(8d, 4d),
new Vector(8d, 6d),
new Vector(9d, 2d),
new Vector(9d, 5d))
);
this.negatives = new ArrayList<>(List.of(
new Vector(6d, 1d),
new Vector(7d, 3d),
new Vector(8d, 2d),
new Vector(9d, 0d))
);
}
@Test
public void shouldReturnCorrectClassForVectorWithKEquals3()
{
var kNearestNeighbour = new KNearestNeighbour((a ,b) -> Math.abs(a.get(0) - b.get(0)) + Math.abs(a.get(1) - b.get(1)), 3);
var vector = new Vector(8, 3.5);
var actualClass = kNearestNeighbour.kNearestNeighbour(this.positives, this.negatives, vector);
var expectedClass = DataClass.NEGATIVE;
assertEquals(expectedClass, actualClass);
}
@Test
public void shouldReturnCorrectClassForVectorWithKEquals5()
{
var kNearestNeighbour = new KNearestNeighbour((a ,b) -> Math.abs(a.get(0) - b.get(0)) + Math.abs(a.get(1) - b.get(1)), 5);
var vector = new Vector(8, 3.5);
var actualClass = kNearestNeighbour.kNearestNeighbour(this.positives, this.negatives, vector);
var expectedClass = DataClass.POSITIVE;
assertEquals(expectedClass, actualClass);
}
}