문제 후기

  1. 문제를 보고 DFS나 BFS로 풀어야되는 것을 파악했다. 먼저 DFS로 풀어봤다.
  2. 처음에 DFS로 풀면서 set을 활용해서 했다. 칸을 넘어갈때마다 set에 add, remove를 하면서 하니 시간초과가 발생했다. -> 그래서 메모이제이션으로 각 알파벳의 활용 여부를 1, 0으로 나타내야했다.
  3. BFS로 풀어볼때는 deque를 활용해서 풀려고 했다. deque를 활용하니 이번에는 메모리초과....... 확인해보니 2가지 경우가 동시에 같은 칸으로 가는 경우가 있고 알파벳 역시 동일한 경우였다. 혼자 해결을 하지 못해 찾아보니 deque가 아닌 set을 활용....😥 BFS를 할 때 항상 deque만 활용하던 것이 잘못된 것이었다. 다음부터는 확실하게 이해하고 어떤 것을 써야할지 생각하자.

문제링크

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net


from sys import stdin
from _collections import deque

dy = [1, 0, -1, 0]
dx = [0, 1, 0, -1]

# dfs로 풀 경우 메모이제이션으로 각 알파벳 visit 체크해야함.
def dfs(y, x, ans):
    global answer, chk

    answer = max(ans, answer)

    for i in range(4):
        ny, nx = y + dy[i], x + dx[i]
        if 0 <= ny < R and 0 <= nx < C:
            # print(ny, nx, matrix[ny][nx], chk)
            if matrix[ny][nx] not in chk:
                chk.add(matrix[ny][nx])
                dfs(ny, nx, ans+1)
                chk.remove(matrix[ny][nx])

# bfs로 풀 경우 deque로 할 경우 중복되는 경우 때문에 메모리 초과 발생. set으로 해결해야함.
def bfs(y, x, chk):

    answer = 1
    queue = set([(y, x, chk)])

    while queue:
        ay, ax, chk_val = queue.pop()
        answer = max(answer, len(chk_val))

        for i in range(4):
            ny, nx = ay + dy[i], ax + dx[i]
            if 0 <= ny < R and 0 <= nx < C and matrix[ny][nx] not in chk_val:
                queue.add((ny, nx, chk_val + matrix[ny][nx]))
    
    return answer

R, C = map(int, stdin.readline().split())

matrix = [list(map(str, input())) for _ in range(R)]
chk = matrix[0][0]

print(bfs(0,0,chk))

'백준' 카테고리의 다른 글

[백준] 지구 온난화 -Python  (0) 2021.02.18
[백준] N-Queen -Python  (0) 2021.01.24
[백준] DFS와 BFS -Python  (0) 2021.01.20
[백준] 줄 세우기 -Python  (0) 2021.01.18
[백준] 가장 긴 바이토닉 부분 수열 -Python  (0) 2021.01.18

문제리뷰

  1. 한번만 상하좌우를 계산하여 지우면 되는 간단한 문제이다. 주의해야할 점으로는 입력값을 matrix로 구현한 다음 deepcopy를 써야하는 것인데 2차원배열부터는 copy나 [:]로 복사가 안되기 때문이다.
  2. dy와 dx를 통해 상하좌우를 검색하고 범위를 넘어가는 경우도 바다로 처리하기 때문에 이것도 처리해야한다.
  3. 이후 바다만 있는 row와 column을 빼고 print하면 끝이 난다.

문제링크

 

5212번: 지구 온난화

첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.

www.acmicpc.net


from sys import stdin
import copy

R, C = map(int, stdin.readline().split())

matrix = [list(input()) for _ in range(R)]
result = copy.deepcopy(matrix)

dy = [-1,0,1,0]
dx = [0,-1,0,1]

for y in range(R):
    for x in range(C):
        count = 0
        if matrix[y][x] == '.':
            continue

        for i in range(4):

            ny = y + dy[i]
            nx = x + dx[i]

            if 0 <= ny < R and 0 <= nx < C:
                if matrix[ny][nx] == '.':
                    count += 1
            else:
                count += 1
        if count >= 3:
            result[y][x] = '.'

