常见的降维方法(PCA,SVD)

article/2025/9/14 4:44:50

1、PCA降维(主成分分析)

PCA降维就是去除线性相关,使得最后剩余的属性维度全都线性无关。

其实:PCA降维不仅是去除先线性无关,还可以过滤掉小特征值对应的特征向量。因为特征值变化小,对应的特征向量变化也小,转换后两个维度相似性就比较大。相似度大就没有意义。

均值(平均值)

 

样本方差(总体方差是n,样本方差是n-1)

 

协方差(如果X等于Y,就是方差)

 

 ①去中心化,减去均值

②计算协方差

③求协方差的特征值,特征向量

④特征向量归一化,原来n维,现在要降到k维,那么就取最大的k个特征值对应的特征向量。与原输入进行相乘。

第一步:均值为0,去中心化不变

第二步:求协方差

第三步:求特征值,特征向量

第四步:特征向量归一化

第五步:取前k大特征值对应的特征向量(原输入是2维,现在要降维到1维,k=1,取最大特征值对应的特征向量)

总结:PCA降维是通过协方差求特征值和特征向量,取前k大特征对应的特征向量与原矩阵相乘,得到降维后的矩阵。原理是找到不同的特征值对应的特征向量,都是线性无关。特征值特征向量如何求取?第一步先求特征值,第二步求特征向量。特征向量中有x1+x2-x3=0(这个方程没法解,枚举,每次一位为1,其余都为0)(_,1,0)-->(-1,1,0)、(_,0,1)-->(1,0,1)

