第十一週作業 9 Numpy

    Generate matrices A, with random Gaussian entries, B, a Toeplitz matrix, where A∈ R^n x m, and B ∈  R^m x m, for n = 200, m = 500


首先使用numpy.random.mormal生成A

    函數語法:

    numpy.random.normal(loc, scale, size)

    loc : 概率分佈的均值,對應着分佈中心

    scale : 概率分佈的標準差,對應分佈的寬度(scale越大越矮胖, 越小越高瘦)

    size : 輸出的空間大小

使用scipy.linalg.toeplitz生成B

import numpy
from scipy.linalg import toeplitz
import time

A = numpy.random.normal(size = (200, 500))
print('A = ')
print(A)

B = toeplitz(range(1, 501))
print('\nB = ')
print(B)


9-1 

Exercise 9.1: Matrix operations
    Calculate A + A, A AT ,AT A and A B. Write a function that computes A(B − λI) for any λ.

print('A + A = ')
print(A + A)


print('\nAA^T = ')
print(A.dot(A.T))


print('\nA^TA = ')
print(A.T.dot(A))


print('\nAB = ')
print(A.dot(B))


def calcul(A, B, linda):
	input()
	tmp = B - linda * numpy.eye(500)
	return numpy.dot(A, tmp)


9-2

Exercise 9.2: Solving a linear system

    Generate a vector b with m entries and solve Bx = b.

b = numpy.array(range(1, 501))
print('b = ')
print(b)
x = numpy.linalg.solve(B, b)
print('\nx = ')
print(x)


9-3

Exercise 9.3: Norms

    Compute the Frobenius norm of A: kAk F and the infinity norm of B: kBk ∞ . Also find the largest and smallest singular values of B.

from numpy import linalg

print('|A|f = ', linalg.norm(A, ord=2))
print('|B| = ', linalg.norm(B, ord=numpy.inf), '\n')

sigma = linalg.eigvals(B)
print('largest = ', numpy.max(sigma), '\nsmallest:', numpy.min(sigma))



9-4


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.

print('\n----------------------9.4----------------------')
def power_iter(n, Z):
	esp = 1e-5
	begin = time.clock()
	
	iter = 0
	u = v = numpy.ones([n , 1]) #ones()返回一個全1數組
	lam = iter_counter = 0
	
	while(1):
		v = numpy.matmul(Z, u)
		pre = lam
		lam = v.max()
		u = v / lam
		if(abs(pre - lam) < esp):
			break
		iter_counter += 1
	
	end = time.clock()
	time_used = end - begin
	
	return lam, iter_counter, time_used

n = [100, 150, 200]
for ni in n:
	Z = numpy.random.normal(size = (ni, ni))
	lam, iter_counter, time_used = power_iter(ni, Z)
	print('when n = ', ni, ': ')
	print('Z = ', Z)
	print('lambda = ', lam)
	print('iter = ', iter_counter)
	print('time = ', time_used, '\n')


9-5

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?

print('\n----------------------9.5----------------------')
def singular_value(n , p):
	C = numpy.random.binomial(1, p, (n, n))
	u, sigma, v = linalg.svd(C)
	return sigma
	

for n in [10, 20]:
	for p in [0.2, 0.3, 0.5]:
		sigma = singular_value(n, p)
		print('n = ', n, ', p = ', p)
		print('The largest singular value is: \n', sigma, '\n')

9-6

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.

def nearest_neighbor(A, z):
	B = numpy.abs(A - z)
	index = numpy.argmin(B)
	return A[index]
	
A = numpy.array(range(1, 100))
print('The closest value is: ', nearest_neighbor(A, 2))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章