start_y, end_y = 0, 0
for i in range(R):
    if 'X' in result[i]:

        start_y = i
        break
for i in range(R-1, -1,-1):
    if 'X' in result[i]:       
        end_y = i
        break

tmp = []
for j in range(C):
    for i in range(start_y, end_y + 1):
    
        if 'X' == result[i][j]:
            tmp.append(j)
            break


for y in range(start_y, end_y+1):
    print("".join(result[y][tmp[0]:tmp[-1]+1]))

'백준' 카테고리의 다른 글

[백준] 알파벳 -Python  (0) 2021.03.01
[백준] N-Queen -Python  (0) 2021.01.24
[백준] DFS와 BFS -Python  (0) 2021.01.20
[백준] 줄 세우기 -Python  (0) 2021.01.18
[백준] 가장 긴 바이토닉 부분 수열 -Python  (0) 2021.01.18

글을 시작하며

정신없이 지나간 3주를 다시 생각해보면서 초심으로 돌아가고자 작성합니다!!!

 

 

전체적인 일정

매일 특정 강의가 오픈이 되고 오전에는 강의를 듣고 오후에 동료들과 진행하는 피어세션 시간 이후 개인 자습과 학습정리로 진행됐다.

중간중간에 부스트캠프 측에서 열리는 이벤트시간이나 피어세션을 제외하고는 모든 일정은 자율적이며 밥먹는 시간도 따로 있지는 않았다.

하루의 마지막으로는 하루동안 공부한 내용을 개인 블로그나 노션 같은 곳에 정리하는 형식으로 하루를 마무리한다.

 

수업진행

부스트캠프의 수업은 동영상을 시청하는 방식으로 진행됐는데 처음에는 현강? 라이브강의가 아니라서 실망한 느낌이 컸다... 아무리 네이버에서 진행하는거지만 현강이 아니네.. 그냥 학원느낌이려나 라는 기분?

 

그런데 이런 생각은 정말 3일만에 갈아엎어지고 이러한 시스템에 감사하게 됐다ㅋㅋㅋㅋㅋㅋ

하루에 정해진 강의를 한번에 소화할 수 있을꺼라 자만한 내 자신에 부끄러워지는..

 

동영상으로 강의가 진행되다 보니 모르는 내용이 나오면 다시 돌려보기도 하고 구글링해서 모르는 부분을 다시 공부하기도 하고 학습정리할때 다시한번 찾아보기도 하고... 정말 계속 돌려본다ㅋㅋㅋㅋㅋ

수업 내용이 다 알려주려고 하기 보다는 주요 내용을 알려주고 해당 내용으로 더 공부하게 해줘서 더 좋은 것 같다!

 

피어세션

부스트캠프에서 만들어주신 조로 팀원들을 만나게 됐다

처음에는 정말 어색하고 말도 없고.. 그러다가 이제는 서로 농담도 하고 취미생활도 이야기하고ㅋㅋㅋ 매일 만나다보니 친해진 것 같다. 팀원분들 성격이 너무너무 좋아서 정말 만족하고 있다

 

각 조마다 규칙을 정해서 자율적으로 진행하는데 우리조는 전날 공부한 내용에서 질문 + 다른 조원이 알면 좋은 부분을 올려 서로 지식을 공유하는 방식이다. 내용을 공유하다가 중간에 다같이 모르는 부분이 있으면 조교님에게 질문하기도 했다. 또 공유하는 내용이 단순히 휘발성으로 사라지는 것을 방지하기 위해서 팀원들과 노션으로 기록하기로 했다! 처음 접해보는 노션.. 상당히 좋은 것 같다ㅋㅋㅋ

 

다른 팀과 거의 비슷한 것 같지만 우리조는 착하고 배려많으신 조교님을 만나 매주 특정 시간에 조교님과 함께 추가 스터디 시간을 가지면서 팀원들끼리 해결하지 못한 내용?이 있으면 조교님이 알려주셨다. 정말 감사합니당😅😅

 

