24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的,共有m个数据(x^{(1)},x^{(2)},...,x^{(m)})。我们希望将这m个数据的维度从n维降到k维,希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表示原来的数据呢?

        我们先看看最简单的情况,也就是n=2,K=1,也就是将数据从二维降维到一维。数据如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向,u1和u2,那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出,u1比u2好。

可以有两种解释,第一种解释是样本点到这个直线的距离足够近,第二种解释是样本点在这个直线上的投影能尽可能的分开。

        假如我们把K从1维推广到任意维,我们希望降维的标准为:样本点到这个超平面的距离足够近,或者说样本点在这个超平面上的投影能尽可能的分开。

PCA(主成分分析)是一种统计技术,它通过正交变换将一组可能相关的变量转换为一组线性不相关的变量,称为主成分。这些主成分按照方差的大小排序,第一个主成分具有最大的方差,第二个主成分具有第二大的方差,依此类推。以下是PCA的工作原理和关键步骤:

1. 标准化数据

由于PCA对数据的尺度敏感,因此在进行PCA之前,通常需要对数据进行标准化处理,使得每个特征的均值为0,标准差为1。这一步是必要的,因为PCA依赖于协方差矩阵,而协方差矩阵会因特征的尺度差异而产生偏差。

2. 计算协方差矩阵

在数据标准化之后,计算数据的协方差矩阵。协方差矩阵是一个方阵,其元素表示不同特征之间的协方差。对于数据集 XX(假设已经中心化),协方差矩阵 ΣΣ 定义为:

其中 n 是样本数量。

3. 计算协方差矩阵的特征值和特征向量

协方差矩阵的特征值和特征向量可以提供关于数据结构的重要信息。特征值表示每个特征的方向上的数据方差量,而特征向量表示这些特征的方向。

4. 选择主成分

根据特征值的大小,选择最大的 k 个特征值对应的特征向量。这些特征向量代表了数据中最重要的 k 个主成分。特征值的大小表示了每个主成分的重要性或方差贡献。

5. 构造新的特征空间

使用选定的特征向量作为新特征空间的基,将原始数据投影到这个新的特征空间上。这个过程实际上是将原始数据集转换为一个新的数据集,其中每个数据点由 k 个主成分的线性组合表示。

6. 解释结果

新数据集中的每个维度(即每个主成分)都代表了原始数据集中的某种结构或模式。通常,第一个主成分捕获了数据中最大的方差,第二个主成分捕获了第二大的方差,且与第一个主成分正交。

PCA的应用

  • 降维:通过减少数据的维度来简化数据集,同时保留最重要的信息。
  • 数据可视化:将高维数据投影到二维或三维空间,以便可视化。
  • 去噪:通过去除小的特征值对应的成分来减少数据中的噪声。
  • 特征提取:在机器学习中,PCA可以作为预处理步骤,提取更有意义的特征。

下面是他的代码:

import numpy as np
from scipy.linalg import svdclass PCA:def __init__(self, n_components=None, whiten=False, copy=True):self.n_components = n_componentsself.whiten = whitenself.copy = copydef fit(self, X, y=None):X = np.asarray(X)if X.ndim == 1:X = X[:, np.newaxis]# Center the dataself.mean_ = np.mean(X, axis=0)X = X - self.mean_# Perform SVDU, S, V = svd(X, full_matrices=False)if self.n_components is None:self.n_components_ = V.shape[1]else:self.n_components_ = min(self.n_components, V.shape[1])# Store the componentsself.components_ = V[:self.n_components_]# Store the explained varianceself.explained_variance_ = S[:self.n_components_]**2 / X.shape[0]return selfdef transform(self, X):check_is_fitted(self)X = np.asarray(X)if X.shape[1] != self.mean_.shape[0]:raise ValueError("Shape of X is different from the shape used to fit the model")X = X - self.mean_return np.dot(X, self.components_.T)def fit_transform(self, X, y=None, **kwargs):self.fit(X)return self.transform(X)def inverse_transform(self, X):check_is_fitted(self)X = np.asarray(X)return np.dot(X, self.components_) + self.mean_def score_samples(self, X):X = self.transform(X)return np.sum(X**2, axis=1)def score(self, X, y=None):# This method is not implemented in this simplified versionpass# Helper function to check if the model is fitted
def check_is_fitted(model):if not hasattr(model, 'components_'):raise ValueError("Model is not fitted")# Example usage
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
pca = PCA(n_components=2)
X_r = pca.fit_transform(X)
print(X_r.shape)  # Output: (150, 2)

