모든 챌린지
보통 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에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.