학습정리

하루 마무리하면서 학습정리를 하는데 나는 이 블로그에 계속 남길 생각이었다. 하지만 바로 여기에 올리기에는 뭔가 정확하지 않은 내용?이 많이 들어갈 것 같은 기분이었다. 팀원분들이 노션으로 하길래 나도 노션으로 시작했다. 단순히 필기하는 내용은 노션으로 작성하고 복습하는 기분으로 이 블로그에 올리기로 결심했다!

구경하고 싶으신 분들은 [인공지능 공부/이론 및 파이썬]으로 ㅎㅎ

 

 

 

[이론 및 파이썬] 확률 및 통계 용어 정리(1)

글을 시작하며 부스트캠프 수업을 들으면서 확률 관련 용어에 대한 개념이 부족해 글을 작성했습니다.😥 수업에 열심히 따라가자..! 글의 순서는 다음과 같습니다 확률변수 이산형 확률변수와

hwanii-with.tistory.com

 

학습정리한 내용은 매일 url을 올리는 형식으로 내가 작성한 내용은 다른 캠퍼분들이 볼 수 있고, 다른 캠퍼분들이 작성한 내용도 내가 볼 수 있다. 다른 캠퍼분들이 작성한 내용을 보면서 내가 정리한 것은 정리가 아니라는 것을 깨닫느...😅

 

보고 배워야지..ㅋㅋㅋㅋ

 

개인적인 느낌

스스로 느끼는 것은 정말 똑똑한 분들이 많다는 것! 그리고 나는 아직도 배울 것이 많다는 것이다내가 알고 있었다는 부분도 얕은 지식이었다는 점과 그 부분을 더 깊게 알려고 하는 노력과 왜?라는 질문을 생각하고 혼자 해결하다 안되면 물어보는 것이 좋은 해결방법이라는 것도 다시 깨닫고 있다ㅎㅎ

 

또 다른 것은 학교를 다니면서 나는 코딩을 할꺼야! 라는 생각으로 학교를 다니고 수학(신시....정보통신수학..)은 많이 안볼꺼라는 생각이었는데 이번 수업으로 그 시절 공부했던 내용을 활용하는 것을 보고는 아 괜히 공부하던 것이 아니구나라는 것을 깨닫는다ㅋㅋㅋㅋㅋ 이번 쉬는 주 동안 그동안 배웠던 것 다시한번 공부해야지....

 

아직 3주밖에 안지났지만 매일 쉴틈없이 공부하는 이 기분은 좋으면서도 힘들다ㅋㅋㅋㅋ 정말 배우고 싶던 내용이라 기분이 좋지만 몸과 뇌가 힘들어하는?😐

 

 

이제 본격적으로 실습과 수업이 시작하는데 남은 기간 계속 화이팅하자!!(다른 부스트캠퍼 분들도 화이팅!!🥰🥰🥰)

 

 

문제 리뷰

  1. 작년 카카오 코테를 보면서 스스로 많이 부족하다는 것을 알았습니다... 그동안 혼자서 공부하면서 어느정도 실력이 늘었다고 생각을 했고 옛날에 못풀었던 문제를 다시 풀었습니다.
  2. 최소비용을 찾는 문제인 것을 다익스트라를 활용해야겠다고 생각했습니다.
  3. 같이 어디까지 가는지 고민하다가, 모든 노드를 같이 갔을 때 가장 최소인 비용을 찾으면 되겠다고 생각하고 찾았습니다.
  4. 문제에 효율성도 있는 것으 봐서는 우선순위 큐를 활용한 다익스트라아니면 안될 것(?) 같습니다!

문제링크

 

코딩테스트 연습 - 합승 택시 요금

6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4

programmers.co.kr

 

 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com


import heapq

