机器学习:matlab和python实现SVD(奇异值分解)算法

2023-10-27

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

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

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

MTM = (UDVT)TUDVT=V(DTD)VT
MMT = UDVT(UDVT)T=U(DDT)UT
这里,MTM和MMT是方阵;
UTU和VT为单位矩阵,
VT为MTM的特征向量,
U为MMT的特征向量。
MTM 和MMT的特征值为M的奇异值的平方

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

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

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

如若侵权,留言立删。

尊重他人知识产权,不做拿来主义者!

喜欢的可以关注我哦QAQ,

你的关注和喜欢就是我write博文的动力

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习:matlab和python实现SVD(奇异值分解)算法 的相关文章

  • MATLAB 中时间戳过滤器的优化 - 处理非常大的数据集

    我正在 MATLAB 中编写一个程序 必须使用 MATLAB 并且不能真正使用 MEX 来过滤大量数据 我需要实现的过滤器之一要求我将时间戳向量与其他时间戳不会出现的已知 不良 时间列表进行比较 一个典型的时间戳向量有大约 2 000 00
  • 如何使用matlab生成不同频率的正弦波?

    对于我的项目 我需要使用 matlab 生成一个正弦波 它有 100 000 个样本 并且频率在每 10 000 个样本后随机变化 采样率和频率可以根据方便而定 matlab中有没有函数可以生成这个 好的另一个例子 生成 5 个随机频率 r
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • 在 MATLAB 中重命名文件

    我正在尝试以编程方式重命名工作目录中的文件a temp txt to b hello txt 您建议如何这样做 MATLAB中有一个简单的文件重命名函数吗 我认为您正在寻找 MOVEFILE
  • 如何在没有安装Visual Studio的另一台机器上使用Visual Studio生成的dll?

    我已经在 Visual Studio 2012 中生成了动态库 我想在另一台机器上使用该库 但我不想在远程机器上安装 Visual Studio 我有 mex 库和 dll 我想运行一个使用这两个库的脚本 当我运行脚本时 出现以下错误 缺少
  • MATLAB:具有复数的 printmat

    我想使用 MATLAB 的printmat显示带有标签的矩阵 但这不适用于复数 N 5 x rand N 1 y rand N 1 z x 1i y printmat x y z fftdemo N 1 2 3 4 5 x y x iy O
  • 在 Matlab 中将 datenum 转换为 datetime 的最快方法

    我在 Matlab 中将 datenum 转换为 datetime 时遇到问题 Given dnum floor now floor now 1 我尝试了以下方法 datenum dnum 但这没有用 我发现有效的方法是 datetime
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • MATLAB - 冲浪图数据结构

    我用两种不同的方法进行了计算 对于这些计算 我改变了 2 个参数 x 和 y 最后 我计算了每种变体的两种方法之间的 误差 现在我想根据结果创建 3D 曲面图 x gt on x axis y gt on y axis Error gt o
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • 在matlab中绘制给定区域内(两个圆之间)的向量场

    我想在 Matlab 中绘制下面的向量场 u cos x x 0 y y 0 v sin x x 0 y y 0 我可以在网格中轻松完成 例如 x 和 y 方向从 2 到 2 x 0 2 y 0 1 x y meshgrid 2 0 2 2
  • ROC曲线和libsvm

    给定一条 ROC 曲线plotroc m see here http www csie ntu edu tw cjlin libsvmtools roc curve for binary svm 理论问题 如何选择要使用的最佳阈值 编程问题
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 正确使用 fft2 和 fftshift 进行着色形状

    我正在尝试从 Trucco Verri 文本 3d 计算机视觉入门技术 中看到的着色算法重新创建经典形状 但我很难理解 matlab 中的 fft 函数 本质上 我需要使用可积性约束来获取图像的深度 Z 我不确定在这种情况下何时使用 fft
  • Matlab Builder JA - 将 Matlab 编译成 Java jar - 免费版本?

    请记住 我对 Matlab 一无所知 Matlab Builder JA 允许开发人员构建 Matlab 应用程序并将其导出到 Java jar 中 太棒了 我只需要生成一个 jar 然后就可以从其他 java 代码中使用它 有谁知道单罐包
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 读出 Matlab / Octave fft2() 函数输出的特定点

    我正在熟悉 Octave 及其功能fft2 在此玩具示例中 我的目标是生成以下 256 x 256 png 图像的 2D DFT 为了能够轻松理解输出 我尝试将此图像转换为 256 x 256 图像 消除颜色信息 Im imread cir

