forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMultinomialNaiveBayesClassifierTest.java
More file actions
141 lines (116 loc) · 4.68 KB
/
Copy pathMultinomialNaiveBayesClassifierTest.java
File metadata and controls
141 lines (116 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.thealgorithms.machinelearning;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class MultinomialNaiveBayesClassifierTest {
@Test
void predictsCorrectClassOnSeparableToyDataset() {
// Class 0 samples are dominated by feature 0; class 1 samples by feature 1.
double[][] features = {
{5, 1},
{6, 0},
{4, 1},
{1, 5},
{0, 6},
{1, 4},
};
int[] labels = {0, 0, 0, 1, 1, 1};
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
classifier.fit(features, labels);
assertEquals(0, classifier.predict(new double[] {5, 0}));
assertEquals(1, classifier.predict(new double[] {0, 5}));
}
@Test
void predictBatchMatchesIndividualPredictions() {
double[][] features = {
{3, 0},
{2, 0},
{0, 3},
{0, 2},
};
int[] labels = {0, 0, 1, 1};
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
classifier.fit(features, labels);
double[][] samples = {{4, 0}, {0, 4}};
int[] predictions = classifier.predict(samples);
assertEquals(classifier.predict(samples[0]), predictions[0]);
assertEquals(classifier.predict(samples[1]), predictions[1]);
}
@Test
void laplaceSmoothingKeepsZeroCountFeatureLogProbabilityFinite() {
// Feature index 1 never appears for class 0 in training data.
double[][] features = {
{2, 0},
{3, 0},
{0, 2},
{0, 3},
};
int[] labels = {0, 0, 1, 1};
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
classifier.fit(features, labels);
// A sample that hits class 0's zero-count feature should still produce
// a finite, usable prediction instead of -Infinity collapsing the score.
int prediction = classifier.predict(new double[] {1, 1});
assertTrue(prediction == 0 || prediction == 1);
}
@Test
void predictBeforeFitThrowsIllegalStateException() {
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
assertThrows(IllegalStateException.class, () -> classifier.predict(new double[] {1, 2}));
}
@Test
void nonPositiveAlphaThrowsIllegalArgumentException() {
assertThrows(IllegalArgumentException.class, () -> new MultinomialNaiveBayesClassifier(0.0));
assertThrows(IllegalArgumentException.class, () -> new MultinomialNaiveBayesClassifier(-1.0));
}
@Test
void mismatchedSampleLengthThrowsIllegalArgumentException() {
double[][] features = {
{1, 2},
{3, 4},
};
int[] labels = {0, 1};
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
classifier.fit(features, labels);
assertThrows(IllegalArgumentException.class, () -> classifier.predict(new double[] {1, 2, 3}));
}
@Test
void mismatchedFeatureAndLabelLengthsThrowsIllegalArgumentException() {
double[][] features = {
{1, 2},
{3, 4},
};
int[] labels = {0};
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
assertThrows(IllegalArgumentException.class, () -> classifier.fit(features, labels));
}
@Test
void emptyFeaturesArrayThrowsIllegalArgumentException() {
double[][] features = {};
int[] labels = {};
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
assertThrows(IllegalArgumentException.class, () -> classifier.fit(features, labels));
}
@Test
void refittingReplacesPreviousModelState() {
MultinomialNaiveBayesClassifier classifier = new MultinomialNaiveBayesClassifier();
double[][] firstFeatures = {
{5, 0, 0},
{0, 5, 0},
{0, 0, 5},
};
int[] firstLabels = {0, 1, 2};
classifier.fit(firstFeatures, firstLabels);
double[][] secondFeatures = {
{5, 0},
{0, 5},
};
int[] secondLabels = {0, 1};
classifier.fit(secondFeatures, secondLabels);
// Class 2 existed in the first fit but not the second — it must not
// survive into predictions after refitting.
int prediction = classifier.predict(new double[] {2.5, 2.5});
assertTrue(prediction == 0 || prediction == 1);
}
}