# 다익스트라
def dijkstra(node_dict, n, start, end):
    # 우선순위 queue 활용.
    heap = [(0, start)]
    # 거리 저장.
    dp = [1e9 for _ in range(n + 1)]
    dp[start] = 0

    # heap이 있을때
    while heap:
        # 우선순위가 높은 것 먼저 처리
        weight, now = heapq.heappop(heap)
        # 만약 이미 저장된 거리가 더 작은 경우 패스
        if dp[now] < weight:
            continue
        # 해당 노드에서 이어지는 간선확인
        for node, w in node_dict[now]:
            # 만약 지금 거리 + 다음 거리가 저장된 거리보다 작은 경우
            if dp[node] > weight + w:
                heapq.heappush(heap, (weight + w, node))
                dp[node] = weight + w
    return dp[end]

def solution(n, s, a, b, fares):

    answer = 1e9
    # 모든 노드 hash화
    node_dict = {i:[] for i in range(n+1)}
    # matrix를 hash로 변환
    for start, end, weight in fares:
        node_dict[start].append((end, weight))
        node_dict[end].append((start,weight))

    # 같이 택시타는 곳(모든 곳을 탐색)
    for i in range(1,n+1):
        
        if i == s:
            answer = min(answer, dijkstra(node_dict, n, s, a) + dijkstra(node_dict, n, s, b))

        elif i == a:
            dis_a = dijkstra(node_dict, n, s, a)
            if dis_a < answer:
                answer = min(answer, dis_a + dijkstra(node_dict, n, a, b))

        elif i == b:
            dis_b = dijkstra(node_dict, n, s, b)
            if dis_b < answer:
                answer = min(answer, dis_b + dijkstra(node_dict, n, b, a))
                
        else:
            dis_i = dijkstra(node_dict, n, s, i)
            if dis_i < answer:
                answer = min(answer, dis_i
                         + dijkstra(node_dict, n, i, a) + dijkstra(node_dict, n, i, b))

    return answer

글을 시작하며

이전에 작성한 Numpy에 이어서 작성하는 글입니다. 이전 글을 보고 싶으신 분은 아래 링크를 눌러 확인해주세요😁

2021/02/07 - [인공지능 공부/이론 및 파이썬] - [이론 및 파이썬] Numpy(1)

 

[이론 및 파이썬] Numpy(1)

글을 시작하며 부스트캠프에서 수업을 한 Numpy부분을 정리하고 공부하기 위해서 작성합니당 계속 하는데 잘 까먹는다...하면서 글을 시작!😂 Numpy란? Numerical Python 파이썬의 고성능 과학 계산용

hwanii-with.tistory.com

 

Operation Function

sum : ndarray의 element들 간의 합을 구함

axis : 모든 operation function을 실행할 때 기준이 되는 dimension 축

mean & std : ndarray의 element들 간의 평균 또는 표준 편차를 반환

그 외에도 다양한 수학 연산자를 제공함.

concatenate : numpy array를 합치는(붙이는 함수)

 

np.newaxis 하면 축이 하나 추가가 됨.

import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([5,6])
b = b[np.newaxis, :]
b
# array([[5, 6]])
np.concatenate((a,b.T), axis=1) # T는 transpose
# array([[1, 2, 5],
#       [3, 4, 6]])

 

Array Operations

array간의 기본적인 사칙 연산을 지원함.

S

Element-wise operations

  • Array간 shape이 같을 때 일어나는 연산.

Dot product

  • Matrix의 기본 연산, dot 함수 사용. 
  • 2dimension에서 내적

 

broadcasing : Shape이 다른 배열 간 연산을 지원하는 기능

 

Scaler - vector 외에도 vector- matrix 간의 연산도 지원

 

Numpy와 for loop 속도차이

  • 일반적으로 속도는 다음과 같다.
  • for loop < list comprehension < numpy
  • 100,000,000 번의 loop이 돌 때, 약 4배 이상의 성능 차이를 보임
  • Numpy는 C로 구현되어 있어, 성능을 확보하는 대신 파이썬의 가장 큰 특징인 dynamic typing을 포기함
  • 대용량 계산에서는 가장 흔히 사용됨
  • Concatenate처럼 계산이 아닌, 할당에서는 연산 속도의 이점이 없음.
