特征工程(六)—(2)利用LDA进行特征转换

news2024/11/30 0:52:31

1、LDA的手动处理

LDA(线性判别分析)是特征变换算法,也是有监督分类器。

和PCA一样,LDA的目标是提取一个新的坐标系,将原始的数据集投影到一个低维的空间中。
和PCA的主要区别是,LDA不会专注数据的方差,而是优化低维空间,以获得最佳的类别可分性。

LDA极为有用的原因在于,基于类别可分性的分类有助于避免机器学习流水线的过拟合。也会降低计算成本。

LDA不会计算整体数据的协方差矩阵的特征值,而是计算类内(within-class)和类间(between-class)散布矩阵的特征值和特征向量。
LDA分为5个步骤:
1、计算每个类别的均值向量
2、计算类内和类间的散布矩阵
3、计算S(W)-1 * S(B) 的特征值和特征向量
4、降序排列特征值,保留前K个特征向量
5、使用前几个特征向量,将数据投影到新空间

(1)计算每个类别的均值向量

import matplotlib as mpl
# 解决中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 从sklearn中导入鸢尾花数据集
from sklearn.datasets import load_iris
import numpy as np
# 导入画图模块
import matplotlib.pyplot as plt
%matplotlib inline
# (1)、加载数据集
iris = load_iris()

# (2)、将数据矩阵和相应变量存储到iris_x和iris_y中
iris_X, iris_y = iris.data, iris.target

label_dict = {i : k for i,k in enumerate(iris.target_names)}
print(label_dict)
# {0: 'setosa', 1: 'versicolor', 2: 'virginica'}
'''
第一步、计算每个类别的均值向量
'''


# 每个类别的均值向量
mean_vect = []

for cl in [0, 1, 2]:
    # 过滤出每一种鸢尾花,计算其均值向量
    class_mean_vect = np.mean(iris_X[iris_y == cl], axis=0)
    print(label_dict[cl],'均值向量为: ', class_mean_vect)
    mean_vect.append(class_mean_vect)
mean_vect

在这里插入图片描述

(2)计算类内和类间的散布矩阵

在这里插入图片描述

'''
第二步、计算类内和类间的散布矩阵
'''

# (1) 计算类内的散布矩阵S_W
S_W = np.zeros((4, 4))

list(zip([0, 1 , 2], mean_vect))

在这里插入图片描述

# 对于每种鸢尾花
for cl, mv in zip([0, 1 , 2], mean_vect):
    # 从0开始,每个类别的散布矩阵
    class_sc_mat = np.zeros((4, 4))
    # 对于每个样本
    for row in iris_X[iris_y == cl]:
        row = row.reshape(4, 1)
        mv = mv.reshape(4, 1)
        # 4 * 4矩阵
        class_sc_mat = class_sc_mat + (row - mv).dot((row - mv).T)
    # 散布矩阵的和
    S_W += class_sc_mat

S_W

在这里插入图片描述

# (2) 计算类间的散布矩阵S_B

# 整个数据集的均值
total_mean = np.mean(iris_X, axis=0).reshape(4, 1)
S_B = np.zeros((4, 4))
for i,mean_vec in enumerate(mean_vect):
    # 每一种鸢尾花的数量
    n = iris_X[iris_y == i, :].shape[0]
    # 每种花的列向量
    mean_vec = mean_vec.reshape(4, 1)

    S_B = S_B + n * (mean_vec-total_mean).dot((mean_vec-total_mean).T)

S_B

在这里插入图片描述

(3)计算S(W)-1 * S(B) 的特征值和特征向量

'''
第三步、计算S(W)-1 * S(B) 的特征值和特征向量
'''
# 利用eig进行矩阵分解(inv求逆)
eig_values, eig_vecs = np.linalg.eig(
    np.dot(
        np.linalg.inv(S_W), S_B
    )
)

eig_values = eig_values.real
eig_vecs = eig_vecs.real


# 按照降序打印特征向量和相应的特征值
for i in range(len(eig_values)):
    eigvec_cov = eig_vecs[:, i]
    print('特征向量 {}: \n{}'.format(i + 1, eigvec_cov))
    print('特征值 {} : {}'.format(i + 1,eig_values[i]))
    print(30 * '-')

# 注意,第3个和第4个特征值几乎为0,这是因为LDA在类间划分决策边界,鸢尾花数据集只有三个类别,我们可能只需要2个决策边界
# 通常来说,LDA拟合n个类别的数据集,最多只需要n-1次切割

在这里插入图片描述

(4)降序排列特征值,保留前K个特征向量

'''
第四步、降序排列特征值,保留前K个特征向量
'''

# 保留最好的两个线性判别式子
line_dis = eig_vecs.T[:2]

line_dis

在这里插入图片描述
在这里插入图片描述

(5)使用前几个特征向量,将数据投影到新空间

'''
第五步、使用前几个特征向量,将数据投影到新空间
'''
lda_projection = np.dot(iris_X, line_dis.T)
lda_projection[:5, :]

