You are on page 1of 8

TUGAS MATEMATIKA LANJUT

I KADEK AGUS WAHYU RAHARJA (23219019)

Program SVD Decomposition

'''
I Kadek Agus Wahyu Raharja(23219019)
SVD Decomposition
'''

import numpy as np
from math import sqrt

#Membuat random matriks tall dengan dimensi m x n


m = 10
n = 5
A = np.random.randint(1,9,(m,n))
A = np.array(A)
A1 = list(map(list, A))
Vs = 0
run = True
print ('Matriks A dengan dimensi',m,'x',n,':')
print (A)

#Fungsi transpose
def transpose(A):
result = [[A[j][i] for j in range(A.shape[0])]
for i in range(A.shape[1])]
result1 = np.array(result)
return result1

#Fungsi perkalian
def multiply(A,B):
rowA,rowB,colA,colB = len(A),len(B),len(A[0]),len(B[0])
result = []
for i in range (rowA):
row = []
for j in range(colB):
X = 0
for k in range(colA):
X += A[i][k]*B[k][j]
row.append(X)
result.append(row)
result1 = np.array(result)
return result1
#fungsi membuat matrix identitas
def make_identity(r,c):
identity = []
for i in range(0,r):
row = []
for j in range(0,c):
elem = 0
if i==j:
elem = 1
row.append(elem)
identity.append(row)
return identity

#fungsi untuk mencari nilai norm


def norm(A):
return sqrt(sum([A_i**2 for A_i in A]))

#fungsi QR decomposition untuk mencari nilai eigen


def qr(A):
m, n = A.shape
Q = np.eye(m)
for i in range(n - (m == n)):
H = np.eye(m)
H[i:, i:] = make_householder(A[i:, i])
Q = np.dot(Q, H)
A = np.dot(H, A)
return Q, A

def make_householder(a):
v = a / (a[0] + np.copysign(norm(a), a[0]))
v[0] = 1
H = np.eye(a.shape[0])
H -= (2 / np.dot(v, v)) * np.dot(v[:, None], v[None, :])
return H

#Invers matrix dengan metode Gauss


def invers(A):
I = make_identity(len(A),len(A[0]))
for i in range(len(A)):
for j in range(len(A)):
if (i != j):
c = A[j][i]/A[i][i]
for k in range(len(A)):
A[j][k]-=A[i][k]*c
I[j][k]-=I[i][k]*c
m = np.array(I)
A = np.array(A)
for i in range(len(I)):
for j in range(len(I)):
for k in range (len(I)):
if (i==j):
I[i][k]/=A[i][j]
A[i][k]/=A[i][j]

m = np.array(I)
return m

#mencari Eigenvalue dan Eigenvector


CT = transpose(A)
CTC = multiply(CT,A)
m, n = CTC.shape
V = make_identity(m,n)

while(run):
Vs += 1
Q1, R1 = qr(np.array(CTC))
V = multiply(V,Q1)
CTC2 = multiply(R1,Q1)
for i in range(m):
for j in range(m):
if (i>j and CTC2[i][j]>0 and CTC2[i][j]<1.0e-05):
run = False
CTC = CTC2

#Nilai Eigenvalue adalah nilai tiap diagonal CTC2 perhitungan


terakhir
print ('Nilai Sigma adalah :')
for i in range (n):
row = []
for j in range(n):
if (i==j):
result = CTC2[i][j]
row.append(result)
sigma = np.diag(row)
print(sigma)

#Mengeleminasi sigma < 0.1


