단순하게 생각하자!
단일 숫자. 변수에 저장할 때는 일반적으로 소문자를 사용
- 벡터는 일반적으로 위의 화살표를 갖는 소문자의 형태로 표기
- →
각 구성요소를 서로 곱한 후 합한 값과 같음.
,
v x = = 70
벡터의 내적에서는 두 벡터의 길이가 반드시 동일해야함.
교환법칙 및 분배법칙 적용 가능.
행과 열을 통해 배치되어있는 숫자. 대문자를 통해 표기
(행,열)의 차원을 가짐.
행과 열을 바꾼 행렬. 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]])"""
Diagonal (대각): 대각선 부분에만 값이 있고, 나머지는 전부 0입니다.
Upper Triangular (상삼각): 대각선 위쪽 부분에만 값이 있고, 나머지는 전부 0입니다.
Lower Triangular (하삼각): upper triangular 와 반대로, 대각선 아래에만 값이 있습니다.
Identity (단위 매트릭스):
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 (대칭): 대각선을 기준으로 위 아래의 값이 대칭인 경우 입니다.
행렬식은 모든 정사각 매트릭스가 갖는 속성으로, 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)
행렬과 그 역행렬을 곱하면 언제나 I (단위행렬) 이 된다.
A →
np.linalg.inv(H)
Determinant 값이 0 이 되면, 역행렬 식에서 분모가 0 이 됨. →
매트릭스의 행과 열이 선형의 의존관계가 있는 경우
통계적 추정의 정확성에 대한 질적 척도수치가 작을수록 정확성이 높음 손실함수로 쓰임
실제 값과 측정(예측)값의 차이 회귀지표로써 사용됨
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(직교) 단위벡터가 된다.
즉, 의 조건을 만족하면 Orthogonal Matrix라고 할 수 있다.
Q의 전치행렬과, 자기 자신 Q 를 곱했을 때 I(Identity 행렬)이 된다는 것은, Q의 전치행렬이 Q 의 역행렬과 같아지고, 이렇게 되면, 직교행렬이라고 부를 수 있다.
직교행렬 Q는 반드시 Intervible 해야하며, 또 다른 특징이 있다면 어떠한 직교행렬의 Determinant 는 +1 또는 -1 이다. 선형 변환으로써, 하나의 직교행렬은 백터의 내적을 보존하고, 따라서 유클리드 공간에서 isometry(등거리변환)으로써 작동한다. 예를들면 회전, 반영 또는 회전반영과 같은 것.
하우스홀더행렬은 길이가 1인 Unit vector v에 대하여, 다음과 같이 정의됨
이렇게 만들어진 행렬 H 는 임의의 벡터 x에 곱했을 때, 벡터 v에 직교하는 평면에 대하여 벡터 x를 반전시킨다.
따라서 P = I- 일때, 다음과 같은 그림을 그려볼 수 있다.
이렇게 하우스홀더행렬은 벡터를 특정 평면에 대해 반전시킬 때 쓸 수 있다. (하우스홀더행렬도 직교행렬)
만약 벡터 x를 unit vector y의 방향으로 변환시키고 싶을 때? → 벡터 x를 unit vector y의 방향으로 변환시키면 |x|y가 될테니, 벡터x와 벡터|y|를 양분하는 평면의 normal vector(법선벡터)를 구해 v라고 하고, 이 벡터로 하우스홀더행렬을 구해 x에 곱하면 된다.
와.........너무어렵다........ 나중에 다시읽어보자