Generate matrices A, with random Gaussian entries, B, a Toeplitz matrix, where A ∈Rn×m and B ∈Rm×m, for n = 200, m = 500.
代码:
n,m = 200,500
A = np.asmatrix(np.random.normal(0,1,(n,m)))
B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))
Exercise 9.1: Matrix operations
Calculate A + A, AA>,A>A and AB. Write a function that computes A(B−λI) for any λ.
代码:
import numpy as np
from scipy.linalg import toeplitz
def exercise():
n,m = 200,500
A = np.asmatrix(np.random.normal(0,1,(n,m)))
print("A = ",end="")
print(A)
print("A+A = ",end="")
print(A+A)
print("A*A.T = ",end="")
print(A*A.T)
print("A.T*A = ",end="")
print(A.T*A)
B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))
print("B = ",end="")
print(B)
print("A*B = ",end="")
print(A*B)
v = float(input("The value you want to input: ") )
value = B-v*np.eye(500)
print("A * (B-v*I) = ",end="")
print(A*value)
if __name__ == "__main__":
exercise()
输出:
A = [[-1.10225136 2.21873012 0.33921943 ... -0.58045849 -0.22609409
-1.1485404 ]
[-0.79951558 0.3417823 -1.53500528 ... -0.53382699 -0.27875606
0.6064832 ]
[-1.83764129 1.12700183 2.34544169 ... 0.58404444 0.33494688
1.34002791]
...
[ 0.14869196 1.91087847 0.27526752 ... -0.88849499 0.10884669
1.94673766]
[ 1.82040969 0.98783944 -0.34103696 ... -2.32697057 2.51322659
-0.3932646 ]
[ 0.33260388 0.50151772 0.42966366 ... 1.27819282 0.31062568
-0.24729084]]
A+A = [[-2.20450272 4.43746023 0.67843887 ... -1.16091698 -0.45218817
-2.29708081]
[-1.59903115 0.68356461 -3.07001055 ... -1.06765397 -0.55751211
1.2129664 ]
[-3.67528258 2.25400365 4.69088339 ... 1.16808888 0.66989376
2.68005581]
...
[ 0.29738393 3.82175694 0.55053505 ... -1.77698999 0.21769337
3.89347533]
[ 3.64081939 1.97567887 -0.68207391 ... -4.65394115 5.02645318
-0.78652919]
[ 0.66520775 1.00303545 0.85932733 ... 2.55638563 0.62125136
-0.49458167]]
A*A.T = [[ 4.63208246e+02 2.40180484e-01 3.46530645e+01 ... -4.82740565e+00
1.43593770e+01 -2.17085074e+01]
[ 2.40180484e-01 4.99395568e+02 7.79920974e+00 ... -2.47458350e+01
-1.03703127e+01 -1.13860129e+01]
[ 3.46530645e+01 7.79920974e+00 4.98845546e+02 ... 2.98096407e+01
-2.77969133e+01 -3.60815715e+00]
...
[-4.82740565e+00 -2.47458350e+01 2.98096407e+01 ... 5.70297122e+02
-1.01518627e+01 -2.60267595e+01]
[ 1.43593770e+01 -1.03703127e+01 -2.77969133e+01 ... -1.01518627e+01
5.09262164e+02 1.69596816e+01]
[-2.17085074e+01 -1.13860129e+01 -3.60815715e+00 ... -2.60267595e+01
1.69596816e+01 5.14457478e+02]]
A.T*A = [[220.27899088 33.17327302 -7.69605592 ... -6.22577705 7.89493968
11.88368899]
[ 33.17327302 207.30700145 -4.94490961 ... 11.35008009 -5.42586929
-4.82416196]
[ -7.69605592 -4.94490961 189.54300527 ... 7.76804105 5.16030969
2.37855479]
...
[ -6.22577705 11.35008009 7.76804105 ... 216.7720772 -4.8927115
-8.21323537]
[ 7.89493968 -5.42586929 5.16030969 ... -4.8927115 183.16753692
-22.57196274]
[ 11.88368899 -4.82416196 2.37855479 ... -8.21323537 -22.57196274
209.72169494]]
B = [[ 5 2 13 ... 7 8 9]
[ 2 5 2 ... 14 7 8]
[13 2 5 ... 3 14 7]
...
[ 7 14 3 ... 5 2 13]
[ 8 7 14 ... 2 5 2]
[ 9 8 7 ... 13 2 5]]
A*B = [[ 2.31168967e+02 8.88960471e+01 6.84638967e+01 ... 1.92738084e+02
-2.54989557e+01 3.08709334e+02]
[-2.00968433e+02 -3.05183581e+01 -1.06020820e+02 ... -1.24856236e+02
-1.17401426e+02 -1.83299043e+02]
[ 1.78175408e+02 -1.49132894e-01 1.21106933e+01 ... 1.64014805e+02
4.33408821e+01 2.44508398e+02]
...
[-1.48937966e+02 -3.75092102e+02 -3.13060871e+02 ... -7.07733678e+01
-2.34358754e+02 -2.00245964e+02]
[-2.05011103e+02 -2.47971128e+02 -1.87814456e+02 ... -1.16379285e+02
-5.07267358e+01 -1.45244630e+02]
[ 2.28095970e+02 2.80775135e+01 -1.37630114e+01 ... 1.34247891e+02
2.00410902e+02 5.31975865e-02]]
The value you want to input: 4
A * (B-v*I) = [[ 235.57797263 80.02112666 67.10701892 ... 195.05991792
-24.5945794 313.30349533]
[-197.77037044 -31.88548727 -99.88079936 ... -122.7209277
-116.28640163 -185.72497588]
[ 185.52597323 -4.6571402 2.72892653 ... 161.67862732
42.00109455 239.14828636]
...
[-149.53273344 -382.73561552 -314.16194073 ... -67.21938788
-234.79414092 -208.03291466]
[-212.29274156 -251.92248528 -186.45030784 ... -107.07140277
-60.77964217 -143.67157193]
[ 226.76555493 26.0714426 -15.48166602 ... 129.13511993
199.16839955 1.04236093]]
Exercise 9.2: Solving a linear system
Generate a vector b with m entries and solve Bx = b.
代码:
import numpy as np
from scipy.linalg import toeplitz
def exercise():
B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))
print("B = ",end="")
print(B)
b = np.array(list (np.random.randint(0,15) for k in range(1,501) ))
print("b = ",end="")
print(b)
print("x = ",end="")
x = np.linalg.solve(B, b)
print(x)
if __name__ == "__main__":
exercise()
输出:
由于输出规模太大,故选取5*5的作为测试:
B = [[ 7 10 9 11 9]
[10 7 10 9 11]
[ 9 10 7 10 9]
[11 9 10 7 10]
[ 9 11 9 10 7]]
b = [ 7 4 6 0 10]
x = [ 1.0620155 -1.08386187 0.27061311 2.58280479 -2.27131783]
Exercise 9.3: Norms
Compute the Frobenius norm of A: kAkF and the infinity norm of B: kBk∞. Also find the largest and smallest singular values of B.
代码:
import numpy as np
from scipy.linalg import toeplitz
def exercise():
n, m = 200, 500
A = np.asmatrix(np.random.normal(0, 1, (n, m)))
B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))
FrobeniusNormA = np.linalg.norm(A,'fro')
print("The Frohenius Norm of A: ",end="")
print(FrobeniusNormA)
InfinityNormB = np.linalg.norm(B,np.inf)
print("The Infinity Norm of B: ",end="")
print(InfinityNormB)
n1,n2,n3 = np.linalg.svd(B,full_matrices=True)
max_singular_value = max(n2)
min_singular_value = min(n2)
print("max: ",end="")
print(max_singular_value)
print("min: ",end="")
print(min_singular_value)
if __name__ == "__main__":
exercise()
输出:
The Frohenius Norm of A: 315.6780718174581
The Infinity Norm of B: 3536.0
max: 3499.330487023503
min: 0.11771046122162954
Exercise 9.4: Power iteration
Generate a matrix Z, n × n, with Gaussian entries, and use the power iteration to find the largest eigenvalue and corresponding eigenvector of Z. How many iterations are needed till convergence?
Optional: use the time.clock() method to compare computation time when varying n.代码:
import numpy as np
from time import clock
def power_iter(matrix_Z,error):
u = np.random.rand(matrix_Z.shape[0])
num_times = 0
nextL = 1
preL = 0
start_t = clock()
while abs(nextL - preL) > error or num_times == 0:
preL = nextL
v = matrix_Z.dot(u)
nextL = max(abs(v))
u = v / nextL
num_times += 1
end_t = clock()
return u, nextL, num_times, end_t - start_t
if __name__ == "__main__":
n_size = [20,100,500,1000,2000]
for n in n_size:
np.random.seed(0)
Z = np.random.normal(0, 0.1, (n, n))
eigenvector, lam, num_iters, time = power_iter(Z, 0.0001)
print("The size = " + str(n) + ", ",end="")
print('The Iteration times: '+ str(num_iters) + ", ",end="")
print('the total time: ' + str(time) + ".")
输出:
分别取n = 20、100、500、1000、2000,统计每次输入的迭代次数,运行时间:
The size = 20, The Iteration times: 7186, the total time: 0.044823762223709894.
The size = 100, The Iteration times: 3441, the total time: 0.1178116618883803.
The size = 500, The Iteration times: 1831, the total time: 0.35797010994023276.
The size = 1000, The Iteration times: 15637, the total time: 10.70897158665916.
The size = 2000, The Iteration times: 1753, the total time: 4.444710261403037.
Exercise 9.5: Singular values
Generate an n×n matrix, denoted by C, where each entry is 1 with probability p and 0 otherwise. Use the linear algebra library of Scipy to compute the singular values of C. What can you say about the relationship between n, p and the largest singular value?
代码:
import numpy as np
def exercise():
for n in range(3,210,3):
matrix_C = np.zeros((n,n))
for i in range(1,10,2):
p = i/10
for k in range(n):
for l in range(n):
if np.random.random() > 1-p:
matrix_C[k][l] = 1
else:
matrix_C[k][l] = 0
n1,n2,n3 = np.linalg.svd(matrix_C)
max_singular_value = max(n2)
print("The Largest Singular Value = ",max_singular_value,"p = ",p,"n = ",n)
if __name__ == "__main__":
exercise()
输出:
为了更加全面分析数据,我遍历了从n=3每次递增3,一直到210,对每个n,均设p=0.1,0.3,0.5,0.7,0.9的情况比较其最大奇异值。
The Largest Singular Value = 1.0 p = 0.1 n = 3
The Largest Singular Value = 1.4142135623730951 p = 0.3 n = 3
The Largest Singular Value = 2.175327747161075 p = 0.5 n = 3
The Largest Singular Value = 2.732050807568877 p = 0.7 n = 3
The Largest Singular Value = 2.732050807568877 p = 0.9 n = 3
The Largest Singular Value = 1.931851652578136 p = 0.1 n = 6
The Largest Singular Value = 2.65902918377423 p = 0.3 n = 6
The Largest Singular Value = 3.9690783319193947 p = 0.5 n = 6
The Largest Singular Value = 3.998033285331483 p = 0.7 n = 6
The Largest Singular Value = 5.445270580796229 p = 0.9 n = 6
The Largest Singular Value = 2.2711376057657193 p = 0.1 n = 9
The Largest Singular Value = 2.655144368309624 p = 0.3 n = 9
The Largest Singular Value = 4.259188093238085 p = 0.5 n = 9
The Largest Singular Value = 6.531866761814029 p = 0.7 n = 9
The Largest Singular Value = 8.07880078775689 p = 0.9 n = 9
The Largest Singular Value = 2.7462872998525776 p = 0.1 n = 12
The Largest Singular Value = 3.8718097899665493 p = 0.3 n = 12
The Largest Singular Value = 6.305742275616531 p = 0.5 n = 12
The Largest Singular Value = 7.99569761412166 p = 0.7 n = 12
The Largest Singular Value = 10.980442789505467 p = 0.9 n = 12
The Largest Singular Value = 2.2379962667290996 p = 0.1 n = 15
The Largest Singular Value = 5.778670823227578 p = 0.3 n = 15
The Largest Singular Value = 8.090188637280358 p = 0.5 n = 15
The Largest Singular Value = 10.29573791442704 p = 0.7 n = 15
The Largest Singular Value = 13.67635721304295 p = 0.9 n = 15
...
The Largest Singular Value = 19.38949701576099 p = 0.1 n = 186
The Largest Singular Value = 56.94504366449596 p = 0.3 n = 186
The Largest Singular Value = 93.54422459660233 p = 0.5 n = 186
The Largest Singular Value = 130.67481543341682 p = 0.7 n = 186
The Largest Singular Value = 167.09061508238244 p = 0.9 n = 186
The Largest Singular Value = 20.258561128073687 p = 0.1 n = 189
The Largest Singular Value = 57.297048042194696 p = 0.3 n = 189
The Largest Singular Value = 95.11444758467373 p = 0.5 n = 189
The Largest Singular Value = 132.60548423642717 p = 0.7 n = 189
The Largest Singular Value = 170.5014181310536 p = 0.9 n = 189
The Largest Singular Value = 20.05437077493877 p = 0.1 n = 192
The Largest Singular Value = 58.44691193374126 p = 0.3 n = 192
The Largest Singular Value = 96.34102323493846 p = 0.5 n = 192
The Largest Singular Value = 134.81851700881901 p = 0.7 n = 192
The Largest Singular Value = 172.90716981562926 p = 0.9 n = 192
The Largest Singular Value = 20.76229909108876 p = 0.1 n = 195
The Largest Singular Value = 59.52973931863676 p = 0.3 n = 195
The Largest Singular Value = 97.65281068524865 p = 0.5 n = 195
The Largest Singular Value = 136.14601080175393 p = 0.7 n = 195
The Largest Singular Value = 175.9322918907921 p = 0.9 n = 195
The Largest Singular Value = 20.807310921751753 p = 0.1 n = 198
The Largest Singular Value = 59.29171144340913 p = 0.3 n = 198
The Largest Singular Value = 99.26347838770371 p = 0.5 n = 198
The Largest Singular Value = 139.37089190246715 p = 0.7 n = 198
The Largest Singular Value = 178.55971728244972 p = 0.9 n = 198
The Largest Singular Value = 20.502753619976946 p = 0.1 n = 201
The Largest Singular Value = 60.91842036996605 p = 0.3 n = 201
The Largest Singular Value = 100.93781583296915 p = 0.5 n = 201
The Largest Singular Value = 141.38912544670887 p = 0.7 n = 201
The Largest Singular Value = 180.63276426921232 p = 0.9 n = 201
The Largest Singular Value = 21.35418303075927 p = 0.1 n = 204
The Largest Singular Value = 61.94242840864246 p = 0.3 n = 204
The Largest Singular Value = 102.51456169233059 p = 0.5 n = 204
The Largest Singular Value = 142.58482567890835 p = 0.7 n = 204
The Largest Singular Value = 183.98456595092017 p = 0.9 n = 204
The Largest Singular Value = 22.11533217267731 p = 0.1 n = 207
The Largest Singular Value = 62.6086349924835 p = 0.3 n = 207
The Largest Singular Value = 104.01827672327332 p = 0.5 n = 207
The Largest Singular Value = 145.4581721206903 p = 0.7 n = 207
The Largest Singular Value = 187.03528803882207 p = 0.9 n = 207
由结果显示得知,当n较小时,p的改变对Largest Singular Value影响比较小,当n较大时,p越大,Largest Singular Value也越大,并且p的改变对Largest Singular Value影响比较大;当p不变,n增大时,Largest Singular Value也会增大。
Exercise 9.6: Nearest neighbor
Write a function that takes a value z and an array A and finds the element in A that is closest to z. The function should return the closest value, not index.
Hint: Use the built-in functionality of Numpy rather than writing code to find this value manually. In particular, use brackets and argmin.代码:
import numpy as np
def find_nearest_neighbor(value_z,array_A):
tmp = abs(array_A-value_z)
value = array_A[np.argmin(tmp)]
return value
if __name__ == "__main__":
value_z = np.random.rand()
array_A = np.random.rand(50)
print("z = ",value_z)
print("A = ",array_A)
print("We can see the nearest neighbor is ",find_nearest_neighbor(value_z,array_A))
输出:
z = 0.6368442631515912
A = [0.40649133 0.02533991 0.55882556 0.86891874 0.52946213 0.9249992
0.20037347 0.75057371 0.93168899 0.23463218 0.80935187 0.64473216
0.40661881 0.66388089 0.62561682 0.24724342 0.05804259 0.17847537
0.10828185 0.62755381 0.84145733 0.61452277 0.91499793 0.71516597
0.4478704 0.62753202 0.04412641 0.08322074 0.55919557 0.86540081
0.69002192 0.20776787 0.78010365 0.19342374 0.73000747 0.94171405
0.44862776 0.01926229 0.69754189 0.72526034 0.84528182 0.91442855
0.6519868 0.06088775 0.03545648 0.82967409 0.75913422 0.32334049
0.49889186 0.23732668]
We can see the nearest neighbor is 0.6447321591878525