考慮如下的資料集:x,
y 是觀測到的變數(observed variables),
y 的誤差存放在陣列 e中:
x = np.array([ 0, 3, 9, 14, 15, 19, 20, 21, 30, 35,
40, 41, 42, 43, 54, 56, 67, 69, 72, 88])
y = np.array([33, 68, 34, 34, 37, 71, 37, 44, 48, 49,
53, 49, 50, 48, 56, 60, 61, 63, 44, 71])
e = np.array([ 3.6, 3.9, 2.6, 3.4, 3.8, 3.8, 2.2, 2.1, 2.3, 3.8,
2.2, 2.8, 3.9, 3.1, 3.4, 2.6, 3.4, 3.7, 2.0, 3.5])
對資料集作如下的視覺化工作:
我們的工作即是找到能夠擬合這些點的一條直線。視覺上很容易看出這些點中存在離群點(outliers)。
我們可使用最大似然估計(maximum likelihood estimation)的策略尋找這樣的點:
我們首先定義乙個簡單的線性模型(linear model), y^
(xi|
θ)=θ
0+θ1
x 在這一模型之下,我們可計算每一點所對應的高斯似然: p(
xi,y
i,ei
|θ)∝
exp[−(
yi−y
^(xi
|θ))
22e2
i]全體樣本的對數似然為:
logl(d
|θ)=
const−∑
i=1n
(yi−
y^(x
i|θ)
)22e
2i通常的最優化函式一般是最小化某一損失函式(loss function)(比如,scipy庫下的optimize.fmin()
),我們將最大化該資料集的高斯似然轉換為最小化如下的損失函式:
loss=∑
i=1n
(yi−
y^(x
i|θ)
)22e
2i這一損失函式的形式即是著名的
squared loss
(平方誤差),也即我們可從高斯似然中推導出平方誤差的形式。
我們可通過兩種方法進行最優化損失函式的求解,: θ
=(xt
x)−1
xty
其中 x
是樣本矩陣增廣的形式,也即第一列為全1.
x_aug = np.hstack((np.ones((len(x), 1)), x
.reshape((-1, 1))))/np.dot(e.reshape((-1, 1)), np.ones((1, 2)))
p_inv = np.dot(np.linalg
.inv(np.dot(x_aug.t, x_aug)), x_aug.t)
theta0 = np.dot(p_inv, y/e)
def
squared_loss
(theta, x, y, e):
return ((y-(theta[0]+theta[1]*x))/e)**2/2.sum()
import scipy
theta1 = optimize.fmin(theta, x0=(0, 0), args=(x, y, z), disp=false)
平方誤差函式的形式(以及實踐)均說明這種線性擬合的方法,對離群點較為敏感。
下面給出兩種解決方案,分別是頻率主義學派的huber loss(對雜訊敏感的根源在於平方誤差損失函式,改變損失函式的形式自然是一種可以想見的解決方案),以及是貝葉斯主義學派的nuisance parameters。lδ
python離群點檢測例子 異常點 離群點檢測演算法
異常點 離群點檢測演算法 瀏覽次數 456 sklearn中關於異常檢測的方法主要有兩種 1 novelty detection 當訓練資料中沒有離群點,我們的目標是用訓練好的模型去檢測另外新發現的樣本 2 outlier detection 當訓練資料中包含離群點,模型訓練時要匹配訓練資料的中心樣...
離群點(oulier)挖掘詳解
異常物件被稱作離群點。異常檢測也稱偏差檢測和例外挖掘。異常檢測的方法 1 基於模型的技術 首先建立乙個資料模型,異常是那些同模型不能完美擬合的物件 如果模型是簇的集合,則異常是不顯著屬於任何簇的物件 在使用回歸模型時,異常是相對遠離 值的物件。2 基於鄰近度的技術 通常可以在物件之間定義鄰近性度量,...
線性擬合函式
線性擬合函式 regress 呼叫格式 b regress y,x b,bint,r,rint,stats regress y,x b,bint,r,rint,stats regress y,x,alpha 該函式求解線性模型 y x 是p 1的引數向量 是服從標準正態分佈的隨機干擾的n 1的向量 ...