7 분 소요

# 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       ]]

Part 3 선형대수학[모두의_인공지능_기초_수학]

댓글남기기