티스토리 뷰
> 행렬에서 스칼라는 크기 만으로 나타낼 수 있는 행렬에서의 가장 작 물리량
> Index Location으로 스칼라 값을 가져올 수 있다.
df = pd.read_csv(".\data\house_prices.csv", encoding ="cp949")
print(df.iloc[2,4])
print(df.iloc[2,3] + df.iloc[4,5])
> 벡터는 스칼라를 모아서 표현.
> 크기와 방향이 같으면 모두 동일한 벡터
> 리스트는 벡터다
> 열/행 벡터 구분 가능하고 그냥 벡터면 기본적으로 열 벡터를 의미한다.
> 벡터 덧셈, 뺄셈을 하기 위해서는 길이 즉 차원이 같아야 한다.
> 벡터의 덧셈, 뺄셈은 기하학적으로 나타낼 수 있다.
> 스칼라가 모여서 벡터, 벡터가 모여서 행렬이 된다.
> 소문자 평문(아무런 효과도 주지 않은) = 스칼라(Scalar)
> 소문자 Bold = 벡터
> 대문자 Bold = 행렬
> 대문자 평문 = 확률변수
a = np.array(range(0,10))
print(a)
print(a.reshape(10,1))
print(a.reshape(2,5))
print(a.reshape(-1,5))
print(a.reshape(2,-1))
> 행렬을 만들 때 np.array()를 활용
> a.reshape()을 활용해서 행렬 크기를 변경
> -1은 알아서 해라는 뜻임, 행이나 열 기준으로 알아서 맞춰라
> reshape(-1,#)을 반대 보다 더 많이 씀, 머신러닝 할 때 데이터의 행이 더 많기 때문
> 벡터라고 생각하지만 엄밀히 말해서 행렬임 왜냐하면 []가 두 개이기 때문.
b = a.reshape(2,-1)
b.reshape(-1)
> reshape(-1)은 행렬을 벡터로 바꿔줌
> 딥러닝 할 때 많이 씀, 이미지 처리에 많이 씀.
> 이미지 픽셀의 정보를 행 벡터로 만들어준다, 픽셀이 feature가 된다.
> 해상도를 높이면 데이터 크기가 너무 커지기 때문에 처음 시작할 땐 해상도를 낮춰서 진행 필요
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[9,12]])
C = np.concatenate((A,B), axis=0)
D = np.concatenate((A,B), axis=1)
> concatenate는 행렬을 합치는 함수
> axis =0이면 행 방, 1이면 열 방향
> 행렬 곱에선 앞 열, 뒤 행 크기가 같아야 함.
> 행렬 곱 후 행렬의 크기는 달라진다.
> 같은 크기의 두 행렬의 각 원소의 곱은 동그라미로 표시한다 A ⊙ B.
> Kronecker product 곱도 있음.
> 행렬 곱은 교환 법칙 성립하지 않음
> 전체 행렬은 행과 열을 바꾸는 행렬.
> 표현 방법은 T이다, ' 표기법은 미분이랑 헷갈려서 안 씀
> 스칼라에는 Transpose가 안 붙음, 1행 1 열이기 때문.
> AB Transpose 하면 순서가 바뀜.
> 행 벡터를 Transpose로 표시한다.
> 대각선 기준으로 같은 값을 가진 행렬 (거의 주인공 급으로 중요함)
> 대칭 행렬은 정사각 행렬이다.
> 행렬과 전치 행렬의 곱은 앞의 행 by 뒤의 열 행렬로 되고 대칭 행렬이 됨.
> 각 값은 행렬의 공분산이고 이 행렬을 공분산 행렬이라고 한다.
> 엄밀하게 얘기하면 공분산 행렬이 아님 (중간 생략된 게 있음), 개념상 공분산으로 보는것임.
> XX^T는 506 x 506 행렬이 되어 크기가 커지고 이건 의미가 크게 없음. feature에 대한 관계 값이 아니기 때문.
> 머신러닝은 feature보다 행이 훨씬 큰 데이터 형태이기 때문에 다른 Case는 생각할 필요 없음.
> 공분산 행렬이 중요.
x = df[['CRIM', 'NOX', 'RM', 'AGE', 'TAX']]
x_t = np.transpose(x)
x_t = x.T
x_t@x
x_t.dot(x)
> 단위행렬 AI = IA = A 같음
> 지시함수도 I를 쓰는데 차이점은 지시 함수는 I 후 여러 조건들이 붙음
> one vector는 1= (1,1,1) #열 행렬, 1^T = (1,1,1)
> zero matrix 0 = ([0,0], [0,0], [0,0]) #크기는 상황에 따라 다름
> 3x3의 행렬식은 육면체의 부피이다.
> 2x2는 평행 사변형의 넓이이다.
> 정방행렬 즉 정사각 행렬에서만 가능.
> 부피가 0, 그림으로 보면 같은 방향의 벡터가 있기 때문.
> feature가 모자라면 파생 변수를 만들었을 때 의미가 없다. det 하면 0이기 때문.
> 파생 변수인 Sum, Avg 만들었을 때 데이터 분석 기준에선 의미가 있을 수 있으나, 머신러닝 관점에선 의미가 없다.
> 데이터의 중복값이 있는지 행렬식으로 확인해 볼 수 있다.
> 행렬식이 0이어도 머신러닝 결과가 더 좋을 수 있다 하지만, 가능성을 높이기 위해 하나의 가능성이다.
> x1, x4가 det가 0이면 각각 x1, x4, x1&x4 넣어보고 결과 잘 나온 조합으로 한다. (이걸 정하는 분야가 차원 축소)
> det 0이 될 수 있는 열들이 여러개라면 많은 경우의 수가 발생하지만 Case 별로 다 넣어서 머신러닝 돌려보고 판단 해야 함.
> 차원 축소를 할 때 비지도 학습을 사용한다.
A = df[['CRIM','NOX','NOX']]
AtA=A.T@A
np.linalg.det(AtA)
B=df[['CRIM', 'NOX']]
B['NOX3'] = B['NOX']*3
BtB = B.T@B
np.linalg.det(BtB)
> 0에 수렴하는 값.
> 2x2 역행렬 공식에 행렬식이 들어가고 행렬식이 0이 되면 역행렬을 못 구한다.
> 역행렬을 구해야 되는 이유는 회귀분석 Solution 구할 때 필요함.
> 행렬식이 0이면 에러가 나와야 되는데 코드 실행 시 조치가 되어있어 에러는 나지 않음
> 역행렬이 존재하지 않는 경우 singular matrix
Y = df['MEDV']
XtX_inv = np.linalg.inv(XtX) #lialg : linear algebra
XtY = X_t@Y
XtX_inv @ XtY #회귀분석 Solution
> (X^TX)^1X^TY : 회귀분석 Solution (5x506 506x5 5x506 506x1) = 5x1
> vector * vector^T 는 행렬이다
> vector^T * vector 는 스칼라이다.
학습 목표 : 논문 발췌문 다 이해, 어디 내적 되었는지 찾아보기
> 내적 (Inner Product) 은 벡터를 연산해서 스칼라 결과 값이 나오는 연산자.
> 표기 방법은 <> or 가운데 º 을 사용한다.
> 같은 위치이 있는 값들을 곱해서 더한 값
> 다른 표현 방식으로 앞의 벡터의 Transpose와 벡터의 곱 즉 결과는 스칼라.
> 예를 들어 의자를 끌 때 내적의 값은 물체의 이동거리
> 내적이 0보다 작으면 의자가 뒤로 간다는 의미.
> 두 vector의 직각 여부를 판단할 때 사용된다.
> 물리 관점으로 만약 좌표가 (2,3)에 공이 있고 (1,2) 내적 하면 값은 8이고 이 값의 뜻은 x축 2 위치에 1만큼 힘을 가하고
> y축 방향 3에 2의 힘을 적용한 후 모두를 더한 값이다.
> 최종 위치는 2차원 좌표 대신 8이되며 이는 (2,3) 벡터 방향으로 8 만큼 움직였다는 뜻이다.
> 노름 (norm) 표시는 vector의 크기를 계산한다.
> 각각의 원소들을 제곱해서 Root 값 계산한다.
> 사이 각도를 구할 수 있다.
> 각도가 작은 vector 일수록 내적 값은 크다
> 머신러닝 관점에서 내적 값이 클수록 vector들이 더 유사하다, 추천 시스템을 만들 때 사용된다.
> 추천 시스템은 선형대수라고 봐도 무방하다.
> cos 유사도도 다른 개념이 아닌 내적이다.
> 공식에 Scaler 와 Core Function이 나눠져 있음 Scaler는 단위를 조정해 주는 값, Core Function이 중요한 식.
> cos 유사도에서 Core Function은 내적이다.
crim = df['CRIM']
nox = df['NOX']
res = np.inner(crim,nox)
print(res)
> 수직인 vector를 직교 vector라고 한다. (Orthogonal Vector)
> 두 Vector가 직교 하면서 크기가 1인 vector를 정규 직교 벡터라고 한다. (Orthonormal Vector)
> 선형대수에서 Orthogoal Vector를 찾는 걸 선호한다 왜냐하면 내적이 0으로 계산이 필요 없기 때문이다.
> 1차원에서 1개의 좌표 필요, 2차원에선 2개 그리고 3차원에선 3개 필요함.
> unit vector는 크기가 1이고 기본이 되는 Vector.
> unit vector로 3차원 모든 좌표를 표현 가능하고 이것을 선형 조합이라고 한다.
> 선형 조합을 표현하는 i, j, k를 기저 벡터(basis vector)라고 한다.
> 전체 공간의 일부분 공간을 부분 공간이라고 한다.
> 부분 공간이 2차원이면 기저 벡터는 2개이다 s1, s2.
> 기저 벡터 2개 s1, s2로 부분 공간을 만들 수 있다 이것을 span 한다라고 표현한다.
> 2차원 (2,1)를 행렬을 곱해서 3차원으로 변환하는걸 선형 변환이라고 한다.
> 기저 벡터로 선형 조합을 표현할 수 있다.
> 하지만, 서로 기저 벡터로 만들 수 없으면 선형 조합을 할 수 없고 이것을 선형 독립이라고 한다.
> 선형 종속은 선형 조합으로 표현할 수 있다.
> 행렬 안에 선형 종속이 있으면 행렬식은 0이다.
> 기저 벡터는 공간을 생성하는 선형 독립인 벡터들.
> 조건은 공간의 모든 좌표를 표현할 수 있어야 하고 선형 독립이어야 한다.
> 기저 벡터는 항상 직교일 필요는 없으며 유일하지 않아도 된다.
> unit vector일 필요는 없다.
> 하지만 보통 직교를 사용한데 왜냐하면 내적이 0이어서 계산이 용이하기 때문.
> a)의 의미는 2차원 공간에 벡터 두 개가 있는데 추가로 하나가 더 있으면 기존 두 개로 나머지를 표현 가능하기 때문에 선형 종속이다.
> b) 2차원에서 하나의 벡터가 있으면 공간 표현을 할 수 없다
> c) 2차원에서 색깔 별 기저 벡터를 여러 가지로 해도 총개수는 2개이다.
> 행으로 자른 2차원 vector가 3개로 만든 공간은 2차원이고 행 공간.
> 열로 자른 3차원 vector가 2개로 만든 공간은 2차원 왜냐하면 vector가 2개이기 때문에 이 공간을 열공 간.
> 그래서 rank는 2다.
> 열, 행의 기저 벡터 max 값으로 rank를 구할 수 있다. 종속 벡터는 rank에 포함되지 않는다.
> 머신 러닝에서 rank가 많았으면 좋겠지만 종속 벡터들이 있다면 rank는 예상보다 작아지게 된다.
> 최대 나올 수 있는 rank를 Full rank라고 하고 rank는 feature의 개수가 된다.
> Full rank가 아닌 경우 종속 벡터가 있기 때문에 A_TA의 행렬식은 0이다.
> feature의 개수 4개 의 rank 가 3 이면 1이 남는데 이게 nullity 다.
> rank는 망대, nullity는 망소
> 영 공간은 쓸모없는 버려지는 공간
> 영 공간은 Ax 벡터 앞에 행렬이 있으면 선형 변환, 다른 공간으로 보내 버리고 보내는 공간이 0 임.
> 기본 연산을 해줘도 행 공간, 열 공간은 변하지 않는다.
> X를 다른 차원으로 보내버릴 때 (Linear Transformation) 자기 자신이 나오는 vector (길이만 바뀐)
> 이때 안 변환 vector를 고유 벡터라고 한다.
> 람다를 고윳값이라고 한다, 고윳값은 스칼라, eigenvalue (하나의 고유한의 독일어)
> 고윳값이 0보다 작으면 반대로 커진다.
> det 가 0인 것은 두 벡터가 포개지게 되고 하나의 해가 아닌 무한개의 해를 가지며 이는 종속 관계가 된다.
> 미지수가 2개인데 해가 하나인 경우 => 부정 방정식
> 무한개의 해가 나온다.
> 고유 벡터 두 개가 orthogonal 하지 않지만 orthogonal 되는 경우도 있다 대칭 행렬의 경우.
> X^TX는 공분산 행렬, 대칭 행렬이다 그래서 이 행렬의 고유 벡터는 orthogonal이다.
> 고윳값은 고유 벡터의 길이
> 그럼 고윳값, 고유 벡터는 뭐 때문에 구하냐?
> 공분산 행렬은 데이터의 흩어짐 정도와 관련이 있다.
> 공분산 행렬, 고윳값, 고유 벡터를 구하게 되면 차원 축소가 가능하다.
> 고유 벡터는 흩어짐의 방향, 고윳값은 흩어짐의 크기
> 대칭 행렬이기 때문에 orthogonal 하다.
> 비지도 학습에서 라벨링이 안되어있기 때문에 구분하기 위해선 데이터의 흩어짐 정도가 중요하다.
> 흩어짐 정도를 고유 벡터와 고윳값으로 표현할 수 있다.
> 2차원은 기저 벡터가 2개이고 차원 축소를 하려면 기저 벡터를 하나 줄여야 한다.
> 대체로 1번을 뽑는다 이유는 길이가 길기 때문(Information Loss 때문)
> Information Loss는 경향 라인에 투사시켰을 때 원래 어디서 왔는지 1번일 때 더 잘 알 수 있다
> 2번은 길이가 길고 많기 때문에 원래 어디 있었는지 알 수 없는 경우가 많이 생긴다.
> 그래서 선택할 때 고윳값이 큰 것부터 한다.
> 컴퓨터로 고윳값을 구하는데 여러 알고리즘이 있다. (빠르게 구하기 위해)
> 행렬을 대각 행렬을 만드는 것을 대각화라고 한다.
> 가역 행렬 (Invertible Matrix)은 역행렬이 존재하는 행렬이다.
> A가 대칭 행렬이고 P가 직교 행렬이면 직교 대각화라고 한다.
> 직교 행렬은 행렬의 벡터가 직교하는 행렬
> 대칭 행렬은 공분산 행렬과 관련 있다
>> 직교 행렬의 열 벡터들의 내적은 0이다.
>> 직교 행렬이 대칭 행렬인 경우도 있지만, 일반적으로는 그렇지 않다.
> 이것을 고윳값 분해라고 한다.
> feature가 많은 고차원 행렬을 저차원 행렬로 분리하는 기법이다.
>
> 직교 행렬이면 역행렬이 Transpose
> 고윳값은 내림차순 람다 1이 제일 큼
> 2차원 차원 축소 시 람다 1, 람다 2를 뽑는다.
> 고윳값 분해는 직사각 행렬만 넣어야 한다.
X= df[['CRIM', 'NOX','RM','AGE','TAX']]
X_t = X.T
XtX = X_t@X
e, v = np.linalg.eig(XtX)
> 직사각 행렬이 아닐 때 고윳값 분해 가능하도록 한 일반적인 분해 방법
> 정사각 행렬로 만듦
> P, P^T 대신 AA^T, A^TA를 사용
> 주의할 점은 AA^T의 값이 매우 크기 때문에 numpy에서 error가 나올 수 있다.
> 고윳값 분해랑 특이값 분해가 거의 같은 내용이고 안전성이 더 뛰어난 고윳값 분해를 추천.
X_t = X.T
XtX = X.T @ X
e, v = np.linalg.eig(XtX)
u,s, vt = np.linalg.svd(XtX)
u2,s2, vt2 = np.linalg.svd(X)
> 텐서는 Matrix가 모인 것 그림의 RGB 세 개의 Matrix가 필요하고 이미지 딥러닝 할 때는 텐서를 잘 다뤄야 한다. (CNN)
> 요즘 Deep learning Trend는 Tensor flow보다 Pytorch가 관심도가 더 높음.
'Machine Learning 입문' 카테고리의 다른 글
6. 확률 분포 & 가설 검정 (0) | 2024.12.26 |
---|---|
5. 데이터 전처리 처리 및 시각화 (1) | 2024.12.26 |
4. 기초 통계 & 시각화 (2) | 2024.12.26 |
2. 기초 수학 (0) | 2024.12.24 |
1. 가상 환경 Setting / Jupyter Notebook (0) | 2024.12.24 |
- Total
- Today
- Yesterday
- C언어 #C Programming
- MOS
- Blu-ray
- Energy band diagram
- Pinch Off
- Solar cell
- pn 접합
- EBD
- Diode
- 문턱 전압
- 반도체
- CD
- semiconductor
- 쇼트키
- Donor
- Fiber Optic
- Laser
- 양자 웰
- Reverse Bias
- 열전자 방출
- PN Junction
- Depletion Layer
- Acceptor
- Thermal Noise
- fermi level
- Charge Accumulation
- 광 흡수
- Optic Fiber
- channeling
- Semicondcutor
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |