1. 데이터 유형

1) Scala

- 하나의 값: 정수와 실수 그리고 하나의 글자나 단어 (자연어 처리)

 

2) Vector

- 0개 이상의 값

- Vector 분류

  • Vector: 1차원 배열 (Record)
  • Matrix: 벡터가 모여서 만들어진 이차원 배열 - Table
    • 머신러닝의 기본 단위
  • Tensor: Matrix의 배열로 삼차원 배열
    • 딥러닝의 기본 단위
from sklearn.datasets import load_iris

iris = load_iris()

#이차원 배열이라 iris.data는 Matrix
print(iris.data.shape)
#첫번째 행의 붓꽃 데이터 - 배열이므로 Vector
print(iris.data[0, :])
(150, 4)
[5.1 3.5 1.4 0.2]

 

- 하나의 행을 추출했을 때 하나의 행이 입력 데이터로 사용되면 Feature Vector라고 함. (Feature)

# 컬러 이미지 배열이 Tensor
from scipy import misc
img_rgb= misc.face()
print(img_rgb.shape)
(768, 1024, 3)
  • 차원이 3개면 Tensor

# Matrix를 3차원으로 만들기

x = iris.data.copy()
# 3번째 값으로 1을 설정해도 되고 -1을 설정해도 됨
# -1은 남은 것은 모두 다 배정
y = x.reshape((x.shape[0], x.shape[1], -1))
print(y.shape)
(150, 4, 1)

 

#1차원으로 만들기

#1차원으로 만들 때는 flatten이라는 메소드를 이용해도 되고 reshape를 이용해도 가능
print(y.flatten().shape)
(600,)

 

 

 

 

2. Vector의 연산

1) 행과 열 전치

- T 속성이나 transpose 메소드 이용

  • 메소드를 사용할 때는 변경된 순서 직접 설정
  • 2차원까지는 T 사용
  • 3차원 배열 이상에서 transpose 사용

- VT(윗첨자)

 

 

2) 대칭 행렬

- 자신을 전치한 행렬과 동일한 행렬

ar = np.array([[1, 2, 3], [4, 5, 6]])
print(ar)
print(ar.T)

ar = np.array([[], [], [], []])
[[1 2 3]
 [4 5 6]]
[[1 4]
 [2 5]
 [3 6]]
ar = np.array([[1, 5, 6, 7], [5, 2, 8, 9], [6, 8, 3, 10], [7, 9, 10, 4]])
print(ar)
print(ar.T)
[[ 1  5  6  7]
 [ 5  2  8  9]
 [ 6  8  3 10]
 [ 7  9 10  4]]
[[ 1  5  6  7]
 [ 5  2  8  9]
 [ 6  8  3 10]
 [ 7  9 10  4]]
  • 대칭행렬 - 전치를 해도 동일한 모양이 나오는 행렬
  • 정방행렬 - 행과 열의 개수가 같은 행렬
  • 대칭행렬은 정방행렬에서만 가능

 

3) 벡터와 벡터 연산

-   동일한 차원의 벡터끼리는 동일한 위치의 데이터와 연산을 수행
-   차원이 다른 스칼라와 벡터 또는 벡터와 벡터 사이의 연산은 작은 차원의 데이터를 큰 차원의 데이터로 크기를 변경해서 연산을 수행

  • 이를 브로드캐스트 연산이라고 하고 컴퓨터 프로그래밍에서만 존재

-   차원이 같더라도 원소의 개수가 다르면 연산이 수행되지 않음

ar = np.array([1,2,3])
br = np.array([4,5,6])
cr = np.array([7,8,9,10])
print(ar + br)
#벡터의 차원이 1차원으로 동일하지만 원소의 개수가 3개와 4개로 달라서 에러
# print(ar + cr)
[5 7 9]

# ValueError: operands could not be broadcast together with shapes (3,) (4,) 

 

 

4) 선형 가중 결합

- 각 벡터에 스칼라 가중치를 적용해서 혼합하는 방법

