SVD之python代码实现

环境:jupyter(tensorflow)

import numpy as np
import matplotlib.image as mpimg
import matplotlib.pyplot as plt


def svd(A):
    # 特征值,特征向量
    val,U = np.linalg.eigh(A.dot(A.T))

    # 特征值由大到小排序
    val_idx = np.argsort(val)[::-1]
    val = val[val_idx]
    Sigma = np.sqrt(val)  #(649,)

    # 特征向量由大到小排序
    U = U[:,val_idx]

    # A = U * Sigma * VT --->  VT = inv_(U * Sigma) * A = inv(Sigma) * UT * A
    VT =  np.linalg.inv(np.diag(Sigma)).dot(U.T).dot(A)
    return U, Sigma, VT



def draw(img1,img2,img3):
    fig,ax = plt.subplots(1,3,figsize = (25,30))
    ax[0].imshow(img1)
    ax[0].set(title = 'src')
    ax[1].imshow(img2)
    ax[1].set(title = 'nums of sigma = 60')
    ax[2].imshow(img3)
    ax[2].set(title = 'nums of sigma = 120')

    plt.show()

if __name__ == '__main__':
    img = mpimg.imread("./mi.png")  #(521, 396, 3)
    A = img.reshape(521, 396 * 3)
    U,Sigma,VT = svd(A)
    print(U.shape,Sigma.shape,VT.shape)

    nums = 60
    img2 = U[:,0:nums].dot(np.diag(Sigma[0:nums])).dot(VT[0:nums,:])
    img2 = img2.reshape(521, 396, 3)

    nums = 120
    img3 = U[:, 0:nums].dot(np.diag(Sigma[0:nums])).dot(VT[0:nums, :])
    img3 = img3.reshape(521, 396, 3)

    draw(img,img2,img3)

其中:mi.png是网上下载的size =(521,396,3)的 人物图片

最终效果:

参考:SVD(奇异值分解)Python实现 - EndlessCoding - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值