def sclar_vector_product(scalar, vector):
	result = []
	for value in vector:
		result.append(scalar * value)
	return result


iternation_max = 100000000
vector = list(range(iternation_max))
scalar = 2

%timeit sclar_vector_product(scalar, vector) # for loop을 이용한 성능
%timeit [scalar * value for value in range(iternation_max)]
# list comprehension을 이용한 성능
%timeit np.arange(iternation_max) * scalar # numpy를 이용한 성능

# 21.9 s ± 927 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 16.6 s ± 104 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 450 ms ± 46.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

 

Comparision

All & any

import numpy as np

a = np.arange(10)
a < 4
#array([ True,  True,  True,  True, False, False, False, False, False,False])

np.any(a>5), np.any(a<0)
# (True, False)
np.all(a>5), np.all(a < 10)
# (False, True)

 

numpy는 배열의 크기가 동일 할 때 element간 비교의 결과를 Boolean type으로 반환

test_a = np.array([1, 3, 0], float)
test_b = np.array([5, 2, 1], float)

test_a > test_b
# array([False,  True, False])

 

np.where

a = np.arange(10)
np.where(a > 5, 3, 2)  # where(condition, TRUE, FALSE)
# array([2, 2, 2, 2, 2, 2, 3, 3, 3, 3])
np.where(a > 5) # 인덱스 값이 나옴
# (array([6, 7, 8, 9], dtype=int64),) 

a = np.array([1, np.NaN, np.Inf], float)
np.isnan(a) # 메모리의 값이 존재하지 않는 경우
# array([False,  True, False])
np.isfinite(a) # 한정되지 않는 값.
# array([ True, False, False])

 

argmax & argmin

a = np.array([1, 2, 4, 5, 8, 78, 23, 3])
a.argsort()
# array(0,1,7,2,3,4,6,5])
a.argsort()[::-1]
# array([5, 6, 4, 3, 2, 7, 1, 0], dtype=int64)

np.argmax(a), np.argmin(a)
# (5, 0)

a = np.array([[1, 2, 4, 7], [9, 88, 6, 45], [9, 76, 3, 4]])
np.argmax(a, axis=1), np.argmin(a, axis=0)
# (array([3, 1, 1], dtype=int64), array([0, 0, 2, 2], dtype=int64))

 

boolean index

test_array = np.array([1, 4, 0, 2, 3, 8, 9, 7], float)
test_array > 3
# array([False,  True, False, False, False,  True,  True,  True])
test_array[test_array > 3]
# array([4., 8., 9., 7.])

 

fancy index

a = np.array([2, 4, 6, 8], float)
b = np.array([0,0,1,3,2,1],int)

a[b]

a.take(b)  # take 함수: bracket index와 같은 효과
# array([2., 2., 4., 8., 6., 4.])

boolean index는 원래 index의 shape이 같아야하지만 fancy index는 같을 필요는 없음. 하지만 index범위 안에 있어야함.

 

numpy data i/o

  • text type의 데이터를 읽고, 저장하는 기능
a = np.loadtxt("./poppulations.txt",delimiter="\t")

a_int = a.astype(int)

np.savetxt('int_data.csv', a)int, delimiter=",")

주로 npy파일로 저장함.

pandas 연습하기 좋은 자료 링크

 

Pandas Exercises, Practice, Solution - w3resource

Pandas Exercises, Practice, Solution: pandas is a Python package providing fast, flexible, and expressive data structures designed to make working with relational or labeled data both easy and intuitive.

www.w3resource.com

 

Excellent Pandas Exercise to Learn Pandas | Data Science and Machine Learning

Excellent Pandas Exercise to Learn Pandas.

www.kaggle.com

 

guipsamora/pandas_exercises

Practice your pandas skills! Contribute to guipsamora/pandas_exercises development by creating an account on GitHub.

github.com

pandas 공부에 도움되는 책

  • 머신러닝 탐구생활
 

머신러닝 탐구생활 : 네이버 책검색

'머신러닝 탐구생활'의 네이버 책검색 결과입니다.

