释放数据的潜力:用梯度上升法解锁主成分分析(PCA)的神奇

news2025/1/1 22:49:16

文章目录

  • 🍀引言
  • 🍀什么是主成分分析(PCA)?
  • 🍀传统PCA vs 梯度上升PCA
  • 🍀PCA的优化目标
  • 🍀代码实现
    • 🍀求解第一主成分
    • 🍀求解第二主成分
  • 🍀在sklearn中封装的PCA

🍀引言

主成分分析(PCA)是一种常用于降维和特征提取的技术,它有助于发现数据中的主要变化方向。虽然传统的PCA方法通常依赖于特征值分解或奇异值分解等数学技巧,但在本文中,我们将介绍一种不同的方法,即使用梯度上升来求解PCA问题。


🍀什么是主成分分析(PCA)?

主成分分析是一种统计技术,旨在找到数据中的主要变化方向,以便将数据投影到新的坐标系中,从而减少维度或提取最重要的特征。通常情况下,PCA的目标是找到一组正交向量(模长为1的向量),称为主成分,这些向量按照方差递减的顺序排列。这些主成分捕捉了数据中的大部分信息,允许我们以更低维度的方式表示数据。


🍀传统PCA vs 梯度上升PCA

传统PCA方法依赖于特征值分解或奇异值分解等数学工具,这些方法在处理大规模数据集时可能效率较低。相比之下,梯度上升是一种优化技术,可用于直接最大化PCA的目标函数,即最大化数据在新坐标系中的方差。


🍀PCA的优化目标

在传统PCA中,我们通过解决以下优化问题来找到主成分:

最大化目标函数:

在这里插入图片描述

其中, w \mathbf{w} w 是主成分的权重向量, x i \mathbf{x}_i xi 是数据样本, n n n 是样本数量。

🍀代码实现

🍀求解第一主成分

在实现之前我们需要做数据的准备工作

import matplotlib.pyplot as plt
import numpy as np
X = np.empty(shape=(100,2))
X[:,0] = np.random.uniform(0,100,size=100) # 生成0-100之间100个随机数
X[:,1] = 0.6*X[:,0]+5 + np.random.normal(0,10,size=100)

绘制后如下图
在这里插入图片描述
接下来我们需要创建一个函数demean目的是使得矩阵各个维度上的均值都为0

官方解释:这个函数的目的是将数据中的均值信息去除,以便更好地进行后续数据分析或建模,特别是当不同维度的尺度差异较大时,去均值操作可以有助于模型的性能提升。

def demean(X):
    return X-np.mean(X,axis=0)
  • 使用 np.mean(X, axis=0) 计算 X 的每个维度(列)上的均值。axis=0 参数指定了沿着列的方向进行均值计算。

接下来需要创建一个效用函数,这里遵循梯度上升(寻找方差最大的效用函数)

def f(X,w): # 求方差最大的效用函数
    return np.sum(X.dot(w)**2)/len(X)

还需要一个求梯度的函数

def df(X,w): # 求梯度
    return X.T.dot(X.dot(w)) * 2. /len(X)

可以依照如下图示
在这里插入图片描述
接下来创建一个梯度上升的函数,和梯度下降的函数类似

def gradient_ascent(X,initial_w,eta=0.0001,n_iters=1e4,epsilon=1e-8): # eta取值比较小的原因是w的单位向量
	w = initial_w
    i_iter = 1
    while i_iter<=n_iters:
        last_w = w
        gradient = df(X,w)
        w = w+ gradient*eta
        if abs(f(X,w)-f(X,last_w))<epsilon:
            break
        i_iter+=1
    return w

注意:这里的w每次会发现变化,那就不是单位向量了,所以我们应该在每次函数执行的时候都应该将w设置成单位向量
修改后的梯度上升函数代码如下

def direction(w): # 每次求一个单位方向
    return w/np.linalg.norm(w)

def gradient_ascent(X,initial_w,eta=0.0001,n_iters=1e4,epsilon=1e-8): # eta取值比较小
    w = direction(initial_w)
    i_iter = 1
    while i_iter<=n_iters:
        last_w = w
        gradient = df(X,w)
        w = w+ gradient*eta
        w = direction(w)
        if abs(f(X,w)-f(X,last_w))<epsilon:
            break
        i_iter+=1
    return w

