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

奇异值分解SVD(证明全部省略)相关推荐

  1. 奇异值分解(SVD)原理详解及推导 (转)

    很不错的文章,适合入门. 转载出处http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都 ...

  2. 【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,有相当多的应用与奇异值都可以扯上关系,它不光可以用于降维算法中的特征分解,比如做f ...

  3. 奇异值分解(SVD)原理详解及推导(转载)

    转载自:http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补 ...

  4. 线性代数学习笔记11-2:总复习Part2(相似对角化、对称矩阵、奇异值分解SVD)

    下面的一系列分解,涉及了线性代数中的各个重要知识点: 关于求解方程组的分解: Ch1[矩阵乘法角度] 矩阵 A \mathbf A A=列向量矩阵 C \mathbf C C和行向量矩阵 R \mat ...

  5. 主成分分析(PCA)与矩阵奇异值分解(SVD)

    1 矩阵奇异值分解SVD 1.1 矩阵奇异值分解的数学原理 在关于SVD(Singular Value Decomposition)的讲解中将涉及稍微多一点的数学推导. 定义:设 A A A是秩为 r ...

  6. 奇异值分解(SVD)原理详解及推导

    转载于:http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补 ...

  7. 特征值分解,奇异值分解svd

    特征值分解: 特征值分解(Eigen decomposition),又称谱分解(Spectral decomposition)是将矩阵分解为由其特征值和特征向量表示的矩阵之积的方法.需要注意只有方阵才 ...

  8. 矩阵分解之: 特征值分解(EVD)、奇异值分解(SVD)、SVD++

    目录: 1.矩阵分解 1.1 矩阵分解的产生原因 1.2 矩阵分解作用 1.3 矩阵分解的方法 1.4 推荐学习的经典矩阵分解算法 2. 特征值分解(EVD) 3. 奇异值分解(SVD) 4. SVD ...

  9. 降维 ---- 主成分分析 (PCA)、奇异值分解 (SVD)

    降维 在机器学习或数据处理中,经常会碰到一些高维数据,而高维数据情形下经常出现样本稀疏.计算困难等问题,称之为"维度灾难". 对于一个高维数据数 D={X1,X2,...,XN}D ...

  10. 机器学习-Sklearn(第三版)Day4 主成分分析PCA与奇异值分解SVD

    目录 一.简介 什么是维度 sklearn中的降维算法 二.PCA与SVD 0.如何实现降维算法 思考:PCA和特征选择技术都是特征工程的一部分,它们有什么不同? 1.重要参数n_components ...

最新文章

  1. jquery插件的写法
  2. sap信贷管理的操作流程
  3. 关于vue使用eslint规范报Trailing Spaces not Allowed错误解决办法!
  4. boost::mpl模块AUX_ASSERT_IS_SEQ的测试程序
  5. javaWeb项目 IDEA中导入eclipes项目的方法。maven多模块项目(父子模块)与普通的web项目导入
  6. Spring 中的国际化Message的简单例子(ApplicationContext) 不跟框架集成的版本
  7. 天池 在线编程 聪明的销售(计数+贪心)
  8. LeetCode--75.颜色分类(三路快排,计数排序)
  9. MQ中将消息发送至远程队列的配置
  10. python列表add用法_使用add_edge_list()方法创建图形的最佳方法是什么?
  11. mysql - GTID主从复制
  12. Centos 5.2安装Cacti并集成Nagios安装文档
  13. linux 命令行 迅雷替代,linux下迅雷的替代
  14. 在2022年如何将整个维基百科下载到U盘中
  15. Netty Websocket多人多房间聊天室Demo
  16. GhostScript 沙箱绕过(命令执行)漏洞 CVE-2019-6116 漏洞复现
  17. ST-LINK下载程序出现flash download failed - ‘cortex m4‘
  18. 中科院大牛博士是如何进行文献检索和阅读(好习惯受益终生)
  19. matlab求解多自由度振动系统,【2017年整理】1-《机械振动基础》大作业,基于matlab的多自由度振动.doc...
  20. PHP现代濒危动物毕业论文,保护濒危动物(论文).doc

热门文章

  1. Win7旗舰版系统hosts文件位置在哪里
  2. 企业微信怎么删除好友 企业微信如何删除成员
  3. 腾讯视频下载转mp4_腾讯视频如何上传自己的视频
  4. java截取指定字符串中的某段字符
  5. 学习Spring Boot:(二十)使用 MongoDB
  6. IoT -- (一) 物联网平台架构设计分析
  7. 电子游戏跟计算机有什么关联,电脑和电子游戏对小学生的影响
  8. 面试常见java异常题_Java异常面试题(含答案)
  9. 在c语言中预处理命令行都以井号开头,以井号开头的行和gcc预处理器输出中的'#1“ac”'之类的数字是什么意思?...
  10. 未为dll加载任何符号_专家发现aspersky 和Trend Micro安全性解决方案中的DLL劫持问题...