R语言 线性判别分析

R语言 线性判别分析

最流行或成熟的机器学习技术之一是线性判别分析(LDA)。它主要用于解决分类问题,而不是监督下的分类问题。它基本上是一种降维技术。使用预测器的线性组合,LDA试图预测给定观测值的类别。让我们假设预测变量为p。让所有的类有一个相同的变体(即对于单变量分析,p的值为1)或相同的协方差矩阵(即对于多变量分析,p的值大于1)。

在R中实现LDA的方法

LDA或线性判别分析可以在R中使用软件包 MASSlda() 函数进行计算 LDA用于确定群体的平均数,同时对于每个个体,它试图计算出该个体属于不同群体的概率。因此,该特定个体在该组中获得了最高的概率分数。

要使用 lda() 函数,必须安装以下软件包。

  1. 用于 lda() 函数的 MASS 包。
  2. tidyverse 包,用于更好地、方便地进行数据处理和可视化。
  3. caret 包,用于更好的机器学习工作流程。

在安装了这些包之后,再准备数据。为了准备数据,首先需要将数据分成训练集和测试集。然后,需要对数据进行标准化处理。在这样做的时候,分类变量会被自动删除。一旦数据被设置和准备好,就可以使用 lda() 函数开始进行线性判别分析。

首先,LDA算法试图找到能够最大限度地分离各类的方向。然后,它使用这些方向来预测每一个人的类别。这些方向被称为线性判别因子,是预测变量的线性组合。

函数lda()的解释

实现线性判别分析之前,让我们讨论一下需要考虑的问题。

  1. 人们需要检查每一个变量的单变量分布情况。它必须是正态分布。如果不是,就用对数和根函数对指数分布进行转换,或者用Box-Cox方法对偏态分布进行转换。
  2. 我们需要去除数据中的异常值,然后对变量进行标准化处理,以使其规模具有可比性。
  3. 让我们假设因变量即Y是离散的。
  4. LDA假设预测因子是正态分布的,即它们来自高斯分布。各个类有特定的类均值和相等的协方差或方差。

MASS 包中,我们有 lda() 函数用于计算线性判别分析。让我们看看使用 lda() 函数的默认方法。

语法:

lda(formula, data, …, subset, na.action)

或者,

lda(x, grouping, prior = proportions, tol = 1.0e-4, method, CV = FALSE, nu, … )

参数

formula :一个公式,其形式为group ~ x1+x2…

data :数据框,我们最好从其中提取公式中的变量或个体

subset :一个索引,用于指定用于训练样本的案例。

na.action :一个函数,用于指定在发现NA时要采取的行动。

x :一个矩阵或一个数据框,如果参数中没有传递公式,则需要。

grouping : 一个用于指定观测值类别的因子。

prior : 类成员的先验概率。

tol : 一个用于决定矩阵是否为单数的公差。

method : 在各种情况下使用什么样的方法。

CV : 如果它为真,它将返回留一交叉验证的结果。

nu : 当 method=”t “时,方法的自由度

… : 从其他方法传递的各种参数。

函数 lda() 的输出有以下内容。

  • 组的先验可能性 ,即在每一个组中,训练观测值的比例。
  • 组平均值 ,即组的重心,用于显示组中每个变量的平均值。
  • 线性判别系数 ,即预测变量的线性组合,用于形成LDA的决策规则。

例子

让我们看看线性判别分析是如何使用 lda() 函数计算的。让我们使用R Studio的虹膜数据集。

# LINEAR DISCREMINANT ANALYSIS
  
library(MASS)
library(tidyverse)
library(caret)
theme_set(theme_classic())
  
# Load the data
data("iris")
  
# Split the data into training (80%) and test set (20%)
set.seed(123)
training.individuals <- irisSpecies %>% 
            createDataPartition(p = 0.8, list = FALSE)
train.data <- iris[training.individuals, ]
test.data <- iris[-training.individuals, ]
  
# Estimate preprocessing parameters
preproc.parameter <- train.data %>% 
  preProcess(method = c("center", "scale"))
  
# Transform the data using the estimated parameters
train.transform <- preproc.parameter %>% predict(train.data)
test.transform <- preproc.parameter %>% predict(test.data)
  
# Fit the model
model <- lda(Species~., data = train.transform)
  
# Make predictions
predictions <- model %>% predict(test.transform)
  
# Model accuracy
mean(predictionsclass==test.transform$Species)
  
model <- lda(Species~., data = train.transform)
model
R

输出

[1] 1
Call: lda(Species ~ ., data = train.transformed)

Prior probabilities of groups:
    setosa versicolor  virginica
 0.3333333  0.3333333  0.3333333

Group means:
           Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa       -1.0120728   0.7867793   -1.2927218  -1.2496079
versicolor    0.1174121  -0.6478157    0.2724253   0.1541511
virginica     0.8946607  -0.1389636    1.0202965   1.0954568

Coefficients of linear discriminants:
                    LD1         LD2
Sepal.Length  0.9108023  0.03183011
Sepal.Width   0.6477657  0.89852536
Petal.Length -4.0816032 -2.22724052
Petal.Width  -2.3128276  2.65441936

Proportion of trace:
   LD1    LD2
0.9905 0.0095
R

输出的图形绘制

让我们看看在两个假数据集上做什么样的绘图。为此,让我们使用 ggplot2 包中的 ggplot() 函数来绘制从 lda() 得到的结果或输出

例子

# Graphical plotting of the output
  
library(ggplot2)
library(MASS)
library(mvtnorm)
  
# Variance Covariance matrix for random bivariate gaussian sample
var_covar = matrix(data = c(1.5, 0.4, 0.4, 1.5), nrow = 2)
  
# Random bivariate Gaussian samples for class +1
Xplus1 <- rmvnorm(400, mean = c(5, 5), sigma = var_covar)
  
# Random bivariate Gaussian samples for class -1
Xminus1 <- rmvnorm(600, mean = c(3, 3), sigma = var_covar)
  
# Samples for the dependent variable
Y_samples <- c(rep(1, 400), rep(-1, 600))
  
# Combining the independent and dependent variables into a dataframe
dataset <- as.data.frame(cbind(rbind(Xplus1, Xminus1), Y_samples))
colnames(dataset) <- c("X1", "X2", "Y")
datasetY <- as.character(datasetY)
  
# Plot the above samples and color by class labels
ggplot(data = dataset) + geom_point(aes(X1, X2, color = Y))
R

输出

R编程中的线性判别分析

应用

  • 人脸识别系统 中,LDA被用来在分类前产生更少的和可管理的特征数量。
  • 客户识别系统 中,LDA帮助识别和选择特征,这些特征可以用来描述一群可以从商场购买特定物品或产品的客户的特点或特征。
  • 医学 领域,LDA帮助识别各种疾病的特征,并根据病人的症状将其分类为轻度、中度或重度。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册