m.search.naver.com

  • 파이썬 라이브러리를 활용한 데이터 분석
 

파이썬 라이브러리 : 네이버 책검색

'파이썬 라이브러리'의 네이버 책검색 결과입니다.

m.search.naver.com

 

글을 시작하며

부스트캠프에서 수업을 한 Numpy부분을 정리하고 공부하기 위해서 작성합니당

계속 하는데 잘 까먹는다...하면서 글을 시작!😂

 

Numpy란?

  • Numerical Python
  • 파이썬의 고성능 과학 계산용 패키지
  • Matrix와 Vector와 같은 Array 연산의 사실상의 표준
  • 한글로 넘파이로 주로 통칭
  • 일반 List에 비해 빠르고, 메모리 효율적
  • 반복문 없이 데이터 배열에 대한 처리를 지원함
  • 선형대수와 관련된 다양한 기능을 제공함
  • c, c++, 포트란 등의 언어와 통합가능

ndarray

import numpy as np

test_array = np.array([1, 4, 5, 8], float)
print(test_array)
type(test_array[3])

# [1. 4. 5. 8.]
# numpy.float64
  • numpy는 np.array 함수를 활용 배열을 생성함. → ndarray(객체)
  • numpy는 하나의 데이터 type만 배열에 넣을 수 있음.
  • List와 가장 큰 차이점 → dynamic typing not supported
  • C의 Array를 사용하여 배열을 생성함.
  • numpy array는 차례대로 값이 저장되는 반면 파이썬의 List는 값의 주소값을 List에 넣어서 2번 들어가는 방식이다.(-5 ~ 256은 고정 주소값)
  • 타입도 일정하기 때문에 메모리도 효율적이다.
test_array = np.array([1, 4, 5, "8"], float) # String Type의 데이터를 입력해도

print(test_array)
print(type(test_array[3])) # Float Type으로 자동 형변환을 실시
print(test_array.dtype) # Array(배열) 전체의 데이터 Type을 반환함
print(test_array.shape) # Array(배열) 의 shape을 반환함
print(test_array.nbytes) # ndarry object의 메모리 크기를 반환함.

# [1. 4. 5. 8.]
# <class 'numpy.float64'>
# float64
# (4,)
# 32  -> float64는 8bytes 이므로  4 * 8 = 32

 

numpy Rank

 

Hadling Shape

reshape : Array의 shape의 크기를 변경함, element의 갯수는 동일

  • reshape에서 (-1, n) 하면 n으로 지정하고 나머지 사이즈에 맞춰서 넣어진다.
  • ex : (2,4)를 reshape(-1,2) 하면 reshape(4,2)와 같다.

flatten : 다차원 array를 1차원 array로 변환.

ravel : 다차원 array를 1차원 array로 변환.

a = np.array([[1,2,3,4],[5,6,7,8]])

a1 = a.flatten()
a2 = a.ravel()
a3 = a.reshape(-1)

# array([1, 2, 3, 4, 5, 6, 7, 8])
# array([1, 2, 3, 4, 5, 6, 7, 8])
# array([1, 2, 3, 4, 5, 6, 7, 8])

a[0][0] = 100
a

# array([[100,   2,   3,   4],
#       [  5,   6,   7,   8]])

a1
# array([1, 2, 3, 4, 5, 6, 7, 8])
a2
# array([100,   2,   3,   4,   5,   6,   7,   8])
a3
# array([100,   2,   3,   4,   5,   6,   7,   8])

 

위에서 보이는 것처럼 reshape과 flatten, reval로 1차원으로 만들 수 있습니다. 각각의 함수에 차이점이 있다면 아래와 같습니다.

numpy.ravel() numpy.reshape() numpy.ndarray.flatten()
1차원배열(contiguous flattened array)반환 데이터 변경 없이 형상만 변경하여 반환 1차원배열 복사본을 반환
원본 값 변경시 같이 변함 원본 값 변경시 같이 변함 원본 값 변경시 변하지 않음.

Indexing & Slicing

