特征值分解和奇异值分解

article/2025/10/14 0:38:53

特征值分解

特征值分解是将一个方阵A分解为如下形式:
A = Q Σ Q − 1 A=Q\Sigma Q^{-1} A=QΣQ1
其中,Q是方阵A的特征向量组成的矩阵, Σ \Sigma Σ是一个对角矩阵,对角线元素是特征值。

通过特征值分解得到的前N个特征向量,表示矩阵A最主要的N个变化方向。利用这前N个变化方向,就可以近似这个矩阵(变换) 。

奇异值分解

奇异值分解(Singular Value Decomposition,SVD)是在机器学习领域广泛应用的算法,它不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。 它能适用于任意的矩阵的分解。

SVD是将m*n的矩阵A分解为如下形式:
A = U S V T A=USV^T A=USVT
其中,U和V是正交矩阵,即 U T U = I , V T V = I U^TU=I,V^TV=I UTU=I,VTV=I,U是左奇异矩阵, U ϵ R m × m U \epsilon R^{m\times m} UϵRm×m,S是 m × n m\times n m×n的对角阵(对角线上的元素是奇异值,非对角线元素都是0), V T V^T VT右奇异向量, V ϵ R n × n V \epsilon R^{n\times n} VϵRn×n

特征值用来描述方阵,可看做是从一个空间到自身的映射。奇异值可以描述长方阵或奇异矩阵,可看做是从一个空间到另一个空间的映射。

奇异值和特征值是有关系的,奇异值就是矩阵 A ∗ A T A*A^T AAT的特征值的平方根。

步骤

输入:样本数据

输出:左奇异矩阵,奇异值矩阵,右奇异矩阵

  1. 计算特征值:特征值分解 A A T AA^T AAT,其中 A ϵ R m × n A \epsilon R^{m\times n} AϵRm×n为原始样本数据
    A A T = U Σ Σ T U T AA^T=U\Sigma \Sigma^TU^T AAT=UΣΣTUT
    得到左奇异矩阵 U ϵ R m × m U\epsilon R^{m\times m} UϵRm×m和奇异值矩阵 Σ ′ ϵ R m × m \Sigma^{'}\epsilon R^{m\times m} ΣϵRm×m

  2. 间接求部分右奇异矩阵:求 V ϵ R m × n V\epsilon R^{m\times n} VϵRm×n

    利用 A = U Σ ′ V ′ A=U\Sigma^{'}V^{'} A=UΣV可得
    V ′ = ( U Σ ′ ) − 1 A = ( Σ ) − 1 U T A V^{'}=(U\Sigma^{'})^{-1}A=(\Sigma)^{-1}U^TA V=(UΣ)1A=(Σ)1UTA

  3. 返回 U , Σ ′ , V ′ U,\Sigma^{'},V^{'} U,Σ,V,分别为左奇异矩阵,奇异值矩阵,右奇异矩阵。

python实现

调用eig和svd方法

import numpy as npdata = np.array([[1, 0, 4], [2, 2, 0], [0, 0, 5]])  # 数组
# 调用np.linalg.eig()对data*data'进行特征值分解
eig_value, eig_vector = np.linalg.eig(data.dot(data.T))
# 将特征值降序排列
eig_value = np.sort(eig_value)[::-1]
print("特征值:", eig_value)  # 特征值
print("特征值的平方根:", np.sqrt(eig_value))  # 特征值的平方根# 调用np.linalg.svd()对data进行奇异值分解
U, S, V = np.linalg.svd(data)
# 降到两维,计算U*S*V 结果应该和data几乎相同
recon_data = np.round(U[:,:2].dot(np.diag(S[:2])).dot(V[:2,:]), 0).astype(int)
print("奇异值:", S)  # 奇异值
print("data:\n",data)
print("U*S*V的结果:\n",recon_data)

从结果上验证了奇异值就是矩阵 A ∗ A T A*A^T AAT的特征值的平方根。结果如下:

特征值: [41.44423549  8.26378188  0.29198263]
特征值的平方根: [6.43771974 2.87467944 0.54035417]
奇异值: [6.43771974 2.87467944 0.54035417]
data:[[1 0 4][2 2 0][0 0 5]]
U*S*V的结果:[[1 0 4][2 2 0][0 0 5]]

按SVD原理实现

import numpy as np# 1.调用np.linalg.eig()计算特征值和特征向量
eig_val, u_vec = np.linalg.eig(data.dot(data.T))
s_val = np.sqrt(eig_val)  # 奇异值:是特征值的平方根
# 将向量u_vec对应排好序
s_val_sort_idx = np.argsort(s_val)[::-1]
u_vec = u_vec[:, s_val_sort_idx]
# 奇异值降序排列
s_val = np.sort(s_val)[::-1]
# 2.计算奇异值矩阵的逆
s_val_inv = np.linalg.inv(np.diag(s_val))
# 3.计算右奇异矩阵
v_vec = s_val_inv.dot((u_vec.T).dot(data))# 降到两维,计算U*S*V 结果应该和data几乎相同
recon_data = np.round(u_vec[:,:2].dot(np.diag(s_val[:2])).dot(v_vec[:2,:]),0).astype(int)
print("左奇异矩阵U:\n", u_vec)
print("奇异值Sigma:\n", s_val)
print("右奇异矩阵V:\n", v_vec)
print("data:\n",data)
print("U*S*V的结果:\n",recon_data)

