機器學習——局部異常檢測
今天介紹無監督機器學習中的異常檢測演算法,用來找出給定的輸入樣本中包含的異常值的問題。我們之前雖然也介紹過魯棒學習演算法,但是當樣本中包含較多異常值的時候,先出去異常值再進行學習的方法,一般會更有效。
首先介紹局部異常因子法,局部異常因子是指偏離大部分數據的異常數據進行檢測的方法。這裡我們需要用到幾個定義:
可達性距離(Reachability Distance,RD)
這裡的 d(A,B) 就是A與B的直接距離, k-distance 是 k-nearest distance,也就是第k近距離,k = 1,那就是距離最近的點,示例圖如下(Objects B and C have the same reachability distance (k=3), while D is not a k nearest neighbor):
定義了RD之後,再定義一個局部可達密度(Local Reachability Density,LRD),定義如下:
這裡我們把 A 的第 k 近鄰居。
局部可達密度反映了樣本的密集程度,應用該定義之後,我們可以定義局部異常因子(Local Outlier Factor,LOF),如下:
當A的局部因子比較小的話就被認為是正常的。這樣,我們就可以進行異常值檢測,借用維基百科中的例子做一個示例。
可以看出,紅圈比較大的就是LOF比較大,異常的概率也就更大,與事實基本符合,代碼如下:
closeall; clear; clc;
n = 100;
x = [(rand(n/2,2)-0.5)*20; randn(n/2,2)];
x(n,1) = 14;
k = 3; % k-nearest 中的k
x2 = sum(x.^2,2);
[s,t] = sort(sqrt(repmat(x2,1,n) + repmat(x2",n,1) - 2*x*x"),2);
for i = 1:k+1
for j = 1:k
RD(:,j) = max(s(t(t(:,i),j+1),k),s(t(:,i),j+1));
end
LRD(:,i) = 1./mean(RD,2);
end
LOF = mean(LRD(:,2:k+1),2)./LRD(:,1);
figure
holdon
plot(x(:,1),x(:,2),"b.","linewidth",2);
for i = 1:n
plot(x(i,1),x(i,2),"ro","Markersize",LOF(i)*10);
end
代碼的運行結果如下:
以上就是今天推送的內容,歡迎討論。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※Win10將迎來重大更新 微軟推人工智慧平台 面向AI與機器學習
※《後院怪獸》開發商想用機器學習提高營收,並用此獲得2000萬美元融資
TAG:機器學習 |