svd降维 python案例_SVD(奇异值分解)Python实现

注: 在《SVD(异值分解)小结 》中分享了SVD原理,但其中只是利用了numpy.linalg.svd函数应用了它,并没有提到如何自己编写代码实现它,在这里,我再分享一下如何自已写一个SVD函数。但是这里会利用到SVD的原理,如何大家还不明白它的原理,可以去看看《SVD(异值分解)小结 》,或者自行百度/google。

1、SVD算法实现

1.1 SVD原理简单回顾

有一个\(m \times n\)的实数矩阵\(A\),我们可以将它分解成如下的形式

\[

A = U\Sigma V^T

\tag{1-1}

\]

其中\(U\)和\(V\)均为单位正交阵,即有\(UU^T=I\)和\(VV^T=I\),\(U\)称为左奇异矩阵,\(V\)称为右奇异矩阵,\(\Sigma\)仅在主对角线上有值,我们称它为奇异值,其它元素均为0。上面矩阵的维度分别为\(U \in \mathbf{R}^{m\times m},\ \Sigma \in \mathbf{R}^{m\times n}\),\(\ V \in \mathbf{R}^{n\times n}\)。

正常求上面的\(U,V,\Sigma\)不便于求,我们可以利用如下性质

\[

AA^T=U\Sigma V^TV\Sigma^TU^T=U\Sigma \Sigma^TU^T

\tag{1-2}

\]

\[

A^TA=V\Sigma^TU^TU\Sigma V^T=V\Sigma^T\Sigma V^T

\tag{1-3}

\]

1.2 SVD算法

据1.1小节,对式(1-3)和式(1-4)做特征值分解,即可得到奇异值分解的结果。但是样分开求存在一定的问题,由于做特征值分解的时候,特征向量的正负号并不影响结果,比如,我们利用式(1-3)和(1-4)做特征值分解

\[

AA^T\mathbf{u}_i = \sigma_i \mathbf{u}_i\quad \text{or} \quad AA^T(-\mathbf{u}_i) = \sigma_i (-\mathbf{u}_i)\\

A^TA\mathbf{v}_i = \sigma_i \mathbf{v}_i\quad \text{or} \quad A^TA(-\mathbf{v}_i) = \sigma_i (-\mathbf{v}_i)

\]

