当前位置: 首页 > news >正文

PCA主成分分析算法

在数据分析中,如果特征太多,或者特征之间的相关性太高,通常可以用PCA来进行降维。比如通过对原有10个特征的线性组合, 我们找出3个主成分,就足以解释绝大多数的方差,该算法在高维数据集中被广泛应用。

算法(没时间看版本)

  • 将数据标准化,即把所有数据转换以原点为中心;
  • 划一条通过原点的直线,将所有点投影到该直线上,然后计算这些投影点到原点的距离平方和。设想我们不停的转动该直线,最终找到一条直线使得这个距离平方和最大,也就是该直线最接近所有的点,该直线为特征向量的方向,称为PC1,这个距离平方和即为特征值;
  • 按同样的方法,找到第二条直线,该直线与PC1垂直且距离平方和最大,为PC2;
  • 重复该过程直到找到所有的PC;
  • 根据需求,确定头部的几个PC可以解释绝大多数方差。

下面先给出几个相关的概念。


协方差和散度矩阵

样本均值:
x ˉ = 1 n ∑ i = 1 N x i \bar{x} = \frac{1}{n} \sum_{i=1}^N x_i xˉ=n1i=1Nxi
样本方差:
S 2 = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) 2 S^2=\frac{1}{n-1} \sum_{i=1}^n {(x_i-\bar{x})}^2 S2=n11i=1n(xixˉ)2
样本X和样本Y的协方差:
C o v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) Cov(X,Y)=E[(X-E(X))(Y-E(Y))]=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y}) Cov(X,Y)=E[(XE(X))(YE(Y))]=n11i=1n(xixˉ)(yiyˉ)

  1. 方差的计算是针对一维特征的,即针对同一特征不同样本的取值来进行计算得到;而协方差必须要求至少满足二维特征;方差是协方差的特殊情况。
  2. 方差和协方差的除数是 n − 1 n-1 n1,这是为了得到方差和协方差的无偏估计。
    协方差为正时,说明X和Y是正相关关系;为负时负相关关系;为0时相互独立。 C o v ( X , X ) Cov(X,X) Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差实际上是协方差矩阵(对称方阵)。

散度矩阵
S = ∑ k = 1 n ( x k − m ) ( x k − m ) T S=\sum_{k=1}^{n}(x_k-m)(x_k-m)^T S=k=1n(xkm)(xkm)T
其中 m = 1 n ∑ k = 1 n x k m=\frac{1}{n}\sum_{k=1}^{n}x_k m=n1k=1nxk
对于数据X的散度矩阵为 X X T XX^T XXT。其实协方差矩阵和散度矩阵关系密切,散度矩阵就是协方差矩阵乘以(总数据量-1)。因此它们的特征值和特征向量是一样的。同时散度矩阵是SVD奇异值分解的一步,因此PCA和SVD有密切关系。


特征值分解矩阵原理

  1. 特征值与特征向量
    如果一个向量v是矩阵A的特征向量,则一定可以表示成下面的形式:
    A v = λ v Av=\lambda v Av=λv
    其中, λ \lambda λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。
  2. 特征值分解矩阵
    对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:
    A = Q ∑ Q − 1 A=Q\sum Q^{-1} A=QQ1
    其中,Q是矩阵A的特征向量组成的矩阵, ∑ \sum 则是一个对角阵,对角线上的元素就是特征值。

SVD分解矩阵原理

奇异值分解是一个能使用任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:
A = U ∑ V T A=U\sum V^T A=UVT
假设A是一个 m × n m\times n m×n矩阵,那么得到的U是一个 m × m m\times m m×m的方阵,U里面的正交向量被称为左奇异向量。 ∑ \sum 是一个 m × n m\times n m×n矩阵, ∑ \sum 除了对角线其他元素都为0.对角线上的元素称为奇异值。 V T V^T VT是V的转置矩阵,是一个 n × n n\times n n×n的方阵,它里面的正交向量被称为右奇异值向量。通常 ∑ \sum 上的值按从大到小的顺序排列。

SVD算法:

  • A A T AA^T AAT的特征值和特征向量,用单位化的特征向量构成U;
  • A T A A^TA ATA的特征值和特征向量,用单位化的特征向量构成V;
  • A A T AA^T AAT或者 A T A A^TA ATA的特征值求平方根,然后构成 ∑ \sum