l1 = 1
l2 = 2
l3 = -3

v1 = np.array([4.5, 1])
v2 = np.array([-4.5, -1])
v3 = np.array([1.5, 2])

print(l1 * v1 + l2 * v2 + l3 * v3)
[-9. -7.]

 

- 활용

  • 선형회귀 분석에서 회귀 변수와 계수의 관계를 선형 가중 결합으로 표현
  • 주성분분석 같은 차원 축소 과정에서 각 성분의 분산을 최대화하는 가중치와 계수의 관계 표현

- 선형독립성

  • 각 열의 독립적인 정도
  • 하나의 벡터를 다른 벡터들의 선형 가중 결합으로 나타낼 수 있는지 확인
    상관계수는 2개의 벡터 사이의 독립성을 판단

 

5) 벡터의 내적

- 벡터를 기하학적으로 표현했을 때 2개의 벡터를 확장해서 만든 사각형의 너비

- 내적을 구하려면 한쪽 벡터를 전치했을 때 차원과 동일해야 함

- 계산은 dot 함수 @ 연산자 이용

  • 1차원의 경우 전치를 하지 않아도 데이터의 개수만 같으면 전치를 해서 수행
  • 2차원 이상의 경우는 전치를 했을 때의 차원이 같아야 함
#일차원 벡터의 내적
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

#내적 구하기 - 일차원 벡터의 경우는 데이터의 개수만 같으면 알아서 수행
print(np.dot(x, y))
print(x @ y)

# 이 경우는 이차원 배열이라서 첫번째 데이터의 열의 개수와 두번째 데이터의 행의 개수가 맞아야 수행
x = np.array([[1], [2], [3]])
y = np.array([[4], [5], [6]])
print(np.dot(x.T, y))
print(x.T @ y)
32
32
[32]
[32]

 

- 가중합이나 가중평균에 사용

- 벡터의 내적은 두 벡터 간의 유사도를 계산하는데도 이용

  • 두 벡터가 닮은 정도 : 유사도
  • 내적을 이용해서 구한 유사도 : 코사인 유사도
  • 정규화를 한 후 내적 : 피어슨 상관계수
#이미지 가져오기
from sklearn.datasets import load_digits
import matplotlib.gridspec as gridspec

digits = load_digits()
digits.images[0]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])
#0번 이미지 가져오기
d1 = digits.images[0]
d2 = digits.images[10]

#1번 이미지 가져오기
d3 = digits.images[1]
d4 = digits.images[11]

#유사도 계산을 위해 이미지의 shape 조정
v1 = d1.reshape(64, 1)
v2 = d2.reshape(64, 1)
v3 = d3.reshape(64, 1)
v4 = d4.reshape(64, 1)
#이미지 출력해보기
plt.figure(figsize=(9,9))

#이미지를 동일한 크기로 출력하기 위해서 영역 설정
gs = gridspec.GridSpec(1, 4, height_ratios=[1], width_ratios=[9, 9, 9, 9])

#eval: 문자열로 대입하면 문자열에 해당하는 인스턴스를 찾아오는 함수
for i in range(4):
    plt.subplot(gs[i])
    plt.imshow(eval("d" + str(i+1)))
    plt.grid(False)
    plt.title("image{}".format(i+1))

 

# 코사인 유사도 계산

#동일한 이미지
print(v1.T @ v2)
print(v3.T @ v4)

#다른 이미지
print(v1.T @ v3)
print(v2.T @ v4)
[[3064.  ]]
[[3661.  ]]
[[1866.  ]]
[[2479.  ]]

 

 

 

 

 

 

 

 

 

 

'Python' 카테고리의 다른 글

[Python] 머신러닝  (0) 2024.03.07
[Python] 지도학습 연습 _ 자전거 대여 수요 예측  (0) 2024.03.06
[Python] 샘플링 _ 표본 추출  (1) 2024.02.26
[Python] 확률 분포 모형  (1) 2024.02.26
[Python] 기술통계  (0) 2024.02.22