如果在计算过程取,取上面的\(\mathbf{u}_i\)组成左奇异矩阵\(U\),取\(-\mathbf{v}_i\)组成右奇异矩阵\(V\),此时\(A\ne U\Sigma V^T\)。因此求\(\mathbf{v}_i\)时,要根据\(\mathbf{u}_i\)来求,这样才能保证\(A= U\Sigma V^T\)。因此,我们可以得出如下1.1计算SVD的算法。它主要是先做特性值分解,再根据特征值分解得到的左奇异矩阵\(U\)间接地求出部分的右奇异矩阵\(V'\in \mathbf{R}^{m\times n}\)。

算法1.1:SVD

输入:样本数据

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

计算特征值: 特征值分解\(AA^T\),其中\(A \in \mathbf{R}^{m\times n}\)为原始样本数据

\[

AA^T=U\Sigma \Sigma^TU^T

\]

得到左奇异矩阵\(U \in \mathbf{R}^{m \times m}\)和奇异值矩阵\(\Sigma' \in \mathbf{R}^{m \times m}\)

间接求部分右奇异矩阵: 求\(V' \in \mathbf{R}^{m \times n}\)

利用\(A=U\Sigma'V'\)可得

\[

V' = (U\Sigma')^{-1}A = (\Sigma')^{-1}U^TA

\tag{1-4}

\]

返回\(U,\ \Sigma',\ V'\),分别为左奇异矩阵,奇异值矩阵,右奇异矩阵。

注: 这里得到的\(\Sigma'\)和\(V'\)与式(1-2)所得到的\(\Sigma,\ V\)有区别,它们的维度不一样。\(\Sigma'\)是只取了前\(m\)个奇异值形成的对角方阵,即\(\Sigma' \in \mathbf{R}^{m \times m}\);\(V'\)不是一个方阵,它只取了\(V \in \mathbf{R}^{m \times n}\)的前\(m\)行(假设\(m < n\)),即有\(V' = V(:m,\cdot)\)。这样一来,我们同样有类似式(1-1)的数学关系成立,即

\[

A = U\Sigma' (V')^T\tag{1-5}

\]

我们可以利用此关系重建原始数据。

2、SVD的Python实现

以下代码的运行环境为python3.6+jupyter5.4。

2.1 SVD实现过程

读取数据

这里面的数据集大家随便找一个数据就好,如果有需要我的数据集,可以下在面留言。

import numpy as np

import pandas as pd

from scipy.io import loadmat

# 读取数据,使用自己数据集的路径。

train_data_mat = loadmat("../data/train_data2.mat")

train_data = train_data_mat["Data"]

print(train_data.shape)

特征值分解

# 数据必需先转为浮点型,否则在计算的过程中会溢出,导致结果不准确

train_dataFloat = train_data / 255.0

# 计算特征值和特征向量

eval_sigma1,evec_u = np.linalg.eigh(train_dataFloat.dot(train_dataFloat.T))

计算右奇异矩阵

#降序排列后,逆序输出

eval1_sort_idx = np.argsort(eval_sigma1)[::-1]

# 将特征值对应的特征向量也对应排好序

eval_sigma1 = np.sort(eval_sigma1)[::-1]

evec_u = evec_u[:,eval1_sort_idx]

# 计算奇异值矩阵的逆

eval_sigma1 = np.sqrt(eval_sigma1)

eval_sigma1_inv = np.linalg.inv(np.diag(eval_sigma1))

# 计算右奇异矩阵

evec_part_v = eval_sigma1_inv.dot((evec_u.T).dot(train_dataFloat))

上面的计算出的evec_u, eval_sigma1, evec_part_v分别为左奇异矩阵,所有奇异值,右奇异矩阵。

2.2 SVD降维后重建数据

取不同个数的奇异值,重建图片,计算出均方误差,如图2-1所示。从图中可以看出,随着奇异值的增加,均方误差(MSE)在减小,且奇异值和的比率正快速上升,在100维时,奇异值占总和的53%。

图2-1 奇值分解维度和均方误差变化图

注: 均方误差MSE有如下计算公式

\[

\text{MSE} = \frac{1}{n}\left((y_1-y_1')^2+(y_2-y_2')^2+\cdots+(y_n-y_n')^2\right)

\]

我们平时听到的\(\text{RMSE}=\sqrt{\text{MSE}}\)。

将图和10、50、100维的图进行比较,如图3-2所示。在直观上,100维时,能保留较多的信息,此时能从图片中看出车辆形状。

图2-2 原图与降维重建后的图比较

总结

SVD与特征值分解(EVD)非常类似,应该说EVD只是SVD的一种特殊怀况。我们可以通这它们在实际的应用中返过来理解特征值/奇异值的含义:它代表着数据的信息量,它的值越大,信息越多。

最近作业是真的多呀,冒着生命危险来分享,希望能给大家带来帮助

By © 2017 likecs 版权所有.

粤ICP备12038626号-2

Powered By WordPress . Theme by Luju

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

salt 启动mysql_saltsack自动化配置day03:服务部署mysql部署

一、MySQL集群需求分享1、抽象&#xff1a;功能模块把基础的写成通用服务部署也要抽象出来模块redis内存有的多&#xff0c;有的少&#xff0c;可以config set在线更改redis 安装、配置、启动mysql 安装、配置(my.cnf可以统一 目录默认配置可以统一)master: server_id 1111slav…

jtag引脚定义_从逆向分析的角度学习硬件调试技巧JTAG,SSD和固件提取

我想从逆向的角度做了深入了解JTAG&#xff0c;JTAG是许多嵌入式CPU使用的硬件级别调试机制&#xff0c;我希望通过这篇文章从逆向工程师的角度解释如何使用JTAG&#xff0c;并在此过程中提供一些实际示例。0x01 研究目标通过这篇文章&#xff0c;我希望做到以下几点&#xff1…

python virtualenv conda_在vscode中启动conda虚拟环境的思路详解

问题&#xff1a;cudatoolkit cudnn 通过conda 虚拟环境安装&#xff0c;先前已经使用virtualenv安装tf&#xff0c;需要在conda虚拟环境中启动外部python虚拟环境思路&#xff1a;conda prompt即将 [虚拟环境位置] 以参数形式传入 [activate.bat]VSOCDE中的设置添加以下语句{&…

python如何导入图片imread_OpenCV 使用imread()函数读取图片的六种正确姿势

经常看到有人在网上询问关于imread()函数读取图片失败的问题。今天心血来潮&#xff0c;经过实验&#xff0c;总结出imread()调用的四种正确姿势。通常我要获取一张图片的绝对路径是这样做的&#xff1a;在图片上右键——属性——安全——对象名称。然后复制对象名称就得到了图…

python2.7与3.7脚本转换_python 2.7 - python 3.7 升级记录

更换的模块python 3.7 模块名python 2.7 模块名python 3.7 包python 2.7包pymysqlMySQLdbPyMySQLMySQL-pythonpdfminerpdfminerpdfminer.sixpdfminerurllib.parseurlparse自带自带htmlHTMLParser自带HTMLparser语法变化1. print 修改为 print()2. except Exception, e 修改为 e…

远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案

引言RPC(Remote Procedure Call Protocol)——远程过程调用协议&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在&#xff0c;如TCP或UDP&#xff0c;为通信程序之间携带信息数据。在OSI网络…

chrome 新的session 设置_为什么还是由这么多人搞不懂Cookie、Session、Token?

作者&#xff1a;不学无数的程序员链接&#xff1a;https://urlify.cn/Yfm6Vr# Cookie洛&#xff1a;大爷&#xff0c;楼上322住的是马冬梅家吧&#xff1f; 大爷&#xff1a;马都什么&#xff1f; 夏洛&#xff1a;马冬梅。 7大爷&#xff1a;什么都没啊&#xff1f; 夏洛…

mysql for update用处_for update的作用和用法

一、for update定义for update是一种行级锁&#xff0c;又叫排它锁&#xff0c;一旦用户对某个行施加了行级加锁&#xff0c;则该用户可以查询也可以更新被加锁的数据行&#xff0c;其它用户只能查询但不能更新被加锁的数据行&#xff0e;如果其它用户想更新该表中的数据行&…

python大数据零基础_零基础学习大数据人工智能,学习路线篇!

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统&#xff0c;这两个是学习大数据的基础&#xff0c;学习的顺序不分前后。Python&#xff1a;Python 的排名从去年开始就借助人工智能持续上升&#xff0c;现在它已经成为了语言排行第一名。从学习难易度来看…

python删除文件和linux删除文件区别_使用Python批量删除文件列表

使用Python批量删除文件列表环境&#xff1a;已知要删除的文件列表&#xff0c;即确定哪些文件要删除。代码如下&#xff1a;#!/usr/bin/env python#codingutf-8#目的&#xff1a;本程序主要为删除给定的文件列表import osimport shutil#引入模块&#xff0c;os为包含普遍的操作…

华为python有必要学吗_【华为云技术分享】这个 Python 库有必要好好学学

这里看一个最基本的例子&#xff0c;这里给到一个 User 的 Class 定义&#xff0c;再给到一个 data 数据&#xff0c;像这样&#xff1a;1 class User(object):2 def __init__(self, name, age):3 self.name name4 self.age age56 data [{7 name: Germey,8 age: 239 }, {10 nam…

python求平行四边形面积_python 已知平行四边形三个点,求第四个点的案例

我就废话不多说了&#xff0c;大家还是直接看代码吧&#xff01;import numpy as np#已知平行四边形三个点&#xff0c;求第四个点#计算两点之间的距离def CalcEuclideanDistance(point1,point2):vec1 np.array(point1)vec2 np.array(point2)distance np.linalg.norm(vec1 -…

eview面板数据之混合回归模型_【视频教程】Eviews系列25|面板数据回归分析之Hausman检验及本章常见问题解答...

点击上方关注我们!本期我们学习Eviews统计建模最后一部分--面板数据回归分析Hausman检验及本章常见问题解答。实操&#xff1a;Hausman检验判断是固定效应模型还是随机效应模型上期我们讲到模型判断若选择模型2,需进一步通过Hausman检验判断固定效应还是随机效应&#xff0c;接…

python打出由边框包围的_python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)...

图像边框的实现图像边框设计的主要函数cv.copyMakeBorder()——实现边框填充主要参数如下&#xff1a;参数一&#xff1a;源图像——如&#xff1a;读取的img参数二——参数五分别是&#xff1a;上下左右边的宽度——单位&#xff1a;像素参数六&#xff1a;边框类型&#xff1…

mysql5.7.21备份脚本_Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本

#!/bin/sh#db_backups_conf.txt文件路径db_backups_conf"/wocloud/shell/db_backups_conf.txt"#判断文件是否存在if [ -f "${db_backups_conf}" ];thenecho $(date %Y-%m-%d %H:%M:%S)" 数据库配置信息文件存在&#xff0c;开始进行数据备份"#获…

python嵌套列表操作_python基础(list列表的操作,公共方法,列表嵌套,元祖)...

list 列表索引&#xff0c;切片与str相同。列表的操作(增删改查)1&#xff0c;增加.append()  追加&#xff0c;增加到最后li [alex,wusir,egon,女神,taibai]li.append(ppp)print(li).insert()  中间插入&#xff0c;通过索引li [alex,wusir,egon,女神,taibai]li.insert(…

mybatis mysql selectkey_Mybatis示例之SelectKey的应用

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题&#xff0c;他可以很随意的设置生成主键的方式。不管SelectKey有多好&#xff0c;尽量不要遇到这种情况吧&#xff0c;毕竟很麻烦。SelectKey需要注意order属性&#xff0c;像Mysql一类支持自动增长类型的…

python程序设计上机实践第三章答案_20192419 实验三《Python程序设计》实验报告

学号 2019-2020-2 《Python程序设计》实验3报告课程&#xff1a;《Python程序设计》班级&#xff1a;1924姓名&#xff1a; 万腾阳学号&#xff1a;20192419实验教师&#xff1a;王志强实验日期&#xff1a;2020年5月16日必修/选修&#xff1a; 公选课1.实验内容创建服务端和客…

完成数独的算法 python_python实现数独算法实例

本文实例讲述了python实现数独算法的方法。分享给大家供大家参考。具体如下&#xff1a;# -*- coding: utf-8 -*-Created on 2012-10-5author: Administratorfrom collections import defaultdictimport itertoolsa [[ 0, 7, 0, 0, 0, 0, 0, 0, 0], #0[ 5, 0, 3, 0, 0, 6, 0, …

python读取多个文件csv_Python:读取多个文本文件并写入相应的csv文件

我在别处找不到这个问题的答案&#xff0c;所以我将继续把它贴在这里&#xff1a;我有一个Python脚本&#xff0c;它将读取文本文件的内容&#xff0c;将其内容拆分为单词&#xff0c;然后输出一个CSV文件&#xff0c;该文件将文本缩减为单词频率列表。(最后&#xff0c;我将插…