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 |