最后我们来测试一下

initial_w = np.random.random(X.shape[1])   # 这里不能取0
X_demean = demean(X)
w = gradient_ascent(X,initial_w)
plt.scatter(X_demean[:,0],X_demean[:,1])
plt.plot([0,w[0]*25],[0,w[1]*25],color='r')
plt.show()

运行结果如下
在这里插入图片描述

注意:对于PCA问题 不能使用数据标准化来处理数据这个轴就是一个主成分,是我们求出来的第一个主成分,所以叫他第一主成分,接下来我们求解第二主成分

🍀求解第二主成分

在求解之前,我们可以先了解一下

第一主成分和第二主成分是PCA中的两个最重要的成分

联系:

  • 都是主成分: 第一主成分和第二主成分都是数据中的主要变化方向,它们是原始数据中的线性组合,以便最大程度地捕捉数据的方差。

  • 正交性: 第一主成分和第二主成分是正交的,即它们之间的内积为零。这意味着它们是彼此独立的方向,没有重叠。

  • 降维: PCA的目标是将数据从原始高维空间投影到主成分构成的低维空间中。第一主成分通常包含最大的方差,第二主成分包含次大的方差,因此它们通常用于构建一个较低维度的表示来降低数据的维度。

区别:

  • 方差: 第一主成分包含数据中的最大方差,而第二主成分包含大方差。因此,第一主成分捕获了数据中的最大变化,而第二主成分捕获了除第一主成分之外的最大变化。以此类推,后续主成分包含的方差逐渐减小。

  • 权重向量: 第一主成分和第二主成分是由不同的权重向量定义的。这些权重向量决定了如何将原始特征组合成主成分。第一主成分的权重向量是使得第一主成分方差最大化的方向,第二主成分的权重向量是使得第二主成分方差最大化的方向。

  • 信息: 第一主成分通常包含最多的信息,因为它捕获了数据中的最大变化。第二主成分包含的信息次于第一主成分,但与第一主成分正交。因此,第一主成分和第二主成分合起来可以保留大部分原始数据的信息。

找到第一主成分之后,每一个样本都去 去掉第一主成分上的分量,对于这个结果 继续去求第一主成分,得到的就是第二主成分

这里可以举个例子,前一个得出的是纵轴的分向量,后一个是横轴的分向量
在这里插入图片描述

这里可以用下面的语句来表示去掉第一主成分分量以后的样本

X2 = X_demean-X_demean.dot(w).reshape(-1,1)*w

注意:如果特征值就两个,那么第一第二主成分是垂直关系,但是如果特征值多个的话就不一定了。

🍀在sklearn中封装的PCA

这里我们简单演示一下取前两个和一个主成分
首先导入必要的库

from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt

之后准备之前的数据

X = np.empty(shape=(100,2))
X[:,0] = np.random.uniform(0,100,size=100) # 生成0-100之间100个随机数
X[:,1] = 0.6*X[:,0]+5 + np.random.normal(0,10,size=100)

最后进行演示

pca = PCA(n_components=2)
pca.fit(X)
pca.components_

其实我们也可以使用真实数据进行演示,下面我们进行真实数据的案例演示


首先做前期的准备

from sklearn.datasets import load_digits
digits = load_digits()
X = digits.data
y = digits.target

这里我们使用KNN算法进行演示

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y)  # 分割数据集和测试集

之后得出降维前的准确率

from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
%%time
knn_clf.fit(X_train,y_train)
knn_clf.score(X_test,y_test)

运行结果如下
在这里插入图片描述
之后我们进行降维,将64维降维2维

pca = PCA(n_components=2)
pca.fit(X_train)
X_train_reduction= pca.transform(X_train)
X_test_reduction= pca.transform(X_test)
%%time
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reduction,y_train)
knn_clf.score(X_test_reduction,y_test)

运行结果如下
在这里插入图片描述

  • pca.transform方法会将原始特征数据投影到PCA的主成分空间中,得到一个新的特征矩阵,其中每一列代表一个主成分,每一行代表一个训练样本。

通常情况下我们在降维的时候保留原始数据总方差的95%

