用贝叶斯判别分析方法预测股票涨跌

作者: 依然很拉风

原文:数据人网 http://shujuren.org/article/164.html

判别分析也是一种分类器,与逻辑回归相比,它具有以下优势:

  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.fitCall:lda(Direction ~ Lag1 + Lag2, data = Smarket, subset = Year <     2005)Prior probabilities of groups:    Down       Up 0.491984 0.508016 Group means:            Lag1        Lag2Down  0.04279022  0.03389409Up   -0.03954635 -0.03132544Coefficients of linear discriminants:            LD1Lag1 -0.6420190Lag2 -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.642Lag1-0.514Lag2$很大时,LDA分类器预测上涨;$-0.642Lag1-0.514Lag2$很小时,LDA分类器预测下跌。

> plot(lda.fit)

上面的图是对LDA模型的可视化,实际上它是训练集的$-0.642Lag1-0.514Lag2$分别在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         LD1999     Up      0.4901792    0.5098208  0.082930961000    Up      0.4792185    0.5207815  0.591141021001    Up      0.4668185    0.5331815  1.167230631002    Up      0.4740011    0.5259989  0.833350221003    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.2005glm.pred Down  Up    Down   35  35    Up     76 106> mean(glm.pred==Direction.2005)[1] 0.5595238

LDA的结果与逻辑回归完全一致!以一个数据分析狮敏锐的第六感,我们可以大胆猜测:LDA与逻辑回归这两种算法可能有某种内在联系!

这里不做严谨的推导(深层的推导可参考延伸阅读文献6),只作一个简单的验证比较。为了简单起见,只考虑二分类问题,多分类问题可同理类推。 <br>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})<br><br>log(1−p1(x)p1(x))=log(p2(x)p1(x))=log(p1(x))−log(p2(x))=x∗σ2μ1−μ2−2σ2μ12−μ22+log(π2π1)<br> 可见这仍是关于x的线性函数,与逻辑回归形式一致!虽然形式一致,但逻辑回归的参数是通过极大似然法估计出来的,LDA的参数是概率密度函数计算出来的。

由于LDA与逻辑回归形只是拟合过程不同,因此二者所得的结果应该是接近的。事实上,这一情况经常发生,但并非必然。LDA假设观测服从每一类的协方差矩阵都相同的正态分布,当这一假设近似成立时,LDA效果比逻辑回归好;相反,若这个假设不成立,则逻辑回归效果比LDA好。

下面练习QDA:

> qda.fit=qda(Direction~Lag1+Lag2,data=Smarket,subset=train)> qda.fitCall:qda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)Prior probabilities of groups:    Down       Up 0.491984 0.508016 Group means:            Lag1        Lag2Down  0.04279022  0.03389409Up   -0.03954635 -0.03132544> qda.class=predict(qda.fit,Smarket.2005)$class> table(qda.class,Direction.2005)         Direction.2005qda.class Down  Up     Down   30  20     Up     81 121> mean(qda.class==Direction.2005)[1] 0.5992063

可见QDA的准确率稍高于LDA。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-06-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

常用连续型分布介绍及R语言实现

作者:张丹(Conan), 程序员Java,R,PHP,Javascript blog: http://blog.fens.me 随机变量在我们的生活中处处可...

3046
来自专栏AI2ML人工智能to机器学习

基于深度学习的图像目标检测(下)

依然要感激如此美丽的封面图片。 在“基于深度学习的图像目标检测(上)”里面, 我们详细介绍了R-CNN走到端到端模型的Faster R-CNN的进化流程。 ...

603
来自专栏人工智能LeadAI

为什么ResNet和DenseNet可以这么深? | 一文详解残差块为何能解决梯度弥散问题

传统的“提拉米苏”式卷积神经网络模型,都以层叠卷积层的方式提高网络深度,从而提高识别精度。但层叠过多的卷积层会出现一个问题,就是梯度弥散(Vanishing),...

3117
来自专栏AILearning

【Scikit-Learn 中文文档】线性和二次判别分析 - 监督学习 - 用户指南 | ApacheCN

中文文档: http://sklearn.apachecn.org/cn/0.19.0/tutorial/basic/tutorial.html 英文文档:...

2207
来自专栏AI研习社

为什么ResNet和DenseNet可以这么深?一文详解残差块为何有助于解决梯度弥散问题

传统的“提拉米苏”式卷积神经网络模型,都以层叠卷积层的方式提高网络深度,从而提高识别精度。但层叠过多的卷积层会出现一个问题,就是梯度弥散(Vanishing),...

3165
来自专栏算法channel

案例实战|泰坦尼克号船员获救预测(算法求解)

01 — 回顾 泰坦尼克号船员获救案例的数据原来的模样: ? 经过数据预处理后,解决了以下问题: 数据的Nan值问题 特征选取问题 新的特征创建 数据清洗问题...

3479
来自专栏大数据挖掘DT机器学习

使用scikit-learn解释随机森林算法

文/CSDN 译者/赵屹华 校检/刘帝伟、朱正贵、李子健 责编/周建丁 赵屹华,计算广告工程师@搜狗,前生物医学工程师,关注推荐算法、机器学习...

2696
来自专栏机器学习、深度学习

人群密度估计--Crowd Counting Via Scale-adaptive Convolutional Nerual Network

Crowd Counting Via Scale-adaptive Convolutional Nerual Network https://arxiv....

2045
来自专栏机器之心

业界 | 一文概览2017年Facebook AI Research的计算机视觉研究进展

选自skrish13 作者:Krish 机器之心编译 参与:路雪、刘晓坤 本文概述了 2017年Facebook AI 研究院(FAIR)在计算机视觉上的研究进...

3065
来自专栏目标检测和深度学习

业界 | 一文概览2017年Facebook AI Research的计算机视觉研究进展

选自skrish13 作者:Krish 参与:路雪、刘晓坤 本文概述了 2017年Facebook AI 研究院(FAIR)在计算机视觉上的研究进展,包括基础构...

2709

扫描关注云+社区