线性判别分析
线性判别分析(Linear Discriminant Analysis,LDA),一般的机器学习资料将其笼统地归类为“分类算法”,实则这是一个值得探究的问题。
在参考资料 [1] 中,已经比较详细地讲解了费雪的线性判别分析,此处则从贝叶斯定理出发,阐述 LDA 基本原理,推导过程所用数学知识可以参考 [3] 。
优势 Odds
- Probability,译为“概率”,这是公认的,也是概率论教材中普遍采用的翻译。另外,还有“几率”、“机率”等翻译,皆为此单词的中文译名。
- Odds,翻译为“优势”。对此单词,有诸多译名,比如“赔率”、“几率”(周志华教授的《机器学习》一书中用此翻译)、“比值比”、“发生比”等。此处,采信“优势”的翻译(感谢苏州大学唐煜教授指导)。
概率,在统计学中有严格的定义,请参阅《机器学习数学基础》。
以抛硬币为例,正面朝上的概率为:
优势 Odds 不是概率。
优势定义式:
其中 是概率。
对数优势,即计算 通常是以 为底的对数。
分类问题
数据集
假设数据集 ,样本数量是 ,特征数量(维数)是 ,即样本数据 在 空间。
以 作为样本所属的类别,或者说是样本标签。若 属于第 类或属于 类,即其标签是 ,亦可表示为 。
问题:现有给定一个样本 ,判断它属于哪一个类别?
贝叶斯定理
根据贝叶斯定理,有:
其中:
是类别 出现的概率,称为先验概率。
是给定类别 ,样本数据 的概率密度函数,称为似然函数(likelihood,“看起来像”)。
是样本数据 的概率密度函数,称为证据,根据全概率公式,算式为:
是给定样本数据 情况下,该样本属于 的概率,称为后验概率。
对贝叶斯定理的全面理解,参阅《机器学习数学基础》5.2.3节。
由贝叶斯定理,判定:样本数据 应归属于具有最大后验概率的类别,即:若 ,则 属于类别 。
又因为对任何后验概率 ,(3)式的 都相同,所以: ,即:若 ,则 属于类别 。
S 形函数
考虑二分类问题,即 ,则(3)式中的后验概率有两个: 。
于是(4)式即为: 。
根据(3)式,计算 : (5)式中最后得到的分母: 。
根据(3)式,可得(注意,下面的(6)式跟上面的(5)式分母相比,互为倒数,分子分母位置倒过来了):
即 相对 的优势,若取优势对数,得: (7)式是对数优势(log odds)函数,也称为 logit 函数。
由于对数优势中的对数是以 为底,由(7)式可得: (8)式的倒数为: 将(9)式代入到(5)式,得: 函数 是 S 形函数(sigmoid function),也称为 logistic 函数。它具有如下形式:
- 对称性:
- 反函数: ,即(7)式中的 logit 函数
- 导数:
在神经网络中,logistic 函数常作为激活函数(参阅《机器学习数学基础》4.4.1节、4.4.4节),且喜欢用符号 表示,则其导数: 。
Softmax 函数
如果考虑多分类问题,即 ,将(4)式代入(3)式,并将分母(4)式用求和符号表示: 令: 其中对数让然是以 为底,则: 将(13)式代入到(11)式,则: (14)式所得函数即称为 Softmax 函数。
二分类的线性判别分析
构建线性判别分析的分类器
根据贝叶斯定理构建分类器。
线性判别分析:linear discriminant analysis,LDA。
二分类的线性判别分析,即
假设:(此假设是 LDA 的重要适用条件)
- 服从正态分布
- 所有类别有相同的协方差矩阵
即: 其中:
- 是类别 的均值(向量)
- 是 的协方差矩阵, 表示协方差矩阵对应的行列式
- ,二分类
由 logit 函数(对数优势函数)(7)式可知, ,即 对(15)式取对数,得到: 将(17)式代入到(16)式中,得到: 在(18)式中,二次项 之和等于 。
由于 是对称矩阵, , ,有:
故,(18)式等于: 令:
则(19)式可以写成: 将(20)式代入到(10),得到后验概率 的重新表述: 由于是二分类,则 ,根据(21)式,故两个类别的边界(超平面)为: 也就是说,如果 ,则样本 属于 ,否则属于 。
这就是所谓的“线性判别”,因为(22)式是“线性”函数。
所以,问题就转化为如何确定 和 。由(19)式可知,必须要知道:
- 先验概率:
- 均值向量:
- 协方差矩阵:
用最大似然估计求解
设样本数据集 ,其中:
- 表示一个样本,共有 个特征
- 表示 ; 表示
并设先验概率 ,则 。
按照前述假设: 服从正态分布,用 表示正态分布的概率密度函数:
如果 来自 类,则:
如果 来自 类,则:
写出似然函数: 因为对数是单调递增函数,所以,最大化 就等价于最大化 (通常取以 为底的对数),于是得: 接下来分别将(26)式对 求导,并令其导数为零,即可得到最优解。
1. 计算 在(27)式求导中,使用了自然对数的导数: 。
令 ,则可得到 的最大似然估计,即: 2. 计算 和
首先计算 ,由(26)式可知,只有第一个方括号中的项含有 ,并参考(15)式,故: 在上面计算导数的时候,使用了矩阵导数的公式(参考《机器学习数学基础》213页):
令 ,则得: 同样方法,可以求得: 3. 计算
将(15)式正态分布的具体函数代入到(26)式,并根据对数展开,将含有 的项都写出来,其余的项用 表示。
另外,还是用了矩阵迹的性质: 其中: 根据迹与行列式导数公式:
计算(32)式对 的导数: 令(34)式等于零,则得到协方差矩阵的最大似然估计: 也就是样本(有偏差的)协方差矩阵 的加权平均。
多分类的线性判别分析
将上述二分类下的公式推广到多分类,即:
表示类别 的数据样本数量, ,则:
注意
LDA 要求数据样本服从正态分布,且所有类别有相同协方差矩阵。
但对离群值敏感,若有离群值,则会造成较大的参数估计偏差。
实践案例
在 scikit-learn 中,提供了实现线性判别分析的专门模型:https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html
这是一个分类器模型,要求数据必须符合正态分布,并且各类有相同的协方差矩阵。这个模型,也能够实现对数据的降维。
1. 导入数据
# 使用鸢尾花数据集
import pandas as pd
from sklearn import datasets
iris = datasets.load_iris(as_frame=True) # 载入鸢尾花数据集
df = iris.data
df['target'] = iris.target # 将数字表示的标签列添加到 df
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names) # 增加样本类别名称列
df.head()
2. 划分数据集
from sklearn.model_selection import train_test_split
X = df[iris.feature_names] # 得到样本数据 sepal length\sepal width\petal length\petal width (cm)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. 训练模型
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA()
lda.fit(X_train, y_train)
4.简单评估
lda.score(X_test, y_test)
5. 可视化显示结果
lda = LDA(n_components=1) # 降维
X_1d = lda.fit(X,y).transform(X)
print(X_1d[:5]) # 降维之后
print(X) # 降维之前
df['X'] = X_1d
df.head()
import seaborn as sns
sns.scatterplot(data=df, x="X", y="target", hue="species")
总结
优点:
- 使用类别的先验知识
- 以标签、类别衡量差异性的有监督降维方法,相对于 PCA 的模糊性,其目的更明确,更能反应样本间的差异
缺点:
- 不适合对非高斯分布样本进行降维
- 降维最多到 维
- 在样本分类信息依赖方差而不是均值的时候,降维效果不好
- 有过拟合的可能
参考资料
[1]. 费雪的线性判别分析
[2]. 谢文睿等. 机器学习公式详解. 北京:人民邮电出版社
[3]. 齐伟. 机器学习数学基础. 北京:电子工业出版社
[4]. 贝叶斯定理
作者: 老齐
链接: http://math.itdiffer.com/bayes-lda.html
来源: 机器学习
本文原创发布于「机器学习」,转载请注明出处,谢谢合作!