# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3.7.9 64-bit
#     language: python
#     name: python3
# ---

# # TIL 7
#
# 오늘은 내용은 여러번 반복해서 이해하는 것이 좋아보임

# ##### 벡터와 직교분해

# - 내적
# - 투영
#   - 투영을 이용해서 특정 벡터를 직교 분할 가능!
#
# - 직교행렬
#   - 직교좌표계 
#     - 행렬의 열벡터 끼리 내적했을 때 0인 행렬
#     - 직교 행렬의 열벡터를 노말라이즈 했을때 
#       - 정규 직교 행렬
#   - 투영을 이용해서 직교 분할한 행렬을 구할 수 있음
#   - 역행렬을 계산하지 않고 투영을 이용해서 해를 구할 수 있음!
#   - 독립된 기저벡터를 갖는 행렬이기때문에 병렬처리 가능
#
# - 정규 직교 행렬
#   - 내적만으로 해를 구 할 수 있음!
#
# - QR 분해
#   - 일반적인 행렬A은 직교성을 갖지 않음.
#   - QR 분해는 직교분할과 연관성
#   - A = QR , Q(직교행렬), R(상삼각행렬)
#   - 상삼각행렬은 해를 구하기가 쉬움 (ㄱ 행렬 )
#
#  - QR 분해 vs LU 분해
#    - LU 병렬처리 X
#    - QR 분해는 메모리 사용이 많음
#

# #### SVD , PCA

# - SVD (특이값 분해)
#   - LU, QR 분해는 정방행렬
#   - 특이값 분해는 일반적인 m x n 행렬의 분해
#   - A = U(회전) D(스케일) V(회전)
#
# - PCA (주성분 분석)
#   - 데이터들 집합의 분포성을 분석
#   - 데이터의 주성분으로 나누고 증폭함
#   - 
#
#
# - 인공지능에서 차원을 축소 하는 행위는 근사값을 구하는 행위같음

# #### 벡터 공간과 최소 제곱법

# - 공간
#   - 덧셈 연산에 닫힘
#   - 스칼라 곱 연산에 닫힘
#
# - 열공간
#   - 행렬 A의 열벡터들에 대한 가능한 모든 **선형 조합의 결과**를 모은 집합
#
# - 최소 제곱법 
#   - Ax = b (b가 풀리지 않는 경우!?)
#   - 어떻게든 풀 수 있는 형태로 변경하는 것! 신박한데?
#   - 최선을 다하는 것
#   - b 라는 벡터를 열공간에 투영을해서 그 값을 이용해서 목표를 수정해서 값을 얻는다
#   - Ax = b 는 불가능 Ax = projwB (bar_B) 가능
#   - b - bar_B 
#   - Ax = b => A_transpos A x_bar = A_transpos b 
#     - x_bar = (A_transpos A)^-1 A_transpos b
#   - 선형 회귀
#     - 2차원 공간의 m개의 정점이 있을 때 이 정점들을 설명 할 수 있는 직선을 구하는 문제 
#   

# #### 통계학, 기본개념

# - 통계학
#   -  데이터수집, 구성, 분석, 해석, 표현
#   -  기술, 추측
#
# - 개념 정의
#   - 모집단(population)
#     - 개체나 사건의 집합
#   - 모수(parameter)
#     - 모집단의 수치적인 특성
#   - 표본(sample)
#     - 모집단에서 선택된 개체, 사건의 집합
#
# - 도수(Frequency)
#   - 정의
#     - 발생한 횟수 
#   - 표현 방법
#     - 분포표
#     - 막대그래프
#       - 질적 자료(비율)
#     - 히스토그램
#       - 양적 자료(숫자인 경우)

# +
import statistics

b = [79, 54,1000]

print(statistics.mean(b))
print(statistics.median(b))
# -

# - 분산
#   - 모분산 (N)
#   - 표본분산 (n-1)
#
#

print(statistics.variance(b)) 

# +
import numpy as np

np.var(b)

# -

np.var(b, ddof=1)

# - 범위
#   - max - min 범위 
#   - 대충 이정도 값들을 갖고있구나

max(b) - min(b)

# - 사분위수
#   - 자료를 정렬 했을 때 1/4,1/2,3/4 위치에 있는 숫자

np.quantile(b,0.25)

# - 사분위수 범위
#   - Q3 - Q1
#   - 평균보다 더 자세하게 값의 범위를 확인 가능

np.quantile(b,0.75) - np.quantile(b,0.25)

# - z-score
#   - 어떤 값이 평균으로부터 표준푠차와 얼마나 떨어져있는지 의미
#   

# +
import scipy.stats

scipy.stats.zscore(b)

StarcoderdataJupyterScriptsDedupFiltered