pca = PCA(0.95) # 降维时保留95%的原始数据总方差
pca.fit(X_train)
X_train_reduction= pca.transform(X_train)
X_test_reduction= pca.transform(X_test)

最后得到的准确率为
在这里插入图片描述
所以说降维不要太离谱,否则信息损失太多!!!

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

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

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

相关文章

数据结构:线性表之-循环双向链表(万字详解)

目录 基本概念 1&#xff0c;什么是双向链表 2&#xff0c;与单向链表的区别 双向链表详解 功能展示&#xff1a; 1. 定义链表 2&#xff0c;创建双向链表 3&#xff0c;初始化链表 4,尾插 5&#xff0c;头插 6&#xff0c;尾删 判断链表是否被删空 尾删代码 7&a…

怎么用excel管理固定资产

在当今的数字时代&#xff0c;我们已经习惯了使用各种电子工具来提高我们的生产力。其中&#xff0c;Excel无疑是一个强大的工具&#xff0c;它不仅可以帮助我们处理数据&#xff0c;还可以用来进行复杂的计算和分析。然而&#xff0c;你可能不知道的是&#xff0c;Excel也可以…

【已解决】src/spt_python.h:14:20: 致命错误:Python.h:没有那个文件或目录

src/spt_python.h:14:20: 致命错误&#xff1a;Python.h&#xff1a;没有那个文件或目录 问题 其中重点的报错信息 src/spt_python.h:14:20: fatal error: Python.h: No such file or directory 思路 sudo yum install python-devel然后重新安装需要的依赖。 解决 成功。…

DBeaver使用

一、导出表结构 二、导出数据CSV 导出数据时DBeaver并没有导出表结构&#xff0c;所以表结构需要额外保存&#xff1b; 导入数据CSV 导入数据时会因外键、字段长度导致失败&#xff1b;

4. HBase必知必会理论基础篇

HBase必知必会理论基础篇 1.1 HBase简介1.2 HBase 数据模型1.3 HBase整体架构1.4 HBase 读写流程1.4.1 客户端读取流程1.4.2 客户端写入流程 1.5 HBase 客户端常用的方法1.5.1 scan查询1.5.2 get查询1.5.3 put查询1.5.4 delete 查询1.5.5 append 查询1.5.6 increment查询 1.6 H…

从零开始在树莓派上搭建WordPress博客网站并实现公网访问

文章目录 序幕概述1. 安装 PHP2. 安装MySQL数据库3. 安装 Wordpress4. 设置您的 WordPress 数据库设置 MySQL/MariaDB创建 WordPress 数据库 5. WordPress configuration6. 将WordPress站点发布到公网安装相对URL插件修改config.php配置 7. 支持好友链接样式8. 定制主题 序幕 …

今天给大家分享一个绘图的 RGB COLOR TABLE

如果大家觉得有用&#xff0c;就点个赞让更多的人看到吧~

微信支付上新的“分分捐”很暖心,一起吗?

今天在买东西付款后发现&#xff0c;在付款页面发现下方出现了一个公益项目&#xff0c;名为“为乡村儿童送鸡蛋 去捐 0.01元”的提示。去查了一下才知道该功能名叫“分分捐”。 微信分分捐是什么&#xff1f; 当微信支付金额超过 5 元且为非整数的订单&#xff08;红包、转账…

如何激励员工?

如何激励员工&#xff1f;激励就是发现员工的需求&#xff0c;并满足它。 今天想给大家介绍下“马斯洛需求理论”&#xff0c;毕竟想要更好的激励下属创造价值&#xff0c;你首先需要了解他想要什么。对吧。 马斯洛需求理论是美国心理学家马斯洛在上世纪四十年代年提出的。他…

钢建筑模板和木建筑模板的优缺点?

当涉及到建筑模板材料时&#xff0c;钢模板和木模板都是常见的选择。它们各自具有一些优点和缺点&#xff0c;下面是钢模板和木模板的介绍&#xff1a; 钢模板的优点&#xff1a; 强度和稳定性&#xff1a;钢模板具有高强度和稳定性&#xff0c;能够承受较大的荷载和压力&…

人大女王金融硕士——不要成为群羊中盲从的羊,别人疯狂你要冷静

