与举例分析和fisher判别分析相比,贝叶斯判别分析考虑了不同总体类别的先验概率,假如说有G1,G2,G3,G4四个P维总体,如果我们能预先得知这四个总体发生的概率,占得比例,那么在得到新样品时,就可以根据正态分布密度函数和到各个总体先验概率求出各个总体的后验概率,找出最大的后验概率对应的总体,即为其所属类。这就是贝叶斯判别法思路。
贝叶斯判别法需假设各个总体服从多元正态分布密度函数,也就是说,需要各个总体服从多元正态分布,对数据有一定要求。
代码实现:
首先进行多元正态分布检验,用到MVN包,下面为函数参数。
mvn(data, subset = NULL, mvnTest = c("mardia", "hz", "royston", "dh",
"energy"), covariance = TRUE, tol = 1e-25, alpha = 0.5,
scale = FALSE, desc = TRUE, transform = "none", R = 1000,
univariateTest = c("SW", "CVM", "Lillie", "SF", "AD"),
univariatePlot = "none", multivariatePlot = "none",
multivariateOutlierMethod = "none", bc = FALSE, bcType = "rounded",
showOutliers = FALSE, showNewData = FALSE)
我们只需要用到其中三个
下边这个可以画出等高线图(二维变量),将contour替换成persp就可以画出透视图
mvn(iris[,1:2], mvnTest ="royston",multivariatePlot = c("contour"))
一般我们用下边这列函数
mvn(iris[,1:4], mvnTest ="hz",multivariatePlot = c("qq"))
函数返回各个变量的S-W正态分布检验,和整体的hz多元正态分布检验结果,和一个QQ图。注意需要检验每个类的正态性(这个方法好累啊)
下面检验协方差阵有没有显著差异
library(heplots)
boxM(iris[,-5],iris$Species)
若是没有显著差异,则直接用线性判别函数lda即可,这时就可以用上prior参数了。这里就可以自己回判了,并且可以输入测试集test看看(这里没给test)
library(MASS)
m <- lda(Species~.,prior=c(1/3,1/3,1/3),data = iris)
z=predict(m)
table(data.frame(z$class,iris$Species))
predict(m,test)
有显著差异的话就用二次判别函数qda
m1 <-qda(Species~.,prior=c(1/4,1/4,1/2),data = iris)