fork download
  1. """ U : ma trận U
  2. s : vectơ đường chéo của ma trận Σ
  3. S : ma trận Σ
  4. VT: ma trận chuyển vị của ma trận V """
  5.  
  6. from scipy import linalg
  7.  
  8. # Bài 1 ########################################################################
  9. def tinh_svd(A):
  10. """Tính toán SVD của ma trận A."""
  11. U, s, VT = linalg.svd(A)
  12.  
  13. # Tạo ma trận S với kích thước phù hợp với U và VT
  14. S = np.zeros((A.shape[0], A.shape[1])) # Ma trận 0 có kích thước của A
  15. S[:A.shape[0], :A.shape[0]] = np.diag(s) # Chèn các giá trị đơn lẻ vào đường chéo chính
  16.  
  17. return U, S, VT
  18.  
  19. # Bài 2 ########################################################################
  20. def tinh_compact_svd(A):
  21. """Tính toán compact SVD của ma trận A."""
  22.  
  23. # 1. Tìm SVD của ma trận A
  24. U, S, VT = tinh_svd(A)
  25.  
  26. # 2. Tìm số giá trị λ khác 0 của ma trận A, đặt là r
  27. r = np.count_nonzero(S)
  28.  
  29. # 3. Giữ lại r hàng và r cột đầu tiên của ma trận Σ để tạo thành Σr
  30. Sr = S[:r, :r]
  31.  
  32. # 4. Giữ lại r cột đầu tiên của ma trận U để tạo ra Ur
  33. Ur = U[:, :r]
  34.  
  35. # 5. Giữ lại r hàng đầu tiên của ma trận VT để tạo ra VTr
  36. VTr = VT[:r, :]
  37.  
  38. return Ur, Sr, VTr
  39.  
  40. # Bài 3 ########################################################################
  41. def tinh_truncated_svd_k(A, k):
  42. """Tính toán truncated SVD của ma trận A với k."""
  43.  
  44. # 1. Tìm SVD của ma trận A
  45. U, S, VT = tinh_svd(A)
  46.  
  47. # 2. Giữ lại k hàng và k cột đầu tiên của ma trận Σ để tạo thành Σk
  48. Sk = S[:k, :k]
  49.  
  50. # 3. Giữ lại k cột đầu tiên của ma trận U để tạo ra Uk
  51. Uk = U[:, :k]
  52.  
  53. # 4. Giữ lại k hàng đầu tiên của ma trận VT để tạo ra VTk
  54. VTk = VT[:k, :]
  55.  
  56. # 5. Tìm số I từ k
  57. sum_r = np.sum(S**2)
  58. sum_k = np.sum(Sk**2)
  59. I = sum_k/sum_r
  60.  
  61. return Uk, Sk, VTk, I
  62.  
  63. # Bài 4 ########################################################################
  64. def tinh_truncated_svd_I(A, I):
  65. """Tính toán truncated SVD của ma trận A với I."""
  66.  
  67. # 1. Tìm SVD của ma trận A
  68. U, S, VT = tinh_svd(A)
  69.  
  70. # 2. Tìm số k từ I
  71. sum_r = np.sum(S**2)
  72. sum_k = 0
  73. i = 0
  74. while sum_k/sum_r < I and i < S.shape[0]:
  75. sum_k += S[i, i]**2
  76. i += 1
  77. k = i
  78.  
  79. # 3. Giữ lại k hàng và k cột đầu tiên của ma trận Σ để tạo thành Σk
  80. Sk = S[:k, :k]
  81.  
  82. # 4. Giữ lại k cột đầu tiên của ma trận U để tạo ra Uk
  83. Uk = U[:, :k]
  84.  
  85. # 5. Giữ lại k hàng đầu tiên của ma trận VT để tạo ra VTk
  86. VTk = VT[:k, :]
  87.  
  88. return Uk, Sk, VTk, k
  89.  
  90.  
Success #stdin #stdout 0.07s 28176KB
stdin
Standard input is empty
stdout
Standard output is empty