貝葉斯分類器的分類
根據實際處理的資料類型, 可以分為離散型貝葉斯分類器和連續型貝葉斯分類器, 這兩種類型的分類器, 使用的計算方式是不一樣的.
貝葉斯公式
首先看一下貝葉斯公式
$ P\left ( y|x \right ) = \frac{P\left ( x|y \right ) * P\left ( y \right )}{\sum_{i=1}^{n}P\left ( x|y_{i} \right )*P\left ( y_{i} \right )} $
其推導很簡單, 因為 P(yx) = P(xy), 可得 P(y|x) * P(x) = P(x|y) * P(y), 可得 P(y|x) = P(x|y) * P(y) / P(x), 将P(x)分解就得到了上面的公式.
在實際應用中, 可以用于計算一些檢測項目的可靠性. 例如某機構對雇員是否吸毒的檢測. 假定吸毒人員比例很低, 為0.5%, 而檢測存在誤差, 吸毒者檢出陽性率為99%, 非吸毒者檢出陽性率1%, 那麼僅作一輪檢測, 檢出陽性的結果中實際是吸毒者的比例有多高呢? 用式子描述就是
P(吸毒|陽性)
= P(陽性|吸毒) * P(吸毒) / P(陽性)
= P(陽性|吸毒) * P(吸毒) / (P(陽性|吸毒)*P(吸毒) + P(陽性|未吸毒)*P(未吸毒))
= 0.99 * 0.005 / (0.99 * 0.005 + 0.01 * 0.995) = 0.00495 / (0.00495 + 0.00995) = 0.00495 / 0.0149 = 0.3322
對檢測為陽性的雇員, 再做第二輪檢測, 檢出陽性的結果中實際是吸毒者的比例還可以按上式計算, 但是P(吸毒)從0.005變成了0.3322, 于是
P(吸毒|陽性) = 0.99 * 0.3322 / (0.99 * 0.3322 + 0.01 * 0.6678) = 0.98
這樣經過二次檢測後呈陽性的結果誤判率就僅有2%了.
另外, 對于檢測結果為陰性的雇員, 其吸毒的機率計算如下, 誤判的機率很低
P(吸毒|陰性)
= P(陰性|吸毒) * P(吸毒) / P(陰性)
= P(陰性|吸毒) * P(吸毒) / (P(陰性|吸毒)*P(吸毒) + P(陰性|未吸毒)*P(未吸毒))
= 0.01 * 0.005 / (0.01 * 0.005 + 0.99 * 0.995)
= 0.00005 / (0.00005 + 0.98505) = 0.005%
高斯分布公式
高斯分布(Gaussian distribution) 又名正态分布(Normal distribution)/常态分布. 是一個在數學實體及工程等領域都非常重要的機率分布, 在統計學的許多方面有着重大的影響力, 正态曲線呈鐘型, 若随機變量X服從一個數學期望為μ, 方差為σ^2的正态分布, 記為N(μ,σ^2). 其機率密度函數為正态分布的期望值μ決定了其位置, 其标準差σ決定了分布的幅度. 當μ = 0, σ = 1時正态分布就是标準正态分布.
高斯函數标準型:
$ f(x)=\frac{1}{\sqrt{2\pi }}e^{-\frac{x^{2}}{2}}, -\infty < x < +\infty $
這個函數描述了變量 x 的一種分布特性,變量x的分布有如下特點:
- 均值 = 0
- 方差為1
- 機率密度和為1
一進制高斯函數一般形式
$ f(x)=\frac{1}{\sqrt{2\pi \sigma }}e^{-\frac{(x - \mu )^{2}}{2\sigma ^{2}}}, -\infty < x < +\infty $
其中μ, σ(σ > 0)為常數, 一般使用均值作為μ, 标準差(Standard Deviation [ˌdi:viˈeɪʃn] )作為σ
高斯分布重要量的性質
- 密度函數關于平均值對稱
- 平均值是它的衆數(statistical mode)以及中位數(median)
- 68.268949%的面積在平均值左右一個标準差σ範圍内
- 95.449974%的面積在平均值左右兩個标準差2σ範圍内
- 99.730020%的面積在平均值左右三個标準差3σ範圍
離散型的貝葉斯分類器
離散型的貝葉斯分類器, 訓練資料為Xin和 Yin,
Xin是離散的特征值, 例如英文句子 I like sun shine, I am so happy, It is a good day, 和 I hate rainy, I don't like cloudy day,
Yin是對應的分類, 例如前面的句子, 對應的Yin分别是positive, positive, positive, negative, negative
訓練時, 将句子拆成單詞, 以單詞作為特征值, 累計到以下key的count
ytotal, ypositive, ynegative,
xsun&ypositive, xshine&ypositive, xhappy&ypositive, ... , xI&ypositive, xam&ypositive, xI&ynegative, ... xday&ynegative,
計算以下數值:
P(ypositive) = ypositive / ytotal
P(ynegative) = ynegative / ytotal
對于測試的句子, 将句子拆分為單詞數組, 分别計算各個單詞對于yi的條件機率:
P(yi|xword) = P(xword|yi) * P(yi) / Σ (P(xword|yj) * P(yj))
對每個單詞得到的值累加, 将累加的結果進行排序, 最高的yi就是分類的結果.
對于Σ P(xword|yj) * P(yj) 的值為0的情況, 可以給每一個count(xwordi&yj)預設一個初始值, 例如count(xwordi&yj) = 1, 避免除數為0
連續型貝葉斯分類器(高斯貝葉斯分類器)
連續型的貝葉斯分類器, 訓練資料為Xin和 Yin,
Xin是帶多元向量的特征值, 例如一個人的身高體重(H, W): (175, 68.5), (181.5, 75.3), (132, 31.5), (170, 71.5), (60, 15.0)
Yin是對應的分類, 例如前面的Xin值, 對應的Yin分别是A, A, K, A, K (A:adult, K:kid)
訓練時, 需要計算以下值:
P(A) = YA / Ytotal
P(K) = YK / YtotalA的身高均值和标準差: μAH, σAH, A的體重均值和标準差: μAW, σAW,
K的身高均值和标準差: μKH, σKH, B的體重均值和标準差: μKW, σKW,
假定身高和體重這兩個是互相獨立的次元. 這樣就确定了這兩個分類, 在各次元上的高斯分布函數
對于輸入的測試資料 x:(h, w), 先對A計算各個次元上的高斯分布機率, 再将結果乘起來(假定各次元互相獨立):
P(x|A) = P(Hx|A) * P(Wx|A) = GAH(x) * GAW(x), 再計算得到 P(A|x) = P(x|A) * P(A) / (P(x|A) * P(A) + P(x|K) * P(K))
同理計算得到P(K|x), 比較P(A|x)和 P(K|x)大小, 大者就是選中的結果分類.
...
public static HashMap<Integer, HashMap<Integer, Double>> meanMatrix = new HashMap<>(); //Matrix to hold the mean values
public static HashMap<Integer, HashMap<Integer, Double>> derivationMatrix = new HashMap<>(); //Matrix to hold standard devirations
...
/**
* Get gaussian parameters by lable & feature, then calculate with input x
*/
public static double gaussian(double x, int label, int feature) {
double conditionalMean = meanMatrix.get(label).get(feature);
double conditionalDerivation = derivationMatrix.get(label).get(feature);
return (Math.exp(-1 * (Math.pow(x - conditionalMean, 2) / (2 * conditionalDerivation)))) / (Math.sqrt(2 * Math.PI * conditionalDerivation));
}
.