Windows | Linux | Mac OS | |
---|---|---|---|
장점 | 친숙함, 초기엔 쉬움 | 모듈 설치 쉬움, 무료, 참고문서 많음 | 모듈 설치 쉬움, 참고문서도 많음 |
단점 | 모듈 설치 어려움 | OS 자체 사용이 어려움 | 비쌈 |
변수란?
프로그래밍에서 변수는 값을 저장하는 장소
변수는 메모리 주소를 가지고 있으며 변수에 들어가는 값은 메모리 주소에 할당 됨
폰 노이만 아키텍처
폰 노이만 아키텍처에서는 사용자가 컴퓨터에 값을 입력하거나 프로그램을
실행할 경우 그 정보를 먼저 메모리에 저장시키고 CPU가 순차적으로 그 정보를
해석하고 계산하여 사용자에게 결과값을 전달
컴퓨터의 반올림 오차
>>> c = 38.8
>>> print(c)
38.8
>>> c
38.799999999999999997
단순한 실수도 이진수(반도체를 사용하기 때문)로 변환하면 무한소수가 됨
일반적으로 반올림 오차는 충분히 작아 문제가 되지 않는다.
Parameter VS Argument
문자열 함수
>>> a.capitalize() # 첫 문자를 대문자로 변환
>>> raw_string = r"파이썬 재밌어 \n 정말"
>>> print(raw_string)
파이썬 재밌어 \n 정말
def type_hint_example(name:str) -> str:
return f"Hello,{name}"
def kos_root():
'''
Return the path name of the ...
example
'''
global _kos_root
if _kos_root: return _kos_root
...
for k,v in OrderedDict(sorted(d.items(),key = lambda t: t[0])).items():
print(k,v)
from collections import namedtuple as nt
Point = nt('Point',['x','y'])
p = Point(11,22)
>>> print(p[0] + p[1])
33
Exception 이름 | 내용 |
---|---|
IndexError | List의 index 범위를 넘어갈 때 |
NameError | 존재하지 않은 변수를 호출 할 때 |
ZeroDivisionError | 0으로 숫자를 나눌 때 |
ValueError | 변환할 수 없는 문자/숫자를 변환할 때 |
FileNotFoundError | 존재하지 않는 파일을 호출할 때 |
예시
for i in range(10):
try:
result = 10/i
except ZeroDivisionError as e:
print(e)
print("Not divided by 0")
else:
print(result)
finally 구문 예시
try:
for i in range(1,10):
result = 10 // i
print(result)
except ZeroDivisionError:
print("Not divided by 0")
finally:
print("종료되었습니다.")
필요에 따라 강제로 Exception을 발생
raise 구문 예시
while True:
value = input("변환할 정수 값을 입력해주세요")
for digit in value:
if digit not in "0123456789":
raise ValueError("숫자값을 입력하지 않으셨습니다.")
print("정수값으로 변환된 숫자 -",int(value))
특정 조건에 만족하지 않을 경우 예외 발생
assert 구문 예시
def get_binary_number(decimal_number):
assert isinstance(decimal_number,int)
return bin(decimal_number)
print(get_binary_number(10))
Logging Handling
import logging
logging.debug("틀렸잖아")
logging.info("확인해")
logging.warning("조심해")
logging.error("에러났어")
logging.critical("망했다")
logging level
Level | 개요 | 예시 |
---|---|---|
debug | 개발시 처리 기록을 남겨야하는 로그 정보를 남김 | 다음 함수로 A를 호출함, 변수 A를 무엇으로 변경함 |
info | 처리가 진행되는 동안의 정보를 알림 | 서버가 시작되었음, 서버가 종료됨, 사용자 A가 프로그램에 접속함 |
warning | 사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않는 정보가 들어왔을 때 알림 | Str입력을 기대했으나 int가 입력됨 (Str casting으로 처리함) |
error | 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작할 수 있음을 알림 | 파일에 기록을 해야하는데 파일이 없음 (Exception 처리 후 사용자에게 알림) |
critical | 잘못된 처리로 데이터 손실이나 더이상 프로그램이 동작할 수 없음을 알림 | 잘못된 접근으로 해당 파일이 삭제됨, 사용자의 의한 강제 종료 |
import logging
logger = logging.getLogger("main")
stream_hander = logging.StreamHandler()
numpy
array shape : array의 RANK에 따라 불리는 이름이 있다.
Rank | Name | Example |
---|---|---|
0 | scalar | 7 |
1 | vector | [10,10] |
2 | matrix | [[10,10],[15,15]] |
3~n | tensor | [[[1,5,9],[2,6,10]],[[3,7,8],[4,8,12]]] |
reshape : Array의 shape의 크기를 변경함,element의 갯수는 동일
>>> test_matrix = [[1,2,3,4],[1,2,5,8]]
>>> np.array(test_matrix).shape
(2,4)
>>> np.array(test_matrix).reshape(8,)
array([1,2,3,4,1,2,5,8])
flatten : 다차원 array를 1차원 array로 변환 ( reshape(-1)와 같음 )
>>> test_matrix = [[1,2,3,4],[1,2,5,8]]
>>> np.array(test_matrix).flatten()
array([1,2,3,4,1,2,5,8])
arrange : array의 범위를 지정하여, 값의 list를 생성하는 명령어
np.arrange(30)
np.arrange(0,5,0.5)
np.arrange(30).reshape(5,6)
zeros : 0으로 가득찬 ndarray 생성
ones : 1로 가득찬 ndarray 생성
# zeros
np.zeros(shape=(10,),dtype=np.int8)
np.zeros((2,5))
# ones
np.ones(shape=(10,),dtype=np.int8)
np.ones((2,5))
something_like : 기존 ndarray의 shape 크기 만큼 1,0 또는 empty array를 반
test_matrix = np.arange(30).reshape(5,6)
np.ones_like(test_matrix) # 1으로 가득찬
np.zeros_like(test_matrix) # 0으로 가득찬
identity : 단위 행렬을 생성함
>>> np.identity(n=3,dtype=np.int8)
array([[1,0,0],
[0,1,0],
[0,0,1]], dtype=int8)
eye : 대각선이 1인 행렬, k값의 시작 index의 변경이 가능
>>> np.eye(3)
array([[1.,0.,0.],
[0.,1.,0.],
[0.,0.,1.]])
>>> np.eye(N=3,M=5, dtype=np.int8)
array([[1,0,0,0,0],
[0,1,0,0,0],
[0,0,1,0,0]], dtype=int8)
>>> np.eye(3,5,k=2, dtype=np.int8)
array([[0,0,1,0,0],
[0,0,0,1,0],
[0,0,0,0,1]], dtype=int8)
diag : 대각 행렬의 값을 추출함
>>> matrix = np.arange(9).reshape(3,3)
array([[0,1,2],
[3,4,5],
[6,7,8]])
>>> np.diag(matrix)
array([0,4,8])
>>> np.diag(matrix,k=1) # k : start_index
array([1,5])
random sampling : 데이터 분포에 따른 sampling으로 array를 생성
>>> np.random.uniform(0,1,10).reshape(2,5) #균등분포
>>> np.random.normal(0,1,10).reshape(2,5) # 정규분포
numpy array operations
Element-wise operations : array간 shape이 같을 때 일어나는 연산
>>> matrix_a = np.arange(1,13).reshape(3,4)
>>> matrix_a * matrix_a
Dot product : matrix의 기본 연산, dot 함수 사용
>>> test_a = np.arange(1,7).reshape(2,3)
>>> test_b = np.arange(7,13).reshape(3,2)
>>> test_a.dot(test_b)
numpy comparisons
np.all : 모두가 조건에 만족한다면 True
np.any : 하나라도 조건에 만족한다면 True
>>> a = arange(10)
>>> np.any(a>5), np.any(a<0)
(True, False)
>>> np.all(a>5), np.all(a<10)
(False,True)
np.where
>>> a = np.array([1,3,0])
>>> np.where(a > 0, 3, 2) #where(condition,True,False)
array([3,3,2])
>>> np.arange(10)
>>> np.where(a>5) #Index 값 반환
array([6,7,8,9])
fancy index : numpy는 array를 index value로 사용해서 값 추출
>>> a = np.array([2,4,6,8], float)
>>> b = np.array([0,0,1,3,2,1], int) #반드시 integer로 선언
>>> a[b] #bracket index, b 배열의 값을 index로 하여 a의 값을 추출
array([2., 2., 4., 8., 6., 4.])
>>> a.take(b) #take 함수: bracket index와 같은 효과
>>> df.sex.unique()
array(['male', 'female'], dtype = object)
>>> df.sex.map({"male" : 0, "female" : 1})
>>> df.sex.replace({"male":0,"female":1})
>>> df.sex.replace(["male","female"],[0,1],inplace=True)
#적용받는 컬럼
>>> df.groupby("Team")["Points"].sum()
#묶음의 기준 #적용받는 연산
>>> df.groupby(["Team","Year"])["Points"].sum() #한 개이상의 컬럼을 묶을 수 있음
>>> h_index.unstack()
벡터
행렬
@
연산을 사용한다. Ex : X @ Y
경사하강법
확률론
이산형
과 연속형
확률변수로 구분통계학
통계적 모델링은 적절한 가정 위에서 확률분포를 추정하는 것이 목표
유한한 개수의 데이터만 관찰해서 모집단의 분포를 정확하게 알 수 없으므로, 근사적으로 확률 분포를 추정한다.
데이터가 특정 확률분포를 따른다고 선험적으로(apriori) 가정한 후 그 분포를 결정하는 모수(parameter)를 추정하는 방법을 모수적(parametric) 방법론이라 합니다.
특정 확률분포를 가정하지 않고 데이터에 따라 모델의 구조 및 모수의 개수가 유연하게 바뀌면 비모수(nonparametric) 방법론이라부릅니다
확률분포 가정하기
최대가능도 추정법
확률분포의 거리
출처 : 네이버 부스트캠프
참고자료 : dive into deeplearning (한국어)