线性判别分析(LDA)-白话讲解

前言

    线性判别分析(Linear Discriminant Analysis,LDA)是一种经典的线性分类方法。而机器学习中还有一种用于NLP主题模型建模的潜在狄利克雷分布(Latent Dirichlet Allocation)也简称为LDA,大家在学习的时候注意区分。不同于PCA降维使用最大化方差的思想,LDA的基本思想是将数据投影到低维空间后,使得同一类数据尽可能接近不同类数据尽可能疏远。所以,LDA是一种有监督的线性分类算法。

基本思想

    下图描述了PCA和LDA直观上的区别。
LDA
LDA
LDA

python 实现

    按照前述LDA算法流程,我们可以给基于numpy来实现一个简单的LDA模型。基本关 键点包括计算分组均值与协方差、类间散度矩阵和SVD分解等。具体实现过程如下代 码所示:

import numpy as np

class LDA():
    def __init__(self):
        self.w = None
    
    def calculate_covariance_matrix(self, X, Y=None):
        # 计算协方差矩阵
        m = X.shape[0]
        X = X - np.mean(X, axis=0)
        Y = X if Y == None else Y - np.mean(Y, axis=0)
        return 1 / m * np.matmul(X.T, Y)
    
    # 对数据进行向量转换
    def transform(self, X, y):
        self.fit(X, y)
        X_transform = X.dot(self.w)
        return X_transform
    
    # LDA拟合过程
    def fit(self, X, y):
        # 按类划分
        X0 = X[y == 0]
        X1 = X[y == 1]

        # 分别计算两类数据自变量的协方差矩阵
        sigma0 = self.calculate_covariance_matrix(X0)
        sigma1 = self.calculate_covariance_matrix(X1)
        # 计算类内散度矩阵
        Sw = sigma0 + sigma1

        # 分别计算两类数据自变量的均值和差
        u0, u1 = X1.mean(0), X2.mean(0)
        mean_diff = np.atleast_1d(u0 - u1)

        # 对类内散度矩阵进行奇异值分解
        U, S, V = np.linalg.svd(Sw)
        # 计算类内散度矩阵的逆
        Sw_ = np.dot(np.dot(V.T, np.linalg.pinv(S)), U.T)
        # 计算w
        self.w = Sw_.dot(mean_diff)
    
    # LDA分类预测
    def predict(self, X):
        y_pred = []
        for sample in X:
            h = sample.dot(self.w)
            y = 1 * (h < 0)
            y_pred.append(y)
        return y_pred
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值