用贝叶斯判别分析再次预测股票涨跌情况
2016-06-18 01:23
204 查看
可以转载,禁止修改。转载请注明作者以及原文链接
判别分析也是一种分类器,与逻辑回归相比,它具有以下优势:
当类别的区分度高的时候,逻辑回归的参数估计不够稳定,它点在线性判别分析中是不存在的;
如果样本量n比较小,而且在每一类响应变量中预测变量X近似服从正态分布,那么线性判别分析比逻辑回归更稳定;
多于两类的分类问题时,线性判别分析更普遍。
其中,πk是第k类的先验概率,fk(x)是第k类的概率密度(当然如果是离散型变量就是条件概率,本文考虑连续型变量)。这个公式就是贝叶斯定理。
假设特征变量满足正态分布,即:
线性判别分析有一个重要假设:假设所有K类的划分方差相同,即δ21=δ22=……=δ2K。根据贝叶斯定理有:
对分子取对数转换,可见pk(x)最大等价于下式最大:
(这里十分诚意地附上推导过程,没兴趣的可以直接跳过:)
所以只要找到令上式最大的k值即可。从上式可看出,一共有μ、δ2、π这三种参数需要估计拟合。先验概率πk可以根据业务知识进行预先估计,如果不行也可以直接以样本中第k类的样本在所有类的总样本中的比例当作先验概率,即
至于期望和方差,直接根据各类的观测值计算即可:
从上上式(我就不编号)可看出,δk(x)是x的线性函数,这也是LDA名为“线性”的原因。
2、多元线性判别分析
多元LDA由于涉及到多个特征变量,因此用协方差矩阵来代替一维方差(协方差矩阵的概念可参考延伸阅读文献3)。这里直接给结论,线性模型就变成:
除了方差变成协方差矩阵,x和μ也变成了向量。注意这里的x还是一次,仍然是线性模型。
可见δk(x)是x的二次函数,故名“二次判别分析”。
QDA与LDA的关系类似于多项式回归与线性回归的关系,本质上仍是偏差和方差的权衡,这也是Machine Learning领域的一个核心问题。QDA比LDA光滑,偏差更小,但方差更大。那么它们的适用条件呢?
一般而言,如果训练观测数据量相对较少,LDA是一个比QDA更好的决策,降低模型的方差很有必要。相反地,如果训练集非常大,则更倾向于使用QDA,这时分类器的方差不再是一个主要关心的问题,或者说K类的协方差矩阵相同的假设是站不住脚的。
上面的图是对LDA模型的可视化,实际上它是训练集的−0.642∗Lag1−0.514∗Lag2分别在
可见直方图形状完全一致。
以上在训练集中对LDA模型的训练过程。下面在测试集中验证LDA模型。
比较一下上一篇逻辑回归(延伸阅读文献4)中的结果:
LDA的结果与逻辑回归完全一致!以一个数据分析狮敏锐的第六感,我们可以大胆猜测:LDA与逻辑回归这两种算法可能有某种内在联系!
这里不做严谨的推导(深层的推导可参考延伸阅读文献6),只作一个简单的验证比较。为了简单起见,只考虑二分类问题,多分类问题可同理类推。
log(p1(x)1−p1(x))=log(p1(x)p2(x))=log(p1(x))−log(p2(x))=x∗μ1−μ2σ2−μ21−μ222σ2+log(π1π2)
可见这仍是关于x的线性函数,与逻辑回归形式一致!虽然形式一致,但逻辑回归的参数是通过极大似然法估计出来的,LDA的参数是概率密度函数计算出来的。
由于LDA与逻辑回归形只是拟合过程不同,因此二者所得的结果应该是接近的。事实上,这一情况经常发生,但并非必然。LDA假设观测服从每一类的协方差矩阵都相同的正态分布,当这一假设近似成立时,LDA效果比逻辑回归好;相反,若这个假设不成立,则逻辑回归效果比LDA好。
下面练习QDA:
可见QDA的准确率稍高于LDA。
算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
协方差的意义和计算公式
逻辑回归模型预测股票涨跌
机器学习笔记 线性判别分析(上)
机器学习笔记 线性判别分析(中)
注:本文是从贝叶斯分类器的角度来讨论判别分析,有关贝叶斯分类器的概念可参考文末延伸阅读第1-2篇文章。至于Fisher判别分析,未来会连同PCA一同讨论。
判别分析也是一种分类器,与逻辑回归相比,它具有以下优势:
当类别的区分度高的时候,逻辑回归的参数估计不够稳定,它点在线性判别分析中是不存在的;
如果样本量n比较小,而且在每一类响应变量中预测变量X近似服从正态分布,那么线性判别分析比逻辑回归更稳定;
多于两类的分类问题时,线性判别分析更普遍。
贝叶斯分类器
贝叶斯分类的基本思想是:对于多分类(大于等于2类)的问题,计算在已知条件下各类别的条件概率,取条件概率最大的那一类作为分类结果。用公式描述如下:其中,πk是第k类的先验概率,fk(x)是第k类的概率密度(当然如果是离散型变量就是条件概率,本文考虑连续型变量)。这个公式就是贝叶斯定理。
线性判别分析(Linear Discriminant Analysis, LDA)
1、 一元线性判别分析假设特征变量满足正态分布,即:
线性判别分析有一个重要假设:假设所有K类的划分方差相同,即δ21=δ22=……=δ2K。根据贝叶斯定理有:
对分子取对数转换,可见pk(x)最大等价于下式最大:
(这里十分诚意地附上推导过程,没兴趣的可以直接跳过:)
所以只要找到令上式最大的k值即可。从上式可看出,一共有μ、δ2、π这三种参数需要估计拟合。先验概率πk可以根据业务知识进行预先估计,如果不行也可以直接以样本中第k类的样本在所有类的总样本中的比例当作先验概率,即
至于期望和方差,直接根据各类的观测值计算即可:
从上上式(我就不编号)可看出,δk(x)是x的线性函数,这也是LDA名为“线性”的原因。
2、多元线性判别分析
多元LDA由于涉及到多个特征变量,因此用协方差矩阵来代替一维方差(协方差矩阵的概念可参考延伸阅读文献3)。这里直接给结论,线性模型就变成:
除了方差变成协方差矩阵,x和μ也变成了向量。注意这里的x还是一次,仍然是线性模型。
二次判别分析(Quadratic Discriminant Analysis, QDA)
在LDA中假设所有的K类方差(或协方差矩阵)都相同,但这个假设有些严苛,如果放宽这个假设,允许每一类的观测都各自服从一个正态分布,协方差矩阵可以不同,LDA就变成了QDA。这里依然直接给公式:可见δ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是对每类每个变量计算平均,用来估计参数μ。通过
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(p1(x)1−p1(x))=log(p1(x)p2(x))=log(p1(x))−log(p2(x))=x∗μ1−μ2σ2−μ21−μ222σ2+log(π1π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.延伸阅读
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
协方差的意义和计算公式
逻辑回归模型预测股票涨跌
机器学习笔记 线性判别分析(上)
机器学习笔记 线性判别分析(中)
相关文章推荐
- leetcode之Counting Bits
- Percona-Server-5.5.33二进制安装
- Android内存泄漏(线程造成的内存泄漏与资源未关闭造成的内存泄漏)
- 内涵社区APP,一款集内涵段子,百思不得其姐,煎蛋于一身的搞笑社区
- 屏幕自适应(二)把dp转成px
- 数据结构——C语言描述 第二章(1) 顺序表
- 深入浅出-iOS函数式编程的实现 && 响应式编程概念
- Android内存泄漏(非静态内部类创建静态实例造成的内存泄漏)
- rails安装
- Android自助餐之Jni(六)NDK入门
- IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字
- 傅盛谈管理的本质zz
- Error解决:Property's synthesized getter follows Cocoa naming convention for returning 'owned'
- C++ 重载决议overload resolution 与 SFINAE
- C++数组类型基础及数组指针基础
- 20145314郑凯杰 《Java程序设计》课程总结
- SVGElement Drag & Drop
- 安装rabbitmq
- 图论相关问题(提纲)
- FIX