📜  高斯判别分析(1)

📅  最后修改于: 2023-12-03 15:28:59.803000             🧑  作者: Mango

高斯判别分析

简介

高斯判别分析(GDA,Gaussian Discriminant Analysis)是一种基于概率统计的分类方法,它假设每个类别的数据都符合高斯分布,通过计算不同类别的概率密度函数之间的差异来确定分类边界。

GDA 可以被用于二分类和多分类问题。在二分类问题中,我们需要找到一个判定函数,判断输入数据属于哪一类。在多分类问题中,我们需要为每个类别构建一个判定函数。

原理

在 GDA 中,我们需要对每个类别 $y$ 计算其概率密度函数 $p(x|y)$,其中 $x$ 表示输入数据。我们假设 $p(x|y)$ 符合多元高斯分布,即

$$ p(x|y) = \frac{1}{(2\pi)^{n/2}|\Sigma_y|^{1/2}} \exp\left(-\frac{1}{2}(x-\mu_y)^T\Sigma_y^{-1}(x-\mu_y)\right) $$

其中 $n$ 表示输入数据的维度,$\mu_y$ 表示类别 $y$ 的均值向量,$\Sigma_y$ 表示类别 $y$ 的协方差矩阵。

对于二分类问题,我们假设两个类别的先验概率分别为 $p(y=1)$ 和 $p(y=0)$,则可以根据贝叶斯准则计算后验概率

$$ p(y=1|x) = \frac{p(x|y=1)p(y=1)}{p(x|y=1)p(y=1) + p(x|y=0)p(y=0)} $$

我们可以对其进行化简,得到一个决策边界 $f(x) = g(x) - \frac{1}{2}\log\frac{p(y=1)}{p(y=0)}$,其中 $g(x) = x^T\Sigma^{-1}(\mu_1 - \mu_0)$。当 $f(x) \geq 0$ 时,我们将样本判定为类别 $y=1$,否则判定为类别 $y=0$。

对于多分类问题,我们可以使用一对一(One-vs-One)或一对多(One-vs-All)的方式将其转化成二分类问题,然后使用 GDA 进行分类。

实现

以下是一个基于 Python 的 GDA 实现,其中 X 表示输入数据,y 表示类别,n_classes 表示类别的数量。

import numpy as np

class GDA:
    def fit(self, X, y):
        self.n_classes = len(set(y))
        self.means = []
        self.covs = []
        self.priors = []
        for i in range(self.n_classes):
            Xi = X[y == i]
            self.means.append(np.mean(Xi, axis=0))
            self.covs.append(np.cov(Xi, rowvar=False))
            self.priors.append(len(Xi) / len(X))
    
    def predict(self, X):
        log_likelihoods = np.zeros((len(X), self.n_classes))
        for i in range(self.n_classes):
            rv = multivariate_normal(mean=self.means[i], cov=self.covs[i])
            log_likelihoods[:, i] = rv.logpdf(X) + np.log(self.priors[i])
        return np.argmax(log_likelihoods, axis=1)

在训练过程中,我们对每个类别计算其均值向量、协方差矩阵和先验概率。在预测过程中,我们对每个类别的概率密度函数求出其对数似然值,然后根据后验概率进行分类。

总结

GDA 是一种基于概率统计的分类方法,它假设每个类别符合高斯分布,通过计算不同类别的概率密度函数之间的差异来确定分类边界。GDA 可以被用于二分类和多分类问题,它对于各个类别的协方差矩阵做了相同的假设,因此适用于特征之间的线性关系不是很强的情况。在实际应用中,常常需要根据具体问题进行调整,例如使用 LDA 等变种方法。