스칼라, 벡터, Magnitude, Dot, Determinant

형준·2021년 1월 17일
0

Linear Algebra

목록 보기
1/6

단순하게 생각하자!

스칼라 Scalar

단일 숫자. 변수에 저장할 때는 일반적으로 소문자를 사용

벡터 Vector

  • n차원의 벡터는 컴포넌트라 불리는 n개의 원소를 갖는 모음 (컴포넌트는 스칼라로 간주되지 않음)
    • 벡터는 일반적으로 위의 화살표를 갖는 소문자의 형태로 표기 a=\vec{a}=[n+13]n+1\brack 3

벡터의 크기 (Magnitude, Norm, Length)

  • 단순히 길이에 지나지 않음 → 피타고라스정리를 통해 길이를 구함
  • a|\vec{a}| 라고 표기
    • a=[1,3,3]\vec a = [1,3,3]a=12+32+32|\vec a| = \sqrt{1^2+3^2+3^2}

벡터의 내적 (Dot Product)

각 구성요소를 서로 곱한 후 합한 값과 같음.

v=[1,2,3,4]v=[1,2,3,4] , x=[5,6,7,8]x=[5,6,7,8]
v \cdot x = 15+26+37+481*5 +2*6+3*7+4*8 = 70

벡터의 내적에서는 두 벡터의 길이가 반드시 동일해야함.
교환법칙 및 분배법칙 적용 가능.

매트릭스 (Matrix, 행렬)

행과 열을 통해 배치되어있는 숫자. 대문자를 통해 표기

(행,열)의 차원을 가짐.

전치행렬 (Transpose)

행과 열을 바꾼 행렬. rotation과는 조금 다름!

def transpose(mat):
    rows = len(mat)
    cols = len(mat[0])
    tmp=[[0 for _ in range(rows)] for _ in range(cols)]
    tmp=[]
    for i in range(cols): # 0 1 2
        temp=[]
        for j in range(rows): # 0 1 2 3
            temp.append(mat[j][i])
        tmp.append(temp)
    return tmp
F=[[15,2,8],[-15,-11,0],[-17,13,17],[-3,-16,-12]]
transpose(F)

'''
[[15, -15, -17, -3], [2, -11, 13, -16], [8, 0, 17, -12]]
'''
np.matrix(F).T
"""
matrix([[ 15, -15, -17,  -3],
        [  2, -11,  13, -16],
        [  8,   0,  17, -12]])"""

정사각 매트릭스 (Square Matrix)

  • 행과 열의 수가 동일한 행렬
  • Diagonal(대각) 대각선부분만 값이 있고, 나머지는 전부 0

Diagonal (대각): 대각선 부분에만 값이 있고, 나머지는 전부 0입니다.

Upper Triangular (상삼각): 대각선 위쪽 부분에만 값이 있고, 나머지는 전부 0입니다.

Lower Triangular (하삼각): upper triangular 와 반대로, 대각선 아래에만 값이 있습니다.

Identity (단위 매트릭스):

  • Diagonal 매트릭스 중에서, 모든 값이 1인 경우입니다. 임의의 정사각 매트릭스에 단위 행렬을 곱하면, 그 결과값은 원본 정사각 매트릭스로 나오며,
  • 반대로 임의의 매트릭스에 대해서 곱했을때 단위 매트릭스가 나오게 하는 매트릭스를 역행렬 (Inverse)라고 부릅니다.

def mkId(mat):
    row=len(mat)
    col=len(mat[0])
    tmp=[[0 for _ in range(row)] for _ in range(col) ]
    for i in range(row):
        for j in range(col):
            if i==j: tmp[i][j]=1
    return tmp
G=[[-17,11],[10,3]]
matmul(mkId(G),G)

Symmetric (대칭): 대각선을 기준으로 위 아래의 값이 대칭인 경우 입니다.

Determinant

행렬식은 모든 정사각 매트릭스가 갖는 속성으로, det(A) 혹은 |A| 로 표기된다.

def determinant(mat): #3x3까지만 처리...
    row=len(mat)
    col=len(mat[0])
    front=0
    back=0
    if row>2:
        for i in range(row):
            ff=1
            bb=1
            for k in range(row):
                #정방향
                x=k
                y=(i+k)%row
                
                #역방향
                yy=(row-1-k+i)%row

                ff = ff*mat[x][y]
                bb = bb*mat[x][yy]
                
            front+=ff
            back+=bb
    else:
        ff=1
        bb=1
        for i in range(row):
            ff=ff*mat[i][i]
            bb=bb*mat[i][row-i-1]
        front+=ff
        back+=bb
    return front-back    