1. 导入依赖

import numpy as np
from scipy.linalg import svd

svd用于执行奇异值分解,我有讲过。

2. PCA 类定义

class PCA:def __init__(self, n_components=None, whiten=False, copy=True):self.n_components = n_componentsself.whiten = whitenself.copy = copy

这是 PCA 类的构造函数,它初始化了几个重要的属性:

  • n_components:要保留的主成分数量。如果设置为 None,则保留所有成分。
  • whiten:是否进行白化处理,即是否将主成分的方差缩放到1。
  • copy:是否在处理数据时复制数据,以避免修改原始数据。

3. 拟合方法

def fit(self, X, y=None):X = np.asarray(X)if X.ndim == 1:X = X[:, np.newaxis]# Center the dataself.mean_ = np.mean(X, axis=0)X = X - self.mean_# Perform SVDU, S, V = svd(X, full_matrices=False)if self.n_components is None:self.n_components_ = V.shape[1]else:self.n_components_ = min(self.n_components, V.shape[1])# Store the componentsself.components_ = V[:self.n_components_]# Store the explained varianceself.explained_variance_ = S[:self.n_components_]**2 / X.shape[0]return self

fit 方法用于计算数据的PCA变换:

  • 首先,将数据转换为 numpy 数组,并确保数据是二维的。
  • 计算数据的均值,并中心化数据(减去均值)。
  • 执行SVD,得到 US 和 V 三个矩阵。
  • SVD可以看之前的文章24/11/6 算法笔记 SVD-CSDN博客
  • 根据 n_components 的设置,确定保留的主成分数量。
  • 保存主成分(V 矩阵的列)和解释的方差。

主成分有什么用:

  • PCA可以减少数据的维度,同时保留最重要的特征。这有助于去除噪声和冗余信息,使得数据集更易于管理和分析。

4. 转换方法

def transform(self, X):check_is_fitted(self)X = np.asarray(X)if X.shape[1] != self.mean_.shape[0]:raise ValueError("Shape of X is different from the shape used to fit the model")X = X - self.mean_return np.dot(X, self.components_.T)

transform 方法用于将新数据投影到主成分上:

  • 确保模型已经被拟合。
  • 将输入数据转换为 numpy 数组,并检查数据的形状是否与拟合时的数据一致。
  • 中心化数据。
  • 将数据与主成分的转置矩阵相乘,得到降维后的数据。

5. 拟合和转换方法

def fit_transform(self, X, y=None, **kwargs):self.fit(X)return self.transform(X)

fit_transform 方法结合了 fittransform 方法,先拟合模型,然后将数据投影到主成分上。

6. 逆变换方法

def inverse_transform(self, X):check_is_fitted(self)X = np.asarray(X)return np.dot(X, self.components_) + self.mean_

7.样本得分函数

def score_samples(self, X):X = self.transform(X)return np.sum(X**2, axis=1)

8.辅助函数

def check_is_fitted(model):if not hasattr(model, 'components_'):raise ValueError("Model is not fitted")

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

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

相关文章

JS 实现SSE通讯和了解SSE通讯

SSE 介绍: Server-Sent Events(SSE)是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。 SSE基于HTTP协议,允许服务器将数据以事件流(…

C/C++每日一练:查找链表的中间节点

链表(Linked List) 链表是一种线性数据结构,由一系列节点(Node)通过指针链接在一起。与数组不同,链表中的元素在内存中不需要连续存储,每个节点包含两部分: 数据部分:存…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密:密码学的基石及 RSA 算法详解 在当今数字化的时代,信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术,为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…

PH47代码框架全局函数及功能类

PH47代码框架全局函数及功能类 概述 全局函数及功能类体系是PH47框架当中除了4个逻辑层之外最重要的组成部分之一,它们可以在 整个PH7 代码框架及用户代码中使用。常用全局函数及功能类为 PH7 代码框架提供了最常用和最基础的功能实现。 全局函数主要包含了对时间…

力扣 LeetCode 203. 移除链表元素(Day2:链表)

解题思路: 方法一:头节点和非头节点分开处理 方法二:定义一个dummy虚拟节点,后面的节点就可以采用相同的处理方式 注意: cur需要指向要删除的节点的上一个节点,因为要越过这一个被删除的节点 class Sol…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

turbo c 2.0 画螺栓

代码; #include<graphics.h> void bolt(x0,y0,d,l) int x0,y0,d,l; {int x1,x2,x3,x4,x5,x6,x7,x8;int y1,y2,y3,y4,y5,r1,r2,b,c;if(l>2*d) b2*d;else b1;r11.5*d;r20.38*d;c0.1*d;x1x0-0.7*d;x2x0-0.61*d;x3x0-0.32*d;x4x00.8*d;x5x0l-b;x6x0l-c;x7x0l-0.05*d;x8x0…

网络服务综合项目-博客

一、运行环境&#xff1a; 主机主机名系统服务192.168.31.128Server-WebLinuxWeb192.168.31.129Server-NFS-DNSLinuxNFS 二、基础配置&#xff1a; 配置主机名开启防火墙并配置部分开启selinux并配置服务器之间使用ntp.aliyun.com进行时间同步服务器之间实现ssh免密登录 三…

leetcode86:分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&am…

Android Mobile Network Settings | APN 菜单加载异常

问题 从log看是有创建APN对应的Controller&#xff08;功能逻辑是ok的&#xff09;&#xff0c;但是Mobile Network Settings无法显示&#xff08;UI异常&#xff09;。 日志分析 看似APN 菜单已经创建了&#xff0c;实际上并没有显示。 11-12 07:01:28.150 8773 8773 D Pr…

上海市计算机学会竞赛平台2020年4月月赛丙组永恒的生命游戏

题目背景 2020年4月11日&#xff0c;英国数学家 约翰霍顿康威&#xff08;John Horton Conway&#xff09;因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域&#xff0c;都做出了重大贡献。他的离去是人类文明的损失。他最著…

FS8x 功能安全

fail-safe是电独立的和物理隔离的。fail-safe由自己的参考电压和电流提供,有自己的振荡器,有重复的模拟路径以最小化常见的故障,并有LBIST/ABIST来覆盖潜在故障。fail-safe根据设备部件号提供ASIL B或ASIL D遵从性。除非另有规定,fail-safe定时来自故障安全振荡器,其精度为…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

内网域环境、工作组、局域网等探针方案

1. 信息收集 1.1 网络收集 了解当前服务器的计算机基本信息&#xff0c;为后续判断服务器角色&#xff0c;网络环境做准备 systeminfo 详细信息 net start 启动服务 tasklist 进程列表 schtasks 计划任务&#xff08;受权限影响&#xff09; 了解当前服务器的网络接口信息…

什么是量化交易

课程大纲 内容初级初识量化&#xff0c;理解量化 初识量化 传统量化和AI量化的区别 量化思想挖掘 量化思想的挖掘及积累技巧 量化代码基础&#xff1a; python、pandas、SQL基础语法 金融数据分析 常用金融分析方式 常用因子分析方式 数据分析实战练习 回测及交易引擎 交易引擎…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示&#xff1a;   OpenHarmony(简称OH)的标准系统的底层系统是linux&#xff0c;所以调用如下代码&#xff1a; linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

【LeetCode】【算法】64. 最小路径和

LeetCode 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路 思路&#xff1a;这种题太典了&#xff0c;典…

1.7 JS性能优化

从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 追问&#xff1a;http 与 TCP 1. http - 应用层 < > TCP - 传输层 2. 关联 - http基于TCP实现连接 < > UDP > 握手 & 挥手 &#xff08;传输速率上较…

Spring Task详细讲解

✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具&#xff0c;也就意味着不需要再添加第三方依赖了&#xff0c;相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒…

Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用&#xff0c;本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理&#xff0c;帮助开发者快速理解如何通过代码控制相机&#xff0c;实时采集并处理图像数据。*** 1. 搜索并…