index : List와 달리 이차원 배열에서 [0,0]표기법을 제공함.

  • matrix 일 경우 앞은 row, 뒤는 column을 의미함.

slicing : List와 달리 행과 열 부분을 나눠서 slicing이 가능함.

  • matrix의 부분 집합을 추출할 때 유용함.
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)

a[:,2:] # 전체 Row의 2열 이상
a[1,1:3] # 1 Row의 1열 ~ 2열
a[1:3] # 1 Row ~ 2Row의 전체

Create Function

arange : array의 범위를 지정하여, 값의 list를 생성하는 명령어

np.array(30) # List의 range와 같음.
np.arange(0,5,0.5)  # (시작, 끝, step
np.arrange(30).reshpae(5,6)

zeros : 0으로 가득찬 ndarray 생성 np.zeros(shape, dtype, order)

ones : 1로 가득찬 ndarray 생성

empty : shape만 주어지고 비어있는 ndarray 생성 (memory initialization이 되지 않음)

something_list : 기존 ndarray의 shape 크기 만큼 1, 0 또는 empty array를 반환

identity : 단위행렬(i행렬)을 생성함.

eye : 대각선이 1인 행렬, k값의 시작 index의 변경이 가능.

diag : 대각 행렬의 값을 추출함.

random sampling : 데이터 분포에 따른 sampling으로 array를 생성 (시작, 끝, 개수)

글을 시작하며

부스트캠프 수업을 들으면서 확률 관련 용어에 대한 개념이 부족해 글을 작성했습니다.😥

수업에 열심히 따라가자..!

글의 순서는 다음과 같습니다

  1. 확률변수
  2. 이산형 확률변수와 이산형 확률 분포
  3. 연속형 확률변수와 연속형 확룔 분포

확률변수

표본공간과 확률변수 이야기 전에 확률실험과 표본공간에 대해서 이야기 하겠습니다.

  • 확률 실험 : 같은 조건 하에서 실험을 반복할 때, 그 결과가 예측 불가능한 실험
  • 표본 공간 : 확률 실험의 모든 가능한 결과들의 집합.

통계 이론에서 확률실험은 중요한 용어입니다. 확률실험은 예를 들어 주사위 던지기부터 시작해서, 모든 일상생활을 확률실험이라고 할 수 있습니다. 여기서 표본 공간은 확률 실험의 모든 가능한 결과들의 집합입니다.

그러면 본격적으로 표본공간과 확률변수를 이야기하겠습니다.

 

확률변수(Random Variable)

발생 가능한 모든 경우에 대해서 각각의 실숫값을 대입해주는 하나의 함수입니다.

표본공간의 각 원소 하나하나에 원하는 목적에 따라 그에 걸맞은 실수를 대입해주는 함수입니다.

확률변수는 변수의 척도(이산형, 연속형)에 따라 2가지로 나뉩니다.

 

이산형 확률변수와 연속형 확률변수

이산형 확률 변수(Discrete random variable)

  • 어떤 값을 가질 확률을 계산하는 확률변수
  • 확률 변수 X가 가질 수 있는 값이 유한이거나 셀 수 있는 경우
  • 예를 들어 동전 던지기나 주사위 던지기 등 계수 자료에 해당

연속형 확률변수(Continuous Random Variable)

  • 어떤 구간 내에 포함될 확률을 계산하는 확률변수
  • 데이터 공간에 정의된 확률변수의 밀도(density) 위에서의 적분을 통해 모델링.
  • 확률변수 x의 범위는 -무한부터 +무한까지.

 

지금까지 헷갈렸던 것은 확률변수와 확률 분포다.

이산형 확률변수와 연속형 확률변수는 모두 확률변수로 위에서 언급한 대로 변수의 척도에 따라서 나눈 것이다. 확률 변수는 위의 식들에서 모두 X이다.

 

확률 분포를 이제 설명하겠습니다.

 