运行结果

左奇异矩阵U:[[ 0.63464303 -0.12919086  0.76193041][ 0.03795231 -0.97952798 -0.19769816][ 0.77187295  0.15438478 -0.61674751]]
奇异值Sigma:[6.43771974 2.87467944 0.54035417]
右奇异矩阵V:[[ 0.11037257  0.01179061  0.99382034][-0.72642772 -0.68148675  0.08876135][ 0.67832195 -0.73173546 -0.06665242]]
data:[[1 0 4][2 2 0][0 0 5]]
U*S*V的结果:[[1 0 4][2 2 0][0 0 5]]

基于SVD的图像压缩

基于SVD图片压缩: :图片其实就是数字矩阵,通过SVD将该矩阵降维,只使用其中的重要特征来表示该图片从而达到了压缩的目的。

path = 'Andrew Ng.jpg'
data = io.imread(path,as_grey=True)
print(data.shape)
data = np.mat(data)  # 需要mat处理后才能在降维中使用矩阵的相乘
U, sigma, VT = np.linalg.svd(data)
count = 30  # 选择前30个奇异值
# 重构矩阵
dig = np.diag(sigma[:count])  # 获得对角矩阵
# dim = data.T * U[:,:count] * dig.I # 降维 格外变量这里没有用  dig.I:是求dig的逆矩阵
redata = U[:, :count] * dig * VT[:count, :]  # 重构后的数据plt.imshow(data, cmap='gray')  # 取灰
plt.title("原始图片")
plt.show()
plt.imshow(redata, cmap='gray')  # 取灰
plt.title("基于SVD压缩重构后的图片")
plt.show()

原图片为720x1080,保存像素点值为720x1080 = 777600,使用SVD算法,取前30个奇异值则变为(720+1+1080)*30=54030,达到了几乎15倍的压缩比,极大的减少了存储量。

结果如下

在这里插入图片描述在这里插入图片描述

附录

方阵

方阵:是一种特殊的矩阵。方阵是n*n的矩阵

特征值和特征向量

设A是n阶方阵,若存在n维非零向量 v ⃗ \vec v v ,使得
A v ⃗ = λ v ⃗ A\vec{v}=\lambda \vec{v} Av =λv
则称常数 λ \lambda λ为A的特征值, v ⃗ \vec v v 为A的对应于 λ \lambda λ的特征向量。

np.diag()

np.diag(array)参数说明:

array是一个1维数组时,结果形成一个以一维数组为对角线元素的矩阵;

array是一个二维矩阵时,结果输出矩阵的对角线元素

import numpy as np# 输入是1维数组时,结果形成一个以一维数组为对角线元素的矩阵
data_1 = np.array([1,2,3])
print("输入是1维数组时的结果:\n",np.diag(data_1))# 输入是二维矩阵时,结果输出矩阵的对角线元素
data_2 = np.array([[1,0,4],[2,2,0],[0,0,5]])
print("输入是2维数组时的结果:\n",np.diag(data_2))

运行结果

输入是1维数组时的结果:[[1 0 0][0 2 0][0 0 3]]
输入是2维数组时的结果:[1 2 5]

相关链接

SVD分解原理
机器学习实战–SVD
机器学习实战——SVD(奇异值分解)


http://chatgpt.dhexx.cn/article/I3chDTO0.shtml

相关文章

奇异值分解的揭秘(一):矩阵的奇异值分解过程

转载来源: 作者:Xinyu Chen 链接:https://zhuanlan.zhihu.com/p/26306568 来源:知乎 矩阵的奇异值分解(singular value decomposition,简称SVD)是线性代数中很重要的内容,并且奇…

奇异值分解(Singular Values Decomposition,SVD)

奇异值分解 1.奇异值分解1.1 变换(Transformations)1.2 线性变换(Linear Transformations)1.3 降维(Dimensionality Reduction)1.4 奇异值分解(SVD)1.4.1 如果矩阵 A A A是方阵&…

奇异值分解(SVD)的原理详解及推导

1. 写在前面 最近整理推荐系统模型的时候, 第二个模型打算整理一下隐语义模型, 这里面绕不开一种思想就是矩阵分解, 而作为矩阵分解的经典方法SVD感觉这次有必要学学了, SVD不仅是一个数学问题,在工程应用中的很多地方…

机器学习(29)之奇异值分解SVD原理与应用详解

微信公众号 关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于…

【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用

奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,有相当多的应用与奇异值都可以扯上关系,它不光可以用于降维算法中的特征分解,比如做feature reduction的PCA,做数据压缩&#x…

联邦学习——用data-free知识蒸馏处理Non-IID

