用貝葉斯判別分析再次預測股票漲跌情況


可以轉載,禁止修改。轉載請注明作者以及原文鏈接

注:本文是從貝葉斯分類器的角度來討論判別分析,有關貝葉斯分類器的概念可參考文末延伸閱讀第1-2篇文章。至於Fisher判別分析,未來會連同PCA一同討論。

判別分析也是一種分類器,與邏輯回歸相比,它具有以下優勢:

  1. 當類別的區分度高的時候,邏輯回歸的參數估計不夠穩定,它點在線性判別分析中是不存在的;
  2. 如果樣本量n比較小,而且在每一類響應變量中預測變量X近似服從正態分布,那么線性判別分析比邏輯回歸更穩定;
  3. 多於兩類的分類問題時,線性判別分析更普遍。

貝葉斯分類器

貝葉斯分類的基本思想是:對於多分類(大於等於2類)的問題,計算在已知條件下各類別的條件概率,取條件概率最大的那一類作為分類結果。用公式描述如下:

其中,\pi_{k}是第k類的先驗概率,f_k(x)是第k類的概率密度(當然如果是離散型變量就是條件概率,本文考慮連續型變量)。這個公式就是貝葉斯定理

線性判別分析(Linear Discriminant Analysis, LDA)

1、 一元線性判別分析

假設特征變量滿足正態分布,即:

線性判別分析有一個重要假設:假設所有K類的划分方差相同,即\delta_1^2=\delta_2^2=……=\delta_K^2。根據貝葉斯定理有:

對分子取對數轉換,可見p_k(x)最大等價於下式最大:

(這里十分誠意地附上推導過程,沒興趣的可以直接跳過:)

所以只要找到令上式最大的k值即可。從上式可看出,一共有\mu\delta^2\pi這三種參數需要估計擬合。先驗概率\pi_k可以根據業務知識進行預先估計,如果不行也可以直接以樣本中第k類的樣本在所有類的總樣本中的比例當作先驗概率,即

至於期望和方差,直接根據各類的觀測值計算即可:

從上上式(我就不編號)可看出,\delta_k(x)x的線性函數,這也是LDA名為“線性”的原因。

2、多元線性判別分析

多元LDA由於涉及到多個特征變量,因此用協方差矩陣來代替一維方差(協方差矩陣的概念可參考延伸閱讀文獻3)。這里直接給結論,線性模型就變成:

除了方差變成協方差矩陣,x\mu也變成了向量。注意這里的x還是一次,仍然是線性模型。

二次判別分析(Quadratic Discriminant Analysis, QDA)

在LDA中假設所有的K類方差(或協方差矩陣)都相同,但這個假設有些嚴苛,如果放寬這個假設,允許每一類的觀測都各自服從一個正態分布,協方差矩陣可以不同,LDA就變成了QDA。這里依然直接給公式:

可見\delta_k(x)x的二次函數,故名“二次判別分析”。

QDA與LDA的關系類似於多項式回歸與線性回歸的關系,本質上仍是偏差方差的權衡,這也是Machine Learning領域的一個核心問題。QDA比LDA光滑,偏差更小,但方差更大。那么它們的適用條件呢?

一般而言,如果訓練觀測數據量相對較少,LDA是一個比QDA更好的決策,降低模型的方差很有必要。相反地,如果訓練集非常大,則更傾向於使用QDA,這時分類器的方差不再是一個主要關心的問題,或者說K類的協方差矩陣相同的假設是站不住腳的。

實戰:用LDA(QDA)再次預測股票漲跌

這里為了方(tou)便(lan),依然使用延伸閱讀文獻4里的數據集,即ISLR包里的Smarket數據集。用不同方法做同樣的事,其實也方便將不同方法進行對比。

> library(ISLR)
> library(MASS)
> attach(Smarket)
> lda.fit=lda(Direction~Lag1+Lag2,data=Smarket, subset=Year<2005)
> lda.fit
Call:
lda(Direction ~ Lag1 + Lag2, data = Smarket, subset = Year < 
    2005)

Prior probabilities of groups:
    Down       Up 
0.491984 0.508016 

Group means:
            Lag1        Lag2
Down  0.04279022  0.03389409
Up   -0.03954635 -0.03132544

Coefficients of linear discriminants:
            LD1
Lag1 -0.6420190
Lag2 -0.5135293

Prior probabilities of groups是先驗概率,實際上就是各類別在訓練集中的比例:

> table(Smarket[Year<2005,9])/nrow(Smarket[Year<2005,])

    Down       Up 
0.491984 0.508016

Group means是對每類每個變量計算平均,用來估計參數\mu。通過Group means矩陣可看出:當股票下跌時,前兩天的投資回報率會趨向於正;當股票上漲時,前兩天的投資回報率會趨向於負。Coefficients of linear discriminants則是線性模型的系數,說明當-0.642*Lag1-0.514*Lag2很大時,LDA分類器預測上漲;-0.642*Lag1-0.514*Lag2很小時,LDA分類器預測下跌。

> plot(lda.fit)