在这里插入图片描述

def plot(X, y, title, x_label, y_label):
    ax = plt.subplot(111)
    for label,market,color in zip(range(3),('^', 's' , 'o'), ('blue', 'red', 'green')):
        plt.scatter(
            x=X[:, 0].real[y == label],
            y = X[:, 1].real[y == label],
            color=color,
            alpha=0.5,
            label=label_dict[label]
                    )

    plt.xlabel(x_label)
    plt.ylabel(y_label)

    leg = plt.legend(loc='upper right', fancybox=True)
    leg.get_frame().set_alpha(0.5)
    plt.title(title)


# 投影前的鸢尾花数据集
plot(iris_X, iris_y, '投影前的鸢尾花数据集', 'sepal length (cm)', 'sepal width (cm)')

在这里插入图片描述

# 投影后的鸢尾花数据集
plot(lda_projection, iris_y, '投影后的鸢尾花数据集', 'LDA1', 'LDA2')

# 可以看到数据几乎完全突出出来了,因为LDA会绘制决策边界,提供特征向量,从而帮助机器学习模型尽可能的分裂各种花。

在这里插入图片描述

2、scikit-learn中的LDA

import matplotlib as mpl
# 解决中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 从sklearn中导入鸢尾花数据集
from sklearn.datasets import load_iris
import numpy as np
# 导入画图模块
import matplotlib.pyplot as plt
%matplotlib inline


# (1)、加载数据集
iris = load_iris()

# (2)、将数据矩阵和相应变量存储到iris_x和iris_y中
iris_X, iris_y = iris.data, iris.target
label_dict = {i : k for i,k in enumerate(iris.target_names)}

# 导入LDA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# LDA其实是伪装成特征转换算法的分类器
# 和PCA无监督计算不同,LDA会尝试用响应变量,查找最佳的坐标系,尽可能优化类别的可分性
# LDA只有在有响应变量存在的时候才能用
lda = LinearDiscriminantAnalysis(n_components=2)

# 拟合并转换鸢尾花数据集
X_lda_iris = lda.fit_transform(iris_X, iris_y)


def plot(X, y, title, x_label, y_label):
    ax = plt.subplot(111)
    for label,market,color in zip(range(3),('^', 's' , 'o'), ('blue', 'red', 'green')):
        plt.scatter(
            x=X[:, 0].real[y == label],
            y = X[:, 1].real[y == label],
            color=color,
            alpha=0.5,
            label=label_dict[label]
                    )

    plt.xlabel(x_label)
    plt.ylabel(y_label)

    leg = plt.legend(loc='upper right', fancybox=True)
    leg.get_frame().set_alpha(0.5)
    plt.title(title)


# 投影前的鸢尾花数据集
plot(X_lda_iris, iris_y, 'scikit-learn处理的鸢尾花数据集', 'LDA1', 'LDA2')

在这里插入图片描述

# lda的scalings和pca的compents_基本一样,但是转置了_
lda.scalings_

# 解释方差lda.explained_variance_ratio_和手动计算完全相同,不过判别式好像之前手动计算的特征向量完全不同,这是因为scikit-learn进行了标量缩放
# 和PCA一样,投影是原始列的一个线性组合
# LDA和PCA一样,会去除特征的相关性
# PCA和LDA的主要区别在于:PCA是无监督方法,捕获整个数据集的方差;而LDA是有监督的方法,通过响应变量来捕获类别的可分性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计JAVA实验教学过程管理平台

[附源码]计算机毕业设计JAVA实验教学过程管理平台 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

【Hack The Box】linux练习-- Magic

HTB 学习笔记 【Hack The Box】linux练习-- Magic 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月21日🌴 &#x1f36…

Js逆向教程17-极验滑块 实现加密算法的逻辑

Js逆向教程17-极验滑块 实现加密算法的逻辑 还是和上节课一样,针对这个网址 https://www.geetest.com/demo/slide-float.html 一、加密算法的结果查看 计算u运行后的结果: a45a0551c344b03be428cab551f9755f073e64061c35988a29d6ba70e7d35c8b9e963b63…

全波形反演的深度学习方法: 第二章 正演 (草稿)

