프로젝트 폴더에서 즉, .git이 존재하는 폴더에 .gitignore 파일를 만듭니다.

vi .gitignore -> 'i' 입력 -> push를 원하지않는 파일 입력 -> :wq를 눌러 나가기

# .idea
*.idea

# .ipynb_checkpoints
*.ipynb_checkpoints

# etc.
*.jar
*.war
.DS_Store
file.xml

위처럼 *.확장자명을 입력하면, 해당 확장자명을 가진 파일을 push하지 않습니다.

후에 아래처럼 다시 commit합니다.

git rm -r --cached .
git add .
git commit -m "git add ignore"
git push (origin master)

 

다음 사이트를 통해 자동으로 위 내용을 생성할 수 있습니다.

www.toptal.com/developers/gitignore

https://hwiyong.tistory.com/27

 

posterior과 bayesian

논문을 읽다보면 확률 모델에 대한 이야기가 많이 나옵니다. 사실상 이해를 못한 채 넘어가는 부분이 많은데, 검색을 통해서 공부하고 또 공부한 내용을 한번 적어보도록 하겠습니다. 대표적으�

hwiyong.tistory.com


위 글에서 사전확률과 사후확률을 충분히 설명했습니다.

사전확률은 내가 알고있는 지식으로부터 얻어진 특정 사건의 확률

사후확률은 특정 사건이 일어났을 때, 어떤 원인때문이다 라고 생각되는 확률입니다.

 

베이즈 정리의 대표적인 수식은 다음과 같습니다.

 위 수식은 두 가지 사건이 존재할때 성립하고, 그보다 더 많은 사건이 존재할 때는 다음과 같이 표현할 수 있습니다.

간단한 예를 들어서 베이즈 정리를 사용해보겠습니다.

우리는 지금 세 개의 상자를 가지고 있고, 각 상자는 흰돌과 검은돌을 아래 표처럼 가지고 있습니다.

상자 흰돌의 개수 검은돌의 개수
A 3 6
B 1 9
C 3 3

위 표를 통해 알 수 있는 것은 세 개의 상자 중 하나를 선택하는 확률이 1/3 이라는 것과 상자에서 검은돌과 흰돌이 뽑힐 확률을 알 수 있습니다.

예를 들어 A 상자에서 흰돌을 뽑을 확률은 3/9입니다. 또, 이를 P(흰돌|A) 이라고 표현할 수 있습니다.
위에서 알 수 있는 강조된 확률은 정확히 사전확률에 해당합니다.

그래서 우리가 알고 싶은 것은 '흰돌을 뽑았는데, 이 흰돌이 A 상자로부터 나올 확률은 무엇인가?' 입니다.
이 확률은 굉장히 알기 어렵습니다. 하지만 우리가 알고있는 사전확률과 베이즈 정리을 사용하면 구할 수 있을 것입니다.
위 문제는 다음과 같이 표현합니다. P(A|흰돌)

베이즈 정리를 사용하면 다음 수식으로 P(A|흰돌)를 구할 수 있습니다.

직접 확률을 대입해보면 다음과 같습니다.

 

DataFrame과 같은 테이블을 결합할 때, pd.concat 함수를 사용해서 축 방향으로 결합할 수도 있지만,

이 방법외에도 결합을 위해 자주 사용하는 방법은 pd.merge 함수를 활용하는 것입니다.

간단한 예제를 통해 네 가지의 Join 방법을 살펴봅니다.

  • Inner Join
  • Outer Join
  • Left Join
  • Right Join

먼저 테이블은 다음과 같이 정의합니다.

import pandas as pd

A = pd.DataFrame({'ID' : [1, 2, 3], 
                  '이름' : ['김우주', '오수아', '박새로이']})
B = pd.DataFrame({'ID' : [2, 3, 4], '주소' : ['서울', '장가', '이태원']})

 

Inner Join

Inner Join은 두 테이블의 키가 일치하는 데이터만 추출해서 반환합니다. 우리는 'ID'를 키로 활용할 것입니다.
두 테이블에서 일치하는 아이디는 [2, 3]이기 때문에, 2행을 가지는 테이블을 만들 수 있습니다.

pd.merge(A, B, on = 'ID', how = 'inner')

Outer Join

