게시물 전체
-
인공지능 분과 활동
Optimizer - cold
파라미터와 손실함수 AI 학습이란, 인간에서 각 신경의 예민한 정도를 조절하는 과정에 비유할 수 있다.정확히는 신경망에서 주어진 데이터에 대해 어떤 정답을 내놓을지 결정하는 수많은 "파라미터"를 조정하는 과정이 AI 학습이다. 어떤 모델이 얼마나 학습을 했냐는 지표로 손실함수의 값을 사용한다. 모델은 이 손실함수 값이 최소화되도록 파라미터를 조정한다. 손실함수가 어떤 볼록한 함수라고 생각하면, 함수의 가장 깊은 골짜기로 이동하도록 파라미터를 점차 조정해나갈 수 있다.이 방법이 경사하강법이다. 경사하강법을 포함한 파라미터 최적화 기법을 옵티마이저라고 칭한다. 이번 글에서는 경사하강법과, 모멘텀, 그를 개선한 SGD, Adagrad, RMSprop 등을 소개해 볼 것이다. 경사하강법(GD) 이 식을 통해 ..
-
파이썬 공공공
Cis-AB형의 유전 시뮬레이션 [Python]
Cis-AB형이란?ABO식 혈액형은 세개의 대립유전자 A, B, O에 대한 복대립 유전이다. 당연히 정상적인 경우에 세개의 유전자가 같은 염색체 위에 있을 일은 없다. 하지만 Cis-AB형은 A,B 형을 나타내는 대립유전자가 같은 염색체 위에 존재하는 돌연변이다. Cis-AB형 유전자를 가진 사람은 먼저, A,B 유전자가 둘다 있고, 상동염색체에 있는 다른 유전자까지 고려하여 우열 관계에 맞게 표현형을 나타낸다. 예를 들면 Cis-AB/O 형인 사람은 AB형, Cis-AB/A인 사람은 AB형이다. 위와 같은 규칙으로 사람의 ABO식 혈액형 유전을 시뮬레이션하였다. 사실 Cis-AB형이 아니더라도 정상 혈액형을 가진 집단에 대해서도 유전을 시뮬레이션 할 수 있게 구현하였다.시뮬레이션 코드 구현먼저 라이브러..
-
파이썬 공공공
RSA 알고리즘 뚫기 [Python]
도입 - RSA의 등장 배경RSA란 1977년 리베스트(R), 샤미르(S), 애들먼(A) 이 개발한 공개키 암호 알고리즘이다. 공개키 암호란 암호를 만들거나 푸는데 사용하는 "키" 의 일부를 공개하는 방법이다.간단히 좀더 자세하게 설명해보겠다. 먼저 가장 간단한 암호체계를 소개한다. 알파벳을 몇개씩 밀어서 암호를 만드는 방법(카이사르 암호)은 들어본 적, 혹은 간단히 떠올려본 적 있을것이다. "good" 이라는 단어에서 알파벳을 하나씩 뒤로 밀면 "hppe"가 된다. 이 암호 체계의 본 상황에서는 "한"칸씩 알파벳을 밀었기에 키 k=1이라고 할 수 있다. 알파벳을 A부터 Z까지 0~25에 대응시킨다면 평문 P를 암호문 C로 바꾸는 상황(암호화), 암호문 C를 평문 P로 바꾸는 상황(복호화) 는 아래와 같..
-
인공지능 분과 활동
인공지능 사용분야
현재 인공지능은 많은 연구를 통해 폭발적으로 성능이 향상되며 많은 분야에서 사용되고 있다. 이 글에서는 이러한 인공지능의 사용 분야와 사용되는 인공지능 기술을 정리한다. AI타임스의 기사를 참고하여 작성하였다. [https://www.aitimes.com/news/articleView.html?idxno=144027 ] 1. 자율 주행 기술자율주행 차량은 많은 센서와 카메라를 이용해 차량을 제어하며 주행하는 임무를 수행한다. 사물을 인식하는 과정에서 CNN(합성곱 신경망)을 사용한 이미지 분석이 포함된다.또한 자율주행 차량은 인식한 교통상황에 대응하는 방법을 학습하고 실시간 의사 결정을 내리면서 지속적으로 개선된다. 이러한 과정을 자율 주행 모델은 시뮬레이션 상에서 강화학습을 이용해 학습하게 된다. 테..
-
백준 문제풀이
BOJ 5615 아파트 임대[C++]
먼저 문제에서 주어진 식을 변형해야 한다. 아파트의 면적을 n이라 놓으면 2xy + x + y = n. 양변에 2를 곱하고 1을 더하면 4xy + 2x + 2y + 1 = 2n + 1. 좌변을 인수분해하면 (2x + 1)(2y + 1) = 2n + 1. 문제에서는 불가능한 아파트 면적을 찾는 것이다. x,y의 조건에서 2x+1, 2y+1모두 3이상의 홀수이고 이때 가능한 2n + 1 값은 3이상의 홀수 두개로 소인수분해된다. 즉 불가능한 2n + 1값은 3이상의 홀수 두개로 소인수분해 되지 않는 수인데, 2x + 1 과 2y + 1은 짝수가 나올 수 없으므로 둘 중 하나가 3보다 작은 홀수, 즉 1이다. 따라서 2n +1 의 값이 1 x (1이 아닌 홀수) 로만 인수분해 할 수 있는 수 즉 소수가 될때,..
-
백준 문제풀이
BOJ 3665 최종 순위 [C++]
위상정렬 문제이다. 하지만 문제에서 주어진 입력에서 각 팀 사이의 관계를 추출하는 것이 어려웠다. #include using namespace std; int main() { int tt; cin >> tt; for (int ttt = 0; ttt > n; vector same(n + 1,true); vector next[501], pre(n + 1), temp; map rank,high,low; for (int i = 0; i > buf1; temp.push_back(buf1); rank[buf1] = i + 1; low[buf1] = i + 1; high[buf1] = i + 1; } cin >> ..
-
백준 문제풀이
BOJ 16566 카드 게임 [C++]
규칙이 길고 복잡해 보이지만, 사실 별거 없는 문제다. 규칙에서 문제 풀이에 필요한 정보만 추출해내면, 철수는 1~N까지 숫자가 적힌 카드중 아무거나 낼 수 있다. 민수는 철수의 카드보다 큰 숫자가 적힌 카드를 내야한다. 문제 입력은 첫째줄에 n, m(민수 카드 개수), k(철수가 내는 카드 개수)가 주어지고 둘째줄에 민수의 카드, 셋째줄에 철수의 카드가 주어진다. 출력은 철수의 각각 카드에 대한 것이므로 k개 줄에 걸친다. 민수의 카드중 철수의 특정 카드보다 큰 카드를 파악하기 위해서는 먼저 민수 카드의 배열을 정렬해야한다. 그리고 철수 카드보다 큰 카드의 위치를 알려줄 것인데, 이때는 앞에서부터 차례대로 탐색하는 방법이 있지만 이는 시간복잡도가 최대 O(M)에 달할 수 있어 비효율적이다. 따라서 이분..
-
백준 문제풀이
BOJ 9328 열쇠 [C++]
또한 빡센 구현, 시뮬레이션 문제이다. 요즘 문제가 어려워질수록 구현 자체의 난이도도 높아지는 듯 하다. 이 문제는 특히 문자를 사용해서 손도 대기 꺼리게 만드는 것 같다. 먼저 시간복잡도는 고려하지 않아도 된다. 완전탐색도 아니고 문제 사이즈도 작은데다, bfs자체가 그리 오래걸리지 않는다. 아래 코드로 8ms 소비하여 AC를 받았다. 문제는 먼저 건물 지도를 입력받는다. 입력받을 때 문이 있다면, 그 문의 좌표를 문의 종류에 맞는 doors라는 벡터에 삽입해준다. 상근이에게 처음 주어진 열쇠는 종류에 맞는 문이 존재한다면 그 문을 모두 연다. 당장 문에 도달하지 못한다고 해도 추후에 그 문에 도달하면 문을 열 것이므로 그냥 다 연다. 여기서 효율성을 좀더 높이려면 열린 문은 벡터에서 빼버려도 된다. ..
-
백준 문제풀이
BOJ 17387 선분 교차 2 [C++]
까다롭고 복잡한 문제다. 그리고 문제를 푸는 핵심 개념이 ccw라는 것인데 함수에 이런 값을 넣으면 이렇게 튀어나오는구나 정도만 이해했지 공식 내용은 이해하지 못했다. 그래서 선형대수학 공부를 좀 하려한다. 아무튼 ccw함수는 (2차원이라 가정) 세점 p1, p2, p3를 입력받으면 p1, p2, p3로 가는 경로가 시계방향이면 -1, 반시계는 1, 직선이면 0 을 반환하는 함수다. 이것을 4번하고 곱하고 비교해서 두 직선이 평행하지 않을때 교차 여부는 입력된 4개의 좌표의 값들을 ccw만 돌리고 직접 대소비교하지 않고도 쉽게 판단할 수 있다. 하지만 평행할때는 좀 까다롭다. 내가 놓쳐서 헤맸던 가장 큰 것이 입력시 x1 < x2, x3 < x4, y1 < y2, y3 < y4가 보장되지 않는다는 것이다..
-
백준 문제풀이
BOJ 1918 후위 표기식 [C++]
고생 많이 한 문제였다. 먼저 처음 접하는 내용이라 문제 자체가 직관적으로 와닿지가 않았다. 그래서 작게 분해해서 풀기로 했다. 알고리즘 분류는 스택이라 되어있는데 재귀함수를 사용했다. 뭐 재귀함수도 결국 스택이니까. 수학에서 연산자 우선순위는 () > */ > +-순서이다. proc 함수 내부에서 이 세 연산자를 순서대로 처리하도록 하고 괄호의 경우 괄호 내부의 식을 다시 proc 함수의 파라미터로 전달해 재귀호출하였다. 괄호 안에 괄호가 또 있고 짝이 맞지 않는 닫힘괄호에 의해 잘못된 ss값을 구하는 것을 방지하기 위해 스택과 비슷한 원리로 열림 괄호는 n++, 닫힘괄호는 n--를 해주었다. 그리고 괄호를 처리하여 각각의 문자열을 문자열 벡터 vec에 넣어주었다. vec의 각 값은 문자 하나가 될 수..
-
백준 문제풀이
BOJ 9663 N-queen [C++]
처음 글을 써본다. 브루트포스 알고리즘. 무식하게 푼다는 뜻이다. 근데 정말 무식하게 풀어서 이문제를 3시간 걸렸다. 먼저 체스를 해본적이 없어서 퀸이 어떻게 움직이는지 알아봤다. 무식하게 순서만 다른 같은 경우의 수를 확인을 못했다. 그리고 또 무식하게 O(n^2)짜리를 재귀함수 안에 넣었다. 이 문제는 위에서 한 행씩 내려가면서 퀸을 놓을 위치 한개씩을 선택하면 된다. 그 과정에서 두 대각선 방향과 이미 방문된 열인지 체크해주면 된다. 이 과정을 좀 쉽게 하기 위해 수학을 곁들이면 좌표평면에서 x,y절편이 같도록 기울기가 -1인 직선을 그으면 그 직선 위 모든 좌표의 x,y좌표의 합은 일정하다. 이 원리를 적용해 대각선 방문 여부를 쉽게 저장할 수 있다. 아래는 시행착오가 담긴 무식한 코드 + 디버깅..