矩阵的奇异值分解

奇异值分解(Singular Value Decomposition)简称SVD,主要作用是简化数据,提取信息。

SVD的公式: A m × n = U m × m Σ m × n V n × n T A_{m\times n}=U_{m\times m} \Sigma_{m\times n} V_{n\times n}^T Am×n=Um×mΣm×nVn×nT

这个公式中, U 和 V 都是正交矩阵,即:
U U T = U T U = E m × m V V T = V T V = E n × n UU^T=U^TU=E_{m\times m} \qquad VV^T=V^TV=E_{n\times n} UUT=UTU=Em×mVVT=VTV=En×n

原矩阵A是一个m行n列的矩阵,它被分解成了三个矩阵,分别是:

矩阵别称维度计算方法
U U U 矩阵A的左奇异向量m行n列列由 A A T AA^T AAT的特征向量构成,且特征向量为单位列向量
Σ \Sigma Σ 矩阵A的奇异值m行n列对角元素来源于 A A T AA^T AAT A T A A^TA ATA的特征值的平方根,并且是按从大到小的顺序排列的
V V V 矩阵A的右奇异向量n行n列列由 A T A A^TA ATA的特征向量构成,且特征向量为单位列向量

在这里插入图片描述

对矩阵进行SVD分解

import numpy as np
from numpy import linalg as la
from numpy import *

M = [[1, 1, 1, 0, 0],
      [2, 2, 2, 0, 0],
      [1, 1, 1, 0, 0],
      [5, 5, 5, 0, 0],
      [1, 1, 0, 2, 2],
      [0, 0, 0, 3, 3],
      [0, 0, 0, 1, 1]]

# 7x5
Data = mat(M)

U, Sigma, VT = linalg.svd(Data)

# 构建Sig矩阵,上面的Sigma只是Sig的对角元素
Signn = mat(np.diag(Sigma))   # 以Sigma为主对角线创建矩阵(5x5)
Sigmn = mat([[Sigma[0], 0, 0, 0, 0], [0, Sigma[1], 0, 0, 0], [0, 0, Sigma[2], 0, 0], [0, 0, 0, Sigma[3], 0], [0, 0, 0, 0, Sigma[4]], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])


print(U[:, :Data.shape[1]] * Signn * VT)

print(U * Sigmn * VT)


'''
最后一个是公式的原始样式,但构建Sigmm没有Signn来得来得快
而且Sigmn的倒数x (x=Data.shape[0]-len(Sigma))行都是由0组成的,与U的最后x列相乘的结果也是0,所以截掉不影响最后结果
U[:, :Data.shape[1]] * Signn * VT 等于 U * Sigmn * VT
'''


创建矩阵的一些语法

import numpy as np


# 从0开始 取30个数 两两之间相差1
n = np.arange(0, 30, 1)
nn = n.reshape(6, 5)

# 相当于形成一个等差数列, 首项是0,尾项是4,一共9个
o = np.linspace(0, 4, 9)
o.resize(3, 3)

# reshape有返回值,不改变内存   resize无返回值,改变内存



a = np.ones((3, 4))  # 3行4列全是1
b = np.zeros((2, 4)) # 2行3列全是0
e = np.eye(3)        # 3维单位矩阵
x = [4, 5, 6]
y = np.diag(x)       # 以x为主对角线创建矩阵(3x3)
c = np.random.randint(0, 10, (4,3))  # 在0到10之间随机出数,创建4x3矩阵

# 水平拼接行数要相同,竖直拼接列数要相同
p = np.ones([2, 3], int)
pp = np.hstack([p, 2*p])  # 水平拼接
sp = np.vstack([a, b])    # 竖直拼接

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值