Outer Join은 키를 기준으로 두 테이블에 존재하는 모든 데이터를 활용해서 결합하는 방법입니다. 따라서 A 테이블에서는 ID=4가 없으므로 NaN 값으로 채워질 것이고, B 테이블에서는 ID=1이 없으므로 NaN 값으로 채워질 것입니다.
쉽게 생각하면 조건은 잘 모르겠고, Null 값으로 채워서라도 다 사용하겠다~ 라는 의미입니다.

pd.merge(A, B, on = 'ID', how = 'outer')

 

Left Join

Left Join은 left에 위치하는 테이블의 키만 사용하여 데이터를 반환합니다. A 테이블이 보유하고 있는 키를 right 테이블은 B가 보유하고 있지 않으면 무시됩니다. 밑의 결과에서 ID=4가 반환되지 않는 것을 볼 수 있습니다.

pd.merge(left = A, right = B, on = 'ID', how = 'left')

 

Right Join

Right JoinLeft Join의 반대입니다. B 테이블의 키만 반환합니다.

pd.merge(left = A, right = B, on = 'ID', how = 'right')

Convolution 구현해보기

먼저, 3x3 필터를 정의합니다. 어디선가 많이 보셨을 법한 필터입니다.(가로선을 검출하는)

filter = [[-1, 0, 1], 
        [-2, 0, 2], 
        [-1, 0, 1]]

 

벡터화(Vectorization)을 수행하지 않는 컨볼루션의 구현은 매우 간단합니다. for-loop 2개로 구현할 수 있습니다.

컨볼루션은 이미지의 영역과 컨볼루션 필터를 element-wise 곱한 뒤, 전부 합칩니다. 다음 코드를 보면 알 수 있습니다.
패딩을 사용하지 않기 때문에 시작 지점은 이미지의 (1, 1) 좌표입니다.

x_shape = img.shape[0]
y_shape = img.shape[1]

for x in range(1,x_shape-1):
  for y in range(1,y_shape-1):
      convolution = 0.0
      convolution = convolution + (img[x - 1, y-1] * filter[0][0])
      convolution = convolution + (img[x, y-1] * filter[0][1])
      convolution = convolution + (img[x + 1, y-1] * filter[0][2])
      convolution = convolution + (img[x-1, y] * filter[1][0])
      convolution = convolution + (img[x, y] * filter[1][1])
      convolution = convolution + (img[x+1, y] * filter[1][2])
      convolution = convolution + (img[x-1, y+1] * filter[2][0])
      convolution = convolution + (img[x, y+1] * filter[2][1])
      convolution = convolution + (img[x+1, y+1] * filter[2][2])

      if(convolution < 0):
        convolution = 0
      elif(convolution > 255):
        convolution = 255
  • x_shape와 y_shape는 이미지의 크기를 나타냅니다.
  • for-loop 끝의 if문은 이미지 값의 범위 0 ~ 255를 위해 사용합니다.
  • 아래 테이블에서 위의 코드를 좀 더 편하게 볼 수 있습니다.
img[x-1, y-1] * filter[0][0] img[x, y-1] * filter[0][1] img[x+1, y-1] * filter[0][2]
img[x-1, y] * filter[1][0] img[x, y] * filter[1][1] img[x+1, y] * filter[1][2]
img[x-1, y+1] * filter[2][0] img[x, y+1] * filter[2][1] img[x+1, y+1] * filter[2][2]

 

MaxPooling 구현해보기

흔히 사용하는 (2,2)의 MaxPooling을 구현해보도록 합니다.

new_x_shape = int(x_shape / 2)
new_y_shape = int(y_shape / 2)

# 풀링이 적용될 이미지를 만듭니다.
pooled_img = np.zeros((new_x_shape, new_y_shape))

# 2는 stride를 나타냅니다.
for x in range(0, x_shape, 2):
	for y in range(0, y_shape, 2):
    	pixels = []
        pixels.append(img[x, y])
        pixels.append(img[x + 1, y])
        pixels.append(img[x, y + 1])
        pixels.append(img[x + 1, y + 1])
        # 최댓값만 저장합니다.
        pooled_img[int(x/2), int(y/2)] = max(pixels)
img[x, y] img[x + 1, y]
img[x, y + 1] img[x + 1, y + 1]

 

 

os.rename()을 사용한다.

import os

os.rename('./test.txt', './rename.txt')