基于特征值分解协方差矩阵实现PCA算法

输入:数据集 X = x 1 , x 2 , x 3 , . . . , x n X={x_1,x_2,x_3,...,x_n} X=x1,x2,x3,...,xn,需要降到k维。

1.去平均值(即去中心化),即每一位特征减去各自的平均值。
2.计算协方差矩阵 1 n X X T \frac{1}{n}XX^T n1XXT,注:这里除或不除样本数量 n n n n − 1 n-1 n1,其实对求出的特征向量没有影响。
3.用特征值分解方法求协方差矩阵 1 n X X T \frac{1}{n}XX^T n1XXT的特征值与特征向量。
4.对特征值从大到小排序,选择其中最大的k个。然后将对应的k个特征向量分别作为行向量组成特征向量矩阵P。
5.将数据转换到k个特征向量构建的新空间中,即 Y = P X Y=PX Y=PX


基于SVD分解协方差矩阵实现PCA算法

输入:数据集 X = x 1 , x 2 , x 3 , . . . , x n X={x_1,x_2,x_3,...,x_n} X=x1,x2,x3,...,xn,需要降到k维。

1.去平均值(即去中心化),即每一位特征减去各自的平均值。
2.计算协方差矩阵 1 n X X T \frac{1}{n}XX^T n1XXT,注:这里除或不除样本数量 n n n n − 1 n-1 n1,其实对求出的特征向量没有影响。
3.用SVD分解方法求协方差矩阵 1 n X X T \frac{1}{n}XX^T n1XXT的特征值与特征向量。
4.对特征值从大到小排序,选择其中最大的k个。然后将对应的k个特征向量分别作为行向量组成特征向量矩阵。
5.将数据转换到k个特征向量构建的新空间中。

相关文章:

PCA主成分分析算法

在数据分析中,如果特征太多,或者特征之间的相关性太高,通常可以用PCA来进行降维。比如通过对原有10个特征的线性组合, 我们找出3个主成分,就足以解释绝大多数的方差,该算法在高维数据集中被广泛应用。 算法&#xff08…...

Hyperledger Fabric 权限策略和访问控制

访问控制是区块链网络十分重要的功能,负责控制某个身份在某个场景下是否允许采取某个操作(如读写某个资源)。 常见的访问控制模型包括强制访问控制(Mandatory Access Control)、自主访问控制(Discretionar…...

Day28 回溯算法part04 93. 复原IP地址 78. 子集 90. 子集 II

回溯算法part04 93. 复原IP地址 78. 子集 90. 子集 II 93. 复原 IP 地址 class Solution { private:vector<string> result;bool isValid(string& s,int start,int end){if (start > end) return false;if (s[start] 0 && start ! end) { // 0开头的数…...

Linux系统常用的安全优化

环境&#xff1a;CentOS7.9 1、禁用SELinux SELinux是美国国家安全局对于强制访问控制的实现 1)永久禁用SELinux vim /etc/selinux/config SELINUXdisabled #必须重启系统才能生效2&#xff09;临时禁用SELInux getenforce #查看SELInux当前状态 setenforce 0 #数字…...

Vue-4、单向数据绑定与双向数据绑定

1、单向数据绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>数据绑定</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/…...

【Flutter 开发实战】Dart 基础篇:常用运算符

在Dart中&#xff0c;运算符是编写任何程序的基本构建块之一。本文将详细介绍Dart中常用的运算符&#xff0c;以帮助初学者更好地理解和运用这些概念。 1. 算术运算符 算术运算符用于执行基本的数学运算。Dart支持常见的加、减、乘、除、整除以及取余运算。常见的算数运算符如…...

C++:ifstream通过getline读取文件会忽略最后一行空行

getline是读取文件的常用函数,虽然使用简单,但是有一个较容易被忽视的问题,就是文件最后一行空行会被忽略。 #include <iostream> #include <fstream> #include <string> using namespace std;void readWholeFileWithGetline(string fileName) {string t…...

力扣123. 买卖股票的最佳时机 III

动态规划 思路&#xff1a; 最多可以完成两笔交易&#xff0c;因此任意一天结束后&#xff0c;会处于5种状态&#xff1a; 未进行任何操作&#xff1b;只进行了一次买操作&#xff1b;进行了一次买操作和一次卖操作&#xff1b;再完成了一次交易之后&#xff0c;进行了一次买操…...

Vue3:vue-cli项目创建

一、node.js检测或安装&#xff1a; node -v node.js官方 二、vue-cli安装&#xff1a; npm install -g vue/cli # OR yarn global add vue/cli/*如果安装的时候报错&#xff0c;可以尝试一下方法 删除C:\Users**\AppData\Roaming下的npm和npm-cache文件夹 删除项目下的node…...

C# .Net学习笔记—— 异步和多线程(Task)

一、概念 Task是DotNet3.0之后所推出的一种新的使用多线程的方式&#xff0c;它是基于ThreadPool线程进行封装的。 二、使用多线程的时机 任务能够并发运行的时候&#xff0c;提升速度&#xff1b;优化体验 三、基本使用方法 private void button5_Click(object sender, Ev…...

Python从入门到网络爬虫(读写Excel详解)

前言 Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。最常用的Excel处理库有xlrd、xlwt、xlutils、xlwings、openpyxl、pandas&#xff0c;下面是各个模块的支持情况&#xff1a; 工具名称.xls.xlsx获取文件内容写入…...

Mysql之子查询、连接查询(内外)以及分页查询

目录 一.案例&#xff08;接上篇博客&#xff09; 09&#xff09;查询学过「张三」老师授课的同学的信息 10&#xff09;查询没有学全所有课程的同学的信息 11&#xff09;查询没学过"张三"老师讲授的任一门课程的学生姓名 12&#xff09;查询两门及其以上不及格课程…...

计算机的存储单位

在计算机中&#xff0c;只能识别二进制。 byte是1个字节&#xff0c;是8个比特位&#xff0c;所以byte可以存储的最大值是&#xff1a;01111111&#xff0c;byte是 [-128 ~ 127] 共可以标识256个不同的数字。 1字节 8bit&#xff08;8比特&#xff09;--> 1byte 8bit 类…...

设备树文件中的设备节点

一. 简介 前面几篇文章学习了 关于设备树文件的编译&#xff0c;设备树文件的调用。 本文开始学习 设备树文件的语法。具体学习设备节点与标准属性。 二. 设备树文件之设备节点与标准属性 1. 设备节点 设备树 是采用树形结构来描述板子上的设备信息的文件&#xff0c;每…...

文件管理工具.netcore资源文件管理

文件管理工具 怎么快速有效的管理我的文件包括文件夹&#xff0c;需求功能是 模糊搜索显示匹配的文件夹或文件数据 快速打开文件夹位置 在windows直接查看搜索速度太慢&#xff0c;范围宽泛&#xff0c;整理所需资源文件名和文件本机路径保存在数据库&#xff0c;可以在数据库中…...

go-carbon v2.3.4 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…...

vue3 内置组件

文章目录 前言一、过渡效果相关的组件1、Transition2、TransitionGroup 二、状态缓存组件&#xff08;KeepAlive&#xff09;三、传送组件&#xff08;Teleport &#xff09;四、异步依赖处理组件&#xff08;Suspense&#xff09; 前言 在vue3中 其提供了5个内置组件 Transiti…...

MFC如何动态创建button按钮并添加点击事件

在MFC中&#xff0c;可以使用CButton类来动态创建按钮。下面是一个示例代码&#xff0c;演示了如何动态创建按钮并添加点击事件&#xff1a; 在对话框类的头文件中声明按钮变量&#xff1a; CButton m_btnDynamic;在对话框的OnInitDialog()函数中使用Create()函数创建按钮&am…...

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML&#xff1f; QML是一种用户界面规范和编程语言。它允许开发人员…...

Python+Flask+MySQL的图书馆管理系统【附源码,运行简单】

PythonFlaskMySQL的图书馆管理系统【附源码&#xff0c;运行简单】 总览 1、《的图书馆管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 注册2.3 程序主页面2.4 图书新增界面2.5 图书信息修改界面2.6 普通用户界面2.7 其他功能贴图 3、下载 总览…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...