用R实现判别分析

参考用书:数据挖掘:R语言实战      黄文 王正林  编著 

判别分析判断样本所属的类别,其依据是那些已知类别样本的属性信息。
主流的三大判别分析算法费希尔判别、贝叶斯判别和距离判别
费希尔判别的基本思想就是投影,即将高维空间的点向低维空间投影,从而简化问题进行处理
投影轴的要求,保证每一类之内的投影值所形成的类内离差尽可能小,不同类之间的投影所形成的类间离差尽可能大,
贝叶斯判别
根据已知的先验概率P(A|B),求出后验概率P(B|A)然后选择最大后验概率的类作为选择。其优势在于不怕噪声和无关变量,
不足之处在于假设各特征属性之间是无关的,假设成立时判别正确率很高,然而现实是个特征属性具有较强相关性的。
距离判别
根据已知样本之间的距离远近做出判别。
lda()函数
lda(formula, data, ..., subset, na.action)适用于公式fromula
lda(x, grouping, prior = proportions, tol = 1.0e-4,
    method, CV = FALSE, nu, ...)适用于数据框data.frame
lda(x, grouping, ..., subset, na.action)适用于矩阵matrix
data数据集名称和subset纳入规则建立过程的样本都用于formula为对象的函数格式中,
grouping则指明每个观测样本所属类别,prior可以设置各类别的先验概率,tol用于保证
判别效果默认取0.0001,na.action用于选择对于缺失值的处理,默认情况若有缺失值,则该函数无法运行,更改设置时自动删除缺失值
qda()函数
qda(formula, data, ..., subset, na.action)
qda(x, grouping, prior = proportions,
    method, CV = FALSE, nu, ...)
qda(x, grouping, ..., subset, na.action)
同lda()函数参数一样
NaiveBayes()函数
NaiveBayes(formula, data, ..., subset, na.action = na.pass)适用于公式
NaiveBayes(x, grouping, prior, usekernel = FALSE, fL = 0, ...)
na.action默认为na.pass,na.omit表示删除相应的函数有缺失值的样本,
usekernel选择是否使用核密度估计法,fL用于设置拉普拉斯修正的参数值默认取0,朴素贝叶斯对于稀疏数据过于敏感,所以拉普拉斯就可以给未出现的特征值赋予一个很小的数
knn()函数
knn(graph, vids = V(graph), weights = NULL)
默认选择欧氏距离来寻找所需额K的最近样本,train,test代表训练集和测试集;cl用于放置训练集各已知样本的类别取值;
k为控制最近邻域大小的参数,l设置得到确切判别结果所需满足的最少票数,prob控制输出“胜出”类别use.all用于选择再出现“结点”时的处理方式
kknn()函数
kknn(formula = formula(train), train, test, na.action = na.omit(), 
    k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE,
    contrasts = c('unordered' = "contr.dummy", ordered = "contr.ordinal"))
distance参数用于选择计算样本间的距离的具体方法,1为曼哈顿距离,2为欧式距离
 

library(kknn)
library(MASS)
data(miete)#使用miete数据集
head(miete)
dim(miete)
summary(miete)
#分层抽样5个等级等量抽取
library(sampling)
n=round(2/3*nrow(miete)/5)#训练集2/3,计算每一等级应抽取的样本量
n 
?strata
#应为函数问题,最后我随机抽取的
train_sub=sample(nrow(miete),2/3*nrow(miete))
data_train=miete[train_sub,]
data_test=miete[-train_sub,]
dim(data_train)
fit_lda1=lda(nmkat~.,data_train)#以公式格式执行线性判别
names(fit_lda1)
fit_lda1$prior#先验概率
fit_lda1$counts#样本量
fit_lda1$means#均值
fit_lda1
fit_lda2=lda(data_train[,-12],data_train[,12])#排除第十二个变量nmkat
plot(fit_lda1)#输出图形
plot(fit_lda1,dimen=1)#对判别规则fit_lda1,输出1个判别式的图形
plot(fit_lda1,dimen=2)#对判别规则fit_lda1,输出2个判别式的图形
pre_lda1=predict(fit_lda1,data_test)#使用判别规则预测data_test中的nmkat变量的类别
pre_lda1$class#输出预测结果
pre_lda1$posterior#后验概率
table(data_test$nmkat,pre_lda1$class) #生成实际值与预测值的混淆矩阵 
error_lda1=sum(as.numeric(as.numeric(pre_lda1$class)!=as.numeric(data_test$nmkat)))/nrow(data_test)
error_lda1#错误率
#朴素贝叶斯
library(klaR)
fit_Bayes1=NaiveBayes(nmkat~.,data_train)#贝叶斯判别
names(fit_Bayes1)

plot(fit_Bayes1,vars="wfl",n=50,col=c(1,"darkgrey",1,"darkgrey",1))
#对占地面值wfl绘制密度图
plot(fit_Bayes1,vars="mvdauer",n=50,col=c(1,"darkgrey",1,"darkgrey",1))
#对租凭期mvdauer绘制密度图
plot(fit_Bayes1,vars="nmqm",n=50,col=c(1,"darkgrey",1,"darkgrey",1))
#密度图
fit_Bayes2=NaiveBayes(data_train[,12],data_train[,12])
#排除nmkat
pre_Bayes1=predict(fit_Bayes1,data_test)
#对测试集进行预测
pre_Bayes1$class
#显示预测结果
table(data_test$nmkat,pre_Bayes1$class)
#生成nmkat的真实值和预测值的混淆矩阵
error_Bayes1=sum(as.numeric(as.numeric(pre_Bayes1$class)!=as.numeric(data_test$nmkat)))/nrow(data_test)
error_Bayes1#错误率
library(class)
#k最近邻
fit_pre_knn=knn(data_train[,-12],data_test[,-12],cl=data_train[,12])
fit_pre_knn
table(data_test$nmkat,fit_pre_knn)
error_knn=sum(as.numeric(as.numeric(fit_pre_knn)!=as.numeric(data_test$nmkat)))/nrow(data_test)
error_knn
error_knn=rep(0,20)#将错误率的初始值为0
for(i in 1:20)#构造for循环
{fit_pre_knn=knn(data_train[,-12],data_test[,-12],cl=data_train[,12],k=i)
#构造判别和预测,
error_knn[i]=sum(as.numeric(as.numeric(fit_pre_knn)!=as.numeric
 
 (data_test$nmkat)))/nrow(data_test)
  
}#计算每个k值的错误率
error_knn
?plot
plot(error_knn,type="l",xlab="K")#折线图
library(kknn)
?kknn
fit_pre_kknn=kknn(nmkat~.,data_train,data_test,k=5)
#权重为5的判别,预测
summary(fit_pre_kknn)
fit=fitted((fit_pre_kknn))
fit
table(data_test$nmkat,fit)
error_kknn=sum(as.numeric(as.numeric(fit)!=as.numeric(data_test$nmkat)))/nrow(data_test)
error_kknn

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值