《Data-Free Knowledge Distillation for Heterogeneous Federated Learning》ICML 2021 最近出现了利用知识蒸馏来解决FL中的用户异构性问题的想法,具体是通过使用来自异构用户的聚合知识来优化全局模型,而不是直接聚合用户的模型参数。然而&#xff0c…

【FLIS】Clustered Federated Learning via Inference Similarity for Non-IID Data Distribution

Clustered Federated Learning via Inference Similarity for Non-IID Data Distribution 基于推理相似性的非iid数据分布聚类联邦学习 Abstract1.INTRODUCTION2.FEDERATED LEARNING WITH CLUSTERINGA. Overview of FLIS AlgorithmB. Clustering Clients 3.EXPERIMENTSA. Exper…

Federated Learning with Non-IID Data 论文笔记

本文提出联邦学习中的由于Non-IID数据分布而精度降低是因为权重分散(weight divergence),而权重散度可以用搬土距离(EMD)量化,最后提出了一种策略:通过创建一个在所有边缘设备之间全局共享的数据…

论文分享:「FED BN」使用LOCAL BATCH NORMALIZATION方法解决Non-iid问题

‍ ‍ 本次分享内容基于ICLR 2021收录的一篇文章:《FED BN: FEDERATED LEARNING ON NON-IID FEATURES VIA LOCAL BATCH NORMALIZATION》,这篇论文主要探讨了使用LOCAL BATCH NORMALIZATION方法解决Non-iid问题。围绕这篇论文的分享将分为4个部分&#…

On the convergence of FedAvg on non-iid data

在这篇blog中我们一起来阅读一下 On the convergence of FedAvg on non-iid data 这篇 ICLR 2020 的paper. 主要目的 本文的主要目的是证明联邦学习算法的收敛性。与之前其他工作中的证明不同,本文的证明更贴近于实际联邦学习的场景。特别的, 所有用户…

Federated Learning with Non-IID Data

Federated Learning with Non-IID Data 论文中分析了FedAvg算法在Non-IID数据时,准确率下降的原因。并提出共享5%的数据可提高准确率。 论文笔记参考:https://blog.csdn.net/GJ_007/article/details/104768415 Federated Learning with Non-IID Data …

什么是TLB文件,怎样从dll文件中提取TYPEID信息?- IID

文章目录 1.TLB是什么?2.怎样从dll中导出TLB文件?3.怎样创建TLB文件?4.如何导入TLB5.作者答疑Com是windows平台提供的二进制互操作解决方案。如果给你一个dll,或者windows自带的dll,是否有可能提取其Com接口信息,答案是可以的。 1.TLB是什么? TLB文件是一个说明文件,通…

怎么实现联邦学习中的Non-IID?

联邦学习的一大特点就是数据分布是Non-IID,Non-IID意为非独立同分布。那么怎么在实验中实现non-iid呢?这是我这篇博客想讨论的问题。 part 1: 在堪称联邦学习“开山之作”FedAvg这篇论文中,是这样描述的: 数据集是MN…

【联邦学习】联邦学习量化——non-iid数据集下的仿真

文章目录 改进项目背景量化函数的改进non-iid数据集的设置Fedlab划分数据集的踩雷 改进项目背景 在前面的项目中,虽然对联邦学习中,各个ue训练出来的模型上传的参数进行了量化,并仿真的相关结果。但是仍有一些俺不是非常符合场景的情况&…

「隐语小课」联邦学习之Non-IID问题

更多干货内容,请移步公众号:隐语的小剧场 一、引言 本文针对联邦学习中遇到的Non-IID问题进行探讨,介绍Non-IID产生的原因,分析Non-IID对联邦学习的影响,以及调研了近年来针对该问题的解决方案,并进行分类…

联邦学习中的non-iid总结

最近研究联邦学习(federated learning,FL)中的non-iid的解决办法时遇到瓶颈,写成博客将最近的工作总结一下,希望有大佬看到这篇博客不吝赐教。 什么是non-iid 先从维基百科引出独立同分布的定义: 在概率论…

IID 与 Non-IID

数据独立同分布(Independent Identically Distribution,IID) 数据与数据之间都是独立的,但满足同一个分布。(独立:一个数据的出现不会影响另一个数据) 数据分布描述的是数据的统计情况&#x…

dy设备deviceid iid注册分析

清楚缓存,重新打开app, 点击同意按钮,会触发设备注册; 很明显是一个post包,device_register 可以看到请求体加密了 那么 请求体是什么呢? 很老版本思路:都是直接明文注册 较老版本思路:在反编译…

Redis 设计与实现: redisObject 数据结构,以及 Redis 的数据类型

redisObject 数据结构,以及 Redis 的数据类型 redisObject 是 Redis 类型系统的核心, 数据库中的每个键、值,以及 Redis 本身处理的参数, 都表示为这种数据类型。 redisObject 的定义位于 redis.h : /** Redis 对象…

(五)、Redis的RDB持久化---Redis设计与实现读书笔记

两个用于生成RDB文件的命令 save:会阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞期间,服务器不能处理任何命令请求bgsave:会派生出一个子进程,然后由子进程负责创建RDB文件,服务器经常(父进…