• LDA算法实现鸢尾花数据集降维


    1. 作者介绍

    唐杰,男,西安工程大学电子信息学院,2022级研究生
    研究方向:机器视觉与人工智能
    电子邮件:3225033259@qq.com

    陈梦丹,女,西安工程大学电子信息学院,2022级硕士研究生,张宏伟人工智能课题组
    研究方向:机器视觉与人工智能
    电子邮件:1169738496@qq.com

    2. LDA降维算法

    2.1 基本概念

    线性判别分析(Linear Discriminant Analysis,LDA)是一种经典的降维方法。和主成分分析PCA不考虑样本类别输出的无监督降维技术不同,LDA是一种监督学习的降维技术,数据集的每个样本有类别输出。

    LDA分类思想:多维空间中,数据处理分类问题较为复杂,LDA算法将多维空间中的数据投影到一条直线上,将d维数据转化成1维数据进行处理。对于训练数据,设法将多维数据投影到一条直线上,同类数据的投影点尽可能接近,异类数据点尽可能远离。对数据进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定样本的类别。

    如果用一句话概括LDA思想,即“投影后类内方差最小,类间方差最大”。

    2.2 算法流程

    LDA算法流程如下:
    在这里插入图片描述

    3. LDA算法实现

    3.1 数据集介绍

    Iris数据集的中文名是安德森鸢尾花卉数据集,英文全称是Anderson’s Iris data set。Iris包含150个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,所以Iris数据集是一个150行5列的二维表。

    通俗地说,Iris数据集是用来给花做分类的数据集,每个样本包含了花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征(前4列),我们需要建立一个分类器,分类器可以通过样本的四个特征来判断样本属于山鸢尾、变色鸢尾还是维吉尼亚鸢尾(这三个名词都是花的品种)。

    Iris的每个样本都包含了品种信息,即目标属性(第5列,也叫target或label)。如下所示:
    在这里插入图片描述

    3.2 代码实现

    import numpy as np
    from sklearn.datasets import load_iris
    from sklearn.preprocessing import MinMaxScaler
    import matplotlib.pyplot as plt
    import matplotlib.pyplot as plt2
    
    # 定义LDA类
    class LDA:
        def __init__(self, n_components=2, kernel='rbf', gamma=400):
          self.n_components = n_components
          self.kernel = kernel
          self.gamma = gamma
          
        def fit(self, X, y):
          # 计算内部和外部类别散度矩阵
          X_mean = np.mean(X, axis=0)
          S_W = np.zeros((X.shape[1], X.shape[1]))
          S_B = np.zeros((X.shape[1], X.shape[1]))
          for i in range(3):
             X_class = X[y == i, :]
             X_class_mean = np.mean(X_class, axis=0)
             S_W += np.dot((X_class - X_class_mean).T, (X_class - X_class_mean))
             S_B += len(X_class) * np.dot((X_class_mean - X_mean).reshape(-1, 1), (X_class_mean - X_mean).reshape(1, -1))
             
          # 使用LDA算法计算投影矩阵W
          eig_val, eig_vec = np.linalg.eig(np.dot(np.linalg.inv(S_W), S_B))
          idx = np.argsort(-eig_val.real)
          self.W = eig_vec[:, idx[:self.n_components]]
          
          # 归一化处理
          scaler = MinMaxScaler()
          self.W = scaler.fit_transform(self.W)
          
        def transform(self, X):
          # 投影到特征空间
          X_new = np.dot(X, self.W)
          # 归一化处理
          scaler = MinMaxScaler()
          X_new = scaler.fit_transform(X_new)
          return X_new
          
    # 加载数据集
    iris = load_iris()
    X = iris.data
    y = iris.target
    
    # 模型训练
    lda = LDA(n_components=2, kernel='rbf')
    lda.fit(X, y)
    
    # 数据转换
    X_new = lda.transform(X)
    
    # 可视化降维前的数据分布
    plt.scatter(X[:, 0], X[:, 1], c=y)
    plt.show()
    
    # 可视化降维后的数据分布
    plt2.scatter(X_new[:, 0], X_new[:, 1], c=y)
    plt2.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    3.3 结果展示

    运行结果如下:

    图一 鸢尾花数据集前两维分布图
    在这里插入图片描述
    图二 降维后数据分布图
    在这里插入图片描述

  • 相关阅读:
    对于类和对象的理解
    【C++】传递‘类非静态成员函数’用作回调函数
    基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)三
    为什么有了 HTTP 还要 RPC
    【Kubernetes】深入了解 Kubernetes:现代容器编排与管理平台
    分布式定时任务
    设计模式 00 设计原则
    ImmunoChemistry艾美捷Annexin DNA损伤ELISA试剂盒方案
    发动机悬置系统冲击仿真-瞬时模态动态分析与响应谱分析
    React - React v18 的 批处理
  • 原文地址:https://blog.csdn.net/m0_37758063/article/details/130894389