上面的圖是對LDA模型的可視化,實際上它是訓練集的-0.642*Lag1-0.514*Lag2分別在Down類和Up類的直方圖。下面驗證比較一下:

library(dplyr)
Lag1_1 <- Smarket %>% filter(Year<"2005", Direction=="Down") %>% select(Lag1)
Lag2_1 <- Smarket %>% filter(Year<"2005", Direction=="Down") %>% select(Lag2) 
Lag1_2 <- Smarket %>% filter(Year<"2005", Direction=="Up") %>% select(Lag1) 
Lag2_2 <- Smarket %>% filter(Year<"2005", Direction=="Up") %>% select(Lag2) 
lm_1 <- (-0.6420190*Lag1_1-0.5135293*Lag2_1)[,1]
lm_2 <- (-0.6420190*Lag1_2-0.5135293*Lag2_2)[,1]
par(mfrow=c(2,1))
hist(lm_1,breaks=16,freq = F,col="lightblue")
hist(lm_2,breaks=16,freq = F,col="lightblue")

可見直方圖形狀完全一致。

以上在訓練集中對LDA模型的訓練過程。下面在測試集中驗證LDA模型。

> Smarket.2005=subset(Smarket,Year==2005)
> lda.pred=predict(lda.fit,Smarket.2005)
> class(lda.pred)
[1] "list"
> names(lda.pred)
[1] "class"     "posterior" "x"        
> data.frame(lda.pred)[1:5,]
     class posterior.Down posterior.Up         LD1
999     Up      0.4901792    0.5098208  0.08293096
1000    Up      0.4792185    0.5207815  0.59114102
1001    Up      0.4668185    0.5331815  1.16723063
1002    Up      0.4740011    0.5259989  0.83335022
1003    Up      0.4927877    0.5072123 -0.03792892
> table(lda.pred$class,Smarket.2005$Direction)

       Down  Up
  Down   35  35
  Up     76 106
> mean(lda.pred$class==Smarket.2005$Direction)
[1] 0.5595238

比較一下上一篇邏輯回歸(延伸閱讀文獻4)中的結果:

> glm.fit=glm(Direction~Lag1+Lag2,data=Smarket,family=binomial, subset=train)
> glm.probs=predict(glm.fit,newdata=Smarket[!train,],type="response") 
> glm.pred=ifelse(glm.probs >0.5,"Up","Down")
> table(glm.pred,Direction.2005)
        Direction.2005
glm.pred Down  Up
    Down   35  35
    Up     76 106
> mean(glm.pred==Direction.2005)
[1] 0.5595238

LDA的結果與邏輯回歸完全一致!以一個數據分析獅敏銳的第六感,我們可以大膽猜測:LDA與邏輯回歸這兩種算法可能有某種內在聯系!

這里不做嚴謹的推導(深層的推導可參考延伸閱讀文獻6),只作一個簡單的驗證比較。為了簡單起見,只考慮二分類問題,多分類問題可同理類推。
$$
log(\frac{p_1(x)}{1-p_1(x)})=log(\frac{p_1(x)}{p_2(x)})=log(p_1(x))-log(p_2(x))=x*\frac{\mu_1-\mu_2}{\sigma^2}-\frac{\mu_1^2-\mu_2^2}{2\sigma^2}+log(\frac{\pi_1}{\pi_2})
$$
可見這仍是關於x的線性函數,與邏輯回歸形式一致!雖然形式一致,但邏輯回歸的參數是通過極大似然法估計出來的,LDA的參數是概率密度函數計算出來的。

由於LDA與邏輯回歸形只是擬合過程不同,因此二者所得的結果應該是接近的。事實上,這一情況經常發生,但並非必然。LDA假設觀測服從每一類的協方差矩陣都相同的正態分布,當這一假設近似成立時,LDA效果比邏輯回歸好;相反,若這個假設不成立,則邏輯回歸效果比LDA好。

下面練習QDA:

> qda.fit=qda(Direction~Lag1+Lag2,data=Smarket,subset=train)
> qda.fit
Call:
qda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)

Prior probabilities of groups:
    Down       Up 
0.491984 0.508016 

Group means:
            Lag1        Lag2
Down  0.04279022  0.03389409
Up   -0.03954635 -0.03132544
> qda.class=predict(qda.fit,Smarket.2005)$class
> table(qda.class,Direction.2005)
         Direction.2005
qda.class Down  Up
     Down   30  20
     Up     81 121
> mean(qda.class==Direction.2005)
[1] 0.5992063

可見QDA的准確率稍高於LDA。

參考文獻

Gareth James et al. An Introduction to Statistical Learning.

延伸閱讀

  1. 算法雜貨鋪——分類算法之朴素貝葉斯分類(Naive Bayesian classification)
  2. 算法雜貨鋪——分類算法之貝葉斯網絡(Bayesian networks)
  3. 協方差的意義和計算公式
  4. 邏輯回歸模型預測股票漲跌
  5. 機器學習筆記 線性判別分析(上)
  6. 機器學習筆記 線性判別分析(中)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM