Part 3 선형대수학
# Part 3 선형대수학
# 10장 벡터와 공간
# 10.1 벡터
# 10.1.2 벡터란
# 벡터란
# Numpy 라이브러리 호출
import numpy as np
x = np.array([1, 2, 3]) # 크기가 (3, )인 1차원 배열의 표현
print(x)
[1 2 3]
u = np.array([[1, 2, 3]]) # 크기가 (1, 3)인 2차원 배열의 표현(행 벡터)
print(u)
[[1 2 3]]
v = np.array([[1], [2], [3]]) # 크기가 (3, 1)인 2차원 배열의 표현(열 벡터)
print(v)
[[1]
[2]
[3]]
# 벡터의 표현(확률분포를 벡터로 표현)
{1: 1/3, 2: 2/3, 3: 0/3}
{1: 0.3333333333333333, 2: 0.6666666666666666, 3: 0.0}
# 10.1.3 특수한 벡터
# 벡터란
# 단위벡터
import numpy as np
from scipy import linalg
# 단위 벡터를 위해 두가지 방법을 사용할 수 있다.
# NumPy의 서브 패키지인 linalg에서 제공하는 함수 norm()을 사용하여
# 벡터의 크기를 계산한 후 기존 벡터로 나눠준다.
s=np.array([2,3,1])
v_hat01 = s / linalg.norm(s)
print(v_hat01)
[0.53452248 0.80178373 0.26726124]
# 파이썬 문제풀이(1)
import numpy as np
x=np.array([1, -3])
v_hat = x / linalg.norm(x)
print(v_hat)
[ 0.31622777 -0.9486833 ]
# 파이썬 문제풀이(2)
import numpy as np
x=np.array([-6,-8])
v_hat2 = x / (x**2).sum()**0.5
v_hat2
array([-0.6, -0.8])
# 파이썬 문제풀이(3)
import numpy as np
x=np.array([-5, -4])
v_hat = x / linalg.norm(x)
print (v_hat)
[-0.78086881 -0.62469505]
# 영벡터
import numpy as np
np.zeros(5)
array([0., 0., 0., 0., 0.])
np.zeros(5).shape
(5,)
s = (2,2)
np.zeros(s)
array([[0., 0.],
[0., 0.]])
# 10.2 선형 결합과 선형 독립
# 10.2.1 선형 결합(linear combination)과 생성(span)
import numpy as np
a = np.array([2,4])
b = np.array([1,6])
c=(4*a)+((-3)*b)
print(c)
[ 5 -2]
# 10.2.3 부분공간과 부분공간의 기저
# 랭크(rank)
import numpy as np
X1 = np.array([[2, 7], [5, 1]])
np.linalg.matrix_rank(X1)
2
X1 = np.array([[2, 4], [3, 6]])
np.linalg.matrix_rank(X1)
1
# 파이썬 문제풀이(1)
import numpy as np
X1 = np.array([[1, 2], [3, 5]])
np.linalg.matrix_rank(X1)
2
# 파이썬 문제풀이(2)
import numpy as np
X1 = np.array([[1, 2], [3, 6]])
np.linalg.matrix_rank(X1)
1
# 10.3 벡터의 내적과 외적
# 10.3.1 벡터의 덧셈과 뺄셈
# 벡터의 덧셈
x=[2,3]
y=[3,1]
z=[i+j for i, j in zip(x,y)]
print(z)
[5, 4]
# 노트
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)]
# NumPy 라이브러리 이용한 간단한 코드
import numpy as np
u = np.array(x)
v = np.array(y)
w=u+v
print(w)
[5 4]
# 파이썬 문제풀이(1)
import numpy as np
x=[-4,5]
y=[-2,8]
u = np.array(x)
v = np.array(y)
w=u+v
print(w)
[-6 13]
# 파이썬 문제풀이(2)
import numpy as np
x=[11,2]
y=[4,-3]
u = np.array(x)
v = np.array(y)
w=u+v
print(w)
[15 -1]
# 파이썬 문제풀이(3)
import numpy as np
x=[-13,53]
y=[-25,-34]
u = np.array(x)
v = np.array(y)
w=u+v
print(w)
[-38 19]
# 벡터의 뺄셈
x=[2,3]
y=[3,1]
z=[i-j for i, j in zip(x,y)]
print(z)
[-1, 2]
# NumPy 라이브러리 이용한 간단한 코드
import numpy as np
u = np.array(x)
v = np.array(y)
w=u-v
print(w)
[-1 2]
# 파이썬 문제풀이(1)
import numpy as np
x=[-7,15]
y=[-9,4]
u = np.array(x)
v = np.array(y)
w=u-v
print(w)
[ 2 11]
# 파이썬 문제풀이(2)
import numpy as np
x=[-11,6]
y=[8,-14]
u = np.array(x)
v = np.array(y)
w=u-v
print(w)
[-19 20]
# 파이썬 문제풀이(3)
import numpy as np
x=[-11,14]
y=[-19,-21]
u = np.array(x)
v = np.array(y)
w=u-v
print(w)
[ 8 35]
# 10.3.2 벡터의 곱셈
# 벡터의 내적
x=[3,4]
c=8
z=[c*I for I in x]
print(z)
[24, 32]
# NumPy 라이브러리 이용한 간단한 코드
import numpy as np
u = np.array([3,4])
c = 8
w=u*c
print(w)
[24 32]
# 벡터의 내적(inner product)
import numpy as np
u = np.array([6,6])
v = np.array([12,0])
uv = np.dot(u, v)
print(uv)
72
# numpy.dot()를 이용하여 벡터의 내적
import numpy as np
A = np.arange(1*2*3).reshape((1,2,3))
B1 = np.arange(1*2*3).reshape((1,2,3))
B2 = np.arange(1*2*3).reshape((1,3,2))
B3 = np.arange(1*2*3).reshape((2,1,3))
B4 = np.arange(1*2*3).reshape((2,3,1))
B5 = np.arange(1*2*3).reshape((3,1,2))
B6 = np.arange(1*2*3).reshape((3,2,1))
np.dot(A,B1) # 결과는 오류가 맞습니다
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-32-a3fbbf2ce60f> in <module>
9 B5 = np.arange(1*2*3).reshape((3,1,2))
10 B6 = np.arange(1*2*3).reshape((3,2,1))
---> 11 np.dot(A,B1) # 결과는 오류가 맞습니다
<__array_function__ internals> in dot(*args, **kwargs)
ValueError: shapes (1,2,3) and (1,2,3) not aligned: 3 (dim 2) != 2 (dim 1)
np.dot(A,B2)
array([[[[10, 13]],
[[28, 40]]]])
np.dot(A,B3) # 결과는 오류가 맞습니다
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-34-94f98aeef2d9> in <module>
----> 1 np.dot(A,B3) # 결과는 오류가 맞습니다
<__array_function__ internals> in dot(*args, **kwargs)
ValueError: shapes (1,2,3) and (2,1,3) not aligned: 3 (dim 2) != 1 (dim 1)
np.dot(A,B4)
array([[[[ 5],
[14]],
[[14],
[50]]]])
np.dot(A,B5) # 결과는 오류가 맞습니다
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-36-96b485137ea0> in <module>
----> 1 np.dot(A,B5) # 결과는 오류가 맞습니다
<__array_function__ internals> in dot(*args, **kwargs)
ValueError: shapes (1,2,3) and (3,1,2) not aligned: 3 (dim 2) != 1 (dim 1)
np.dot(A,B6) # 결과는 오류가 맞습니다
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-37-36bec492a8d6> in <module>
----> 1 np.dot(A,B6) # 결과는 오류가 맞습니다
<__array_function__ internals> in dot(*args, **kwargs)
ValueError: shapes (1,2,3) and (3,2,1) not aligned: 3 (dim 2) != 2 (dim 1)
# 파이썬 문제풀이(1)
import numpy as np
u = np.array([3, -6])
v = np.array([-7, 9])
uv = np.dot(u, v)
print(uv)
-75
# 파이썬 문제풀이(2)
import numpy as np
u = np.array([-3, 4, 7])
v = np.array([-4, -9, 5])
uv = np.dot(u, v)
print(uv)
11
# 파이썬 문제풀이(3)
import numpy as np
u = np.array([3, -11, 7])
v = np.array([-4, -13, 9])
uv = np.dot(u, v)
print(uv)
194
# 벡터의 외적
a = (1, 3, 5)
b = (2, 4, 6)
# 벡터의 외적을 위한 수식을 함수로 구현
def cross(a, b):
c = [a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0]]
return c
cross(a,b)
[-2, 4, -2]
# Numpy 이용한 벡터 외적 계산
import numpy as np
print(np.cross(a,b)) # cross() 함수 이용한 결과
[-2 4 -2]
# 파이썬 문제풀이(1)
import numpy as np
a = np.array([5, -13, 8])
b = np.array([-2, 11, -14])
print(np.cross(a,b))
[94 54 29]
# 파이썬 문제풀이(2)
import numpy as np
a = np.array([-7, 8, -16])
b = np.array([-8, -5, 2])
print(np.cross(a,b))
[-64 142 99]
# 10.3.3 직교벡터
# 벡터의 크기와 거리
# 벡터의 크기
# 벡터 = (1, 2)일 때, 의 길이를 구해 보자.
import numpy as np
a = np.array([1,2])
print(a)
[1 2]
np.linalg.norm(a) # a의 길이
2.23606797749979
np.linalg.norm(a, ord=1) # L1 Norm 구하기
3.0
np.linalg.norm(a, ord=2) # L2 Norm 구하기
2.23606797749979
# 파이썬 문제풀이(1)
import numpy as np
a = np.array([-2,12])
np.linalg.norm(a)
12.165525060596439
# 파이썬 문제풀이(2)
import numpy as np
a=np.array([5**0.5,12])
np.linalg.norm(a)
12.206555615733702
# 파이썬 문제풀이(3)
import numpy as np
a=np.array([3,-15,8])
np.linalg.norm(a)
17.26267650163207
# 파이썬 문제풀이(4)
import numpy as np
a=np.array([-7,10**0.5,4])
np.linalg.norm(a)
8.660254037844387
# 벡터의 거리/유사도
# Python을 활용한 벡터의 거리계산(유클리드 거리)
# scipy.spatia 모듈로부터 distance 함수 호출
from scipy.spatial import distance
# 두 점 P1과 P2 명시
p1 = (1, 2, 3)
p2 = (4, 5, 6)
# P1과 P2 사이의 유클리드 거리 계산
d = distance.euclidean(p1, p2)
print("Euclidean distance: ",d)
Euclidean distance: 5.196152422706632
# 맨해튼 거리(Manhattan distance)
# math 함수 호출
from math import*
# 두 점 P1과 P2 정의
p1 = (1, 2, 3)
p2 = (4, 5, 6)
# 맨해튼 거리를 계산하기 위한 사용자 정의 함수 생성
def manhattan_distance(x,y):
return sum(abs(a-b) for a,b in zip(x,y))
# P1과 P2 사이의 맨해튼 거리 계산
manhattan_distance(p1,p2)
9
# 코사인 유사도(Cosine Similarity)
from numpy import dot
from numpy.linalg import norm
import numpy as np
def cos_sim(A, B):
return dot(A, B)/(norm(A)*norm(B))
doc1=np.array([1,1,1,1,0])
doc2=np.array([1,0,1,0,1])
doc3=np.array([2,1,1,1,1])
print(cos_sim(doc1, doc2)) #문서1과 문서2의 코사인 유사도
print(cos_sim(doc1, doc3)) #문서1과 문서3의 코사인 유사도
print(cos_sim(doc2, doc3)) #문서2과 문서3의 코사인 유사도
0.5773502691896258
0.8838834764831843
0.8164965809277259
# 11장 행렬변환
# 11.2 역함수와 역변환
# 11.2.2 역행렬
import numpy as np
A = np.matrix([[1, 0, 0, 0], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]])
print(np.linalg.inv(A))
[[ 1. 0. 0. 0.]
[-2. 1. 0. 0.]
[-3. 0. 1. 0.]
[-4. -0. -0. 1.]]
# 파이썬 문제풀이(1)
import numpy as np
A = np.matrix([[1,2],[3,4]])
print(np.linalg.inv(A))
[[-2. 1. ]
[ 1.5 -0.5]]
# 파이썬 문제풀이(2)
import numpy as np
A = np.matrix([[2,3],[4,6]])
print(np.linalg.inv(A)) # 결과는 오류가 맞습니다
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-58-484cc664a1ff> in <module>
3 import numpy as np
4 A = np.matrix([[2,3],[4,6]])
----> 5 print(np.linalg.inv(A)) # 결과는 오류가 맞습니다
<__array_function__ internals> in inv(*args, **kwargs)
~\anaconda3\lib\site-packages\numpy\linalg\linalg.py in inv(a)
545 signature = 'D->D' if isComplexType(t) else 'd->d'
546 extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 547 ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
548 return wrap(ainv.astype(result_t, copy=False))
549
~\anaconda3\lib\site-packages\numpy\linalg\linalg.py in _raise_linalgerror_singular(err, flag)
95
96 def _raise_linalgerror_singular(err, flag):
---> 97 raise LinAlgError("Singular matrix")
98
99 def _raise_linalgerror_nonposdef(err, flag):
LinAlgError: Singular matrix
# 11.3 전치행렬
# 11.3.1 전치행렬이란
import numpy as np
a = np.arange(15).reshape(3, 5)
print(a)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
np.transpose(a)
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
# 12장 상호좌표계
# 12.1 고유값(eigenvalue), 고유벡터(eigenvector), 공유공간
# 12.1.1 고유값과 고유벡터란
import numpy as np
a = np.array([[5,-1],[-2,1]])
w, v = np.linalg.eig(a)
print(w)
print(v)
[5.44948974 0.55051026]
[[ 0.91209559 0.21927526]
[-0.40997761 0.97566304]]
# 파이썬 문제풀이
import numpy as np
a = np.array([[1,3],[4,2]])
w, v = np.linalg.eig(a)
print(w)
print(v)
[-2. 5.]
[[-0.70710678 -0.6 ]
[ 0.70710678 -0.8 ]]
댓글남기기