Generate matrices A, with random Gaussian entries, B, a Toeplitz matrix, where A 2 Rnm and B 2 Rmm,
for n = 200, m = 500.
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_9_1(A, B): print("A + A:") C = A + A print(C) print("AA^:") print(np.dot(A, A.T)) print("A^A:") print(np.dot(A.T, A)) print("AB:") print(np.dot(A, B)) func_lambda(A, B, 2.0); def func_lambda(A, B, lamda): print("A(B - λI):") C = B - lamda * (np.eye(m)) print(np.dot(A, C)) mu, sigma = 0, 1.0 n, m = 200, 500 A = np.random.normal(loc=mu, scale=sigma, size=(n, m)) c = [a for a in range(1, m+1)] B = toeplitz(c, c) Exercise_9_1(A, B)
使用np.random.normal来创建一个符合正态分布拟合的随机矩阵A,使用toeplitz来创建一个随机托普利兹矩阵B。
在本题中主要使用np.dot来实现矩阵相乘,使用np.eye来创建对角矩阵
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_9_2(B, m): b = np.ones((m, 1)) print(np.linalg.solve(B, b)) mu, sigma = 0, 1.0 n, m = 200, 500 A = np.random.normal(loc=mu, scale=sigma, size=(n, m)) c = [a for a in range(1, m+1)] B = toeplitz(c, c) Exercise_9_2(B, m)
矩阵A、B的创建方法同上
在本题中使用np.ones创建向量b,使用np.linalg.solve函数求解线性方程组的解
9-3 Norms
Compute the Frobenius norm of A: kAkF and the innity norm of B: kBk1. Also nd the largest and smallest singular values of B.
import numpy as np from scipy.linalg import toeplitz def Exercise_9_3(A, B, n, m): A_norm = np.linalg.norm(A, 'fro') print("The Frobenius norm of A is ", A_norm) B_norm = np.linalg.norm(B, np.inf) print("The infinity norm of B is ", B_norm) lar_sin = np.linalg.norm(B, 2) smal_sin = np.linalg.norm(B, -2) print("The largest singular values of B is ", lar_sin) print("The smallest singular values of B is ", smal_sin) mu, sigma = 0, 1.0 n, m = 200, 500 A = np.random.normal(loc=mu, scale=sigma, size=(n, m)) c = [a for a in range(1, m+1)] B = toeplitz(c, c) Exercise_9_3(A, B, n, m)
矩阵A、B的创建方法同上
在本题中使用np.linalg.norm来求范数,其中第二个变量为范数类型。(对于范数的概念不是很清楚,在写的时候参考了
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html)
9-4 Power iteration
Generate a matrix Z, n n, with Gaussian entries, and use the power iteration to nd 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 scipy.linalg import toeplitz import time def Exercise_9_4(n): Z = np.random.standard_normal((n, n)) num = 0 u = np.ones(n) v_norm = 0 v = np.zeros(n) begin = time.clock() while(True): v = np.dot(Z, u) v_norm_temp = v_norm v_norm = np.linalg.norm(v) u = v / v_norm num += 1 if(abs(v_norm_temp - v_norm) < 0.0001): break; end = time.clock() print("the largest eigenvalue:", v_norm) print("the corresponding eigenvector:", u) print("The number of iterations:", num) print("computation time when varying n:", end-begin) mu, sigma = 0, 1.0 n, m = 200, 500 A = np.random.normal(loc=mu, scale=sigma, size=(n, m)) c = [a for a in range(1, m+1)] B = toeplitz(c, c) Exercise_9_4(n)
在本题中使用np.random.standard_normal来创建符合高斯分布的矩阵,使用下面所示的幂迭代的方法来求最大特征值和对应的特征向量。(由于对幂迭代不是很熟悉,在写的过程中参考了很多网上的资料和代码)
9-5 Singular values
Generate an nn 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 from scipy.linalg import toeplitz def Exercise_9_5(n): p = 0.5 C = np.random. binomial(1, p, (n, n)) lar_sin = np.linalg.norm(C, 2) smal_sin = np.linalg.norm(C, -2) print("the smallest singular:", smal_sin) print("the largest singular:", lar_sin) print("n * p:", n*p) mu, sigma = 0, 1.0 n, m = 200, 500 A = np.random.normal(loc=mu, scale=sigma, size=(n, m)) c = [a for a in range(1, m+1)] B = toeplitz(c, c) Exercise_9_5(n)
使用np.random. binomial来创建符合二项分布的矩阵,使用np.linalg.norm来计算奇异值,通过计算n乘p发现n乘p的值就是最大奇异值
9-6 Nearest neighbor
Write a function that takes a value z and an array A and nds 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 nd this value manually. In particular, use brackets and argmin.
import numpy as np from scipy.linalg import toeplitz def Exercise_9_6(A): z = 0 closest = fun_closest(A, z) print("Tthe closest value is ", closest) def fun_closest(A, z): B = A[A > z] C = A[A <= z] _min = np.argmin(B) _max = np.argmax(C) if abs(z-B[_min]) < abs(z-C[_max]): return B[_min] else: return C[_max] mu, sigma = 0, 1.0 n, m = 200, 500 A = np.random.normal(loc=mu, scale=sigma, size=(n, m)) c = [a for a in range(1, m+1)] B = toeplitz(c, c) Exercise_9_6(A)
这道题的思路是,新建两个矩阵B和C,B是A中比z大的数组合成的新矩阵,C是A中小于等于z 的值组合的新矩阵。要求和z最近的数,一定在B的最小值和C中的最大值这两个数中,所以只需计算这两个数谁离z最近即可
总结:总体来讲这六道题不是很简单,主要是一些关于矩阵的知识不是很了解,需要在网上找资料来学习这些知识。但是通过这几道题也能体会到numpy库的好用之处,一些例如求解线性方程组、求最大特征值等矩阵中的计算,都可以通过很短的代码来实现,这也充分体现出python在数据处理方面的强大之处。
存在的不足:在这次作业中还是有很多地方不是很了解,如范数的概念、幂迭代的实现等,好多地方都直接使用了网上的代码,在后续的学习中还是要多联系,加强对这些知识的掌握。