print('Setelah mengeleminasi nilai sigma dengan batas 0.1 maka
nilai sigma :')
batas = 0.1 * sigma
for i in range(len(batas[0])):
for j in range(len(batas[1])):
if (batas[i][j] < 0.1):
batas[i][j] = 0
else:
batas[i][j] = sigma[i][j]
sigma_baru = np.array(batas)
print(sigma_baru)

#Nilai Eigenvector adalah nilai perkalian semua vector V yang


diperoleh
print('Nilai matriks V adalah :')
print (V)

#Menentukan nilai miu berdasarkan persamaan A*V = miu*sigma


print('Nilai matriks miu adalah :')
AV = multiply(A,V)
sigma_baru_inv = invers(sigma)
miu = multiply(AV,sigma_baru_inv)
print (miu)

#Menentukan batas nilai sigma


print ('Membuktikan dengan fungsi A = miu*sigma*V.T :')
VT = transpose(V)
miu_sigma = multiply(miu,sigma_baru)
B = multiply(miu_sigma,VT)
print (np.round(B,))

Berdasarkan program dapat dilihat matriks A adalah matriks yang ditentukan secara acak dengan
dimensi matriks A (10x5) . Dari matriks A akan digunakan persamaan SVD sebagai berikut :
𝐴 = 𝜇∑𝑉 𝑇 ………………...….(1)
𝐴𝑇 𝐴 = 𝑉∑𝑇 ∑𝑉 𝑇 ……………….(2)
𝐴𝑉 = 𝜇∑……………………..(3)
Setelah menentukan nilai 𝐴𝑇 𝐴 selanjutnya kitan mendapatkan nilai eigen value yang merupakan
nilai dari ∑ dan nilai eigenvector yang merupakan nilai dari matriks V. Setelah mendapatkan nilai
∑ selanjutnya nilai ∑ akan dieleminasi, dimana apabila nilai ∑ < 0.1 maka akan dianggap nol.
Selanjutnya berdasarkan Persamaan (3) maka kita mendapatkan nilai 𝜇 . Untuk membuktikan
apakah nilai 𝜇, ∑, 𝑉 sudah benar maka kita masukan pada Persamaan (1). Maka output dari
program yang telah dibuat dapat dilihat sebagai berikut :
Output :
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC
v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more
information.
>>>
========================RESTART: D:/SVD.py ==========================
Matriks A dengan dimensi 10 x 5 :
[[4 4 2 8 5]
[7 2 6 6 3]
[6 7 5 5 3]
[2 6 1 6 4]
[7 2 4 1 8]
[5 2 8 6 2]
[1 6 1 2 8]
[6 1 8 6 7]
[1 5 1 3 6]
[8 2 8 1 6]]
Nilai Sigma adalah :
[[24.01425418 0. 0. 0. 0. ]
[ 0. 24.01425418 0. 0. 0. ]
[ 0. 0. 24.01425418 0. 0. ]
[ 0. 0. 0. 24.01425418 0. ]
[ 0. 0. 0. 0. 12.15720077]]
Setelah mengeleminasi nilai sigma dengan batas 0.1 maka nilai sigma :
[[24.01425418 0. 0. 0. 0. ]
[ 0. 24.01425418 0. 0. 0. ]
[ 0. 0. 2.40142542 0. 0. ]
[ 0. 0. 0. 2.40142542 0. ]
[ 0. 0. 0. 0. 1.21572008]]
Nilai matriks V adalah :
[[-0.48981484 0.39834159 0.09733972 0.14728551 -0.75514062]
[-0.3332145 -0.60981414 -0.09825936 0.71204821 0.02067022]
[-0.46667664 0.56141058 -0.04680224 0.23740399 0.63912438]
[-0.43072532 -0.20143614 -0.73982998 -0.4757362 -0.01502851]
[-0.49571982 -0.33718294 0.65675812 -0.43429107 0.14362994]]
Nilai matriks miu adalah :
[[-0.42266032 -0.12577833 -0.11377127 -0.08599901 -0.08733188]
[-0.45667477 0.11314366 -0.09430481 -0.01156694 -0.08794614]
[-0.46828686 -0.04540329 -0.08605988 0.14047974 -0.06866572]
[-0.33366951 -0.20230233 -0.09384536 0.00885652 -0.02161573]
[-0.43134062 0.03812342 0.20037622 -0.02270959 -0.12783661]
[-0.434105 0.14076563 -0.13365819 0.0140232 0.12961217]
[-0.32409866 -0.24150108 0.13472775 0.00962669 0.09270124]
[-0.5438398 0.11254244 0.01123033 -0.09991822 0.12486921]
[-0.28687374 -0.19641354 0.05331415 -0.00366551 0.06613603]
[-0.48818526 0.17630593 0.14193653 0.05913695 -0.00329339]]
Membuktikan dengan fungsi A = miu*sigma*V.T :
[[4. 4. 2. 8. 5.]
[7. 2. 6. 6. 3.]
[6. 7. 5. 5. 3.]
[2. 6. 1. 6. 4.]
[7. 2. 4. 1. 8.]
[5. 2. 8. 6. 2.]
[1. 6. 1. 2. 8.]
[6. 1. 8. 6. 7.]
[1. 5. 1. 3. 6.]
[8. 2. 8. 1. 6.]]
>>>

Berdasarkan output nilai 𝜇, ∑, 𝑉 sudah benar karena hasil dari (𝜇∑𝑉 𝑇 ) memiliki nilai yang sama
dengan matriks A.
Pseudocode Program SVD Decomposition
Berikut adalah pseudocode program utama dari SVD Decomposition
Pseudocode SVD Decomposition
Program ini menunjukan cara kerja sistem dimana sistem akan mencari
nilai 𝜇∑𝑉 𝑇 dan membuktikan apakah nilai output sudah benar dan
sesuai dengan input matriks
INPUT :
1. orde matriks A = m x n
2. Random matriks A
SET :
1. V matriks identitas dengan orde (m x n)
2. Run = True
3. CTC = transpose(A) * A

WHILE (Run) :

1. Qn += 1
2. Mencari nilai Q dan R dari CTCk
3. V = V*Q (untuk menentukan nilai eigenvector dengan
mengalikan semua nilai Q)
4. CTCk+1 = R*Q (mencari nilai matriks CTC baru)
5. FOR (nilai baris matriks CTC = i):
FOR(nilai kolom matriks CTC = j):
IF (i>j and CTC2[i][j]>0 and CTC2[i][j]<1.0e-05):
(jika nilai komponen
matriks A
pada diagonal bawah
bernilai mendekati
zeros)
Run = False
BREAK WHILE;
END FOR
END FOR
CTCk = CTC2k+1 (agar dapat memproses nilai A selanjutnya)
// mengeleminasi sigma < 0.1
6. Sigma = diagonal matriks dari CTC2
7. Batas = 0.1 * sigma
8. IF (any of batas < 0.1):
batas = 0
ELSE :
batas = batas
9. Miu = A*V*(sigma)-1
10. B = miu*sigma*transpose(V)

OUTPUT:

1. Nilai matriks A random


2. Nilai sigma dan sigma baru
3. Nilai matriks V yang merupakan eigenvector CTC
4. Pembuktian dengan melihat Matriks B

You might also like