강의 링크 : https://www.boostcourse.org/ai100/lecture/739177?isDesc=false
벡터 : 정수를 원소로 갖는 1차원 배열
행렬 : 벡터를 원소로 갖는 2차원 배열
파이썬의 numpy에서는 행 벡터가 기본 단위가 된다.
이때 행의 개수를 n개, 열의 개수를 m개라 하여 n x m
행렬이라 한다.
- 한개의 행 벡터는 m개의 성분(벡터)로 이루어져 있고
행렬의 각 성분은 행과 열이라는 인덱스로 나타낼 수 있다.
x = np.array([[1,-2,3],
[7,5,0],
[-2,-1,2]])
x[2][0] # -2
x[1][1] # 5
xij는 i행 j열에 있다는 뜻이다.
파이썬에는 x[i][j]
로 참조할 수 있다.
행렬의 특정 행 또는 열을 고정하면 행(열)벡터라 부른다.
x = np.array([[1,2,3],
[4,5,6]])
xt = np.array([[1,4],
[2,5],
[3,6]])
X ± Y = (xij ± yij)
X ◎ Y = (xij yij)
numpy에서는 ``로 연산한다
aX = axij
XY = Σk(xik ykj)
numpy에서는@
로 연산한다.
x = np.array([[1,-2,3],
[7,5,0],
[-2,-1,2]])
y = np.array([[-1,3],
[3,2],
[-3,-1]])
위의 경우에서 Z = X @ Y라고 할 때
Z11 = (X11 * Y11) + (X12 * Y21) + (X13 * Y31) = (1 * 1) + (-2 * 3) + (3 * -3) = -14
Z12 = (X11 * Y12) + (X12 * Y22) + (X13 * Y32) = (1 * 3) + (-2 * 2) + (3 * -1) = -4
이와 같이 계산할 수 있다.
np.inner
함수를 통해 두 행렬의 내적을 구할 수 있다.XYT = Σk(xik yjk)
x @ A = z
a11x1 + a12x2 + ... + a1mxm = z1
a21x1 + a22x2 + ... + a2mxm = z2
n x n
의 정방행렬이어야 한다 2. 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있다.항등 행렬 : 행렬의 주대각선의 원소는 1이고 나머지는 모두 0인 행렬을 말한다. 임의의 행렬이나 벡터에 항등행렬을 곱하면 자기자신을 결과로 얻는다.
행렬식 : 간단히 말하면 n x n의 정방행렬이 갖고 있는 어떤 특정한 값을 나타내 주는 식이다.
2 x 2 행렬의 경우 ad - bc가 행렬식이다
AA-1 = A-1A = I
linalg
(선형대수 함수) 라이브러리의 inv()
메소드를 통해 구할 수 있다.x = np.array([[1,-2,3],
[7,5,0],
[-2,-1,2]])
x_inv = np.linalg.inv(x) # x의 역행렬
n ≥ m (행이 열보다 많을 때)
A+ = (ATA)-1AT
A+A = I 만 성립한다. (순서가 바뀌면 성립하지 않음)
m ≥ n (열이 행보다 많을 때)
A+ = AT(AAT)-1
AA+ = I 만 성립한다.
linalg
(선형대수 함수) 라이브러리의 pinv()
메소드를 통해 구할 수 있다.Ax = b
▼ 연립방정식 (m ≥ n)
a11x1 + a12x2 + ... + a1mxm = b1
a21x1 + a22x2 + ... + a2mxm = b2
...
an1x1 + an2x2 + ... + anmxm = bn
x = A+b = AT(AAT)-1b
x의 해를 하나 구할 수 있다.
출처 : 위키백과
선형회귀식 : Xβ = y
Xβ = ŷ
β = X+ŷ = (XTX)-1XTŷ
파이썬에서는 sklearn의 LinearRegression 메소드를 이용할 수 있는데, 이것과 같은 결과를 가져 올 수 있다.
단 numpy의 linalg.pinv()
를 이용할 때는 y절편을 고려하지 않았으므로, intercept항을 직접 추가해야한다.
사실 이부분은 잘 이해가 가지 않는다.
y절편이 필요하다는 것은 알겠지만, 어떻게 추가할 수 있다는 걸까?