随机推荐

  • 【大数据】HiveQL:视图

    HiveQL 视图 视图可以允许保存一个查询 并向对待表一样对这个查询进行操作 这是一个逻辑结构 因为它不像一个表会存储数据 换句话说 Hive 目前暂不支持物化视图 当一个查询引用一个视图时 这个视图所定义的查询语句将和用户的查询语句组合
  • 首次域名注册

    什么是域名 域名是Internet网络上的一个服务器或一个网络系统的名字 在全世界 没有重复的域名 域名的形式是以若干个英文字母或数字组成 由 分隔成几部分 如 56dr cn 就是一个域名 域名与网址有什么区别 一个完整网址范例如下 ht
  • 如何评价代码的好坏?

    我们一般从可维护性 可读性 可扩展性 可测试性 可复用性 简洁性来评价代码的质量 可维护性 所谓维护无外乎就是修改bug 修改老的代码 添加新的代码之类的工作 代码易维护指的是在不破坏原有代码设计 不引入新的bug的前提下 能够快速的修改或
  • python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在 python 中赋值语句总是建立对象的引用值 而不是复制对象 因此 python 变量更像是指针 而不是数据存储区域 这点和大多数 OO 语言类似吧 比如 C java
  • JAVA基础学习笔记1

    教程来源 https www runoob com java java tutorial html 以下是个人学习笔记 用水平线划分小节 我的第一个JAVA程序 通常都写成这样 public class HelloWorld public
  • Spring Boot -01- 快速入门篇(详解图文教程)

    作者 肖朋伟 来源 https blog csdn net qq 40147863 article details 84194493 Spring Boot 01 快速入门篇 图文教程 今天开始不断整理 Spring Boot 2 0 版本
  • Windows安装Ubuntu双系统(Win11+最新Ubuntu22.04.1LTS)

    目录 前言 一 查看基础环境 二 准备安装文件 1 下载Ubuntu 22 04 01 LTS镜像ISO文件 2 下载官方推荐的U盘启动制作工具 3 制作启动U盘 4 新建硬盘分区用来安装Ubuntu系统 5 BIOS设置 三 安装Ubun
  • stata学习笔记①stata基础介绍

    文章目录 一 为什么要学stata 二 软件基本解释 1 软件界面 2 导入示例数据 3 认识几个重要的功能符号 三 数据的基本观测 四 统计性描述 1 codebook 数据字典使用 2 summarize 五 图像初步探索 1 hist
  • 华硕服务器RS720-E10-RS12无法安装win10到M.2的NVME SSD

    进BIOS开启CSM 兼容性支持模块
  • 区块链浏览器与合约代码

    声明 此文系 Vue3 0 Quasar ethers js 和以太坊智能合约交互 系列教程之一 开始 区块链浏览器 在本教程中 我一直在说区块链是去中心化的 它想打造的是一个数据永不可篡改且公开透明的数据世界 那么这样的区块链它最重要的一
  • linemod算法过程理解

    一 提取模板 1 预处理 使用高斯模糊预处理将要作为模板的RGB图 2 模板梯度计算 分别计算RGB三个通道中每个像素点x和y方向的梯度 sobel算子 取幅值最大的作为该像素的梯度 若梯度幅度值小于阈值 则被舍弃 3 梯度离散化及量化 对
  • 01 逻辑回归的理解

    1简介 逻辑回归是一个分类算法 本质是对线性回归做了一个变换 将值域压在0 1的空间 从而可以未每一个特征 估算出一个概率 作预测问题 二分类 逻辑回归问题 本质上就变成 求解变换后的每个特征的权重 ax1 bx2 cx3 0 1 求解模型
  • STM32的PWM和DAC练习

    文章目录 一 输出PWM波形 1 1 实验代码 1 2 调试 一 输出PWM波形 1 1 实验代码 代码来自野火STM32F103 mini开发板资料 1 书籍配套例程 F103RCMINI 32 TIM 高级定时器 3 TIM 高级定时器
  • 【牛客】HJ1 字符串最后一个单词的长度

    三行代码做一道题HJ1 字符串最后一个单词的长度 我的意思是不包括固定代码哦 读题 输出几个单词 以空格隔开 输出最后一个单词的长度 代码 直接写最终解题代码 include
  • vue路由传参的两种方式,实现返回上个页面不刷新

    我的项目是当在新增页面 下面叫A页面 先提交一些数据 然后跳转到下一个页面 下面叫B页面 再填写数据 然后返回到新增的页面 之前我直接跳转回B页面goback 这样的话跳转回来A页面就什么数据都没有了 解决方法有两种 一种是在地址栏里面拿参
  • 最简单自动化搜索的脚本代码

    from selenium import webdriver from selenium webdriver common by import By driver webdriver Chrome 打开的网址一般是get请求 driver
  • C语言学习记录——项目1 交换机后台管理之登录菜单(1)

    C语言学习记录 项目1 交换机后台管理之登录菜单 1 交换机 交换机 Switch 是一种用于电 光 信号转发的网络设备 它可以为接入交换机的任意两个网络节点提供独享的电信号通路 最常见的交换机是以太网交换机 其他常见的还有电话语音交换机
  • mysql 查询出表字段的属性

    SELECT column name 字段名 column comment 字段说明 column type 字段类型 column key 约束 FROM information schema COLUMNS WHERE table na
  • Node.js 基础篇(九):fs.watchFile

    目录 fs watch 监视 filename 的变化 fs watchFile 监视 filename 的变化 fs watch 监视 filename 的变化 fs watch filename options listener fil
  • 机器学习:matlab和python实现SVD(奇异值分解)算法

    1 SVD SVD Singular Value Decomposition 奇异值分解 SVD算法不光可以用于降维算法中的特征分解 还可以用于推荐系统 以及自然语言处理等领域 是很多机器学习算法的基石 假设我们现在有一个矩阵M m n 如