设为首页 加入收藏

TOP

用贝叶斯判别分析再次预测股票涨跌情况(一)
2017-10-10 12:09:58 】 浏览:5994
Tags:贝叶斯 判别 分析 再次 预测 股票 涨跌 情况

可以转载,禁止修改。转载请注明作者以及原文链接

注:本文是从贝叶斯分类器的角度来讨论判别分析,有关贝叶斯分类器的概念可参考文末延伸阅读第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
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【R】多元线性回归 下一篇R语言XML格式数据导入与处理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目