R 实现线性判别分析教程
本文介绍线性判别分析概念,并通过示例介绍R的实现过程。
介绍线性判别分析模型
线性判别分析用于基于一组变量把响应变量分为俩类或更多的算法。但线性判别算法对数据有一些要求:
响应变量必须是类别变量。线性判别是分类算法,因此响应变量应该是类别变量。
预测变量应遵循正太分布。首先检查每个预测变量是否大致符合正太分布,如果不满足,需要选择转换算法使其近似满足。
每个预测变量有相同的标准差。现实中很难能够满足该条件,但我们可以对数据进行标准化,让变量统一为标准差为1,均值为0.
检查异常值。在用于LDA之前要检查异常值。可以简单通过箱线图或散点图查进行检测。
LDA模型在现实中应用广泛,下面简单举例:
- 市场营销
零售公司经常使用LDA将购物者分为几类。然后利用建立LDA模型来预测特定购物者是低消费者、中等消费者还是高消费者,使用预测变量如收入、年度总消费额和家庭人数等变量。
- 医学领域
医院或医疗机构的研究人员通常利用LDA预测给定一组异常细胞是否会导致轻微、中度或严重疾病。
- 产品研发
一些公司会利用LDA模型预测消费者属于每天、每周、每月或年使用他们的产品,基于预测变量有性别、年度收入、使用类似产品的频率。
- 生态领域
研究者利用LDA模型预测是否给定珊瑚礁的健康状况:好、中等、坏、严重。预测变量包括大小、年度污染情况、年份。
加载实现库
library(MASS)
library(ggplot2)
载入数据
我们打算使用内置的iris数据,下面代码展示如何载入查看数据。
str(iris)# 'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
我们看到共包括5个变量150个观察记录。下面通过线性判别分析模型对给定鸢尾花进行分类。
我们使用下面四个预测变量:
- Sepal.length
- Sepal.Width
- Petal.Length
- Petal.Width
预测响应变量为Species,分别包括三类:
- setosa
- versicolor
- virginica
数据标准化
线性判别算法其中一个关键假设为每个预测变量具有相同的标准差。一种简单办法可以对预测变量进行标准化,这样预测变量统一为均值为0、方差为1。
我们使用内置的scale
函数,并利用apply
函数进行验证:
iris[1:4] <- scale(iris[1:4])apply(iris[1:4], 2, mean)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# -3.219358e-18 -4.916405e-18 -1.440616e-17 -1.822508e-17 apply(iris[1:4], 2, sd)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1 1 1 1
创建训练和测试数据集
接下来我们把数据分为训练集和测试集:
set.seed(1)sample <- sample(c(TRUE, FALSE), nrow(iris), replace = TRUE, prob = c(.7, .3))train <- iris[sample, ]
test <- iris[!sample,]
拟合LDA模型
下面我们利用MASS
包中的lda
函数实现LDA模型:
library(MASS)
model <- lda(Species~., data=train)
model# Call:
# lda(Species ~ ., data = train)
#
# Prior probabilities of groups:
# setosa versicolor virginica
# 0.3207547 0.3207547 0.3584906
#
# Group means:
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# setosa -1.0397484 0.8131654 -1.2891006 -1.2570316
# versicolor 0.1820921 -0.6038909 0.3403524 0.2208153
# virginica 0.9582674 -0.1919146 1.0389776 1.1229172
#
# Coefficients of linear discriminants:
# LD1 LD2
# Sepal.Length 0.7922820 0.5294210
# Sepal.Width 0.5710586 0.7130743
# Petal.Length -4.0762061 -2.7305131
# Petal.Width -2.0602181 2.6326229
#
# Proportion of trace:
# LD1 LD2
# 0.9921 0.0079
下面我们解释上面的输出:
- 每组的先验概率
这些表示训练集数据中每组的概率。如:所有训练集中35.8%
的观测值属于virginica
类别。
- 组均值
这些数据显示每类每个预测变量的均值。
- 线性判别系数
这里展示了LDA模型的判别规则,每个预测变量的线性组合情况:
- LD1: .792Sepal.Length + .571Sepal.Width – 4.076Petal.Length – 2.06Petal.Width
- LD2: .529Sepal.Length + .713Sepal.Width – 2.731Petal.Length + 2.63Petal.Width
- 分离百分比
这些展示了每个线性判别函数实现的分离百分比。
使用模型进行预测
我们已经使用训练数据拟合了模型,下面使用模型对测试数据进行预测:
predicted <- predict(model, test)names(predicted)head(predicted$class)
# [1] setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginicahead(predicted$posterior)# setosa versicolor virginica
# 4 1 2.425563e-17 1.341984e-35
# 6 1 1.400976e-21 4.482684e-40
# 7 1 3.345770e-19 1.511748e-37
# 15 1 6.389105e-31 7.361660e-53
# 17 1 1.193282e-25 2.238696e-45
# 18 1 6.445594e-22 4.894053e-41head(predicted$x)# LD1 LD2
# 4 7.150360 -0.7177382
# 6 7.961538 1.4839408
# 7 7.504033 0.2731178
# 15 10.170378 1.9859027
# 17 8.885168 2.1026494
# 18 8.113443 0.7563902
我们看到输出列表中包括三个变量:
- class 预测类型
- posterior 每个类别对应的后验概率
- x 线性判别
下面我们来看LDA模型正确预测类型的百分比:
mean(predicted$class == test$Species)
# [1] 1
输出显示模型预测正确率100%。在现实世界中模型很少能够预测每个类别都完全正确,因内置iris数据集比较简单,预测结果比较好。
可视化结果
最后,我们创建LDA图形观察线性判别模型,通过图示方式展示三种类型区分情况:
library(ggplot2)
lda_plot <- cbind(train, predict(model)$x)ggplot(lda_plot, aes(LD1, LD2)) + geom_point(aes(color=Species))
R 实现线性判别分析教程相关推荐
- R语言——线性判别分析(LDA)
R语言--线性判别分析* 线性判别分析是一种经典的线性学习方法,在二分类问题上最早由Fisher在1936年提出,亦称Fisher线性判别.线性判别的思想非常朴素:给定训练样例集,设法将样例投影到一条 ...
- Python实现线性判别分析教程
当有一组预测变量需要被分为两个类,一般使用逻辑回归模型.举例,使用信用分和平均存款余额预测贷款是否违约.但当预测变量有多种可能时,则一般会使用线性判别分析(linear discriminant an ...
- R语言线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)
判别分析包括可用于分类和降维的方法.线性判别分析(LDA)特别受欢迎,因为它既是分类器又是降维技术.二次判别分析(QDA)是LDA的变体,允许数据的非线性分离.最后,正则化判别分析(RDA)是LDA和 ...
- 史上最好的LDA(线性判别分析)教程
一.前言 最近由于研究需要,要用到线性判别分析(LDA).于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然 ...
- R语言分类算法之线性判别分析(Linear Discriminant Analysis)
1.线性判别原理解析 基本思想是"投影",即高纬度空间的点向低纬度空间投影,从而简化问题的处理.在原坐标系下,空间中的点可能很难被分开,如图8-1,当类别Ⅰ和类别Ⅱ中的样本点都投影 ...
- R语言中的线性判别分析
在R语言中,线性判别分析(Liner Discriminant Analysis,简称LDA),依靠软件包MASS中有线性判别函数lqa()来实现.该函数有三种调用格式: 1)当对象为数据框data. ...
- 数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...
全文链接:http://tecdat.cn/?p=27384 在本文中,数据包含有关葡萄牙"Vinho Verde"葡萄酒的信息(点击文末"阅读原文"获取完整代 ...
- R语言惩罚逻辑回归、线性判别分析LDA、广义加性模型GAM、多元自适应回归样条MARS、KNN、二次判别分析QDA、决策树、随机森林、支持向量机SVM分类优质劣质葡萄酒十折交叉验证和ROC可视化
最近我们被客户要求撰写关于葡萄酒的研究报告,包括一些图形和统计输出. 介绍 数据包含有关葡萄牙"Vinho Verde"葡萄酒的信息.该数据集有1599个观测值和12个变量,分别是 ...
- R语言LDA线性判别分析
LDA线性判别分析 R语言中LDA的实现过程 lda()函数理解 lda()用法 lda()参数介绍 lda示例 可视化结果 应用前景 最流行或最成熟的机器学习技术之一是线性判别分析 (LDA) ...
最新文章
- SQL2000 N' '的意思
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
- kubernetes相关概念
- 列注释_简单5步了解相关矩阵的注释热图
- python3 base64 长度补全
- asp.net 页面从初始化到卸载事件顺序(及对页面控件调用)完整列表【转】
- argument list too long 错误的处理
- idea debug启动不了 模式下 报错 ‘Connected to the target VM,address:‘127.0.0.1:58337‘,transport:‘socket‘’
- screen的一些常用命令和快捷键
- FTP服务器搭建及操作(一)
- mysql行级锁unique_MySQL行级锁,表级锁,页级锁详解
- 安卓暗黑模式软件_Android App Dark Theme(暗黑模式)适配指南
- php数据回显是什么意思,关于mysql:php脚本回显部分php而不是什么意图
- Yii2 —— 表单美化
- java打印表情包_表情包生成器
- 视频剪辑 电脑录屏助手
- Java中的GC简单介绍
- android高仿微信下拉有页面,Android——(仿微信聊天界面布局实例)
- Jquery-pagination.js分页处理
- 【WSL】window10 安装WSL2配置conda环境及深度学习环境搭建
热门文章
- 计算机毕业设计ssm面向智慧课堂的教学过程管理系统evi14系统+程序+源码+lw+远程部署
- 《图解机器学习-杉山将著》读书笔记---CH3
- 连接PC桌面和android手机的神器--scrcpy
- 成都拓嘉启远:怎样理解拼多多DSR评分
- Athentech Perfectly Clear Complete 3.6.3汉化版|一键智能清晰磨皮插件
- @准大一萌新:学长学姐的N条忠告,字字珠玑,句句经典
- U盘在我的电脑里不显示,只在系统托盘区里可以检测到设备
- python 通达信 dll_Python读取通达信本地数据
- 【水下目标检测】Underwater object detection using Invert Multi-Class Adaboost with deep learning
- 聊天界面-自适应文字