机器学习——主成分分析PCA

news2024/11/25 10:34:31

机器学习——主成分分析PCA

文章目录

  • 前言
  • 一、原理
    • 1.1. PCA介绍
    • 1.2. 算法步骤
  • 二、代码实现
    • 2.1. 基于numpy实现
    • 2.2. 使用sklearn实现
    • 2.3. 观察方差分布
    • 2.4. 指定方差百分比求分量数
  • 三、优,缺点
    • 3.1. 优点
    • 3.2. 缺点
  • 总结


前言

当面对一个特征值极多的数据集时,使用PCA方法可以帮助降低数据的维度,从而减少特征值的数量。帮助我们更好的对数据进行分析。本文将介绍一下PCA算法。


在这里插入图片描述

一、原理

1.1. PCA介绍

PCA(Principal Component Analysis),即主成分分析算法,又称主分量分析。一种常用的降维技术,用于将高维数据转换为低维表示,同时保留最重要的信息。

它通过线性变换将原始数据投影到一组新的正交特征向量上,这些特征向量称为主成分。

每个主成分都具有不同的方差,通常按照方差的大小进行排序,方差越大的主成分所包含的信息越多。

通过选择前k个主成分,可以实现数据的降维,保留数据集的对方差贡献最大的几个特征,尽可能保留原始数据的信息。

注意:
经过PCA降维后,得到的主成分是新的特征,不再是原有的特征。
PCA的目标是通过线性变换将原始数据投影到一个新的低维空间中,新的特征是原始特征的线性组合

其实按我的理解,降维后得到的新特征就相当于原有特征经多项式线性回归后得到的结果,(也就是各个原有特征乘以它们对应的“权重系数”再相加得到的值)

1.2. 算法步骤

以下是PCA算法的详细步骤:

  1. 标准化数据:如果原始数据的各个特征具有不同的量纲,则需要对数据进行标准化处理,使得每个特征具有相同的量纲。(这是因为要计算协方差矩阵)

  2. 计算协方差矩阵:协方差矩阵反映了不同特征之间的相关性。通过计算标准化后的数据的协方差矩阵,可以得到特征之间的相关性信息

  3. 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示每个主成分所包含的方差特征向量表示主成分的方向

  4. 选择主成分:按照特征值的大小进行排序,选择前k个特征值对应的特征向量作为主成分。

  5. 创建参数矩阵: 将选定的主成分(特征向量)组成一个参数矩阵。

  6. 数据投影:将标准化后的数据乘以参数矩阵,得到降维后的数据。

二、代码实现

2.1. 基于numpy实现

#加载iris数据集
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
data = iris["data"]
target = iris["target"]
df = pd.DataFrame(data=np.c_[iris["data"],iris["target"]],columns=list(iris["feature_names"] + ["target"]))
X = df.copy()
Y = X.pop("target")


#数据标准化
X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0)

# 计算变量之间的协方差矩阵(故要转置矩阵)
cov = np.cov(X_std.T)

#计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov)

#通过特征值对特征向量排序
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))]
eig_pairs.sort(reverse=True)

#假设主成分的数量为2,则参数矩阵W:
W = np.hstack((eig_pairs[0][1].reshape(4,1),
               eig_pairs[1][1].reshape(4,1)))
               
print(W)
[[ 0.52106591 -0.37741762]
 [-0.26934744 -0.92329566]
 [ 0.5804131  -0.02449161]
 [ 0.56485654 -0.06694199]]

    
#将X_std与W相乘,得到降维后的x_pca
x_pca = np.dot(X_std,W)

#组合降维结果和标签数据
df_pca = pd.DataFrame(
    data=x_pca,
    columns= ["pca1","pca2"]
)
df_pca["target"] = Y
#print(df_pca)

2.2. 使用sklearn实现

import numpy as np
import pandas as pd
#使用sklearn标准化数据
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
X_std = std.fit_transform(X)

#使用sklearn的pca算法
from sklearn.decomposition import PCA
pca = PCA(n_components= 2) #n_components 表示降维后的特征数(即主成分数)
x_pca = pca.fit_transform(X_std)

df_pca = pd.DataFrame(
    data=x_pca,
    columns= ["pca1","pca2"]
)
df_pca["target"] = Y

