欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

结果:
R语言 Fisher线性判别

相关标签: R语言 r语言