H=[[8,18],[-4,12]]
J=[[-10,6,-6],[2,3,-2],[3,-1,-8]]
tmp=[[4,-3,0,1],
     [1,2,-1,2],
     [1,2,5,7],
     [4,3,2,2]]
determinant(H) , determinant(J)
# (168, 386)
np.linalg.det(H), np.linalg.det(J)#, np.linalg.det(tmp)

(167.99999999999997, 386.00000000000006)

Inverse 역행렬

행렬과 그 역행렬을 곱하면 언제나 I (단위행렬) 이 된다.

A[abcd]a b \brack c dA1=A^{-1} = 1adbc1\over{ad-bc}[b,dc,d]b, -d\brack -c , d

np.linalg.inv(H)

역행렬이 존재하지 않는경우!! → 특이행렬 (Singular Matrix)

Determinant 값이 0 이 되면, 역행렬 식에서 분모가 0 이 됨. →
매트릭스의 행과 열이 선형의 의존관계가 있는 경우

MSE (Mean Squared Error) 평균제곱오차

1𝑛1\over 𝑛 Σ1𝑛(𝑦𝑖𝑡𝑖)2Σ^𝑛_1(𝑦_𝑖−𝑡_𝑖)^2 통계적 추정의 정확성에 대한 질적 척도수치가 작을수록 정확성이 높음 손실함수로 쓰임

MAE (Mean Absolute Error) 평균절대오차

실제 값과 측정(예측)값의 차이 1𝑛1\over {𝑛} Σ1𝑛𝑦𝑖𝑥{Σ^𝑛_1|{𝑦_𝑖}−{𝑥}|} 회귀지표로써 사용됨

def mse(actual,predict):
    n=0
    sum=0
    for a,p in zip(actual,predict):
        sum += (a-p)**2
        n+=1
    return sum/n
def mae(actual, predict):
    n=0
    sum=0
    for a,p in zip(actual,predict):
        sum += abs(a-p)
        n += 1
    return sum/n

Orthogonal matrix 직교행렬

직교행렬은 정방행렬로 이것의 열과 행들은 Orthogonal(직교) 단위벡터가 된다.

즉, QTQ=QQT=IQ^TQ = QQ^T = I 의 조건을 만족하면 Orthogonal Matrix라고 할 수 있다.

Q의 전치행렬과, 자기 자신 Q 를 곱했을 때 I(Identity 행렬)이 된다는 것은, Q의 전치행렬이 Q 의 역행렬과 같아지고, 이렇게 되면, 직교행렬이라고 부를 수 있다.

직교행렬 Q는 반드시 Intervible 해야하며, 또 다른 특징이 있다면 어떠한 직교행렬의 Determinant 는 +1 또는 -1 이다. 선형 변환으로써, 하나의 직교행렬은 백터의 내적을 보존하고, 따라서 유클리드 공간에서 isometry(등거리변환)으로써 작동한다. 예를들면 회전, 반영 또는 회전반영과 같은 것.

출처 : https://m.blog.naver.com/PostView.nhn?blogId=sw4r&logNo=221358626240&proxyReferer=https:%2F%2Fwww.google.com%2F

하우스 홀더 변환 (Householder Transformation)

하우스홀더행렬은 길이가 1인 Unit vector v에 대하여, 다음과 같이 정의됨

H=I2vvTH = I-2vv^T

이렇게 만들어진 행렬 H 는 임의의 벡터 x에 곱했을 때, 벡터 v에 직교하는 평면에 대하여 벡터 x를 반전시킨다.
따라서 P = I-2uuT2uu^T 일때, 다음과 같은 그림을 그려볼 수 있다.

이렇게 하우스홀더행렬은 벡터를 특정 평면에 대해 반전시킬 때 쓸 수 있다. (하우스홀더행렬도 직교행렬)

만약 벡터 x를 unit vector y의 방향으로 변환시키고 싶을 때? → 벡터 x를 unit vector y의 방향으로 변환시키면 |x|y가 될테니, 벡터x와 벡터|y|를 양분하는 평면의 normal vector(법선벡터)를 구해 v라고 하고, 이 벡터로 하우스홀더행렬을 구해 x에 곱하면 된다.

와.........너무어렵다........ 나중에 다시읽어보자

출처 : 파이썬으로 Linear Regression 해보기 - 우아한형제들 기술 블로그

profile
소프트웨어에 관심이 많은 학생입니다. 반갑습니다.

0개의 댓글

관련 채용 정보