2.3. 观察方差分布

##观察方差分布
results = pd.DataFrame(
    {"variance_ratio": pca.explained_variance_ratio_}
)
results["cumulative"] = results["variance_ratio"].cumsum()    #如在这个示例中,这2个成分的方差总占比(累积比率)为0.958132 
results["component"] = results.index +1
print(results)
   variance_ratio  cumulative  component
0        0.729624    0.729624          1
1        0.228508    0.958132          2

#查看原始特征的线性组合
print(pca.components_)
[[ 0.52106591 -0.26934744  0.5804131   0.56485654]
 [ 0.37741762  0.92329566  0.02449161  0.06694199]]

2.4. 指定方差百分比求分量数

#指定方差百分比计算分量数
pca = PCA(n_components= 0.90)
data_pca = pca.fit_transform(X_std)
print(pca.n_components_) #查看所需分量数
2
#由此可知要满足方差比率为0.90,最少要有2个主成分

另外,对于PCA() 函数中的 n_components参数,当 0 < n_components < 1 ,为小数时是填写所要求的方差比率;当为整数时,才是指定降维后的特征数。

三、优,缺点

3.1. 优点

PCA算法在降低数据维度、保留数据信息、去除冗余信息等方面有很好的效果

3.2. 缺点

  1. 数据线性相关性:PCA假设数据是线性相关的,对于非线性相关的数据,PCA的效果可能不理想。在处理非线性数据时,可以考虑使用其他非线性降维方法,如核主成分分析等。

  2. 特征解释性:降维后的特征是原始特征的线性组合,可能难以解释。因为降维后的特征往往没有直接的物理或业务含义。

  3. 数据标准化:PCA对数据的尺度敏感,需要对数据进行标准化处理,以确保各个特征具有相同的重要性。


总结

本文从PCA的原理解释到算法步骤,再到最后的基于python的代码实现,对主成分分析PCA算法进行了详细介绍。并且最后分析了PCA算法的局限性。

飘飘乎如遗世独立 羽化而登仙。

–2023-9-2 筑基篇

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

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

相关文章

【核磁共振成像】观共享重建

目录 一、K空间关键孔技术-数据采集二、BRISK技术三、TRICKS技术四、实时成像和滑动窗重建五、心电触发电影(CINE)采集六、分段心脏采集和观共享 一、K空间关键孔技术-数据采集 对于笛卡尔K空间&#xff0c;一个相位编码行有时称为一个K空间观。一般情况下&#xff0c;每帧图像…

电源模块的降额曲线

大家好&#xff0c;这里是大话硬件。 今天想写这篇文章来分享在前段时间了解的一个知识点——电源模块的降额曲线。 为什么要写这个呢&#xff1f;对于专门做电源的同学来说&#xff0c;肯定觉得很简单。但是对于一个非电源行业的人来说&#xff0c;曲线应该如何解读&#xff…

春秋云镜 CVE-2018-1273

春秋云镜 CVE-2018-1273 Spring-data-commons 远程命令执行漏洞 靶标介绍 Spring Data是一个用于简化数据库访问&#xff0c;并支持云服务的开源框架&#xff0c;Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中&…

leetcode 1859.将句子排序

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;将句子排序 代码&#xff1a; class Solution { public:string sortSentence(string s) {vector<string> record;record.resize(9);string curString;for (auto val : s) {if (isdigit(val)) {record[ val - 0 - …

Linux内核基础知识

1.arm设备的启动过程 x86、Interl windows 启动过程: 电源 ---- >BIOS----->windows内核 --->文件系统(C盘、D盘) ---->应用程序启动嵌入式产品: 树莓派、mini2440、manopi、海思、RK(瑞芯微)等启动过程: 电源-->bootloader (引导操作系统启动) -->linux内…

【人工智能】—_一阶逻辑、量词的推理规则、一般化分离规则、合一、前向_反向链接算法、归结算法

文章目录 量词的推理规则全称量词实例化存在量词实例化 简化到命题逻辑推理Generalized Modus Ponens&#xff08;一般化分离规则&#xff09;举例 合一Forward chaining 前向链接算法示例 Backward chaining algorithm 反向链接算法一般FOL的FC/BC的完整性 归结算法归结推理规…

CEF内核和高级爬虫知识

