R语言 Fisher线性判别
程序员文章站
2022-03-23 08:34:18
...
本人正在学习R语言,想利用这个平台记录自己一些自己的学习情况,方便以后查找,也想分享出来提供一些资料给同样学习R语言的同学们。(如果内容有错误,欢迎大家批评指正)
Fisher线性判别主要用来根据样本进行整体特征的提取,大致分为以下四个步骤:
1.对数据进行抽样,将数据分为训练集和验证集
2.建立模型,得到对应的法则F
3.使用模型对验证集进行预测
4.计算模型准确率
下面通过使用RStudio中自带的数据集iris来进行判别花的品种与花瓣、萼片的长度、宽度的关系。
按照上述步骤:
1.抽样
ind<-sample(1:150,round(0.7*150),replace=FALSE)
#sample抽取150个样本 round将150个样本中的70%作为训练集 replace是否允许有重复元素
2.建立模型,得到法则
fisher.mode<-lda(as.formula("Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width"),data=iris[ind,])
#lda函数可以降低维度;公式formula是一个把响应变量(在~左侧)和解释变量(在~右侧)联系起来的对象。formula可以用在线性/一般线性模型
#用随机选择出来的行作为训练集,得出品种关于花瓣和萼片的长度、宽度的函数关系
3.预测
pre<-predict(fisher.mode,iris[-ind,-5])
#使用的是除了之前随机选择的行剩余的数据进行验证
4.计算准确率
t<-table(pre$class,iris[-ind,5])
#对角线元素相加就是得到准确结果的个数,和总的结果数相除就得到了准确率
sum(diag(t))/sum(t)
#diag函数可以提取矩阵的对角线元素形成向量(矩阵不是方阵也可以调用)
也可以写成函数:
fisher<-function(data,n,form){
accu<-0
for(i in 1:1000){
ind<-sample(1:nrow(data),round(0.7*nrow(data)),replace=F)
require("MASS") #调用库
fisher.mode<-lda(form,data=data[ind,])
pre<-predict(fisher.mode,data[-ind,]) #使用验证集对得到的函数进行验证
t<-table(data[-ind,n],pre$class)
accu[i]<-sum(diag(t))/sum(t)
}
return (c(mean(accu),sd(accu)))#sd函数计算样本标准差
}
data<-iris
n<-5
form<-as.formula("Species~.")#.表示除了~前面的列剩余的列
fisher(data,n,form)
#########################################
课后作业:采集10个同学的身高体重性别信息
#1.调用MASS库
#2.打开存有身高体重性别的文件(文件要UTF-8编码格式)
#3.从表格中随机选择样本组成训练集
#4.生成函数
#5.用得到的函数对剩余的数据进行预测
#6.得到函数的准确率
library(MASS)
data<-read.table("C:\\Users\\de'l'l\\Desktop\\student.csv",head=T,sep=",")
ind<-sample(1:10,round(0.7*10),replace=FALSE)
fisher.mode<-lda(as.formula("性别~."),data=data[ind,])
pre<-predict(fisher.mode,data[-ind,-3])
t<-table(pre$class,data[-ind,3])
sum(diag(t))/sum(t)
结果: