奇异值分解SVD(证明全部省略)

SVD知识梳理

  • 一、引入
  • 二、SVD的定义、性质
    • 定义
    • 例题
    • 奇异值分解一定存在
    • 紧奇异值分解和截断奇异值分解
      • 几何解释
  • 三、SVD算法
    • 计算过程
  • 四、SVD与矩阵近似
  • 五、python实现
  • 六、应用

一、引入

主成分分析PCA、潜在语义分析都会用到SVD
不要求A矩阵是方阵,SVD是线性代数中相似对角化的延伸
任意mn的矩阵都可以用三个矩阵相乘的形式表示
分别是m阶正交矩阵、由降序排列的非负的对角线元素构成的m
n矩形对角矩阵、n阶正交矩阵
矩阵奇异值分解一定存在但不唯一
SVD可以看作矩阵压缩数据的一种方法,这种近似是在平方损失意义下的最优近似

二、SVD的定义、性质

定义

A=UΣVT
满足以下条件
UUT=E;
VVT=E;
Σ=diag(σ12,…σp),其中σ1>=σ2>=…>=σp>=0;p=min{m,n}

例题

在这里插入图片描述

奇异值分解一定存在

设定m>=n,分三步完成证明
1、确定v和Σ
①Σ
ATA的特征值都是非负的||Ax||2=xTATAx=λxTx=λ||x||2
所以λ=|Ax||2/||x||2>=0
假设正交矩阵V的列的排列使对应的特征值降序排列:λ1>=λ2>=λ3>=…>=λn
计算矩阵A的奇异值σj=√λj, j=12,…n
说明:ATA的特征值与A的特征值是平方关系
ATA=(UΣVT)T(UΣVT)=V(ΣTΣ)VT;
AAT=(UΣVT)(UΣVT)T=U(ΣΣT)UT;
V的列向量是ATA的特征向量,U的列向量是AAT的特征向量,Σ的奇异值是ATA和AAT的特征值的平方根,ATA和AAT的特征值相同

R(A)=r,R(ATA)=r,由于ATA是对称矩阵,它的秩等于正的特征值的个数
所以剩下的n-r个特征值为0。所以σ同理

Σ=在这里插入图片描述 ②v
V1=[v1,v2,…vr];V2=[vr+1,…vn]
其中V1对应的是ATA的正特征值对用的特征向量, 其中V2对应的是ATA的0特征值对用的特征向量V=[V1,V2]
V2
ATAx=0(V2的列向量构成了ATA的零空间N(ATA)=N(A),所以V2的列向量构成A的零空间的一组标准正交基)
Ax=0(正交矩阵的转置乘以正交矩阵等于单位矩阵)
③U
uj=1/σjAvj,j=1,2…r
U1=[u1,u2,…ur]
则AV1=U1Σ1在这里插入图片描述
U2与V~2同理

紧奇异值分解和截断奇异值分解

紧奇异值分解(无损压缩,与原始矩阵秩相同)
截断奇异值分解(有损压缩,小于原始矩阵的秩):满足了秩的要求以后其余元素都变成零

几何解释

被分成的三个矩阵可以解释为,一个坐标轴的旋转或反射变换、一个坐标轴的缩放变换、另一个坐标轴的旋转或反射变换。
在这里插入图片描述

三、SVD算法

计算过程

①计算ATA的特征值和特征向量,特征值开方从大到小排序即为Σ
注意:因为A不是方阵,所以在构造的时候,要将格式修改为m*n的形式,缺的位置补零。
②求n阶正交矩阵V:特征向量单位化
③求m阶正交矩阵U:
uj=1/σjAvj (j=1,2,3…,r) U1=[u1,u2,u3,…ur]
求AT的零空间的一组标准正交基{ur+1,ur+2,…um}
(ATx=0,求出特征向量以后记得标准化)
U=[U1,U2]
④得到奇异值分解

四、SVD与矩阵近似

弗罗贝尼乌斯范数:是向量L2范数的直接推广,对应机器学习中的平方损失函数
在这里插入图片描述
在这里插入图片描述

矩阵的外积展开式
在这里插入图片描述

在这里插入图片描述