확률 분포

  • 확률 변수가 특정한 값을 가질 확률을 나타내는 함수.
  • 예를 들어, 주사위를 던졌을 때 나오는 눈에 대한 확률변수가 있을 때, 그 변수의 확률분포는 이산형 확률 분포다.
  • 확률 변수가 어떤 종류의 값을 가지는가에 따라서 이산 확률 분포와 연속 확률 분포 중 하나에 속함.

 

이산형 확률 분포

  • 이산형 확률변수가 가지고 있는 확률의 구조를 의미.
  • 다른 말로는 확률질량함수(Probablity Maxx Function, pmf)라고 함.
  • 확률 질량 함수 : 이산 확률 변수에서 특정 값에 대한 확률을 나타내는 함수.
  • 대표적인 예로는 이산균등분포, 푸아송 분포, 베르누이 분포, 이항 분포 등이 있다.

동전으로 예를 들면 다음과 같다.

 

연속형 확률 분포

  • 확률 밀도 함수를 이용해 분포를 표현할 수있는 경우
  • 만일 모든 실수 x(즉, -무한부터 +무한까지)에 대해 음이 아닌 함수 f가 존재하여, 임의의 실수의 집합 B에 대해 다음을 만족하면 X를 만족하면., X를 연속형 확률변수라 함.
  • 대표적인 예료는 정규 분포, 연속균등분포, 카이제곱 분포 등이 있다.

 

그렇다면 확률 밀도 함수는 무엇인가?

 

확률 밀도 함수(probability density function)는 확률 변수의 분포를 나타내는 함수입니다.

확률 밀도 함수를 적분한 값이 확률로 확률 밀도 함수 자체가 확률이 아닙니다.

연속형 확률 변수가 어떤 특정 값을 가질 수 있는 확률이 0이라는 것도 정의에 따라서 풀면 다음과 같습니다.

여기서 delta x를 0으로 수렴하게 되므로 적분값이 0이 됩니다. 따라서 연속형 확률변수 X가 어떤 특정 값을 가질 수 있는 확률은 0입니다.

 

다시 한번 정의를 해보면 확률 밀도 함수 f(x)와 구간[a,b]에 대해서 확률 변수 X가 구간에 포함될 확률 P(a<=X<=b)는 아래와 같습니다.

 

왜 확률 질량 함수, 확률 밀도 함수라는 붙은걸까?

이산확률변수의 확률분포를 나타내는 것이 확률질량함수고, 연속확률변수의 확률을 결정하는 함수는 확률밀도함수라고 위에서 설명했었다. 그런데 여기서 왜 '질량'이란 단어와 '밀도'라는 단어가 쓰이게 되었을까?

 

우선 확률밀도함수 f(x)의 구간 x1에서 x2의 정적분을 생각해보자.

여기서 좌변은 [확률]이다. 그리고 우변에서 는 [구간길이]다. 그러면 의 단위는 [확률/구간길이]를 의미한다고 볼 수 있다. 왜냐하면 [확률/구간길이] x [구간길이] = [확률]이기 때문이다. 확률을 일종의 양(질량)으로 보고, 구간길이를 일종의 부피로 본다면, [확률/구간길이]는 [질량/부피]가 되므로 '밀도'를 의미하게 된다. 밀도는 단위 부피당 질량이기 때문이다. 따라서 는 '확률밀도함수'가 되는 것이다.

 

반면 이산확률변수 X의 경우 공식1과 같이 X의 값에 따라 각각 확률(질량)을 나타낼 수 있으므로, 를 확률질량함수라고 부르는 것이다.

 

참고 사이트

 

확률질량함수와 확률밀도함수 (왜 질량과 밀도??)

확률질량함수 확률질량함수(probability mass function, PMF)는 이산확률변수의 확률분포를 나타내는 함수이다. 즉, 확률변수가 취할 수 있는 값이 유한개이거나 자연수와 같이 셀 수 있는 이산확률변

bskyvision.com

 

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

Story 7.1 [연속형] 연속형확률변수

이 전 포스트까진 이산형 확률변수의 개념, 이산형 확률분포의 평균과 분산의 정의, 이산형 확률분포의 종...

blog.naver.com

 

 

확률 분포 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

+ Recent posts