【生物信息学】奇异值分解(SVD)

news2024/11/18 7:28:03

目录

一、奇异值分解(SVD)

二、Python实现

1. 调包np.linalg.svd()

2. 自定义

三、SVD实现链路预测


一、奇异值分解(SVD)

        SVD分解核心思想是通过降低矩阵的秩来提取出最重要的信息,实现数据的降维和去噪。

ChatGPT:

        SVD(奇异值分解)是一种常用的矩阵分解方法,它可以将一个矩阵分解为三个矩阵的乘积:U、Σ和V^T。这里,U和V是正交矩阵,Σ是一个对角矩阵。SVD分解的详细过程如下:

        假设我们有一个m×n的矩阵A,其中m表示行数,n表示列数。SVD分解的目标是找到三个矩阵U、Σ和V^T,使得:A = UΣV^T

        其中,U是一个m×m的正交矩阵,Σ是一个m×n的对角矩阵,V^T是一个n×n的正交矩阵。正交矩阵满足U^TU = I和V^TV = I,其中I是单位矩阵。

对角矩阵Σ的对角线上的元素称为奇异值,通常用σ表示。奇异值按照从大到小的顺序排列,因此可以将它们写成σ₁ ≥ σ₂ ≥ ⋯ ≥ σᵣ,其中r是矩阵A的秩。

SVD分解的步骤如下:

  1. 计算矩阵A的转置A^T与A的乘积AA^T,得到一个m×m的对称矩阵。

  2. 对对称矩阵AA^T进行特征值分解,得到特征值和对应的特征向量。特征值按照从大到小排列。

  3. 根据特征值和特征向量,构造正交矩阵U。U的列向量是对应于AA^T的特征向量,按照特征值从大到小排列。

  4. 计算矩阵A的乘积A^TA,得到一个n×n的对称矩阵。

  5. 对对称矩阵A^TA进行特征值分解,得到特征值和对应的特征向量。特征值按照从大到小排列。

  6. 根据特征值和特征向量,构造正交矩阵V。V的列向量是对应于A^TA的特征向量,按照特征值从大到小排列。

  7. 从特征值中计算奇异值,奇异值的平方根即为特征值的平方根。

  8. 根据奇异值构造对角矩阵Σ。

最后,将矩阵A分解为A = UΣV^T。

二、Python实现

1. 调包np.linalg.svd()

在Python中,可以使用NumPy库来实现SVD分解。以下是一个示例代码:

import numpy as np

# 定义一个矩阵A
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 使用NumPy的svd函数进行SVD分解
U, s, Vt = np.linalg.svd(A)

# 打印分解结果
print("矩阵U:")
print(U)
print("奇异值:")
print(s)
print("矩阵V的转置:")
print(Vt)

        运行上述代码,将得到矩阵A的SVD分解结果。其中,U是一个正交矩阵,s是包含矩阵A的奇异值的一维数组,Vt是V的转置矩阵。

2. 自定义

import numpy as np

def svd_decomposition(A):
    # 计算 A 的转置与 A 的乘积
    AAT = np.dot(A, A.T)
    
    # 计算 A 的乘积与 A 的转置的乘积
    ATA = np.dot(A.T, A)
    
    # 计算 A 的转置与 A 的乘积的特征值和特征向量
    eigenvalues_U, eigenvectors_U = np.linalg.eig(AAT)
    
    # 计算 A 的乘积与 A 的转置的特征值和特征向量
    eigenvalues_V, eigenvectors_V = np.linalg.eig(ATA)
    
    # 对特征值进行排序,并获取排序索引
    sorted_indices_U = np.argsort(eigenvalues_U)[::-1]
    sorted_indices_V = np.argsort(eigenvalues_V)[::-1]
    
    # 获取奇异值
    singular_values = np.sqrt(np.sort(eigenvalues_U)[::-1])
    
    # 获取 U 矩阵
    U = eigenvectors_U[:, sorted_indices_U]
    
    # 获取 V 矩阵
    V = eigenvectors_V[:, sorted_indices_V]
    
    # 对 V 进行转置
    V = V.T
    
    return U, singular_values, V

# 定义一个矩阵 A
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 调用自定义的 SVD 分解函数
U, s, Vt = svd_decomposition(A)

# 打印分解结果
print("矩阵 U:")
print(U)
print("奇异值:")
print(s)
print("矩阵 V 的转置:")
print(Vt)

        自定义的 svd_decomposition 函数基于奇异值分解算法,通过计算矩阵 A 的转置与 A 的乘积以及 A 的乘积与 A 的转置的特征值和特征向量来实现 SVD 分解。

三、SVD实现链路预测

import numpy as np

# 定义邻接矩阵A,表示网络结构
A = np.array([[0, 1, 0, 1],
              [1, 0, 1, 0],
              [0, 1, 0, 1],
              [1, 0, 1, 0]])

# 进行奇异值分解
U, S, V = np.linalg.svd(A)

# 选择保留的前k个奇异值和对应的奇异向量
k = 2  # 选择保留的奇异值个数
U_k = U[:, :k]
S_k = np.diag(S[:k])
V_k = V[:k, :]

# 进行链路预测
A_pred = U_k @ S_k @ V_k

# 保留两位小数
A_pred = np.round(A_pred, decimals=2)

# 输出链路预测结果
print("链路预测结果:")
print(A_pred)

        首先定义了一个邻接矩阵 A,然后使用 np.linalg.svd 函数进行奇异值分解。然后,我们选择保留前 k 个奇异值和对应的奇异向量(在示例中选择 k=2),并重新构造预测的邻接矩阵 A_pred。最后,输出链路预测的结果。

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

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

相关文章

针对敏感数据的安全转录服务

即便在新冠肺炎疫情期间,继续保持了最高级别的机密性 新冠肺炎疫情带来的各种限制向所有服务提供商提出了挑战,促使提供商们想方设法采取更富想象力的新方法来满足客户的需求。澳鹏采用了一种由两种方案组成的工作机制,服务于客户机密材料的…

systrace使用注意事项

打开systrace文件报错:Unable to select a master clock domain because no path can be found from “SYSTRACE” to “LINUX_FTRACE_GLOBAL”. 使用systrace生成的trace.html文件无法打开,或者报上面的错误,可以选择下面这个方式&#xff1…

Springboot 实践(19)负载平衡配置与运用

前文Springboot 实践(1)至Springboot 实践(18),我们分别讲解了springboot数据源配置、swagger-ui测试controller、整合security、整合Oauth2.0、服务注册、路由配置以及配置中心等单例功能开发,实现了各个系…

Avalonia开发(一)环境搭建

一、介绍 开源 GitHub:https://github.com/AvaloniaUI/Avalonia/多平台支持,包括Windows、mac OS、Linux、iOS、Android、Samsung Tizen(很快支持)、WebAssemblyIDE支持,Visual Studio扩展支持,JetBrains …

NLP技术如何为搜索引擎赋能

目录 1. NLP关键词提取与匹配在搜索引擎中的应用1. 关键词提取例子 2. 关键词匹配例子 Python实现 2. NLP语义搜索在搜索引擎中的应用1. 语义搜索的定义例子 2. 语义搜索的重要性例子 Python/PyTorch实现 3. NLP个性化搜索建议在搜索引擎中的应用1. 个性化搜索建议的定义例子 2…

学习笔记-接口测试(postman、jmeter)

目录 一、什么是接口测试 二、前端和后端 三、get请求和post请求的区别 四、cookie和session 五、接口测试的依据 六、HTTP状态码 七、通用接口用例 八、postman接口测试 九、Jmeter接口测试 一、什么是接口测试 通常做的接口测试指的是系统对外的接口,比…

【深度学习】 Python 和 NumPy 系列教程(九):NumPy详解:1、创建数组的n种方式

目录 一、前言 二、实验环境 三、NumPy 0. 多维数组对象(ndarray) a. 多维数组的属性 1. 创建数组 a. 使用numpy.array函数: b. 使用numpy.zeros函数 c. 使用numpy.ones函数 d. 使用numpy.arange函数 e. 使用numpy.linspace函数 …

旋转链表-双指针思想-LeetCode61

题目要求:给定链表的头结点,旋转链表,将链表每个节点向右移动K个位置。 示例: 输入:head [1,2,3,4,5], k2 输出:[4,5,1,2,3] 双指针思想: 先用双指针策略找到倒数K的位置,也就是(…

根据商品ID获得淘宝商品详情, 获得淘宝商品详情高级版,获得淘宝商品评论, 获得淘宝商品快递费用 ,获得淘口令真实,批量获得淘宝商品上下架时间)

参数说明 通用参数说明 参数不要乱传,否则不管成功失败都会扣费url说明 https://api-gw.…….cn/平台/API类型/ 平台:淘宝,京东等, API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,测试key:test_…

火山引擎A/B测试在消费行业的案例实践

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 近日,火山引擎数智平台举办了“走进火山-全链路增长:数据飞轮转动消费新生力”的活动,其中火山引擎数智平台DataTester产品负责人…

家居设计软件Live Home 3D Pro mac中文版特点介绍

Live Home 3D Pro mac是一款专业的3D家居设计软件,可以帮助用户轻松创建和设计家居平面图和3D模型,并进行渲染和虚拟漫游。​​​​​​​ ​Live Home 3D Pro mac软件特点 1. 界面友好:Live Home 3D Pro的界面友好,操作简单方便…

MyBatis基础之SqlSession

SqlSession 线程安全问题 当你翻看 SqlSession 的源码时,你会发现它只是一个接口。我们通过 MyBatis 操作数据库,实际上就是通过 SqlSession 获取一个 JDBC 链接,然后操作数据库。 SqlSession 接口有 3 个实现类: #实现类1Defa…

北斗+渔业:且看北斗卫星如何提升渔业监管水平

近日,为确保渔业船舶海上航行安全和管理,海南省农业农村厅近日发布通告:全省小型海洋渔船须于今年9月30日前完成北斗船载终端安装,大中型海洋渔船须于今年11月30日前同时完成北斗船载终端和“插卡式AIS”终端安装。 近年来&#x…

两种风格的纯CSS3加载动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载动画</title><style>.loader {w…

调用feign接口时手动设置请求头信息

调用feign接口手动设置请求头 一 需求场景&#xff1a;二 解决方法2.1 feign接口添加RequestHeader的注解2.2 provider正常从请求头获取参数2. 3 consumer手动传参2.4 测试 一 需求场景&#xff1a; 我们在provider服务有些参数是从请求头中获取的&#xff0c;但是consumer服务…

单元测试的重要性:编写更安全、更可靠的代码

在软件开发过程中&#xff0c;测试是非常重要的一环。而在众多的测试方法中&#xff0c;单元测试占据了不可忽视的地位。那么&#xff0c;为什么我们需要进行单元测试呢&#xff1f;以下将从理论和实践两方面进行详细的解释。 一、单元测试的定义和目的 单元测试是指对软件中的…

FullGC了怎么办?

什么情况下回触犯FullGC 使用了大对象 //大对象会直接进入老年代在程序中长期持有了对象的引用 //对象年龄达到指定阈值也会进入老年代JVM内存设置不合理 FullGC出现的表象 CPU飙升或忽高忽低&#xff1b;程序性能不问题&#xff0c;接口响应时间比较长。 如何判断FullGC …

ChatGLM GPU多卡并行训练

1.为什么要使用多GPU并行训练 简单来说,有两种原因:第一种是模型在一块GPU上放不下,两块或多块GPU上就能运行完整的模型(如早期的AlexNet)。第二种是多块GPU并行计算可以达到加速训练的效果。想要成为“炼丹大师“,多GPU并行训练是不可或缺的技能。 2. 常见的多GPU训练方…

探讨UUID和Secrets:确保唯一性与数据安全的利器

&#x1f600;前言 在现代软件开发中&#xff0c;唯一标识符&#xff08;UUID&#xff09;和机密信息的处理是至关重要的。UUID是用于唯一标识数据记录和对象的128位值&#xff0c;确保了全球范围内的唯一性。同时&#xff0c;Python的secrets模块为处理机密信息提供了强大的随…