vlambda博客
学习文章列表

R语言如何进行线性判别分析?

    判别分析是一种有监督的训练方法。对于线性判别,先是将样本点投影到一维空间,也就是直线上,若效果不明显,就可以考虑增加一个维度,变成二维空间,如果还是不明显,就继续增加维度。

    在R语言中,MASS软件包中的lda()是实现线性判别的核心函数。下面将通过一个简单实例来进行介绍。



1 读取数据集。

sz_data=read.csv("sz_data.csv",head=T,encoding="utf-8")

head(sz_data);dim(sz_data) #查看数据的前几行和数据维度

2  进行数据预处理。在实际应用中,如果数据有缺失值,需要先按照一定的方法先对缺失值进行处理。这里我们直接划分训练集和测试集,并且随机抽取70%的样本作为训练集。

n=0.7*nrow(sz_data) #作为训练集的样本量

sub_train=sample(nrow(sz_data),n)#随机抽取n个样本

data_train=sz_data[sub_train,-1]#训练集

data_test=sz_data[-sub_train,-1]#测试集

head(data_train);dim(data_train)

head(data_test);dim(data_test)

R语言如何进行线性判别分析?

3  线性判别分析。没有MASS安装包的要先安装MASS包。

fit_lda1=lda(is_rise~.,data_train) #判别分析公式

names(fit_lda1) #查看lda()可给出的输出项名称

fit_lda1$prior #查看本次执行过程中所使用的先验概率

fit_lda1$counts #查看数据集data_train中各类别的样本量

fit_lda1$means #查看各变量在每一类别中的均值

fit_lda1 #输出判别分析的各项结果

plot(fit_lda1) #判别规则可视

从运行结果可以看出,本次线性判别将样本点投射到了一维空间(LD1)。结果中展示了先验概率、各类别样本量,以及各变量在每一类别中的均值。

图形中展示了is_rise取值为0和1时,分布具有一定的差异性。

R语言如何进行线性判别分析?R语言如何进行线性判别分析?

4  对测试集进行预测。

pre_lda1=predict(fit_lda1,data_test)

data_test$pre_rise=pre_lda1$class #输出类别预测结果

head(data_test) #查看含有预测结果的数据

验证模型准确性。

table(data_test$is_rise,pre_lda1$class) #生成is_rise的预测值和实际值的混淆矩阵

error_lda1=sum(pre_lda1$class!=data_test$is_rise)/nrow(data_test);error_lda1#计算错误率

混淆矩阵中,对角线上的数据是被准确判别了的。计算出的错误率在15%以下,具有较高的准确性。