随着社会经济的迅速发展&#xff0c;经济全球化不断扩大&#xff0c;教育体系的完善。越来越多的人追求高学历&#xff0c;通过系统的学习来提升自己的知识储备&#xff0c;增长见识。这也导致每年考研成人逐年增加&#xff0c;录取率也逐年下降。很多选择考研的人&#xff0c;…

做游戏开发需要读研吗?

主观建议版 【是否要读研再工作——不建议】 游戏行业不太看重研究生上学就是为了更好的进入工作&#xff0c;许多人考研就是为了拿到工作的敲门砖。而你现在已经一脚迈入门里面了。对于游戏开发从业者而言&#xff0c;走企业路线的&#xff0c;工作中的经验远比课堂上的知识…

适合小企业的CRM客户管理系统

对于小企业而言&#xff0c;选择一款适合自己的CRM系统可以帮助他们更好地管理客户关系&#xff0c;提高销售业绩&#xff0c;加强市场营销和客户服务等方面的能力。但是&#xff0c;由于市面上CRM系统品牌众多&#xff0c;功能各异&#xff0c;价格不一&#xff0c;小企业适合…

vulnhub靶机Brainpan

主机发现 arp-scan -l 端口扫描 nmap --min-rate 10000 -p- 192.168.21.156 服务扫描 nmap -sV -sT -O -p9999,10000 192.168.21.156 这个地方感到了有点不对劲&#xff0c;python起来的一个web端口 漏洞扫描 nmap --scriptvuln -p9999,10000 192.168.21.156 意料之中&…

java接入apiv3微信小程序支付(以java的eladmin框架为例)

一、需要准备的资料 1.小程序AppID 如&#xff1a;wx2e56f5****** 2.商户号 如&#xff1a;1641****** 3.商户API私钥路径&#xff1a;什么是商户API证书&#xff1f;如何获取商户API证书&#xff1f; 获取文件如下图&#xff1a; 如&#xff1a; 本地路径&#xff1a;E:\Env\e…

计算机提示d3dcompiler43.dll缺失怎么修复,多个解决方法分享

在游戏玩家中&#xff0c;遇到游戏提示找不到 d3dcompiler43.dll 文件的情况并不罕见。这使得许多玩家在启动游戏时感到困扰&#xff0c;因为这意味着他们可能无法正常运行游戏。那么&#xff0c;d3dcompiler43.dll 文件到底是什么呢&#xff1f;为什么游戏会提示找不到它呢&am…

注塑车间是否需要导入MES系统?

判定注塑车间是否需要导入MES系统时&#xff0c;需要谨慎考虑下述几个重要因素&#xff1a; 1.生产加工复杂性和多样化&#xff1a; 倘若注塑车间生产出来的产品品种繁多&#xff0c;涉及到多个工艺过程、不同类型的生产过程和参数设置&#xff0c;那么MES系统能够带去更加精准…

为什么当下MES如此火热,各大制造业工厂都在推行?

MES系统的特点&#xff1a; 1&#xff09;数据采集引擎、整合数据采集渠道&#xff08;RFID、条码设备、PLC、Sensor、IPC、PC等&#xff09;覆盖整个工厂制造现场&#xff0c;保证现场数据的实时、准确、全面的采集&#xff1b; 2&#xff09;打造工厂生产管理系统数据采集基础…

文心一言 VS 讯飞星火 VS chatgpt (90)-- 算法导论8.3 3题

三、用go语言&#xff0c;利用归纳法来证明基数排序是正确的。在你所给出的证明中&#xff0c;在哪里需要假设所用的底层排序算法是稳定的? 文心一言&#xff1a; 基数排序是一种非比较型整数排序算法&#xff0c;其通过在每一位上进行比较来排序。基数排序的一个主要特点是…

不会用手机做二维码?文本、链接码用手机生成的方法

现在很多功能都可以通过手机来实现&#xff0c;用手机制作二维码就是很多小伙伴经常会使用的一个功能&#xff0c;那么在手机上制作文本或者网址二维码是最常见的两种类型。下面就给还会在线制作二维码的小伙伴分享一个工具&#xff0c;通过简单的操作方法就可以快速做出文本码…