特征工程(六)—(1)利用PCA进行特征转换

news2025/7/14 15:30:19

(1)鸢尾花数据集的手动处理

PCA利用了协方差矩阵的特征值分解

过程如下:
(1)创建数据集的协方差矩阵
(2)计算协方差矩阵的特征值
(3)保留前K个特征值(按照特征值降序排列)
(4)要保留的特征向量转换新的数据点

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 matplotlib.pyplot as plt
%matplotlib inline
# (1)、加载数据集
iris = load_iris()

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

print('要预测的花的名字:', iris.target_names)
print('预测的特征名称:', iris.feature_names)


要预测的花的名字: ['setosa' 'versicolor' 'virginica']
预测的特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
label_dict = {i : k for i,k in enumerate(iris.target_names)}
print(label_dict)

{0: 'setosa', 1: 'versicolor', 2: 'virginica'}
# 定义函数,画出其中两个特征的散点图
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, 'original iris data', 'sepal length (cm)', 'sepal width (cm)')

在这里插入图片描述

2、手动PCA处理

1、创建数据集的协方差矩阵

# 然后在数据集上执行PCA
# 第一步、创建数据集的协方差矩阵
import numpy as np

# 计算均值向量
mean_vector = iris_X.mean(axis=0)
print('均值向量: ',mean_vector)

# 计算协方差矩阵
cov_mat = np.cov((iris_X).T)
print('协方差矩阵: ', cov_mat)

在这里插入图片描述

2、计算协方差矩阵的特征值

# 第二步、计算协方差矩阵的特征值

# 计算鸢尾花数据集的特征向量和特征值
eig_val_cov, eig_vec_cov = np.linalg.eig(cov_mat)

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

3、保留前K个特征值(按照特征值降序排列)

# 第三步、按照降序保留前K个特征值

# 使用碎石图,显示每个主成分解释数据总方差的百分比
explained_variance_ratio = eig_val_cov / eig_val_cov.sum()

# 可以看出,4个主成分解释的部分有很大的差异,第一个主成分可以解释方差的92%以上
explained_variance_ratio

在这里插入图片描述

# 利用碎石图进行可视化
plt.plot(np.cumsum(explained_variance_ratio))
plt.title('Scree Plot')
plt.xlabel('主成分')
plt.ylabel('累积方差')

在这里插入图片描述

4、要保留的特征向量转换新的数据点

# 从图中可以看出,前两个主成分占据了原始方差的98%,意味着可以只用前两个特征向量作为新的主成分
# 这样将数据集缩小了一半,而且保持了特征的完整性,加速了性能

# 第四步、使用保留的特征向量转换新的数据点

# 保存两个特征向量
top_2_eigenvectors = eig_vec_cov[:, :2].T

# 转置,每行是一个主成分,两行代表两个主成分
top_2_eigenvectors

在这里插入图片描述

(2)scikit-learn中PCA

# 从scikit-learn的分解模块导入
from sklearn.decomposition import PCA
import numpy as np

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 matplotlib.pyplot as plt
%matplotlib inline

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

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

# 实例化有2个组件的PCA对象
pca = PCA(n_components=2)

# 拟合数据
pca.fit(iris_X)


# 查看pca的属性components_和 手动计算的top_2_eigenvectors 是否匹配
print(pca.components_)


# 可以看到第二个主成分是之前计算值的负数,不过在这没有问题,因为这两个特征都有效,而且也是不相关的

在这里插入图片描述

label_dict = {i : k for i,k in enumerate(iris.target_names)}
# 将数据投影到新的二维平面上
pca.transform(iris_X)[:5,]

# 结果和手动计算的不同,因为scikit-learn中的pca会在预测阶段将数据中心化,从而改变结果
'''
中心化和缩放对PCA的影响:
为什么不在计算特征向量就进行中心化操作,这是因为,原始矩阵和中心化后矩阵的协方差矩阵相同,因此它们的特征值分解也相同.因此,scikit-learn
的PCA不会对数据进行中心化,因为无论是否进行中心化操作,结果都一样.

缩放是指对数据进行中心化,并且除以标准差.
缩放后,与中心化的主成分不同,解释方差的百分比会比之前低得多,因为数据进行缩放后,列和列的协方差会更加一致,而不是集中在一个主成分中.

'''

在这里插入图片描述

# 绘制鸢尾花数据集,比较投影前和投影后的样子
# 定义函数,画出其中两个特征的散点图
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)

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

# 提取每个主成分解释的方差量
pca.explained_variance_ratio_


# pca主要优点之一:消除相关特征
# 本质上,特征值分解时候,得到所有的主成分都互相垂直,意思是批次线性无关
# 很多机器学习模型假设输入的特征是相互独立的,因此消除相关特征的好处很大,我们可以利用pca来确保这一点

在这里插入图片描述

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

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

相关文章

js实现瀑布流

我们浏览网站的时候尤其是图片网站,我们会发现大大小小的图片,紧密的排列在一起,就像瀑布一样看着非常舒服,虽然css可以通过cloums来指定, 像我们这次的图片项目用的就是css实现的,最后布局是用grid布局写的…

【Spring(一)】如何获取对象(Bean)

目录 一、前言 二、Spring的下载 三、快速入门 四、IOC(控制反转) 五、创建XML配置文件 六、获取Bean   1. 按类型来获取Bean   2. 按id来获取Bean   3. 按idclass来获取Bean   4. 默认的一种特殊方式获取Bean   5. 有关id的一些说明 相关文章 Serv…

