출처 : https://www.youtube.com/watch?v=9F4PZ_1orF0

xy좌표계의 basis vector : $\hat{i} , \hat j$ 기저벡터.

스칼라를 달리함으로써 다른 2차원벡터를 다 얻을 수 있어.

여기서 스칼라를 달리하면서 다른벡터를 얻는 과정을 두 벡터의 선형결합이라고 부른다.

두 basis vector가 같은 직선상에 위치한다면, 결과벡터의 끝점이 원점을 지나는 한 직선으로 제한되어버린다.

두 벡터가 영벡터인경우 → 원점에 갇힘

span

The set of all possible vectors that you can reach with a linear combination of a given pair of vectors called the span of those two vectors

주어진 벡터 쌍의 선형결합으로 다다를 수 있는 모든 결과벡터의 집합을 두 벡터의 생성(선형생성, span)이라고 한다.

두 벡터가 일직선위에 있다면 그들의 span은 단지 직선이다.

Linearly dependent 선형 종속

$\vec{u} = a\vec{v} + b\vec{w}$
벡터들 중 span의 축소 없이 하나를 제거해도 되는경우

벡터 중 하나가 다른 벡터들의 선형결합으로 표현될 수 있다는 말 (그 벡터는 이미 다른 벡터들의 span에 속하므로)

Linearly independent 선형 독립

$\vec{u} \neq a\vec{v}$ (모든 a에 대하여)
$\vec{u} \neq a\vec{v} + b\vec{w}$ (모든 a, b에 대하여)

출처 : [Linear Algebra] Lecture 9 선형 독립(Linear independence), Span, 기저(Basis) 그리고 차원(Dimension)

Vector Projection

두개의 벡터에서 둘 중 하나로 전사시키는것!

Vector Projection

($\mathbb{R}^{2}$ 공간에서의) Linear Projections
임의의 두 벡터 $\vec a, \vec b$ 가 있을 때, $\vec b$에 Projection된 벡터의 길이를 $\vec \mu$ 라고하자.
이 둘 사이의 각도를 $\theta$라고 하면, 코사인법칙에 의하여
$$\cos{\theta} ={{아래길이}\over {빗변} } = {|\vec \mu| \over {|\vec a|} } ={\vec {a}\cdot{\vec b}\over{|\vec a|\cdot|\vec{b}|}} $$ 이다.
이때, $|\vec \mu|$에 대하여 정리하면, $|\vec \mu| = {\vec a \cdot \vec b \over |\vec b|}$ 이다.
일단 이 상황에서, $\vec b$방향의 단위벡터 $\hat b$ 를 구하면, ${\hat b} = {\hat \mu} = {{1\over{|\vec b|}}\cdot{\vec b}}$ 이므로, 최종 !!
$${\vec \mu }= {{\vec {a} \cdot \vec {b} \over {|\vec b|^2} }\cdot{\vec b}}$$ 이다.
여기서 앞부분의 ${{\vec a \cdot \vec b \over {|\vec{ b}|^2} }}$ 은 스칼라값이다.!

2차원 벡터 프로젝션해보기

$y=x$ 라는 벡터에 projection한다.

v = [7, 4]

def vecmul(w,v):
    try: return np.array(list(map(lambda x : x[0]*x[1], zip(w,v))))
    except:
        if type(w)!=list: return list(map(lambda x :w*x , v))
        else: return list(map(lambda x : v*x, w))

def vecdot(w,v):
    try: return sum(list(map(lambda x : x[0]*x[1], zip(w,v))))
    except:
        if type(w)!=list: return sum(list(map(lambda x: w*x, v)))
        elif type(v)!=list: return sum(list(map(lambda x: v*x, w)))

def vecdiv(w,v):
    return np.array(list(map(lambda x : x[0]/x[1], zip(w,v))))

def myProjection(w , v=[1,1] ) :
    # 채우세요.
    w_prime = vecmul( vecdot(w,v) / vecdot(v,v) ,  v )

    return w_prime

# myProjection([7,4])
vprime = myProjection(v)
vprime

$\vec v = (7,4)$가 $(5,5)$가 되었다

plt.figure(figsize=(10,10))

x_minus_proj = list(map(lambda x : x[1]-x[0], zip(v,vprime)))

plt.plot(x_vals,y_vals,'--',color='r')
plt.xlim(-1,10)
plt.ylim(-1,10)
plt.arrow(0,0,v[0],v[1], head_width=.2, linewidth=3,head_length=.2, color='b')

plt.arrow(0,0,vprime[0],vprime[1], ls='--', head_width=.2, head_length=.2, color='g',linewidth=3)

plt.arrow(v[0],v[1],x_minus_proj[0],x_minus_proj[1], head_width=.2 , head_length=.2, color='y',linewidth=2)
plt.grid()
# axes.figure.figsize=(20,20)

'Linear Algebra' 카테고리의 다른 글

Vector, Scalar  (0) 2021.02.07

단순하게 생각하자!

스칼라 Scalar

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

벡터 Vector

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

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

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

    벡터의 내적 (Dot Product)

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

    $v=[1,2,3,4]$ , $x=[5,6,7,8]$
    v $\cdot$ x = $15 +26+37+48$ = 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$a b \brack c d$ → $A^{-1} =$ $1\over{ad-bc}$$b, -d\brack -c , d$

np.linalg.inv(H)

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

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

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

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

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

실제 값과 측정(예측)값의 차이 $1\over {𝑛}$ ${Σ^𝑛_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(직교) 단위벡터가 된다.

즉, $Q^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 = I-2vv^T$

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

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

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

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

출처 : 파이썬으로 Linear Regression 해보기 - 우아한형제들 기술 블로그
(https://woowabros.github.io/study/2018/08/01/linear_regression_qr.html)

'Linear Algebra' 카테고리의 다른 글

Span, Vector Projection  (0) 2021.02.07

+ Recent posts