拓端tecdat|R語言非參數(shù)方法:使用核方法和K
原文鏈接:?http://tecdat.cn/?p=22181?
原文出處:拓端數(shù)據(jù)部落公眾號
本文考慮一下基于核方法進行分類預(yù)測。注意,在這里,我們不使用標準邏輯回歸,它是參數(shù)模型。
非參數(shù)方法
用于函數(shù)估計的非參數(shù)方法大致上有三種:核方法、局部多項式方法、樣條方法。
非參的函數(shù)估計的優(yōu)點在于穩(wěn)健,對模型沒有什么特定的假設(shè),只是認為函數(shù)光滑,避免了模型選擇帶來的風(fēng)險;但是,表達式復(fù)雜,難以解釋,計算量大是非參的一個很大的毛病。所以說使用非參有風(fēng)險,選擇需謹慎。
非參的想法很簡單:函數(shù)在觀測到的點取觀測值的概率較大,用x附近的值通過加權(quán)平均的辦法估計函數(shù)f(x)的值。
核方法
當加權(quán)的權(quán)重是某一函數(shù)的核,這種方法就是核方法,常見的有Nadaraya-Watson核估計與Gasser-Muller核估計方法,也就是很多教材里談到的NW核估計與GM核估計,這里我們還是不談核的選擇,將一切的核估計都默認用Gauss核處理。
NW核估計形式為:

GM核估計形式為:

式中

數(shù)據(jù)
使用心臟病數(shù)據(jù),預(yù)測急診病人的心肌梗死,包含變量:
心臟指數(shù)
心搏量指數(shù)
舒張壓
肺動脈壓
心室壓力
肺阻力
是否存活
既然我們知道核估計是什么,我們假設(shè)k是N(0,1)分布的密度。在x點,使用帶寬h,我們得到以下代碼
dnorm(( 心搏量指數(shù)-x)/bw, mean=0,sd=1)
weighted.mean( 存活,w)}
plot(u,v,ylim=0:1,

當然,我們可以改變帶寬。
Vectorize( mean_x(x,2))(u)

我們觀察到:帶寬越小,我們得到的方差越大,偏差越小?!霸酱蟮姆讲睢痹谶@里意味著越大的可變性(因為鄰域越小,計算平均值的點就越少,估計值也就越不穩(wěn)定),以及“偏差越小”,即期望值應(yīng)該在x點計算,所以鄰域越小越好。
使用光滑函數(shù)
用R函數(shù)來計算這個核回歸。
smooth( 心搏量指數(shù), 存活, ban ?= 2*exp(1)
我們可以復(fù)制之前的估計。然而,輸出不是一個函數(shù),而是兩個向量序列。此外,正如我們所看到的,帶寬與我們以前使用的帶寬并不完全相同。

smooth(心搏量指數(shù),存活,"normal",bandwidth = bk)
optim(bk,f)$par}
x=seq(1,10,by=.1)
plot(x,y)
abline(0,exp(-1),col="red")

斜率為0.37,實際上是e^{-1}。
高維應(yīng)用
現(xiàn)在考慮我們的雙變量數(shù)據(jù)集,并考慮一些單變量(高斯)核的乘積
w = dnorm((df$x1-x)/bw1, mean=0,sd=1)*
dnorm((df$x2-y)/bw2, mean=0,sd=1)
w.mean(df$y=="1",w)
contour(u,u,v,levels = .5,add=TRUE)
我們得到以下預(yù)測

在這里,不同的顏色是概率。
K-NN(k近鄰算法)
另一種方法是考慮一個鄰域,它不是用到點的距離來定義的,而是用我們得到的n觀測值來定義k鄰域(也就是k近鄰算法)。
接下來,我們自己編寫函數(shù)來實現(xiàn)K-NN(k近鄰算法):
困難的是我們需要一個有效的距離。

如果每個分量的單位都非常不同,那么使用歐幾里德距離將毫無意義。所以,我們考慮馬氏距離
mahalanobis = function(x,y,Sinv){as.numeric(x-y)%*%Sinv%*%t(x-y)}
mahalanobis(my[i,1:7],my[j,1:7])
這里我們有一個函數(shù)來尋找k最近的鄰居觀察樣本。然后可以做兩件事來得到一個預(yù)測。我們的目標是預(yù)測一個類,所以我們可以考慮使用一個多數(shù)規(guī)則:對yi的預(yù)測與大多數(shù)鄰居樣本的預(yù)測是一樣的。
for(i in 1:length(Y)) Y[i] = sort( ?存活[k_closest(i,k)])[(k+1)/2]
我們也可以計算出最近鄰居中黑點的比例。它實際上可以被解釋為是黑色的概率,
for(i in 1:length(Y)) Y[i] = mean( 存活[k_closest(i,k)])
我們可以在數(shù)據(jù)集上看到觀察結(jié)果,基于多數(shù)原則的預(yù)測,以及死亡樣本在7個最近的鄰居中的比例
k_ma(7),PROPORTION=k_mean(7))

這里,我們得到了一個位于 x 的觀測點的預(yù)測,但實際上,可以尋找任何 x的最近鄰k?;氐轿覀兊膯巫兞坷?得到一個圖表),我們有
w = rank(abs(心搏量指數(shù)-x),method ="random")
mean(存活[which(<=9)])}

不是很平滑,但我們的點也不是很多。
如果我們在二維數(shù)據(jù)集上使用這種方法,我們就會得到以下的結(jié)果。
k = 6
dist = function(j) ?mahalanobis(c(x,y))
vect = Vectorize( dist)(1:nrow(df))
idx ?= which(rank(vect<=k)
contour(u,u,v,levels = .5,add=TRUE)

這就是局部推理的思想,用kernel對 x的鄰域進行推理,或者用k-NN近鄰。

最受歡迎的見解
1.從決策樹模型看員工為什么離職
2.R語言基于樹的方法:決策樹,隨機森林
3.python中使用scikit-learn和pandas決策樹
4.機器學(xué)習(xí):在SAS中運行隨機森林數(shù)據(jù)分析報告
5.R語言用隨機森林和文本挖掘提高航空公司客戶滿意度
6.機器學(xué)習(xí)助推快時尚精準銷售時間序列
7.用機器學(xué)習(xí)識別不斷變化的股市狀況——隱馬爾可夫模型的應(yīng)用
8.python機器學(xué)習(xí):推薦系統(tǒng)實現(xiàn)(以矩陣分解來協(xié)同過濾)
9.python中用pytorch機器學(xué)習(xí)分類預(yù)測銀行客戶流失