cpu设计和实现(流水线上的第一条指令)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 读书的时候,《计算机组成原理》也看了,《计算机体系结构》也学了,老师也给我们讲了各种各样的流水线知识&#…

Spring框架笔记

Spring51. 什么是Spring框架1.1 spring的特点2. IOC2.1 什么是IOC2.2. 基于xml的IOC2.2.1 创建对象2.2.2 给创建的对象赋值2.2.2.1 使用setter方法注入2.2.2.2 使用构造方法注入2.3 基于注解IOC2.3.1 创建对象的注解2.3.2 依赖注入的注解2.3.3 添加包扫描2.3.3.1 添加包扫描多种…

小目标检测:基于切图检测的yolov5小目标训练

目前在目标检测方面有着众多的检测框架,比如两阶段的FasterRcnn、以及yolo系列的众多模型。yolo系列在实际中用的最多,一方面性能确实不错,另一方面具有着较多的改进型系列。今天我们主要使用的yolov5系列。具体原理过程就不多说了&#xff0…

数字化助力生产制造管理:家具行业管理系统

中国家具产业经过近 40 年的发展,占到世界家具生产 1 /4 强,是全球生产和出口第一大国,在世界上有着广泛的影响和关注。中国家具产业也是国民经济的重要支柱产业,2018 年总产值达到16 000 亿元,占中国 GDP 2%多。 然而…

数据库高级 IV

数据库高级 IV 二分查找算法 定义 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列前提要求:1. 线性表必须采用顺序存…

[附源码]计算机毕业设计JAVA火车票预订系统2022

[附源码]计算机毕业设计JAVA火车票预订系统2022 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybat…

[附源码]SSM计算机毕业设计智能超市导购系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

STM32所有系列keil 开发包的下载链接 - Keil.STM32Fxxx_DFP.x.x.x.pack

文章目录1、官网下载链接及操作步骤2、关于Keil官网下载芯片包的网速很慢的解决办法1、官网下载链接及操作步骤 安装Keil之后,需要安装芯片包,但是在软件上面点击下载安装,会非常慢。还不如自己到官网下载的快。 官网下载地址:…

longjmp导致局部变量丢失

0 总结 longjmp与setjmp语句之间的变量赋值会丢失。变量须满足&#xff1a; 在调用setjmp函数中的局部变量&#xff08;栈变量&#xff09; &#xff0c;全局变量不受影响非volatile 解决方法&#xff1a;加volatile 1 问题复现 #include <setjmp.h> #include <s…

H5的基础

网页的学名称作HTML文件&#xff0c;是一种可以在www网上传输&#xff0c;并被浏览器认识和翻译成页面显示出来的文件。 HTML是&#xff1a;Hypertext Marked Language即超文本标记语言&#xff0c;是一种用来制作超文本文档的简单标记语言 超文本就是指页面内可以包含图片&…

六十分之九十——沉迷期的突破

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.得到"逻辑思维"、吴军硅谷来信…

WebRTC GCC 拥塞控制算法(REMB-GCC)

目录 一. 前言 二. REMB-GCC算法原理 1. 接收端基于延时梯度的带宽预估 &#xff08;1&#xff09;Arrival-time filter &#xff08;2&#xff09;Overuse Detector &#xff08;3&#xff09;Adaptive threshold &#xff08;4&#xff09;Remote Rate Controller &a…

【SQL】之索引

【SQL】之索引简单的索引设计方式innodb中的索引设计方式迭代一次迭代两次迭代三次btree聚簇索引二级索引&#xff08;非聚簇&#xff09;联合索引&#xff08;非聚簇&#xff09;InnoDB的B树索引的注意事项myISAM中索引设计方案索引是帮助mysql高效获取数据的数据结构简单的索…

查询

一、顺序查询 普通查找方式&#xff1a; int SeqSearch(int a[],int n,int k) {int i 0;while (i < n && a[i] ! k)i;if (i > n)return 0;elsereturn i 1; } 优化版查找方式&#xff1a; int OPSeqSearch(int a[], int n, int k) {int i 0;a[n] k;while …

全志A33使用主线U-Boot方法

最近在研究A33主线相关的资源&#xff0c;目前主线uboot和内核都对A33有极好的支持了&#xff0c;所以现在把我在使用过程中遇到的问题和使用方法做个记录&#xff0c;首先是下载主线uboot源码&#xff0c;网址为https://ftp.denx.de/pub/u-boot/&#xff0c;我下载的版本为202…

点云 ICP学习-IterativeClosestPoint

目录 一、pcl中 点云配准算法 二、关于svd原理求解部分 三、pcl IterativeClosestPoint 完成demo 一、pcl中 点云配准算法 PCL 库中 ICP 的接口及其变种&#xff1a; 点到点&#xff1a;pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >点到面&…

RocketMQ——Mac电脑OS系统docker安装Dashboard

文章目录引言安装下载dashboard镜像docker pull镜像查看镜像运行容器启动容器查看容器日志问题解决方案解决方案说明登录dashboard界面关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。引言 前面的文章已经介绍过如何在OS系统上安装并启动使用RocketMQ&…

Canal 安装与入门

MySQL Binlog 简介 https://blog.csdn.net/weixin_44371237/article/details/127904514 MySQL 主从复制过程 1&#xff09;Master 主库将改变记录&#xff0c;写到二进制日志(Binary Log)中&#xff1b; 2&#xff09;Slave 从库向 MySQL Master 发送 dump 协议&#xff0c…