貝兒正在學習貝氏機率,最近她想基於貝氏機率來設計一個分類演算法。
她的分類演算法是這樣設計的:假設要預測的目標為$C$,而每筆資料有$n$個特徵$f_1,f_2,...,f_n$。每個特徵的值$v_i$有$1\le v_i\le V(f_i)$,而目標的值$c$也有$1\le c\le V(C)$。
給定$m$筆資料,貝兒的分類器會從中學習出以下的機率:
- $P(c)=\frac{\text{count}(C=c)+1}{m+V(C)}:$ $C=c$的機率
- $P(f_i=k|c)=\frac{\text{count}(C=c\ \&\ f_i=k)+1}{\text{count}(C=c)+V(f_i)}:$ $C=c$時,$f_i=k$的機率
要預測新資料$X(f_1=v_1,f_2=v_2,...,f_n=v_n)$時,貝兒的分類器會分別計算每個類別的分數函數$S(c,X)=P(c)\prod P(f_i=v_i|c)$,並選擇分數最高的類別作為預測。
如果有多個類別同時達到最高分$\max(S(c,X))=S(c_a,X)=S(c_b,X)=...$,則選擇最小的那個:$\text{answer}=\min(c_a,c_b,...)$。
考慮以下範例:
$V(f_1)=2,V(f_2)=3,V(C)=2$
| f1 | f2 | C |
|----|----|---|
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 1 | 2 | 2 |
| 2 | 2 | 1 |
從訓練資料中,貝兒的分類器會學習到以下機率:
- $P(C=1)=\frac{3+1}{4+2}=\frac{4}{6}$
- $P(C=2)=\frac{1+1}{4+2}=\frac{2}{6}$
- $P(f_1=1|C=1)=\frac{1+1}{3+2}=\frac{2}{5}$
- $P(f_1=2|C=1)=\frac{2+1}{3+2}=\frac{3}{5}$
- $P(f_2=1|C=1)=\frac{2+1}{3+3}=\frac{3}{6}$
- $P(f_2=2|C=1)=\frac{1+1}{3+3}=\frac{2}{6}$
- $P(f_2=3|C=1)=\frac{0+1}{3+3}=\frac{1}{6}$
給定一個要預測的資料$X(f_1=1,f_2=3)$,可以計算出每個$c$的分數函數:
- $S(1,X)=P(f_1=1|C=1)P(f_2=3|C=1)P(C=1)=\frac8{180}$
- $S(2,X)=P(f_1=1|C=2)P(f_2=3|C=2)P(C=2)=\frac4{72}$
$S(2,X)>S(1,X)$,所以貝兒的分類器會預測2。
你看了看貝兒的分類器覺得很有意思,決定自己實作一個。
第一行包含兩個整數$n,m$,代表特徵數、訓練資料數。
第二行包含$n+1$個整數,代表$V(f_1),V(f_2),...,V(f_n),V(C)$。
接下來的$m$行,每行包含$n+1$個以逗號分隔的整數,代表一筆訓練資料。前$n$個數分別為$f_1,f_2,...,f_n$,最後一個數為$C$。
下一行包含一個整數$q$。
接下來的$q$行,每行包含$n$個以逗號分隔的整數,代表一筆測試資料。
輸出$q$行,每行包含一個整數,代表對該筆測試資料預測的結果。
如果同時有多個類別達到最大的分數,輸出最小的類別。
2 4 2 3 2 1,1,1 2,1,1 1,2,2 2,2,1 1 1,3
2
2 2 2 2 3 1,1,2 2,2,3 1 1,2
2
範例輸入1:同題目內範例
範例輸入2:由於$S(2,[1,2])=S(3,[1,2])=\frac4{45}$同時達到最大($S(1,[1,2])=\frac1{20}$),故從這些類別(2、3)中選擇數值較小的類別2。
編號 | 身分 | 題目 | 主題 | 人氣 | 發表日期 |
沒有發現任何「解題報告」 |