【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

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

如若侵权,留言立删。

相关文章
|
8天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
55 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
7天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
37 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
17 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
8 2
|
4天前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
17 4
|
5天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
19 4
|
3天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
14 1
|
4天前
|
算法 计算机视觉 Python
Python并查集大揭秘:让你在算法界呼风唤雨,秒杀一切复杂场景!
在编程与算法的广袤天地中,总有一些工具如同神兵利器,能够助你一臂之力,在复杂的问题前游刃有余。今天,我们就来深入探讨这样一件神器——Python并查集(Union-Find),看看它是如何让你在算法界呼风唤雨,轻松应对各种复杂场景的。
14 2
|
3天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
17 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
7天前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
25 3