벡터 : 공간에서의 한 점을 의미, 원점으로부터의 상대적 위치
숫자를 원소로 가지는 list또는 array로 표현가능
벡터의 덧셈: 다른 벡터로 부터의 상대적 이동( x+y인 경우, 벡터 y로부터 상대적으로 x만큼 이동)
백터의 뺄셈: -x 값을 더한 것으로 이해하면 쉬움, 두 벡터 사이의 거리를 의미.
norm : 원점으로부터의 거리
L1 norm, L2 norm 존재
L1 norm : 각 벡터 성분의 변화량의 절대값 ( ex. (1,2,3) -> 1+2+3 )
L2 norm : 유클리드 거리 ( ex. (1,2,3) -> sqrt(1^2 + 2^2 + 3^2) )
왜 L1 norm, L2 norm을 따로 정의하나? : norm을 정의함에 따라 기하학적으로 성질이나 표현 방법이 달라지는데, 머신러닝에서
각 성질들이 필요할 때가 있다. ex) L1 norm: Robust 학습, Lasso 회귀, L2 norm: Laplace 근사, Ridge 회귀
벡터 사이의 거리 : 벡터의 뺄셈 활용, L1 norm, L2 norm 모두 해당
벡터 사이의 각도 : 제2코사인 법칙을 통해 구할 수 있으며, 이를 위해 벡터 사이의 거리(x-y) 필요, L2 norm에서만 가능한 방법이다.
||x||^2 + ||y||^2 - ||x-y||^2 / 2||x||||y||
코사인 법칙 분자 부분을 쉽게 구하는 방법이 벡터의 내적.
내적의 해석 : 내적은 정사영 된 벡터의 길이를 정사영 한 벡터의 길이만큼 조정한 값이다.( x를 y에 정사영한 길이 ||x||cosθ를 ||y||만큼 조정)
내적은 두 벡터의 유사도를 측정하는데 사용 가능하다.
행렬 : vector를 원소로 가지는 2차원 배열
전치행렬 : 열을 행으로, 행을 열로 바꾼 행렬 (n m 행렬 -> m n 행렬)
행렬의 i행은 i번쨰 데이터로 이해하는 게 앞으로 좋을 것.
행렬 곱셈은 numpy에서 @ 연산으로 표현가능하다. ( X @ Y )
numpy에서의 내적 : numpy.inner()
주의할점 : numpy의 내적은 i번째 행벡터와 j번째 행벡터의 내적! ( 일반 행렬 곱셈이 i번째 행과 j번째 열벡터의 내적인 것과 다름)
따라서, numpy에서 행렬곱셈을 구현하고자 하면, 행렬 X와 Y의 전치행렬을 곱하자.
행렬을 벡터공간에서 사용되는 연산자로 이해하자 : 벡터에 행렬을 곱하면 다른 벡터가 나온다.
행렬곱을 통해 벡터를 다른 차원으로 변환 가능 : 원래 n차원이던 벡터에 열이 m개인 행렬을 곱해 m차원으로 변환
역행렬 : 행렬의 연산을 그대로 되돌리는 행렬, 행과 열의 개수가 같아야한다 ( n * n )
역행렬을 계산할 수 없을 때 유사역행렬 또는 무어-펜로즈 역행렬 사용. (기계학습에서 많이 사용된다고 함)
numpy.linalg.pinv() 로 유사역행렬 사용가능
np.linalg.pinv() 활용 : 연립방정식 계산 ( n <= m인 경우, 식이 변수의 개수보다 작거나 같아야함 )
활용2 : 선형회귀분석에서 좌표계에서 데이터를 나타내는 행렬을 X라 하면, X는 좌표계에서 보면 좌표계 위의 점의 집합이라 할 수 있다.
이 때, 이 점들을 가장 잘 나타낼 수 있는 선을 Xβ라 하면, Xβ = y가 되도록 하면 β는 행렬 X의 벡터들을 가장 잘 표현하는 선이라 할 수 있다.
하지만, 선형회귀 문제에선 거의 항상 데이터의 수가 파라미터의 수보다 많기 때문에(행의 수가 변수의 개수보다 많다) 그대로 유사역행렬을 사용할 수 없다.
그렇기 때문에 Xβ = y 식의 정확한 값은 구할 수 없고, y에 최대한 가까운 값이 되도록 하는 β값을 구하는게 최선이다.
따라서, y 대신 y의 L2-norm을 최소화 하는 β를 찾으면 y에 가장 근접하는 y-hat을 찾을 수 있다.
이 때 β를 구하는데 X의 유사역행렬을 사용한다.
이해가 좀 더 필요할 것 같다..
문자열 처리와 관련된 파이썬 함수가 많다는걸 다시 한번 느꼈다. 문자열 처리 기술은 항상 까먹지말고 익혀두자.
다른건 몰라도 split(), join(), re.sub() 까지는 기억해두는게 좋을 것 같다.
in 구문(for .. in ..)에서 container는 set일 경우 O(1) 시간복잡도로 접근 가능하다. str이나 list는 O(n) 시간복잡도
과제가 현재 팀원들 기준으로는 쉬운 편이었지만, 푸는 과정에서 더 좋은 접근방법이 없는지(오늘 경우는 자료구조나 알고리즘, 이미 정의된 함수) 팀원분들과 얘기를 많이 나누었고, 이 과정이 정말 재미있다고 느껴져서 부스트캠프에 참여한 보람이 있다고 생각했다.
오늘 목표로 한 부분까지 강의를 듣지 못했다. 강의 듣고 정리하고 과제 다 하고 피어세션 전에 모르는 부분에 대한 질문을 준비하는게 생각보다 많이 빠듯했고, 내일은 최대한 효율적으로 피어세션 전에 준비를 다 마칠 수 있도록 노력해야겠다.
팀 활동 너무 좋다. 팀원들도 너무 좋다. ㅋㅋ