若A的秩为n,Ak的秩为k, 且Ak是秩为k的矩阵中在弗罗贝尼乌斯范数意义下A的最优近似矩阵。那么Ak就是A的截断奇异值分解。
通常奇异值σi递减的很快,所以k取很小值时,AK也可以对A有很好的近似。

五、python实现

import numpy as np
a = np.random.randint(-10,10,(4, 3)).astype(float)
print(a)
print("-----------------")
u, sigma, vT = np.linalg.svd(a)
print(u)
print("-----------------")
print(sigma)
print("-----------------")
print(vT)
print("-----------------")# 将sigma 转成矩阵
SigmaMat = np.zeros((4,3))
SigmaMat[:3, :3] = np.diag(sigma)
print(SigmaMat)
print("------验证-------")
a_ = np.dot(u, np.dot(SigmaMat, vT))
print(a_)

六、应用

推荐算法

 import numpy as npimport randomclass SVD:def __init__(self,mat,K=20):self.mat=np.array(mat)self.K=Kself.bi={}self.bu={}self.qi={}self.pu={}self.avg=np.mean(self.mat[:,2])for i in range(self.mat.shape[0]):uid=self.mat[i,0]iid=self.mat[i,1]self.bi.setdefault(iid,0)self.bu.setdefault(uid,0)self.qi.setdefault(iid,np.random.random((self.K,1))/10*np.sqrt(self.K))self.pu.setdefault(uid,np.random.random((self.K,1))/10*np.sqrt(self.K))
def predict(self,uid,iid):  #预测评分的函数#setdefault的作用是当该用户或者物品未出现过时,新建它的bi,bu,qi,pu,并设置初始值为0self.bi.setdefault(iid,0)self.bu.setdefault(uid,0)self.qi.setdefault(iid,np.zeros((self.K,1)))self.pu.setdefault(uid,np.zeros((self.K,1)))rating=self.avg+self.bi[iid]+self.bu[uid]+np.sum(self.qi[iid]*self.pu[uid]) #预测评分公式#由于评分范围在1到5,所以当分数大于5或小于1时,返回5,1.if rating>5:rating=5if rating<1:rating=1return ratingdef train(self,steps=30,gamma=0.04,Lambda=0.15):    #训练函数,step为迭代次数。print('train data size',self.mat.shape)for step in range(steps):print('step',step+1,'is running')KK=np.random.permutation(self.mat.shape[0]) #随机梯度下降算法,kk为对矩阵进行随机洗牌rmse=0.0for i in range(self.mat.shape[0]):j=KK[i]uid=self.mat[j,0]iid=self.mat[j,1]rating=self.mat[j,2]eui=rating-self.predict(uid, iid)rmse+=eui**2self.bu[uid]+=gamma*(eui-Lambda*self.bu[uid])  self.bi[iid]+=gamma*(eui-Lambda*self.bi[iid])tmp=self.qi[iid]self.qi[iid]+=gamma*(eui*self.pu[uid]-Lambda*self.qi[iid])self.pu[uid]+=gamma*(eui*tmp-Lambda*self.pu[uid])gamma=0.93*gammaprint('rmse is',np.sqrt(rmse/self.mat.shape[0]))def test(self,test_data):  #gamma以0.93的学习率递减test_data=np.array(test_data)print('test data size',test_data.shape)rmse=0.0for i in range(test_data.shape[0]):uid=test_data[i,0]iid=test_data[i,1]rating=test_data[i,2]eui=rating-self.predict(uid, iid)rmse+=eui**2print('rmse of test data is',np.sqrt(rmse/test_data.shape[0]))def getData():   #获取训练集和测试集的函数import ref=open('C:/Users/xuwei/Desktop/data.txt','r')lines=f.readlines()f.close()data=[]
for line in lines:list=re.split('\t|\n',line)if int(list[2]) !=0:    #提出评分0的数据,这部分是用户评论了但是没有评分的data.append([int(i) for i in list[:3]])random.shuffle(data)train_data=data[:int(len(data)*7/10)]test_data=data[int(len(data)*7/10):]print('load data finished')print('total data ',len(data))
return train_data,test_datatrain_data,test_data=getData()
a=SVD(train_data,30)  
a.train()
a.test(test_data)

代码链接:https://blog.csdn.net/akiyamamio11/article/details/79042688

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

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

相关文章

jq 比较两个时间是否在同一天_jq: 属性-class

.aadClass() 添加class用法和前面的text方法一样&#xff0c;可以传字符串&#xff0c;可以传函数。值用空格隔开可以增加多个class<.removeClass() 移出class值<他们在一起也可以链式调用。链式调用: 取值的时候返回return结果&#xff0c;赋值返回this,表示可以继续调用…

李航《统计学习方法》之EM算法及其推广

EM算法是一种迭代方法&#xff0c;可以看作用坐标下降法来最大化对数似然估计下界的过程。 一、引入 &#xff08;一&#xff09;算法介绍 1、例题 有三枚硬币&#xff0c;ABC他们出现正面的概率分别是Π&#xff0c;p和q。进行如下投掷实验&#xff1a;先投掷A&#xff0c…

获取选中_【字节】如何实现选中复制的功能

Barnett Demesne公园中在白雪覆盖的山坡上玩耍的一家&#xff0c;北爱尔兰贝尔法斯特(© Stephen Barnes/Alamy)本题摘自于我 github 上的面试每日一题&#xff1a;https://q.shanyue.tech&#xff0c;并有大厂面经及内推信息&#xff0c;可在左下角打开本题原文链接在一些…

c语言 bool_程序的数据要放到哪里呢?|C语言第二篇

在C语言第一篇里我写到了编译器&#xff0c;在这里补充一个点&#xff0c;文本编辑器&#xff0c;编译器&#xff0c;IDE(集成开发环境)的区别。文本编辑器是用作编写普通文字的应用软件&#xff0c;如window的记事本&#xff0c;atom&#xff0c;sublime&#xff0c;它常用来编…

项目职责_项目经理的9个职责

虽说懂技术是项目经理的一个必要项&#xff0c;但事实上&#xff0c;很多技术出身的人&#xff0c;根本干不好项目经理。当项目经理之前&#xff0c;是活儿管你&#xff0c;让你干什么你就干什么&#xff0c;只对任务结果负责&#xff0c;对整体目标不负责。当项目经理之后&…

jenkins 安装插件失败_Jenkins 自动化安装插件

手工安装 Jenkins 插件的方法通常&#xff0c;我们有两种方法安装 Jenkins 插件。第一种方法是到 Jenkins 插件管理页面搜索插件&#xff0c;然后安装。第二种方法是上传 Jenkins 插件的 hpi 文件安装。这两种方法能满足大多数人的需求。第一种方法&#xff0c;如下图所示&…

anaconda下python中matplotlib画图无法显示中文

第一步&#xff1a;在自己电脑里选择喜欢的字体&#xff0c;搜索位置为C:\Windows\Fonts&#xff0c;我选择的是SimSun 第二步 查找Matplotlib默认字体目录 打开anaconda prompt,输入python&#xff0c;接下来进入查找过程 查找代码如下 import matplotlib print(matplotlib.…

Python编程及高级数据分析

一、介绍&#xff08;11月22日&#xff09; 小问题找函数 大问题找包 python数据分析常用的包 数据库实现的功能的在panda包里面找 其中M\S\P是数据可视化工具 深度学习使用的包是pytorch(facebook支持) 中文的nlp&#xff1a;Jieba、pynlpir 英文的nlp:NLTK 学python前的准…

helm安装_Helm部署和体验jenkins

运行在Kubernetes上的Jenkins下图来自rancher官方博客&#xff0c;在kubernetes环境下&#xff0c;jenkins任务被交给各个pod执行&#xff0c;这些pod在需要时被创建&#xff0c;任务结束后被销毁&#xff0c;这样既能合理利用资源&#xff0c;又能给每个任务提供一致的干净的初…

【无标题】【一周安全资讯1223】一图读懂《工业和信息化部办公厅关于组织开展网络安全保险服务试点工作的通知》;15亿条纽约房产记录泄露

要闻速览 1、一图读懂《工业和信息化部办公厅关于组织开展网络安全保险服务试点工作的通知》 2、国家数据局《“数据要素”三年行动计划 (2024—2026年)》公开征求意见 3、中国信息通信研究院发布《公共数据授权运营发展洞察 (2023年)》 4、15亿条纽约房产记录泄露&#xff0c…

自定义键盘码_无线+矮轴≤299?ikbc S200 2.4G 机械键盘测评

早在18年初&#xff0c;Cherry就发布了适用于笔记本及超薄键盘的全新轴体MX Low Profile&#xff0c;也就是为人所熟知的“矮轴”。之后Ducky、酷冷至尊、FILCO、ikbc等一众厂商也先后推出了搭载Cherry矮轴的超薄机械键盘&#xff0c;不过市场表现一直有些不温不火。在码呆看来…

simpledateformat格式_如何使用SimpleDateFormat?

SimpleDateFormat是一种比较常用的时间类&#xff0c;可以实现对时间按照一定的字符串格式进行处理。DateFormat类的作用把时间对象转化成指定格式的字符串。反之&#xff0c;把指定格式的字符串转化成时间对象。DateFormat是一个抽象类&#xff0c;一般使用它的的子类SimpleDa…

李沐老师的《动手学深度学习PyTorch》中的d2lzh_python包的安装

关于RNN章节 以及模型章节等会使用到d2l的python包 cmd下载地址&#xff1a;pip install d2l -i https://pypi.doubanio.com/simple/

人体轮廓_人体艺术:赏世界著名的女人体油画:身体轮廓

阅读本文前&#xff0c;请您先点击上面的“十点姐姐”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

c语言未声明的标识符什么意思_C语言中%d和%f是什么意思啊?

%d表示输入或输出十进制有符号数&#xff1b;%f表示输入或输出浮点数&#xff08;float&#xff0c;四字节表示&#xff09;&#xff1b;在C语言中输出不同数据时需要用到不同的格式字符&#xff0c;%d是用来输出十进制整型数据的实际长度输出&#xff0c;%f是以小数形式输出单…

李沐老师《动手学深度学习》课程总结1

数据操作 1、 创建数组&#xff1a;形状、数据类型、数据值 2、 访问元素&#xff1a;[1, 2] 访问第二行第三列 [1, :] 访问第二行 [1:3, 1:] 子区域&#xff1a;第二行至第四行前一行到第二列之后所有 [::3, ::2] 子区域&#xff1a;每三行一跳 第零、三…行拿出; 第零、二…列…

gimp 抠图_gimp抠图教程:gimp快速实现抠图效果

摘要&#xff1a;将图像中需要的部分从画面中精确地提取出来&#xff0c;我们就称为抠图&#xff0c;抠图是后续图像处理的重要基础&#xff0c;关于gimp的快速抠图技巧你们知道吗?将图像中需要的部分从画面中精确地提取出来&#xff0c;我们就称为抠图&#xff0c;抠图是后续…

docker build -t_在Docker环境构建、打包和运行Spring Boot应用

为何考虑采用Docker&#xff1f;Docker是提供用户构建镜像的一种容器化技术&#xff0c;所构建的镜像包含了主要的应用程序和运行应用所需的所有依赖项。该镜像可在任何虚拟机或物理机器上的Docker容器上运行。它的强大之处在于允许用户在开发、测试、预生产和生产中运行同样的…

Java内部类是什么?

在类内部可定义成员变量和方法&#xff0c;且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner&#xff0c;此时类 Inner 就称为内部类&#xff08;或称为嵌套类&#xff09;&#xff0c;而类 Outer 则称为外部类&#xff08;或称为宿主类&#xff09;。 …

MOOC-人工智能实践:Tensorflow笔记4.2自制数据集txt文件和数据集不匹配解决办法(读取文件名并提取内容并合并原始内容与提取内容)

1、读取文件名称生成txt文件 # P01 批量读取文件名&#xff0c;并将读取的文件名保存到指定路径下的txt中&#xff08;带.*** 后缀&#xff09;import os def ListFilesToTxt(dir, file, wildcard, recursion):exts wildcard.split(" ")files os.listdir(dir)for …