(转)关于MFC中如何使用CEF内核&#xff08;CEF初解析&#xff09; Python GUI: cefpython3的简单分析和应用 cefpython3&#xff1a;一款强大的Python库 开始大多数抓取尝试可以从几乎一行代码开始&#xff1a; fun main() PulsarContexts.createSession().scrapeOutPages(&q…

PMP中常用英文术语

常用术语&#xff08;五&#xff09; Project 项目 为完成一个唯一的产品或服务的一种一次性努力。 Project Charter 项目许可证 由高级管理部门提供的一个文档&#xff0c;它给项目经理特权把组织的资源应用到项目工作中。 Project Communication Management 项目沟通管理 项目…

3D视觉测量:面对面的对称度 点对(附源码)

文章目录 0. 测试效果1. 基本内容2. 3D视觉测量对称度测量思路3. 代码实现4. 参考文章目录:3D视觉测量目录微信:dhlddxB站: Non-Stop_目标:通过3D视觉方法计算面对面的对称度0. 测试效果 数据说明:此测试点云是通过UG建模,Meshlab降采样得到,数据比较理想,仅作为测试使用…

Blazor前后端框架Known-V1.2.14

V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

ASIC-WORLD Verilog(16)综合

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加点自己的理解&#xff09;分享给大家。 这是网站原文&…

HTML基础代码

以下是HTML基础代码&#xff1a; <!DOCTYPE html> <html> <head><title>网页标题</title> </head> <body><h1>这是一级标题</h1><p>这是一个段落。</p><img src"图片路径" alt"图片描述…

PNG图片压缩原理

png&#xff1f;&#xff1f;png的图片我们每天都在用&#xff0c;可是png到底是什么&#xff0c;它的压缩原理是什么&#xff1f; 很好&#xff0c;接下来我将会给大家一一阐述。 什么是PNG PNG的全称叫便携式网络图型&#xff08;Portable Network Graphics&#xff09;是…

一文讲清楚redis的线程池jedis

背景 在shigen实习的时候&#xff0c;遇到了日志系统的性能优化问题&#xff0c;当时的优化点就是&#xff1a;使用redis的线程池&#xff0c;实现并发状态下的性能优化。但是找了很多的技术方案&#xff0c;发现redis的线程池配置起来比较麻烦。正巧&#xff0c;这个周末shig…

arthas常用命令,排查cpu和内存场景

常用命令 命令&#xff1a;dashboard 查看jvm总体信息&#xff0c;包括线程&#xff0c;内存和运行环境 命令&#xff1a;monitor monitor -c 5 com.liubike.ta.controller.service.ApiService newString "param[1]2"每5秒统计一次监控方法被调用的次数 命令&…

numpy矩阵求MSE

MSE loss #官方示例 from sklearn.metrics import mean_squared_error y_true [[0.5, 1],[-1, 1],[7, -6]] y_pred [[0, 2],[-1, 2],[8, -5]] mean_squared_error(y_true, y_pred) #0.708验证 import numpy as np A np.array(y_true) B np.array(y_pred)mse (np.square…

【图解RabbitMQ-1】图解消息队列是什么玩意儿?它的应用场景有哪些?

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

NeoVim 安装

一、NeoVim 是什么&#xff1f; hyperextensible Vim-based text editor 译&#xff1a;基于超可扩展Vim的文本编辑器 二、如何安装NeoVim 1.brew 安装 注&#xff1a;brew 是 MacOS 上的包管理工具&#xff0c;即该命令一般情况下只适用于 Mac 电脑 brew install neovim如果…

4.Flasgger-接口文档化

一.下载安装 pip install flasgger0.9.7.1二.基本使用 from flask import Flask, jsonify from flasgger import Swaggerapp Flask(__name__) swagger Swagger(app)app.route(/colors/<palette>/) def colors(palette):"""Example endpoint returnin…

git co 命令是什么意思,用法是怎么样的

偶然看到同事使用 git co feat/xxx 来操作 git&#xff0c;以为 co 是什么 git 新命令&#xff0c;看起来很牛逼&#xff0c;所以问了下 chatgpt&#xff0c;chatgpt 的回答如下&#xff1a; git co 是 git checkout 的缩写形式&#xff0c;需要在Git的全局配置或别名配置中启用…