【ML】matlab和python实现SVD(奇异值分解)算法

简介: matlab和python实现SVD(奇异值分解)算法

1.SVD
SVD: Singular Value Decomposition,奇异值分解
SVD算法不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。

假设我们现在有一个矩阵M(m×n),如果其存在一个分解:M = UDV^T^
其中,U(m×m,酉矩阵,即U^T^=U^-1^);
D(m×n,半正定矩阵);
V^T^(n×n,酉矩阵,V的共轭转置矩阵);
==这样的分解称为M的奇异值分解。==
**D对角线上的元素称为奇异值;
U称为左奇异矩阵;
V^T^称为右奇异矩阵。**

2.SVD奇异值分解与特征值分解的关系
特征值分解与SVD奇异值分解的目的都是提取一个矩阵最重要的特征。
==然而,特征值分解只适用于方阵,而SVD奇异值分解适用于任意的矩阵,不一定是方阵。==

M^T^M = (UDV^T^)^T^UDV^T^=V(D^T^D)V^T^
MM^T^ = UDV^T^(UDV^T^)^T^=U(DD^T^)U^T^
这里,M^T^M和MM^T^是方阵;
U^T^U和V^T^为单位矩阵,
V^T^为M^T^M的特征向量,
U为MM^T^的特征向量。
==M^T^M 和MM^T^的特征值为M的奇异值的平方==

3.SVD奇异值分解的作用核意义
==奇异值分解最大的作用就是数据的降维==

m×n的矩阵M,进行奇异值分解:
M(m×n) = U(m×m)D(m×n)V^T^(n×n)
取其前r个非零奇异值,可以还原原来的矩阵,即前个非零奇异值对应的奇异向量代表了矩阵的主要特征。
可以表示为:
M(m×n)约等于 U(m×r)D(r×r)V^T^(r×n)

4.matlab实现SVD

%% 测试奇异值分解过程
load A.mat;%该文件是做好的一个手写体的图片(28*28 uint8类型)

% for i = 1:28
%     j = 28*(i-1)+1;
%     B(i,:) = A(1,j:j+27);
% end

B = zeros(28,28);%将行向量重新转换成原始的图片
% 方法一:uint8转double类型
for i = 1:28
    for j = 1:28
        B(i,j) = A(i,j);
    end
end

% % 方法二:uint8转double
% B = im2double(A);

%进行奇异值分解
[U S V] = svd(B); 

% U:左奇异矩阵
% S:对角矩阵,对角线上的元素是奇异值,从大到小排列
% V:右奇异矩阵

%选取前面14个非零奇异值
for i = 1:14
    for j = 1:14
        S_1(i,j) = S(i,j);
    end
end

%左奇异矩阵
for i = 1:28
    for j = 1:14
        U_1(i,j) = U(i,j);
    end
end

%右奇异矩阵
for i = 1:28
    for j = 1:14
        V_1(i,j) = V(i,j);
    end
end

B_1 = U_1*S_1*V_1';

%同时输出两个图片
subplot(121);imshow(B); % B是没降维之前
subplot(122);imshow(B_1); % B_是降维后之的

这里有一个疑问?
B是28 28,B_也是28 28的啊?不是说好的降维呢?
我是这么理解的:
实际上,取前r=14个奇异值,再重构图片,这就是一个降维过程啊,
以前一张图片是m×n,现在把它分解成后,取奇异值前r个,
则,左奇异矩阵为:m×r
奇异值矩阵:r×r
右奇异矩阵:r×n
在这里插入图片描述
右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵。

==[从28维降到了14维]==
取的r值越大,重构的图片和原始图片越像。(当然是再矩阵行列数范围内)

run result:
在这里插入图片描述
原始的矩阵B:
在这里插入图片描述
分解后的U:
在这里插入图片描述
分解后的S:
在这里插入图片描述
分解后的V:
在这里插入图片描述
5.python实现SVD
python中的numpy提供了SVD分解算法
函数调用:

np.linalg.svd(a,full_matrices=1,compute_uv=1)
# a:一个m×n矩阵
# full_matrices:取值为0或者1,默认取1,这时u大小为m×m,v的大小为n×n;否则,u的大小为m×k,v的大小为k×n,
# k = min(m,n)
# compute_uv:取值为0或者1,默认取1,表示计算u,s,v;取0表示只计算s

from scipy.io import loadmat 
from numpy import linalg as la
from skimage import io # 用于显示图片
import numpy as np

load_data = loadmat('A_0.mat') # 为0手写体
A = load_data['A'] # 获取数据集
A = A[:,0:26]

# 原始图片
io.imshow(A)

#data = np.double(data) # python中svd可直接对uint8进行计算

U,Sigma,VT = la.svd(A)

# Sigma:本身应该是28*26的矩阵,但是只返回一列奇异值不为0组成的向量,为了节省空间
# U:28*28
# V: 26*26

S = np.zeros((28,26))
S[:26,:26] = np.diag(Sigma)
A_recon = np.dot(np.dot(U, S), VT) # 恢复原始维度
io.imshow(A_recon)

run result:
在这里插入图片描述
总结:我一直在想降维,是高维到低维,比如2826的矩阵,降到2814的矩阵,这样直观产生数据才对啊,我看网上也有和我同样的疑问,这个SVD分解的过程,到取前r个奇异值,(得到简化的U_1,S_1,V_1,这就是降维啊,哈哈哈)进行数据还原,这个才是SVD的精髓所在。

参考和引用:
https://www.zhihu.com/question/34143886 (SVD 降维体现在什么地方?
感觉即使把分解的三个矩阵变小,可乘回去整个矩阵并没有小。)

https://www.jianshu.com/p/9846fc1c4cac

https://blog.csdn.net/google19890102/article/details/27109235

https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

https://blog.csdn.net/mingyuli/article/details/81092795

仅用来个人学习和分享,如有错误,请指正。

如若侵权,留言立删。

相关文章
|
11天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
143 55
|
2天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
103 80
|
21天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
112 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
3天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
41 20
|
1天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
33 5
|
7天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
14天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
14天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
20天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
20天前
|
算法
通过matlab对比遗传算法优化前后染色体的变化情况
该程序使用MATLAB2022A实现遗传算法优化染色体的过程,通过迭代选择、交叉和变异操作,提高染色体适应度,优化解的质量,同时保持种群多样性,避免局部最优。代码展示了算法的核心流程,包括适应度计算、选择、交叉、变异等步骤,并通过图表直观展示了优化前后染色体的变化情况。

热门文章

最新文章