3장 선형대수


선형대수

4.1 벡터

벡터의 합

각 성분끼리 더 한다.

python3

def vector_add(v, w):
    return [v_i + w_i for v_i, w_i in zip(v,w)]

v = [1,2]
w = [3,4]

ret = vector_add(v,w);

numpy

v = np.array([1,2])
w = np.array([3,4])
z = v + w #array(4,6)

벡터의 차

각 성분끼리 뺀다.

python3

def vector_subtract(v, w):
    return [v_i - w_i for v_i, w_i in zip(v,w)]

numpy

v = np.array([1,2])
w = np.array([3,4])
z = v - w #array([-2, -2])

벡터의 총합

벡터의 각 요소를 모두 더한다.

python3

#Reduce 를 이용
def vector_sum1(vectors):
    return reduce(vector_add, vectors)

#for 문을 이용
def vector_sum2(vectors):
	result = vectors[0]
	for vector in vectors[1:]:
		result = vector_add(result,vector)
	return result

#partial 를 이용
vector_sum3 = partial(reduce,vector_add)

numpy

np.sum([1,2,3]) #6
#https://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html

스칼라 벡터 곱

벡터의 각 요소에 스칼라를 곱한다.

python3

def scalar_multiply(c, v):
    return [c * v_i for v_i in v]

numpy

a = np.array([1,2,3,4])
b = 3 * a # b 는 array([ 6,  9, 12])
c = a * 3 # c 는 array([ 6,  9, 12])

벡터 성분의 평균

벡터의 각 요소 값의 평균을 구한다.

python3

def vector_mean(vectors):
    n = len(vectors)
    return scalar_multiply(1/n, vector_sum(vectors))

numpy

a = np.array([[1, 2], [3, 4]])
b = np.mean(a) # b 는 2.5

벡터 내적(inner product)

두 백터의 같은 성분 끼리 곱한 후 모두 더해준 값. 결과는 스칼라이다.한 벡터가 다른 벡터로 투영된 길이를 나타낸다고 볼 수 있다.

python3

def dot(v, w):
    return sum(v_i * w_i for v_i, w_i in zip(v, w))

numpy

a = np.array([1,2,3])
b = np.array([2,2,2]) 
c = np.inner(a, b) # 1 * 2 + 2 * 2 + 3 * 2
# c = 12 

각 성분의 제곱의 합

각 성분을 곱한 후에 더 한 값, 벡터의 길이의 제곱

python3

def sum_of_squares(v):
    return dot(v, v)

numpy

a = np.array([1,2,3])
b = np.sum(a**2) # b = 1 + 4 + 9 = 14

벡터의 크기

벡터의 크기, 스칼라 값.

python3

def magnitude(v):
    return math.sqrt(sum_of_squares(v))

numpy

a = np.array([2,2,2,2])
b = np.linalg.norm(a) #b 는 4 , 4 + 4 + 4 + 4 = 16 = 4의 제곱

두 벡터간의 거리의 제곱

python3

def squared_distance(v, w):
    return sum_of_squares(vector_subtract(v, w))
a = np.array([4,3,2,1])
b = np.array([2,1,0,-1])
c = np.sum((a-b)**2) # 16

두 벡터간의 거리

numpy

a = np.array([4,3,2,1])
b = np.array([2,1,0,-1])
c = math.sqrt(np.sum((a-b)**2)) #4.0

두 벡터간의 거리 1

def distance1(v, w):
   return math.sqrt(squared_distance(v, w))

두 벡터간의 거리 2

def distance2(v, w):
   return magnitude(vector_subtract(v,w))

4.2 행렬

형태

python3

def shape(A):
    num_rows = len(A)
    num_cols = len(A[0]) if A else 0
    return num_rows, num_cols

numpy

a = np.array([[1,2,3],[4,5,6]])
b = np.shape(a) # b는 (2,3), 2행 3열

python3

def get_row(A, i):
    return A[i]

numpy

a = np.array([[1,2,3],[4,5,6]])
a[0]#array([1, 2, 3])
a[1]#array([4, 5, 6])

python3

def get_column(A, j):
    return [A_i[j] for A_i in A]

numpy

a = np.array([[1,2,3],[4,5,6]])
a[:,0]#array([1, 4])
a[:,1]#array([2, 5])
a[:,2]#array([3, 6])

행렬 만들기

python3

def make_matrix(num_rows, num_cols, entry_fn):
    return [[entry_fn(i, j) for j in range(num_cols)]
            for i in range(num_rows)]

numpy

a = np.array([[1,2,3],
             [4,5,6]])

단위 행렬

python3

def is_diagonal(i, j):
    return 1 if i == j else 0

numpy

np.eye(2)
#array([[ 1.,  0.],
#       [ 0.,  1.]])
np.eye(3)
#array([[ 1.,  0.,  0.],
#       [ 0.,  1.,  0.],
#       [ 0.,  0.,  1.]])
np.eye(4)
#array([[ 1.,  0.,  0.,  0.],
#       [ 0.,  1.,  0.,  0.],
#       [ 0.,  0.,  1.,  0.],
#       [ 0.,  0.,  0.,  1.]])

더 알아보기

zip zip(*iterables) 함수

list(zip([1, 2, 3], [4, 5, 6])) # [(1, 4), (2, 5), (3, 6)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9])) #[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
list(zip("abc", "def")) #[('a', 'd'), ('b', 'e'), ('c', 'f')]