資料異常檢測(多元高斯模型)

2021-10-06 13:47:07 字數 2926 閱讀 2756

import numpy as np

import matplotlib.pyplot as plt

from scipy.io import loadmat

data = loadmat(

'data/ex8data1.mat'

)x = data[

'x']

x_val = data[

'x_val'

]y_val = data[

'y_val'

]plt.figure(figsize=(8

,5))

plt.scatter(x[:,

0], x[:,

1], edgecolors=

'b')

plt.show(

)def

estimate_gaussian

(x):

mu = x.mean(axis=0)

# 求每列的均值

sigma2 = x.var(axis=0)

# 求每列的方差,這裡自由度為m

return mu, sigma2

defmultivariate_gaussian

(x, mu, sigma2)

: p = np.zeros(

(x.shape[0]

,1))

n =len(mu)

if np.ndim(sigma2)==1

: sigma2 = np.diag(sigma2)

# 對角陣

for i in

range

(x.shape[0]

):p[i]=(

2* np.pi)**(

-n /2)

* np.linalg.det(sigma2)**(

-1/2

)* np.exp(

-0.5

*(x[i,:]

- mu)

.t @ np.linalg.inv(sigma2) @ (x[i,:]

- mu)

)return p

# 驗證集的概率向量

mu, sigma2 = estimate_gaussian(x_val)

p_val = multivariate_gaussian(x_val, mu, sigma2)

'''尋找最優(f1最大的)的閾值'''

defselect_threshold

(y_val, p_val)

: bestf1 =

0 bestepsilon =

0for epsilon in np.linspace(

min(p_val)

,max

(p_val)

,1001):

y_predict = np.zeros(y_val.shape)

y_predict[p_val < epsilon]=1

# 把小於閾值的設為1(異常)

tp = np.

sum(y_predict[y_val ==1]

)# 真正例

precision = tp / np.

sum(y_predict==1)

recall = tp / np.

sum(y_val==1)

f1 =(2

* precision * recall)

/(precision + recall)

if f1 > bestf1:

bestf1 = f1

bestepsilon = epsilon

return bestepsilon, bestf1

epsilon, f1 = select_threshold(y_val, p_val)

# (8.990852779269495e-05, 0.8750000000000001)

## 找出異常點

mu, sigma2 = estimate_gaussian(x)

p = multivariate_gaussian(x, mu, sigma2)

outliers = np.array(

[x[i]

for i in

range

(len

(x))

if p[i]

< epsilon]

)# 概率小於閾值記為異常點

## 把異常點圈出來

plt.figure(figsize=(8

,5))

plt.scatter(x[:,

0], x[:,

1], edgecolors=

'b')

plt.scatter(outliers[:,

0], outliers[:,

1], edgecolors=

'r')

plt.show(

)## 結果顯示

原資料顯示:

![在這裡插入描述]

異常資料區別顯示:

![在這裡插入描述]

異常檢測 OCSVM與混合高斯分布

20200924 前面的文章 孤立森林的簡要記錄 中描述了孤立森林的簡單原理,而且之前也簡單測試過這種方法的效能,只不過最終沒有得到非常好的效果。本篇文章中記錄一下另外兩種方法。一般來說,異常檢測是一種無監督的學習方法,當然也可以轉化為監督學習,但是我個人感覺轉化的方式不好,原因主要是你需要將異常進...

基於膚色高斯概率模型的人臉檢測

include include opencv2 opencv.hpp include using namespace std using namespace cv void fillhole mat src 基於漫水填充的孔洞填充 define pi 3.14156 void main 基於高斯膚色...

資料探勘之異常點檢測

異常點檢測方法 一 基本概念 異常物件被稱作離群點。異常檢測也稱偏差檢測和例外挖掘。常見的異常成因 資料 於不同的類 異常物件來自於乙個與大多數資料物件源 類 不同的源 類 的思想 自然變異,以及資料測量或收集誤差。異常檢測的方法 1 基於模型的技術 首先建立乙個資料模型,異常是那些同模型不能完美擬...