自Andrew Ng的machine learning課程。算法
目錄:函數
如同以往的學習問題,咱們給定數據集$x^{(1)}, x^{(2)},...,x^{(m)}$性能
給定一個新的實例,$x_{test}$,咱們想知道這個新的實例是不是異常點(abnormal / anomalous)學習
以下例中,給定飛機發動機的一些特徵數據集,如$x_1:heat \ generated, x_2:vibration \ intensity$等,給定一個數據集中未出現過的新的實例$x_{test}$,那麼這個新的實例是不是異常點(真實狀況中不可能出現具備這樣子特徵的飛機發動機就稱其爲異常點);測試
如圖中,屬於一堆紅叉叉中間的綠叉叉就是正常的(ok)飛機發動機,而距離較遠的綠叉叉則是異常的(anomaly)飛機發動機。lua
爲了監測異常點,咱們能夠定義一個模型「p(x)」,這個模型用來計算實例不是異常點的機率,而後,咱們選擇一個閾值$\varepsilon$做爲是否爲異常點的分割線,當機率小於這個值,那麼就認爲這個實例是異常點,不然非異常點。spa
以下圖所示,藍色圈圈之外的就是異常點,選擇不一樣的$\varepsilon$圈子的大小會不同:調試
舉一些anomaly detection的實例:orm
注:若異常監測器標記了太多的異常點,那麼能夠適當的將$\varepsilon$減少。blog
又稱爲Normal distribution,如圖,若數據的分佈知足如下的圖像,則說x是知足均值爲$\mu$,方差爲$\sigma^2$的高斯分佈,完整的函數是$p(x;\mu,\sigma^2)=\frac{1}{\sigma \sqrt{(2\pi)}}e^{-\frac{1}{2} {(\frac{x-\mu}{\sigma})}^2}$
如下是高斯分佈的幾張示例圖:
從以上解釋和圖例中咱們能夠知道決定高斯分佈的參數是均值和方差:
那麼給定一個數據集,咱們如何獲得這兩個參數呢?
給定訓練集${x^{(1)},x^{(2)},...,x^{(m)}}$,這其中的每一個實例都是一個向量,$x \in R^n$。(m表明訓練集的實例的數目,n表明特徵的數目)
$p(x)=p(x_1;\mu_1,\sigma_1^2)p(x_2;\mu_2,\sigma_2^2)...p(x_n;\mu_n,\sigma_n^2)=\prod_{j=1}^{n}p(x_j;\mu_j,\sigma_j^2)$
以上函數公式基於一個獨立性假設,有興趣的能夠本身去查一查。
異常值監測算法:
3. 給定新實例x,計算p(x):
$p(x)=\prod_{j=1}^{n}{p(x_j;\mu_j,\sigma_j^2)}$,若$p(x)<\varepsilon$則新實例爲異常點
如下是一個示例,示例中給出了$p(x_1)和p(x_2)$,藍色圈圈外面的都被定義爲異常點;
當要調試算法時(選擇特徵),若是此時有一個評價算法的方式,那咱們對如何改進算法會有一個方向。(好比加入某個特徵以後,算法變得更好了,那麼怎樣才叫算法變得更好了呢?)
相似與監督分類,咱們把數據分爲訓練集、驗證集和測試集,可是注意異常檢測算法做用的數據集中一般只有少許的異常數據,大部分的數據都是正常的數據,所以咱們的數據集劃分和監督分類是有些不一樣,例如對於一個只包含0.2%的異常數據的數據集,咱們能夠用如下方式劃分數據集:
也就是60/20/20的比例劃分總數據集爲訓練、驗證和測試數據集,而異常數據又以50/50分配到了驗證和測試數據集中。
也有人將驗證數據集和測試數據集做爲同一個數據集,這樣的作法不推薦。
以上只是解決了用哪一部分的數據進行評價,可是如何評價呢?
顯然,這屬於以前說過的skewed class,也就是說異常數據佔據的比例極小,好比只有0.2%,若是簡單的是用分類精度這樣的指標,那麼只要把全部的數據都認爲是非異常,就能夠獲得98%的精度,這樣作固然不對。
同前面說過的,咱們可使用如下指標做爲評價指標:
注意到能夠用驗證集選擇適當的$\varepsilon$。
考慮一個問題,根據以上的解說,其實異常監測算法的作法和監督分類的作法十分的類似,那麼爲何不直接用監督分類呢,好比logistic regression?
這兩個算法的不一樣在於,異常監測是針對非異常數據的建模,模型創建時不考慮異常數據,而監督分類是對正例和負例分別建模,同時考慮了兩個類別。
這裏列出了二者的不一樣:
Anomaly Detection | Supervised Learning |
異常數據很是少(常見數目爲0-20),具備大量的非異常數據 | 正例和負例數據都不少 |
異常的種類是很是多的,各類各樣形式的異常,可是咱們的異常數據很是少,因此沒辦法捕捉全部的異常狀況,常常可能出現的狀況是,出現了訓練集中沒有出現過的新的異常類別,那麼若是想經過對異常數據建模,則可能會漏掉對不少異常數據的識別。 | 有大量的正例數據,能夠捕捉不一樣形式的正例,因此能夠直接對正例或者負例進行建模,均可以獲得比較好出結果。將來可能出現的正例或者負例的形式基本上應該都在訓練集中出現過。 |
詐騙監測,手工業,檢測電腦情況 | 垃圾郵件分類,天氣預報,癌症分類 |
特徵的選擇會很是大的程度上影響異常監測器的性能。
經過畫出數據的直方圖能夠監測數據是不是符合高斯分佈的,對於不符合高斯分佈的數據,能夠經過進行一些轉換使數據更加接近高斯分佈,如$log(x), log(x+c), x^{\frac12}, x^{\frac13}$等。
異常監測的偏差分析:
咱們但願模型可使得異常值的p(x)很是的小,而非異常值的p(x)較大,可是發生的狀況每每以下左圖所示,異常值(藍色叉叉)和非異常值(紅色叉叉)計算出來的p(x)差很少大,這樣就沒有辦法找出異常值了
而當咱們增長一個特徵$x_2$時,見上右圖,異常值(藍色叉叉)就被明顯的分離出來了,所以找到能夠顯著區分異常點和非異常點的特徵是很重要的。
多元高斯分佈是異常監測的延伸狀況,可能會(也可能不會)捕捉到更多的異常。
以前的模型是對每個特徵都構建一個模型$p(x_1),p(x_2),....,p(x_n)$,利用多元高斯分佈能夠對全部的特徵構建一個模型$p(x_1,x_2,...,x_n)$,模型的參數$\mu \in R^{n}, \Sigma \in R^{n*n}$
$p(x;\mu, \Sigma)=\frac{1}{(2\pi)^{n/2}\,|\Sigma|^{1/2}}\,exp{(-1/2(x-\mu)\Sigma^{-1}(x-\mu))}$
這個模型的好處是它能夠擬合橢圓高斯輪廓,不只僅限於正圓
以下面一系列圖所示:
對於多元正態分佈,當參數肯定時,模型以下:
$p(x;\mu, \Sigma)=\frac{1}{(2\pi)^{n/2}\, |\Sigma|^{1/2}}\,exp{(-1/2(x-\mu)\Sigma^{-1}(x-\mu))}$
參數擬合:給定數據集${x^(1),...,x^(n)}$
用多元正態分佈作異常監測的算法:
那麼使用多元正態分佈的異常檢測算法和傳統的異常監測算法有什麼區別呢?
original model | multivariate gaussian |
$p(x_1)$*p(x_2)*...*p(x_n) 至關於在多元高斯模型中$\Sigma$是一個對角矩陣,圖像是沿着軸線方向的圓 |
$p(x;\mu, \Sigma)=\frac{1}{(2\pi)^{n/2}\, |\Sigma|^{1/2}}\,exp{(-1/2(x-\mu)\Sigma^{-1}(x-\mu))}$ |
須要手動的捕捉那些能使得異常值的機率顯著不一樣的特徵之間的組合, 如$x_3=\frac{x_1}{x_2}$ |
能夠自動捕捉不一樣的特徵之間的聯繫 |
計算的耗費更低,更適用於大型的數據,好比n=100,000 | 計算的耗費相對更大,由於這裏有個$\Sigma$須要求逆,且只有當m>n時$\Sigma$才能夠求逆 經驗性的會在m>10n時才用這個方法 |