zoukankan      html  css  js  c++  java
  • Python中利用svd进行矩阵分解和重构原始矩阵??

     1 # 创建数据集,5*7的矩阵
     2 def loadExData():
     3     return [[1,1,1,0,0],
     4             [2,2,2,0,0],
     5             [1,1,1,0,0],
     6             [5,5,5,0,0],
     7             [1,1,0,2,2],
     8             [0,0,0,3,3],
     9             [0,0,0,1,1]];
    10 # 对矩阵进行SVD分解
    11 from numpy import *;
    12 def svd_():
    13     Data=loadExData();
    14     U,Sigma,VT=linalg.svd(Data);    
    15     print('SVD分解Sigma的结果为:',Sigma);
    16     return U,Sigma,VT;
    17 """
    18 array([  9.72140007e+00,   5.29397912e+00,   6.84226362e-01,
    19          1.52344501e-15,   2.17780259e-16])
    20 可以看到最后两个值很小,于是就可以将最后两个值去掉了
    21 """
    22 # 近似重构原始矩阵
    23 def reconstructMat():
    24     U,Sigma,VT=svd_();
    25     Sig3=mat([[Sigma[0],0,0],[0,Sigma[1],0],[0,0,Sigma[2]]]);
    26     reconMat=U[:,:3]*Sig3*VT[:3,:];
    27     return reconMat;

    重构的矩阵结果如下:

     1 >>> reconMat
     2 matrix([[  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
     3           -1.51788304e-17,  -1.02999206e-17],
     4         [  2.00000000e+00,   2.00000000e+00,   2.00000000e+00,
     5            1.73472348e-18,   1.12757026e-17],
     6         [  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
     7            7.61977287e-16,   7.66747776e-16],
     8         [  5.00000000e+00,   5.00000000e+00,   5.00000000e+00,
     9            6.59194921e-17,   9.02056208e-17],
    10         [  1.00000000e+00,   1.00000000e+00,  -7.21644966e-16,
    11            2.00000000e+00,   2.00000000e+00],
    12         [  1.66533454e-16,   1.30451205e-15,  -8.88178420e-16,
    13            3.00000000e+00,   3.00000000e+00],
    14         [  6.24500451e-17,   4.57966998e-16,  -3.33066907e-16,
    15            1.00000000e+00,   1.00000000e+00]])

    原始矩阵为:

    1 >>> loadExData()
    2 [[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]]

    主要问题:怎样寻找奇异值的个数??

    有很多启发式策略,两种典型的方法是:(1)保留矩阵中90%的能量信息,奇异值的平方之和为总能量;(2)保留矩阵中前2000或3000个奇异值,当有成千上万个奇异值时;

  • 相关阅读:
    用户与组
    初识linux
    权限管理
    认识vim 编辑器
    文件归档
    路由相关术语
    Access、Hybrid和Trunk
    #error作用
    交换芯片收发包的 DMA 实现原理
    linux网络学习
  • 原文地址:https://www.cnblogs.com/yuzhuwei/p/4126531.html
Copyright © 2011-2022 走看看