本章介绍正演的基础知识. 本贴的目的是进行内部培训, 错误之处较多, 希望不要误导读者. 2.1 弦线波动基本原理 波动方程是正演的基础. 最简单的模型是在一根弦上的波动, 假设如下: 横震动. 例如拨动吉他弦;微小震动. 满足 u(xΔx,t)−u(x,t)≪Δxu(x \Delta x, t) - u(x, t…

Redis学习(三)之 分布式锁详解

1、redis分布式锁相关的可以移步这篇文章redis做分布式锁实战案例详解_酒书的博客-CSDN博客 这里是对该篇文章的加深与补充 2.集群主从切换导致锁丢失问题:在redis主从架构中,写入都是写入到主redis中,主redis会同步数据到slave机器&#x…

Mybatis插件机制

什么是插件机制 插件插件, 就是能在执行某个方法之前加入一些功能代码, 有啥方法能够实现呢?当然是动态代理了, 为啥要使用动态代理应为他是为了写框架扩展性必备的东西。 只要定义一些接口 或者类 就行使用jdk自带的或者CGLIB之…

分布式NoSQL数据库HBase实践与原理剖析(二)

title: HBase系列 第五章 HBase核心原理 5.1 系统架构 注意,其实上图中的HLog应该在HRegionServer里面,而不是在HRegion里面。所以图有点点问题。其实通过后面的物理存储的图也能发现这个问题。 Client 职责 1、HBase 有两张特殊表: .meta.…

力扣 21. 合并两个有序链表 C语言实现

题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题目链接 方法1:遍历 新建一个链表 newList 用于存放合并后的链表,设置一个指针指向该链表最后一个位置的 next&#xff0c…

77.【JavaWeb文件上传和邮件发送04】

JavaWeb(二十五)、文件上传1.准备工作2.实用类介绍3.思维导图:4.正戏开始5.完整代码(二十六)、邮箱发送1.邮箱发送的原理:2.服务器的原理3.下载两个jar包4.基本类:5.全部代码(二十七)、网站注册发送邮件实现(二十五)、文件上传 1.首先创建一个empty项目 2.配置project项目中的…

【JVM】jvm中的栈简介

jvm中的栈简介一、JVM体系结构二、栈是什么?三、栈的特性四、栈帧五、栈的运行原理5.1 运行原理5.2 代码示例5.2.1 方法的入栈和出栈5.2.2 没有捕获异常5.2.3 捕获异常六、栈帧的内部结构七、运行时数据区,哪些部分存在Error和GC?八、本文源码…

boot 创建 https

需要在配置文件中:加入 server:ssl:key-store: classpath:https.keystorekey-store-type: JKSkey-alias: tomcatkey-password: 123456key-store-password: 123456port: 8089 这样原本请求的http,就需要变成https,其他类似 RestController p…

深度学习入门(五十六)循环神经网络——循环神经网络RNN

深度学习入门(五十六)循环神经网络——循环神经网络RNN前言循环神经网络——循环神经网络RNN课件潜变量自回归模型循环神经网络使用循环神经网络的语言模型困惑度(perplexity)梯度裁剪更多的应用RNNs总结教材1 无隐状态的神经网络…

周赛总结--LeetCode单周赛321场 AcWing79场

1. LeetCode单周赛321场 1.1 找出中枢整数 1.1.1 原题链接:力扣https://leetcode.cn/problems/find-the-pivot-integer/ 1.1.2 解题思路: 1、先保存 1-n 的和sum; 2、从 1 开始枚举,判断前 i 项和 cmp 与 sum - cmp i 是否相等…

MySQL第二弹

目录​​​​​​​ 一、数据库基本操作 1、查看数据库信息 2、查看数据库中的表信息 3、显示数据表的结构(字段) 4、常见的数据类型 4.1 数值类型 4.2 日期和时间类型 4.3 字符串类型 二、SQL语言概述 1、SQL语言 2、SQL分类 2.1 DDL:数据定…

【强化学习论文合集】NeurIPS-2021 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现…

js——高阶函数、闭包、递归以及浅拷贝和深拷贝

目录 一、高阶函数 1、什么是高阶函数 2、把一个函数作为参数 3、return 返回的也是一个函数 二、闭包 1、闭包是什么 2、变量的作用域 3、案例 4、结果展示: 5、总结: 三、递归 1、什么是递归 2、案例一 3、分析 4、问题 5、栈溢出又是什…

【Unity Shader​】 屏幕后处理5.0:讨论双重模糊的Bloom

接上一篇基于高斯模糊的Bloom继续进行接下来的学习。 1 一些必要的思考* 1.1 关于高质量Bloom 前面提到了,Bloom对于游戏必不可少的效果之一,于是我们不仅仅要把Bloom效果实现出来,效果的质量好坏就更加是我们需要关注的点了。高质量泛光&a…

面试宝典之C++多态灵魂拷问

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、重载,隐藏/重定义,覆盖/重写二、多态的原理三、inline可以是虚函数吗四、静态成员函数可以是虚函数吗五、构造函…

海丝一号-中国-2020

2020年12月22日,由中国电科38所和天仪研究院联合研制的我国首颗商业SAR卫星“海丝一号”搭载长征八号运载火箭在文昌卫星发射中心成功发射。海丝一号历时一年完成研制,整星重量小于185kg,成像最高分辨率1m,可以全天时、全天候对陆…

章节5 文件与目录管理

5-Linux文件和目录管理 (Linux操作系统-2022的前面章节都为铺垫) 常见命令格式 Command Options Arguments 命令 选项 参数 rm -rf /* -一个字母或字母组合,此选项为短选项,–单词,此选项为长选项 Options选项&…