2、SVD降维(奇异值分解,参考1、参考2、参考3

①一些基础知识

实对称矩阵:A=AT(矩阵A=矩阵A的转置)

正交矩阵:AAT=E(A的转置=A的逆矩阵)

酋矩阵:对于实数矩阵,酋矩阵就是正交矩阵,貌似矩阵中的每个向量的模长是1。

②矩阵分解

果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式子 : Av = λv

这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:A = Q∑Q-1

其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。

首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。

③奇异值分解(对应的A不是方阵)

奇异值分解是一个能适用于任意的矩阵的一种分解的方法: A = UΣVT

AAT的特征向量表示U、ATA的特征向量表示VT、AAT特征值得算术平方根表示Σ

总结:在图像处理中,一个700*500的图像,可以压缩到svd分解成:

U=750*750的特征向量矩阵

Σ=1*500的特征值

VT=500*500的特征向量矩阵

若前k个奇异值达到总的奇异值的90%,可以进行压缩存储。

src:750*500

dst:(750*160)+160+(160*500)  (k=160)

数据恢复:UΣVT进行相乘得到原矩阵。

#奇异值分解:
U, sigma, VT = np.linalg.svd(data)
#重构,选择前160个奇异值
count = 160
dig = np.mat(np.eye(count) * sigma[:count]) 
redata = U[:, :count] * dig * VT[:count, :] 
#降维   (750,500)(特征维度750,需要降维)  
#(500,750)要转置   (750,160)#降维到160   (750*160) (160*160)
redata = np.dot(np.dot(data.T, U[:,:count]) ,dig) 

数据降维:这里750表示每个特征的维度,需要找到U,np.dot(np.dot(A.T, U), S),只需把S特征值对应的置为0即可。

这里500表示每个特征的维度,需要找到VT,np.dot(np.dot(A.T, U), S)np.dot(np.dot(A, VT), S)。比如例题有两个特征值,是两维,特征变0一个那么降维到1维。

分析:PCA和SVD降维都是取某些特征值即可。PCA是取最大特征值对应的特征向量去映射原矩阵。SVD是也是取k个特征值对应的特征向量然后去映射原矩阵。(SVD可以有两种降维,一种是把特征值和对应的特征向量单独拿出来,另外一种是把不需要的特征值置为0,做运算的时候对应的特征向量不参与运算)

def SVD1():path = 'C:/Users/hqh/desktop/wed.jpg'data = cv2.imread(path,0)U, sigma, VT = np.linalg.svd(data)# 在重构之前,依据前面的方法需要选择达到某个能量度的奇异值cnt = sum(sigma)cnt90 = 0.9 * cnt  # 达到90%时的奇异总值count = 160  # 选择前160个奇异值cntN = sum(sigma[:count])            #sigma已经由大到小排序#cntN>cnt90# 重构矩阵dig = np.mat(np.eye(count) * sigma[:count])  # 获得对角矩阵redata = U[:, :count] * dig * VT[:count, :]  # 重构print(redata.shape)plt.imshow(redata, cmap='gray')  # 取灰plt.show()  # 可以使用save函数来保存图片'''src:700*500 dst:(700*160)+160+(500*160)'''#U压缩行,V可以压缩列#输入700行500列,若看成每个特征有700维度,进行降维->500是不变的,找U矩阵(data还需要转置 )#若看成每个特征有500维度,进行降维->700是不变的,找VT矩阵redata = np.dot(np.dot(data.T, U[:,:count]) ,dig)     #降维   700*500->500*10plt.imshow(redata, cmap='gray')  # 取灰plt.show()  # 可以使用save函数来保存图片
def SVD2():A = np.mat([[1, 2, 3], [4, 5, 6]])   #2*3U, Sigma, VT = np.linalg.svd(A)         #2*2  2  3*3S = np.zeros((2, 3))print("A':", np.dot(np.dot(U, S), VT))  # 恢复原始维度Sigma[1] = 0  # 降维                 #去除一个特征值S = np.zeros((2, 3))S[:2, :2] = np.linalg.diag(Sigma)print("A conv:", np.dot(np.dot(A.T, U), S))  # 原始数据转到低维S = np.mat(np.eye(1) * Sigma[:1])  # 获得对角矩阵print("A conv:", np.dot(np.dot(A.T, U[:,0:1]), S))  # 原始数据转到低维

 


http://chatgpt.dhexx.cn/article/65IkWR15.shtml

相关文章

看!数据分析领域中最为人称道的七种降维方法

http://dataunion.org/20803.html 感谢王穆荣的投稿,转载请注明出处:数盟社区 近来由于数据记录和属性规模的急剧增长,大数据处理平台和并行数据分析算法也随之出现。于此同时,这也推动了数据降维处理的应用。实际上&#xff0…

数据降维的几种常见方法(PCA;FA;LDA;ICA等)

文章目录 数据降维方式简述PCA与ICA、FA、LDA的区别与联系1.PCA与ICA的联系与区别2.PCA与LDA的联系与区别3.PCA与FA的联系与区别 总结 数据降维方式简述 在学习ICA算法的过程中,了解到常常需要对数据进行降维,如PCA,FA等,以达到数…

大整数的乘法

大整数的乘法 (这里主要讨论的是两个较大的数相乘的效率问题,实际上并不是真正意义上的大数相乘。在java中有个BigInteger类已经可以储存大数,并提供了大数相乘的方法了。) 【分析】 首先,当两个整数X、Y&#xff0…

实验一:大整数乘法

1.实验目的 掌握分治算法的基本思想、技巧和效率分析方法。熟练掌握用递归设计分治算法的基本步骤。学会利用分治算法解决实际问题。 2.实验内容 大整数乘法 采用分治算法实现两个n位二进制(或者十进制)大整数的乘法。 3.实验要求 根据实验内容构思…

分治法的经典问题——大整数相乘

分治法的原理 讨论问题时,先来了解一下什么是分治法。 分治法的意思就是,分而治之,也就是把一个问题,拆分成几个小问题,最后再汇总解决的方法 通过大整数相乘问题来了解分治法 假如现在我们要求两个大整数相乘的乘积…

大整数乘法(分治法)

大整数乘法(分治法) 题目描述:设X和Y都是n位的十进制整数,计算它们的乘积X*Y。 如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果,时间复杂度为O(n2&…

大整数相乘算法

一 转换为二进制求,推导出的公式适合十进制计算 设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看…

【大整数乘法】

问题 2.伪代码 理想情况下&#xff0c;XY位数相同 Mul(long long x,long long y,int num){Fh<--(x*y>0)?1:-1;x<--|x|; y<--|y|;if(num 0)then return 0;else if(num1) then return fh*x*y;else{x_high<--x/10^(num/2);x_low<--x mod 10^(num/2);y_high…

大整数乘法(大整数乘int型)

算法思想&#xff1a; 1.将大整数倒序储存到数组中&#xff08;方便进位&#xff09; 2.对同位相乘后的数取模10&#xff0c;推入结果数组中 3.对同位相乘后的数除以10&#xff0c;作为进位 5.去除可能出现的前导零 4.完成乘法后倒序输出 补充知识&#xff1a; 1、vector相关用…

C语言实现大整数乘法

转载自&#xff1a;点击打开链接 乘法规律&#xff0c;一个数的第i位和另一个数的第j位相乘&#xff0c;一定会累加到结果的第ij位&#xff0c;结果的数组一个数组元素存2位数&#xff0c;最后对结果处理进位&#xff0c;最后打印出来 方法一见上面链接https://www.cnblogs.c…

大整数乘法(简单模拟乘法过程)

一、分析 整数的数值超过计算机硬件所能表示的最大值时&#xff0c;那么我们只能借助软件的方法来实现大整数的乘法了。 我们可以使用字符串来模拟大整数的乘法&#xff0c;算法的思想就是使用我们在小学时学过的乘法&#xff0c;一位位相乘&#xff0c;最后计算出结果。如下&…

算法总结——大整数乘法

问题描述 求两个不超过200位的非负整数的积。 输入数据 有两行&#xff0c;每行是一个不超过200位的非负整数&#xff0c;没有多余的前导0。 输出要求 一行&#xff0c;即相乘后的结果。结果里不能有多余的前导0&#xff0c;即如果结果是342&#xff0c;那么就不能输出为0342。…

大整数的乘法(分治法)

通常执行一次加法或乘法运算所需的计算时间看作一个仅取决于计算机硬件处理速度的常数。这个仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。若要精确地表示大整数并在计算结果中要求精确得到所有位数上的数字&#xff0c;就必须用软件的方法来实现大…

分治法-大整数乘法

问题分析&#xff1a; 在计算机上处理一些大数据相乘时&#xff0c;由于计算机硬件的限制&#xff0c;不能直接进行相乘得到想要的结果。可以将一个大的整数乘法分而治之&#xff0c;将大问题变成小问题&#xff0c;变成简单的小数乘法再进行合并&#xff0c;从而解决上述问题…

大整数乘法

设计一个有效的算法&#xff0c;可以计算两个n位大整数的乘法运算。 如果按照我们日常的计算方法&#xff0c;应该就是将两个数逐位相乘&#xff0c;最后加起来得到最终的结果。由于是大整数乘法&#xff0c;那么我们用string来存储这两个数&#xff0c;因为是要做乘法&#x…

大整数乘法算法

一 转换为二进制求&#xff0c;推导出的公式适合十进制计算 设X和Y都是n位的二进制整数&#xff0c;现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法&#xff0c;但是这样做计算步骤太多&#xff0c;显得效率较低。如果将每2个1位数的乘法或加法看…

大整数乘法的详解

一.问题 由于编程语言提供的基本数值数据类型表示的数值范围有限&#xff0c;不能满足较大规模的高精度数值计算&#xff0c;因此需要利用其他方法实现高精度数值的计算&#xff0c;于是产生了大数运算。尤其是乘法运算&#xff0c;下面就是大整数的乘法的过程&#xff08;加 …

Ubuntu server树莓派版本默认用户名密码及密码修改

树莓派安装的Ubuntu server镜像&#xff0c; 默认的初始用户及密码&#xff1a; ubuntu # user ubuntu # passwd默认信息查看 在烧入镜像的内存卡中&#xff0c; 可以查看到默认的用户信息 默认密码修改 在登录界面 输入初始化的用户名和密码后&#xff0c; 会提示是第一…

2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码

树莓派最新的arm64位系统&#xff0c;更新时间是2022年4月4日&#xff0c;这个版本的树莓派取消了默认的账户密码&#xff0c;也就是原来一直使用的pi和对应的默认密码raspberry被取消了&#xff0c;现在如果想要使用的话必须自己设置&#xff0c;下面有两种方法可以设置自己的…

树莓派启用无密码 sudo

启用无密码 sudo&#xff0c;可以在不提供密码的情况下在树莓派上运行程序。 登录 Raspberry Pi 命令行界面。假设 Raspberry Pi 的默认用户名和密码分别为 pi 和 raspberry。在命令行界面中&#xff0c;键入以下命令&#xff1a; sudo nano /etc/sudoers 3. 通过添加以下行启…