- scalar, vector, matrix
- span, basis, rank
- numpy 사용해 선형대수 연산하기
선형대수를 배우는 이유
선형대수 : 벡터, 행렬을 다루는 수학이며, 데이터 과학에서 정답에 가까운 가장 가까운 방법을 찾아내어 문제를 해결하는데 사용
이 벡터가 Data Science에서 데이터를 분석하는데 어떻게 접목이 되나?
- 데이터 분석하기 위해, 정렬된 벡터 형태의 데이터를 필요로 한다. → 우선적으로 데이터를 vectorized한 뒤, 머신러닝 모델을 만든다.
- 차원 축소 → 데이터가 매우 많은 차원에서 주어지는 경우가 많다. 차원의 수가 많아지면 데이터 분석이 어려워지므로, 벡터를 이용하면 차원축소기술을 이용해 고차원 데이터를 저차원 공간으로 변환할 수 있다. (PCA)
- 유사도 측정 : 벡터 이용시, 데이터 포인트 간의 유사도 측정이 가능하다. 벡터 간의 거리, cosine similarity 이용해 clustering, classification, 추천 시스템 등 활용 가능
- Machine learning
- 이미지 분석 시 : 이미지는 pixel로 이루어진 2차원 배열로 표현되어, 각 픽셀을 하나의 feature로 간주하여 각 이미지를 벡터로 변환해 다양한 이미지 분석 작업 가능
→ 데이터 분석에서는 데이터를 벡터 형태로 변환하여 분석하는 것이 중요하므로 선형대수 필수!!
python 자료구조
순서를 갖는 자료형 (list vs array)
- list : 수치적 연산 불가능 / 자료형 혼잡 가능
- array : 수치적 연산 가능 / 동일한 자료형만 가능 /numpy 배열 ( 자료형이 혼합되어 있는 경우, 모두 문자열로 처리됨)
순서를 갖지 않는 자료형 (set)
기본 선형대수
- 1차원 array : vector
- 2차원 array : matrix
Vector
스칼라의 집합. 크기와 방향으로 정의되는 값
- list, aray형태로 나타낼 수 있다.
- 성분의 개수는 벡터의 차원 의미
- 벡터의 크기 : norm, length, magnitude : 벡터의 길이
- 벡터의 내적
- 유클리드 공간의 두 벡터를 수처럼 곱해 scalar를 얻는 연산
- a·b = ||a|| ||b|| cos(θ) → 두 벡터의 유사도(similarity), 방향 파악 가능
np.dot(v1, v2)
- 벡터의 직교(orthogonality) : 내적=0: 서로 수직 → 서로 독립된 벡터 (linearly independent)
- 단위 벡터(unit vector) : 모든 벡터는 단위 벡터의 선형 결합으로 표기가능
- linear combination (선형결합) : 벡터, 스칼라에 대해 벡터의 스칼라곱과 합으로 나타낸 것
# 파이썬으로 벡터 시각화하기
v1 = [2,1]
v2 = [-3,2]
v3 = [1,-1]
plt.xticks(np.arange(-4,4))
plt.yticks(np.arange(-2,4))
# axhline : 수평선그리기 / axvline : 수직선 그리기
plt.axhline(0,0,1, color='lightgray', linestyle='--', linewidth=1)
plt.axvline(0,0,1, color='lightgray', linestyle='--', linewidth=1)
# arrow(시작x, 시작y, 가리키는x, 가리키는y) : 화살표 그리는 함수
plt.arrow(0,0,v1[0],v1[1], head_width=0.1)
plt.text(2.2, 1.1, 'v1')
# v2,v3도 똑같이.
Matrix
- Matrix Multiplication :
np.matmul
- 2차원 공간에서는 np.dot연산과 동일함.
- m x l, l x n = m x n
- 단위 행렬
np.identity
np.eye
: (default:k=0) k에 따라 대각선 위치 변경할 수 있
- 역행렬
np.linalg.inv
- 대각행렬 : 주대각선을 제외한 모든 성분이 0인 정사각 행렬
- 행렬식 (determinant)
- det(A) = |A| = ad-bc
np.linalg.det
- 행렬의 가역성(invertibility)을 판별하는데 사용
- 역행렬 존재O : invertible (=non-singluar matrix) det(A)≠0 linearly independent
- 역행렬 존재X : non-invertible (=singlar matrix) det(A)=0 linearly dependent
- 행렬을 구성하고 있는 벡터가 영벡터 or 한 벡터가 다른 벡터의 선형종속
- 공간을 만들 수 있는 해가 없다 ⇒ 2차원 평면의 면적이 0이다.
- Span
- 주어진 두 벡터의 조합으로 만들 수 있는 모든 가능한 선형결합의 집합
- ex) (1,2)와 (2,4)의 span : (x,y) = a(1,2) + b(2,4) 형태의 모든 벡터 집합 = (a+2b, 2a+4b) 형태로 표현 가능
- 모든 vector가 linearly independent ⇒ span의 차원은 벡터의 수가 되겠지.
- 두 벡터가 같은 선상에 있으면, 이 벡터들은 선형 관계
- 선형 관계에 있는 벡터들이 만들어내는 span은 일적선 수이므로, 벡터의 수보다 더 적은 차원을 가짐. (linearly dependent)
- 선형 관계에 있지 않는 벡터들 = 선형적으로 독립되어있다. (linearly independent)
- Basis
- linearly independent한 벡터들의 모음
- R^2 (2차원 벡터공간)의 basis : {(1,0), (0,1)}
- 결국, span의 차원은 basis vector의 개수로 정의되겠지.
- Rank
- 벡터들로 만들 수 있는 공간(span)의 차원
- 행렬이 나타낼 수 있는 벡터공간에서의 basis의 개수
- 행렬의 linearly independent한 행 또는 열의 최대 개수
- rank를 통해 span의 수 구할 수 있다.
- linearly independent / dependent 여부 파악 가능
np.linalg.matrix_rank
- Gaussian Elimnitation(가우스 소거법) 참고
More Study
- 벡터의 크기를 나타내는 방법
- L1-norm : ||v||₁ = |v1| + |v2| + ... + |vn|
- L2-norm : ||v||₂ = √(v₁² + v₂² + ... + vn²) (Euclidean거리)
- error
- 모델의 예측 정확도 측정에 사용
- 이 값들이 작을수록, 모델의 예측값과 실제값이 가깝다.
- MSE (Mean Squared Error, 평균 제곱 오차)
- 실제값, 예측값 차이제곱을 모두 더한뒤 샘플 수로 나눈 값
- 예측오차 제곱하므로, 예측 오차가 큰 값에 더 민감하게 반응 → 오차에 대한 가중치가 더 부여됨.
- MAE (Mean Absolute Error, 평균 절대 오차)
- 실제값, 예측값 차이 절댓값을 모두 더한뒤 샘플 수로 나눈 값
- 예측오차 제곱을 하지 않으므로, 예측 오차의 크기에 대해 가중치를 비슷하게 부여하므로, 예측 오차의 크기에 대해 더 효과적인 해결책 제공
예측 오차에 대한 가중치 부여 → MSE는 큰 예측 오차에 대해 더 강한 패널티 줌, MAE 크기에 관계없이 동등한 패널티 줌.
np.stack
여러 개의 배열을 하나의 배열로 합치는 함수
a = np.array([1,2,3])
b = np.array([2,3,4])
np.stack((a,b))
>>array([[1, 2, 3],
[2, 3, 4]])
np.stack((a,b), axis=1)
>> array([[1, 2],
[2, 3],
[3, 4]])
%%timeit
: 코드 실행 시간 측정 시 편함.10000 loops, best of 5: 13.2 µs per loop # 코드 10000번 반복해서 실행 시, 5번 실행 결과 중 가장 작은 실행 시간 선택 # '13.2' : 평균 실행 시간`
sns.pairplot
- 모든 열간의 산점도를 한 번에 그려주는 함수
tips = sns.load_dataset('tips') # total_bill, tip, size 열간의 산점도 그리기기 sns.pairplot(tips, vars=["total_bill", "tip", "size"]) # 대각선 부분은 histogram으로 나타남. diag_kind파라미터를 통해 변경 가능
# 'day' 열에 따라 색상을 다르게 해서 산점도 그리기
sns.pairplot(tips, vars=["total_bill", "tip", "size"], hue="day", diag_kind='kde')
# diag_kind가 KDE로 대각선부분에 확률밀도함수를 그려줌.
# 회귀선 추가하기
sns.pairplot(tips, x_vars=["total_bill"], y_vars=["tip"], kind="reg")
- crammer’s rule
- 선형방정식의 해를 구하는 방법 중 하나
- 각 변수의 계수를 행렬로 나타내어 행렬식을 이용하여 해를 구하는 방법
# ax + by = e
# cx + dy = f
# 해를 구하는 공식
x = (ed - bf) / (ad - bc)
y = (af - ec) / (ad - bc)
# 이떄, 행렬식(det)을 이용하여 ad-bc 계산# 크래머의 규칙 : 선형 방정식의 해를 구하는 방법 중 하나
# 각 변수의 계수를 행렬로 나타내어, 행렬식을 이용하여 해를 구하는 방법
A = np.array([[1, 0, 2],
[-3, 4, 6],
[-1, -2, 3]])
B = np.array([6, 30, 8])
# det먼저 구해주기
det = np.linalg.det(A)
# 원래 행렬의 각 열의 값 변경 -> x1은 첫번째 열 B로 대체
x1 = np.linalg.det([[ 6, 0, 2],
[30, 4, 6],
[ 8, -2, 3]]) / det
# x2는 두번째 열 B로 대체
x2 = np.linalg.det([[ 1, 6, 2],
`` [-3, 30, 6],
[-1, 8, 3]]) / det
# x3은 세번째 열 B로 대체
x3 = np.linalg.det([[ 1, 0, 6],
[-3, 4, 30],
[-1, -2, 8]]) / det
- Linear Projection
- proj_b(a) = (a·b / ||b||^2) * b : 벡터a를 벡터b에 수직으로 투영한 결과
- 먼저, 내적의 원리에 대해 살펴보자.
- w를 v에 대해 project해보자. v·w = (length of projected w) x (length of v)
- , w벡터 투사체가 v벡터의 반대 방향이라면, 내적하면 음수가 된다.
- 같은 방향이라면 내적하면 당연하게 양수가 된다.
- 그리고 직각을 이루는 경우는 projection하면 0이되어, 내적하면 0이된다.
- v를 project한 결과나, w를 project한 결과가 같아 순서가 중요하지 않다는 사실을 알 수 있다.
- 데이터를 표기하기 위해, x와y라는 2개의 feature가 필요함 → projection → 데이터를 표기하기 위해, x만 1개의 feature가 필요함
- 다음번에 배울 PCA에서는, linear projection 개념이 중요하게 작용한다.
- dot product(내적)과 projection(사영)이 어떤 관계가 있는지 알아보자.
- cosine similarity (코사인 유사도)
- 두 벡터가 얼마나 유사한지 측정하는 지표이며, 내적과 투영 이용해 계
- cosine_similarity(a, b) = a·b / (||a|| ||b||) = proj_b(a) / ||a||
- 두 벡터의 방향이 비슷할수록, cosine similarity는 1에 가까워짐.
- 방향이 반대일때는, -1
- cosine similarity (코사인 유사도)
'Linear Algebra' 카테고리의 다른 글
[Dimensionality Reduction] PCA (0) | 2023.03.13 |
---|---|
[Clustering] RFM지표를 이용한 K-Means Clustering (1) | 2023.03.03 |