🖥️ 컴퓨터 싸이언스 10

C | 변수의 할당 위치 (동적할당)

C언어 거의 하지도 않는데 조교 업무 때문에 C언어를 계속 보고 검색하다 보니까 확실히 파이썬과는 다른 재미가 있는 것 같다ㅎㅎ 새내기 때 지금 교수님 같은 분한테 수업을 들었다면 C언어를 지금보다 조금 더 잘하지 않을까 싶은 생각이 들 정도로 교수님도 열정적이시고 그 만큼 학생분들의 질문도 어렵다......ㅎㅎ char *getPI(void){ char PI[20]; strcpy(PI, "3.141592653589"); return PI; } int main(void){ char *pistr; pistr = getPI(); printf("%s\n", pistr); return 0; } 짠! 위의 코드에서는 어떤 문제가 있을까? 위의 코드르 실행해보면 쓰레기값이 출력될 것이다. 왜 그럴까? 바로 [cod..

C | array-to-pointer conversion of function parameter type adjustment (배열과 포인터)

조교 업무를 하다가 처음 알게 된 사실이 있다! C언어에서 일반적으로 배열과 포인터는 동일하다고 설명하고, 나도 지금까지 그냥 배열과 포인터가 동일하다고만 생각하고 있었다. 하지만 배열은 배열이고 포인터는 포인터라는 것..! #include #include #include void fff(int array[]); int main() { int data[5] = { 0, 1, 2, 3, 4 }; printf("%d %d\n", sizeof(data), sizeof(data[0])); fff(data); printf("\n\n"); return 0; } void fff(int array[]) { int temp; int num = sizeof(array) / sizeof(array[0]); printf("%..

C | Call by value와 Call by reference

낯선 듯 친숙한 call by value와 call by reference! 사실 코딩을 배웠다 하면 누구든 한 번은 call by value나 call by reference를 들어봤을 것이다. 요새 하도 파이썬만 봐서 C언어를 거의 까먹는 느낌이라 한 번 정리해보려고 한다! C언어 조교를 같이 하고 있는데 곧 포인터 진도를 나갈 것 같아서 얼른 다시 봐야할 것 같다..ㅎ.. 사실은 이것도 까먹어서 다시 검색해보고 정리하는 중이다...ㅎ 포인터 call by value와 call by reference를 정리하기 전에 [yellow]"포인터"[/yellow] 개념을 알아야한다. C언어에서 변수를 선언할 때 보통 [code] int a = 0; [/code] 이런식으로 작성하는데, 포인터 변수를 선언하기..

딥러닝 | 가중치 초기화? (Weight Initialization)

딥러닝은 손실 함수를 최소화 하는 모델의 파라미터 즉, 모델의 weight 값을 알아내는 것이다. 일반적으로 gradient descent 알고리즘을 사용하는데, gradient descent 알고리즘은 initial point가 꽤나 중요하다. 이번에는 가중치를 초기화 하는 몇 가지 방법에 대해 정리하려 한다. 일단, 만약 표준정규분포(평균 0, 표준편차 1)를 이용해서 랜덤하게 weight를 초기화 하면 어떻게 될까? 레이어를 지날수록 점점 weight 값이 커지고 분산도 커진다. 이는 활성 함수를 통과하면 saturation 될 가능성이 높아지고 학습이 더 이상 진행이 되지 않는다. 그렇다고 평균은 0, 표준 편차가 0.01인 분포를 이용해서 초기화를 하면 어떻게 될까? 레이어를 지날수록 점점 we..

딥러닝 | 정규화? (Batch Normalization, Layer Normalization)

기계학습 살펴보기 할 때, 정규화와 표준화를 잠깐 언급하긴 했는데 이번에 좀 더 자세히 정리하려고 한다. 일단, 우리는 보통 zero-mean, unit-variance를 선호하는데 그 이유가 무엇일까? activation 함수를 생각해보자. 대부분의 활성함수는 0 부근에서 gradient 값을 갖고, 0에서 멀어지면 gradient가 거의 0에 수렴하게 되고 더 이상 학습이 진행되지 않는다. 따라서 우리는 데이터 인풋이 0 근처에 있었으면! 하는 것이다. 그래서 input을 어느정도 normalization 해주자!가 되는 것이다. 배치 정규화 (Batch Normalization) 위에서 언급했듯이, zero-mean, unit-variance를 위해서 아래 수식을 이용한다. (아래에서 소개할 레이어..

기계학습 | 기계학습의 다양한 개념들을 간단하게 살펴보자!

개념을 빠르게 훑어보기 위한 글 2번째... 역시나 뒤죽박죽ㅎㅎ 차원 축소 차원 축소는 고차원 데이터를 저차원 데이터로 변환하는 과정을 말한다. 차원 축소에는 2가지 기법이 존재한다. feature selection은 주요 특성만 골라내는 것으로 불필요한 특성은 제거하고 데이터의 특징을 잘 나타내는 특성만 선택한다. feature extraction은 특성을 조합해서 데이터를 잘 표현할 수 있는 중요한 성분들을 가진 새로운 특성을 추출하는 것이다. 하지만, 기존 특성 값들과 완전히 다른 값을 갖게 되어 추출된 변수의 해석이 어렵다. PCA, t-SNE 등이 여기에 속한다. 차원의 저주 (Curse of Dimensionality) 차원의 저주는 차원이 증가할 수록 다양한 문제가 발생한다는 것인데, 차원이..

수학 | 고윳값 분해(Eigen Decomposition)와 특이값 분해(Singular Value Decomposition)

고윳값 분해와 특이값 분해는 선형대수에서 항상 다루는 내용인데, 이 참에 한 번 정리해보기로 했다. 연구실 대쁘가 많이 도와줬다! 고윳값 분해 (Eigenvalue Decomposition) 고윳값과 고유벡터 고윳값 분해에 대해 소개하기에 앞서 고윳값(eigen value)과 고유벡터(eigen vector)의 의미를 먼저 알아보자. n x n 행렬 A에 대하여, [yellow]$Av = \lambda v$[/yellow] 을 만족하는 0이 아닌 벡터 $v$가 존재한다면 숫자 $\lambda$는 행렬 A의 고윳값이며 $v$는 고윳값 $\lambda$에 해당하는 고유벡터이다. 즉, 기하학적으로 고유벡터 $v$는 행렬 A를 곱했을 때와 곱하기 전의 방향이 바뀌지 않는다는 특징을 가지고 있다. 고윳값 분해 정..

확률 | 확률의 다양한 개념들을 간단하게 살펴보자!

확률과 관련한 이런 저런 개념들을 공부하고 정리하며 쓰는 글! 생각의 흐름과 찾아본 내용을 토대로 쓸 것이라 상당히 두서 없는 글이 될 듯. 신뢰구간 신뢰구간은 주어진 '표본'을 사용하여 구한 구간 안에 실제 '모집단'의 특성치 (여기선 모평균)가 포함될 가능성이 1-$\alpha$ 임을 의미한다. 즉, 신뢰 수준 95%라는 의미는 n개의 표본을 사용하여 신뢰구간을 구하는 과정을 100번 반복했을 때 그 중 95개의 구간이 실제 모수를 포함한다는 의미이다. 모수는 모집단의 파라미터라고 생각하면 된다. (모집단의 평균, 표준 편차 등) - 여기서는 모집단의 평균 위의 그림에서 $\bar{X}_1, \bar{X}_2, \bar{X}_k$는 각 표본을 사용하여 구한 구간 안에 실제 모집단의 특성치가 포함되어 ..

Python3 | 파이썬에서 우선순위큐(heap)를 사용하자 (heapq 사용법)

우선순위큐, 흔히 힙이라고 하는 자료구조도 코딩테스트에서 나름 자주 등장하는 아이들이다. 직접 힙을 만들어서 사용할 수도 있지만 더 많은 시간이 소요되니 파이썬에서 제공해주는 패키지를 활용하자. 파이썬에서 우선순위큐를 이용하기 위해서는 PriorityQueue와 heapq를 사용할 수 있는데 이 포스팅에서는 heapq의 간단한 문법만 기록할 것이다. import heapq q = [] heapq.heappush(q, 1) heapq.heappush(q, 3) heapq.heappush(q, 2) heapq.heappop(q) heapq.heappop(q) heapq.heappop(q) 사용법은 아주 간단하다. 일단 heapq를 import해주고, 리스트를 하나 선언해준다. 그리고 [code]heapq.h..

Python3 | 파이썬에서 큐(queue)를 사용하자 (deque 사용법)

큐와 스택은 자료구조의 기본이라고 볼 수 있는데 파이썬에서는 이를 어떻게 구현하면 좋을까! 사실 파이썬은 워낙 리스트와 인덱싱이 편리하게 되어 있어서 리스트만으로도 구현할 수는 있다. lst.pop(0)# 가장 왼쪽의 요소를 꺼내준다. (queue에서의 dequeue) lst.pop()# 가장 오른쪽의 요소를 꺼내준다. (stack에서의 pop) 하지만 위처럼 구현했을 때 가장 큰 문제점은 너무 느리다는 것이다. 그래서 효율성 검사 같이 시간제한이 있는 문제에서는 일반적으로 list와 pop 조합 대신에 deque를 사용한다. from collections import deque 사실 deque 사용법은 엄청 간단하다. list와 큰 차이가 없다! from collections import deque q..