Exercise 9.1: Matrix operations
import numpy as np
from scipy import linalg
n=200
m=500
#computes A(B add lambda*I) for any lambda
def Computes(A,B,lam=1):
size=B.shape
temp=B-lam*np.identity(size[0])
return np.matmul(A,temp)
A=np.random.normal(size=(n,m))
column=np.random.normal(5,5,size=(m,1))
#round to int
column=np.around(column)
B=linalg.toeplitz(column)
tran_A=np.matrix.transpose(A)
#calculate A add A
add=A+A
#calculate A multiply A's transpose
multi_1=np.matmul(A,tran_A)
#calculate A's transpose multiply A
multi_2=np.matmul(tran_A,A)
#caiculate A multiply B
multi_3=np.matmul(A,B)
Exercise 9.2: Solving a linear system
import numpy as np
from scipy import linalg
n=200
m=500
A=np.random.normal(size=(n,m))
column=np.random.normal(5,5,size=(m,1))
#round to int
column=np.around(column)
B=linalg.toeplitz(column)
b=np.random.normal(5,5,size=(m,1))
b=np.around(b)
#calculate B's inverse
inv_B=np.linalg.inv(B)
# solve Bx = b by x=B's inverse plus b
x=np.matmul(inv_B,b)
Exercise 9.3: Norms
import numpy as np
from scipy import linalg
n=2
m=5
A=np.random.normal(size=(n,m))
column=np.random.normal(5,5,size=(m,1))
#round to int
column=np.around(column)
B=linalg.toeplitz(column)
Frobenius_norm=np.linalg.norm(A,ord='fro')
Infinity_norm=np.linalg.norm(B,ord=np.inf)
(u,s,vh)=np.linalg.svd(B)
max_singular_values=s[0]
min_singular_values=s[-1]
Exercise 9.4: Power iteration
import numpy as np
from scipy import linalg
import time
def Power_iteration(n,precision=(10**-6)):
Z=np.random.normal(size=(n,n))
startTime=time.clock()
counter=0
x=np.random.normal(size=(n,1))
x=x/(np.linalg.norm(x,ord='fro'))
lam=0
while(True):
counter=counter+1
u=np.matmul(Z,x)
x_t=np.transpose(x)
#Rayleigh
lam=np.matmul( np.matmul(x_t,Z) ,x)
temp=x
x=u/(np.linalg.norm(u,ord='fro'))
# exam convergence condition
if( min(abs(temp-x))< precision):
break
endTime=time.clock()
Exercise 9.5: Singular values
import numpy as np
from scipy import linalg
import time
import numpy as np
from scipy import linalg
import time
def Singular_values(n,p):
C=np.random.rand(n,n)
for x in np.nditer(C,op_flags=["readwrite"]):
if(x<=p):
x[...]=1
else:
x[...]=0
singularVal=linalg.svd(C,compute_uv=False)
max_SingularVal=singularVal[0]
print("n:",n)
print("p:",p)
print("largest singular value:",max_SingularVal)
改变n,p的值进行测试:
MacBookdeMacBook-Pro:Desktop macbook$ python3 test.py
n: 10
p: 0.5
largest singular value: 5.557124820631773
MacBookdeMacBook-Pro:Desktop macbook$ python3 test.py
n: 100
p: 0.5
largest singular value: 50.004820112268476
MacBookdeMacBook-Pro:Desktop macbook$ python3 test.py
n: 100
p: 0.1
largest singular value: 10.83796353860957
MacBookdeMacBook-Pro:Desktop macbook$ python3 test.py
n: 100
p: 0.9
largest singular value: 89.70073847061134
从上述输出可以看出,当n增大或者p增大时,都会导致最大的奇异值增大
Exercise 9.6: Nearest neighbor
import numpy as np
from scipy import linalg
import time
def Nearest_neighbor(z,A):
Z=np.ones(A.shape)
Z=np.absolute(z*Z-A)
ind = np.unravel_index(np.argmin(Z, axis=None), Z.shape)
return A[ind]