多元分析是多变量的统计分析方法,主要包括回归分析、方差分析、判别分析、聚类分析、
主成分分析、因子分析和典型相关分析
判别分析是用以判别个体所属群体的统计方法;判别分析又称为“分辨法”,是在分类确定的条件下,根据某一研究对象的各种特征值判别其类型归属问题的一种多变量统计分析方法。
常见的判别分析方法有:距离判别法、贝叶斯判别法和Fisher判别法.
基于距离判别法的数据挖掘算法有很多:聚类算法中的层次聚类法、k-均值法、k-中心法等,判别分析实际上也是分类算法的一种。
常见的距离有欧氏距离、马氏距离、曼哈顿距离等.(更多地距离方法可参见博文).
欧式距离在测量距离远近时,没有考虑概率分布的影响(方差的影响)且容易受量纲的影响,因而用马氏距离来度量距离的远近。具体看《统计建模与R软件》
有关距离判别法,k最领近算法(KNN)使用最为广泛,K是分析人员要给定的值.
可以用class包中的knn()函数,knn()函数的语法和参数如下:
knn(train,test,cl,k=1,l=0,prob=F,use.all=T)
说明:train指定训练样本集;test指定测试样本集;cl指定训练样本集中 分类变量;
k指定最邻近的k个已知分类样本点,默认为1;l指定待判样本点属于某类的最少已知分类样本数,默认为0
prob设为TRUE时,可以得到待判样本点属于某类的概率,默认为FALSE
use.all控制节点的处理办法,即如果有多个第K近的点与待判样本点的距离相等,默认情况下将这些点都纳入判别样本点,
当该参数设为FALSE时,则随机挑选一个样本点作为第K近的判别点。
距离判别法的应用:
#通过抽样建立训练样本和测试样本
index <- sample(2,size=nrow(iris),replace = T,prob = c(0.75,0.25))
train <- iris[index==1,]
test <- iris[index==2,]
##加载R包并使用KNN算法
library(class)
res1 <- knn(train=train[,1:3],test=test[,1:3],
cl=as.factor(train$Species),k=5)
##生成实际与预判交叉表和预判精度
table(test$Species,res1)
sum(diag(table(test$Species,res1)))/sum(table(test$Species,res1))
贝叶斯判别法:
贝叶斯判别法的前提是分析人员已经对所分析的数据有所了解(比如数据服从什么分别,各个类别的先验概率等),
根据各个类别的先验概率求得新样本属于某类的后验概率。
判别规则:
对于待判样本x,计算x属于所有类别的后验概率,如果属于某类的后验概率最大,
则将该待判样本划分到该类中。
关于贝叶斯判别法的实现可以使用klaR包中的NaiveBayes()函数。
NaiveBayes()函数的语法和参数如下:
NaiveBayes(formula, data, ..., subset, na.action = na.pass)
NaiveBayes(x, grouping, prior, usekernel = FALSE, fL = 0, ...)
说明:
formula指定参与模型计算的变量,以公式形式给出,类似于 y=x1+x2+x3;
data用于指定需要分析的数据对象;
na.action指定缺失值的处理方法,默认情况下不将缺失值纳入模型计算,也不会发生报错信息,当设为“na.omit”时则会删除含有缺失值的样本;
x指定需要处理的数据,可以是数据框形式,也可以是矩阵形式;grouping为每个观测样本指定所属类别;
prior可为各个类别指定先验概率,默认情况下用各个类别的样本比例作为先验概率;
usekernel指定密度估计的方法(在无法判断数据的分布时,采用密度密度估计方法),默认情况下使用标准的密度估计,设为TRUE时,则使用核密度估计方法;
朴素贝叶斯判别法的应用
#通过抽样建立训练样本和测试样本
index <- sample(2,size = nrow(iris),replace = TRUE,prob = c(0.75,0.25))
train <- iris[index == 1,]
test <- iris[index == 2,]
#加载R包并使用朴素贝叶斯算法
library(klaR)
res2 <- NaiveBayes(Species ~ ., data = train)
pre <- predict(res2, newdata = test[,1:4])
#生成实际与预判交叉表和预判精度
table(test$Species,pre$class)
sum(diag(table(test$Species,pre$class)))/sum(table(test$Species,pre$class))
Fisher判别法是按类内方差尽量小,类间方差尽量大的准则来求判别函数,
该判别法的基本思想是:将高维空间的点向低维空间投影。
关于Fisher线性判别和二次判别方法的实现可以使用MASS包中的lda()函数和qda()函数.
lda()函数和qda()函数的语法和参数如下:
lda(formula, data, ..., subset, na.action)
lda(x, grouping, prior = proportions,
tol = 1.0e-4,method, CV = FALSE, nu, ...)
lda(x, grouping, ..., subset, na.action)
qda(formula, data, ..., subset, na.action)
qda(x, grouping, prior = proportions,
method, CV = FALSE, nu, ...)
qda(x, grouping, ..., subset, na.action)
说明:
formula指定参与模型计算的变量,以公式形式给出,类似于y=x1+x2+x3;
data用于指定需要分析的数据对象;
na.action指定缺失值的处理方法,默认情况下,缺失值的存在使算法无法运行,当设置为“na.omit”时则会删除含有缺失值的样本;
x指定需要处理的数据,可以是数据框形式,也可以是矩阵形式;
grouping为每个观测样本指定所属类别;
prior可为各个类别指定先验概率,默认情况下用各个类别的样本比例作为先验概率;
method指定计算均值和方差的方法,默认情况下使用最大似然估计,还可以使用mve法和稳健估计法(基于t分布);
CV是否进行交叉验证,默认情况下不进行交叉验证。
Fisher判别法的应用
#通过抽样建立训练样本和测试样本
index <- sample(2,size=nrow(iris),replace=TRUE,prob=c(0.75,0.25))
train <- iris[index==1,]
test <- iris[index==2,]
#加载R包使用fisher线性判别法
library(MASS)
lad_res3 <- lda(Species~.,data=train)
结果说明:
训练数据集得到线性判别系数,线性判别系数可能会有好几组
通过各组判别系数对区分类别的贡献大小确定最优的判别函数
lad_pre3 <- predict(lad_res3,newdata=test[,1:4])
说明:
预测函数,用上一次的判断系数来预测测试数据集的结果,函数返回测试数据集的类别(class),后验概率(posterior),线性判别函数的数值(x)
#生成实际与预判交叉表
table(test$Species,lad_pre3$class)
结果:
setosa versicolor virginica
setosa 16 0 0
versicolor 0 11 1
virginica 0 0 11
结果说明:
第一个类和第二个类都预判正确,第三个类正确预判18个,错预判1个.
##求预判精度
sum(diag(table(test$Species,lad_pre3$class)))/sum(table(test$Species,lad_pre3$class))