मध्यम 0 हल किए गए 0% स्वीकृति

Naive Bayes Classifier

Predict a class from categorical features with Bayes' theorem and Laplace smoothing.

आप क्या सीखेंगे

  • Compute class priors and likelihoods
  • Smooth unseen feature values
  • Pick the most probable class

समस्या

अनुवाद दिखाएँ

Naive Bayes assumes features are independent given the class and picks the class with the highest score:

score(c) = P(c) × P(x₁ | c) × P(x₂ | c) × … × P(xₙ | c)

Features are categories encoded as integers. Estimate the probabilities from the training data:

  • P(c) = (number of samples of class c) / (number of samples)
  • P(xⱼ = v | c) = (count of samples of class c whose feature j equals v + 1) / (number of samples of class c + Kⱼ)

where Kⱼ is the number of distinct values of feature j among the training samples and the query. The +1 (Laplace smoothing) keeps an unseen value from making a score 0.

Return the class with the highest score; if scores tie, return the smaller class. Multiplying many small probabilities can underflow, so add logarithms instead.

Implement naive_bayes_predict(features, labels, query).

Input

features: One row of n categorical features per training sample.

labels: The class of each training sample.

query: The n features of the sample to classify.

Output

Return the predicted class.

सीमाएँ

1 ≤ samples ≤ 1,000, 1 ≤ n ≤ 20

0 ≤ each feature value and label ≤ 100

उदाहरण

उदाहरण 1
इनपुट:
query = [0, 1]
labels = [1, 1, 0, 0, 1]
features = [
    [0, 1],
    [0, 0],
    [1, 1],
    [1, 0],
    [0, 1]
]

अपेक्षित आउटपुट:
expected = 1
इनपुट:
std::vector<long long> query = {0, 1};
std::vector<long long> labels = {1, 1, 0, 0, 1};
std::vector<std::vector<long long>> features = {
    {0, 1},
    {0, 0},
    {1, 1},
    {1, 0},
    {0, 1}
};

अपेक्षित आउटपुट:
long long expected = 1;
इनपुट:
long[] query = new long[] {0, 1};
long[] labels = new long[] {1, 1, 0, 0, 1};
long[][] features = new long[][] {
    new long[] {0, 1},
    new long[] {0, 0},
    new long[] {1, 1},
    new long[] {1, 0},
    new long[] {0, 1}
};

अपेक्षित आउटपुट:
long expected = 1;

व्याख्या

Class 1 has 3 samples and class 0 has 2. Feature 1 has values {0, 1} (K = 2), feature 2 has {0, 1} (K = 2). score(1) = 3/5 × (3+1)/(3+2) × (2+1)/(3+2) = 0.6 × 0.8 × 0.6 = 0.288. score(0) = 2/5 × (0+1)/(2+2) × (1+1)/(2+2) = 0.4 × 0.25 × 0.5 = 0.05. Class 1 wins.

उदाहरण 2
इनपुट:
query = [2]
labels = [0, 0, 1]
features = [
    [0],
    [0],
    [1]
]

अपेक्षित आउटपुट:
expected = 0
इनपुट:
std::vector<long long> query = {2};
std::vector<long long> labels = {0, 0, 1};
std::vector<std::vector<long long>> features = {
    {0},
    {0},
    {1}
};

अपेक्षित आउटपुट:
long long expected = 0;
इनपुट:
long[] query = new long[] {2};
long[] labels = new long[] {0, 0, 1};
long[][] features = new long[][] {
    new long[] {0},
    new long[] {0},
    new long[] {1}
};

अपेक्षित आउटपुट:
long expected = 0;

व्याख्या

Value 2 never appears, so K = 3 (values 0, 1 and 2). score(0) = 2/3 × (0+1)/(2+3) ≈ 0.133 and score(1) = 1/3 × (0+1)/(1+3) ≈ 0.083. Thanks to smoothing neither is 0, and the more common class 0 wins.

संदर्भ

यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।

दूसरों से सीखें

समुदाय समाधान

अभी तक कोई प्रकाशित समाधान नहीं। पहला साझा करने के लिए इस चुनौती को हल करें।