Posts

python standard 라이브러리인 bisect로 이진탐색하기

Leetcode나 TopCoder같은 알고리즘 문제은행 사이트를 돌다보면, 간혹 이진 탐색을 필요로 하는 문제를 마주칠 때가 있습니다. 저는 주 언어로 Python을 사용하기 때문에 보통 python으로 문제를 푸는데요, python solution들을 보면 이진 탐색을 직접 구현해서 문제를 푸는 경우가 매우 많습니다. 그런데 사실, python에는 이미 standard library에 이미 bisect 라는 이진 탐색 라이브러리가 구현이 되어있어서 이진 탐색 알고리즘을 따로 짤 필요가 없습니다. 대부분의 문제은행 사이트들이 custom library 설치를 지원하지 않는다는 점을 고려하면, bisect 라이브러리의 존재는 단비같은 존재라고 할 수 있겠지요. 오늘은 이 bisect 모듈을 이용해서 어떻게 이진 탐색을 할 수 있는지를 한번 알아보도록 하겠습니다. bisect 라이브러리는 이미 정렬된 리스트 에 대해서 적용할 수 있는 이진 탐색 관련 함수들을 제공하는데요, 총 6가지 함수들이 있습니다. bisect. bisect_left (a, x, lo=0, hi=len(a)) 정렬된 리스트 a에서 x보다 크거나 같은 첫 원소의 index를 return합니다. 만일 a의 모든 원소가 x보다 작다면 len(a)를 return합니다. lo, hi 값은 a의 특정 부분만 잘라내기 위한 half-open interval을 지정하는 용도로 쓰입니다. bisect. bisect_right (a, x, lo=0, hi=len(a)) 정렬된 리스트 a에서 x보다 큰 첫 원소의 index를 return합니다. 만일 a의 모든 원소가 x보다 작거나 같다면 len(a)를 return합니다. bisect. bisect (a, x, lo=0, hi=len(a)) bisect.bisect_right의 alias bisect. insort_left (a, x, lo=0, hi=len(a)) a.insert(bisect_left(a, x, lo=0, h

유튜브 추천시스템 논문 리뷰 Part 2 - Deep Neural Networks for YouTube Recommendations (RecSys 2016)

Image
유튜브 추천시스템 논문 리뷰 Part 1 에서는 전통적인 데이터 마이닝을 기반으로 만들어진 2010년 버전의 유튜브 추천시스템을 소개했었습니다. 디버깅이 용이하고 알고리즘 구성도 간단해서 실무적으로 유용할 것 같은 시스템이었죠. 하지만 2010년대 들어서 딥러닝(Deep Learning)이 본격적으로 주목받게 되면서, 유튜브 추천시스템도 딥러닝 기반으로 전환하게 되었습니다. 오늘 리뷰할 논문은 2016년에 RecSys에 제출된 Deep Neural Networks for YouTube Recommendations 라는 논문인데, 구글에서 딥러닝을 사용해서 어떻게 유튜브 추천시스템을 구성했는지를 담고 있습니다. System Overview [그림 1] 유튜브 추천시스템의 전체적인 구성 이 논문에서 소개하는 딥러닝 기반 추천시스템도 기본 구조는 이전에 Part 1 에서 소개되었던 candidate generation -> ranking의 2단계 구조를 따릅니다. Part 1을 안보신 분들을 위해 간략하게 설명드리자면, candidate generation은 유저의 유튜브 활동 정보(이전에 시청했던 영상들의 ID, 검색 기록, 성별/연령/지역 등)를 collaborative filtering으로 분석해서 엄청나게 많은 유튜브 영상들 중에서 해당 유저가 좋아할 것 같은 영상들만  high-precision으로, 대략적으로만  선별해내는 작업을 말합니다. ranking 단계에서는 candidate generation 단계에서 대충 좁혀놓은 비디오들과 유저의 정보들을 좀 더  자세히 들여다보면서  유저의 선호도 점수를 추정하고 선호도 순으로 추천을 하게 되구요. candidate generation 단계를 따로 두는 이유는 ranking의 scalability를 개선하기 위해서입니다. ranking에 사용될 후보 영상들의 개수를 확 줄이지 않으면, 유튜브 정도로 추천 가능한 상품(영상)들이 많은 시스템에서는 계산량이 감당이 안될테니까요. H

[서평] 시장의 마법사들 - 성공 투자를 위한 매매의 심리학

Image
오늘 리뷰할 책은 잭 슈웨거(Jack  D. Schwager)라는 선물 트레이더가 쓴 투자의 고전인 [시장의 마법사들(Market Wizards)]입니다. 이 책은 미국에서는 1989년에 처음 출간되었고, 한국에서는 20년 가까운 세월이 지난 2008년에 번역본이 처음 나왔습니다. 첫 출간 이후 리뷰를 쓰는 2019년 현재 기준으로 딱 30년이 지났으니, 발빠르게 움직이는 투자업계에서는 고전이라고 봐도 무방하겠죠. 사실 저는 이 책의 대부분의 챕터를 스킵하고 매매의 심리학 을 다루는 5부의 내용과, 머리말 & 꼬리말을 중심으로 보았습니다. (책에 대한 광범위한 리뷰를 기대하셨던 분들께는 [뒤로 가기] 버튼 클릭을 추천드립니다) 책이 오래된 탓에 당시 투자자들의 구체적인 경험과 전략들이 현재의 시장 상황에는 맞지 않는 부분이 있을거라고 생각했고, 초보 투자자인 제 입장에서는 30년 전의 상황에 overfitting된 투자 전략을 참고했다가 오히려 나쁜 영향을 받을까봐 좀 걱정되더라구요. 하지만 매매를 하는 사람들의 심리는 1989년이나 2019년이나 크게 변했다고 보기는 어렵다고 생각합니다. 겉으로 보기에는 첨단 기술들이 등장하고 [시장의 마법사]를 포함한 좋은 투자 저서들이 시장에 많이 풀렸지만, 인류라는 종의 심리적인 매커니즘이 근본적으로 진화하기에는 30년이라는 시간은 턱없이 부족하니까요. 그렇기 때문에 5부의 내용에서 제시하는 성공한 트레이더들, 그리고 실패하는 트레이더들이 보이는 심리적 패턴에 대한 분석은 충분히 참고할만하다고 생각했고, 해당 챕터를 위주로 책을 보게 되었습니다. 매매의 심리학 우선 기술적인 트레이딩에서 명심해야 하는 대전제는 일반적으로 자산 가격에는  추세 가 있어서 오르고 있는 자산은 더 오르고, 빠지고 있는 자산은 더 빠지는 경향이 강하다는 것입니다.(물론 timeframe을 어떻게 잡느냐에 따라 좀 달라질 수는 있겠지요) 현대에 소위 모멘텀 투자라고 불리는 기법들이 이런 자산 가격의 추세를 이용하는

[서평] 행운에 속지 마라(Fooled By Randomness) - 노이즈가 넘치는 시장에서 리스크 헷징은 필수!

Image
오늘 리뷰할 책은 2001년에 출간된 니콜라스 탈렙의 [행운에 속지 마라]라는 책입니다. 요즘처럼 갈수록 연봉과 자산 수준의 격차가 벌어지며 승자독식의 경향성이 강해지고 있는 시대에 개인이 어떤 마인드로 투자하고 소신있게 살아가야 할지에 대해 함의하는 바가 큰 책이라고 생각합니다. 구체적인 투자 방법론을 거론하는 경우가 거의 없다는 것이 흠이기는 하지만, 보수적인 투자 스타일을 선호하는 사람이라면 건전한 투자 마인드를 형성하기에도 좋은 책이구요. 저자 소개를 잠깐 하자면, 니콜라스 탈렙은 세상에 대한 특유의 비관주의적이고 신랄한(sarcastic) 관점으로 유명한 미국의 유명한 레바논계 퀀트 트레이더입니다. 실제로 니콜라스 탈렙은 이런 비관주의적 투자 전략으로 1987년에 일어난 블랙 먼데이 당시 엄청난 돈을 벌어들였고 , 2000년의 닷컴 버블과 2007년의 금융위기에도 성공적인 투자를 했다고 합니다 . 아마 수차례의 위기에서 돈을 벌어들였던 이런 탈렙의 경험이 탈렙에게 세상에 대해 회의론적인 관점을 견지하게 한 것으로 보입니다. 탈렙은 [행운에 속지 마라] 이외에도 자신의 경험을 바탕으로 불확실성에 관한 자신만의 철학을 정리하여 [ 블랙 스완(The Black Swan) ]과 [ 안티프래질(Antifragile) ]라는 책들을 썼는데, 이 중에서 2007년에 출판된 [블랙 스완]은 2007년에 마침 터진 서브프라임 모기지발 금융위기를 계기로 주목받으면서 금융투자 뿐만 아니라 사회과학분야 전반에 센세이션을 일으킨 바 있습니다. 니콜라스 탈렙이 이 책에서 전달하는 핵심 메시지는 " 세상은 불확실성으로 가득 차 있으며, 대부분의 좋은 성과는 실력이 아닌 행운 덕분이다 "라는 것입니다. 책의 1부에 실제로 시기를 잘 탄 덕분에 승승장구하던 트레이더들이 특이 사건( 블랙 스완 )이 발생하면서 한순간에 몰락하는 사례들이 다수 등장합니다. "카를로스는 적기에 그 시장을 담당한 덕분에, 시장이 융성하는 모습을 볼 수 있었다 ..

유튜브 추천시스템 논문 리뷰 Part 1 - The Youtube Video Recommendation System (RecSys 2010)

Image
요즘 트렌드를 알고 싶다고 하면 유튜브를 빼놓고는 말하기 어렵습니다. VOD 시장에서 전통적으로 인기있었던 먹방, 겜방, 뷰티 방송이나 연예인 뮤비, 공연 영상 등은 기본이고, 최근에는 정치인들이 유튜브에 채널을 직접 개설하는 일도 늘어나고 있죠. 유튜브에 올라오는 영상들의 양과 종류에는 그야말로 한계가 없습니다. 대도서관이 운영하는 겜방 그렇다면 이렇게 다양한 종류의 콘텐츠가 끊임없이 올라오는 유튜브에서 발생하는 트래픽은 실제로 얼마나 될까요? 앱 분석업체인 WISEAPP에서 분석한 국내 2018년 11월 앱별 사용시간 통계를 한번 살펴보겠습니다. 2018년 11월 안드로이드 앱 총 사용시간 (출처: https://platum.kr/archives/112749) 유튜브의 사용시간은 317억 시간으로 소위 국민 앱이라는 카카오톡과 네이버를 압도합니다. 한국 국민 1명 당 하루 평균 대략 21분 정도 유튜브를 사용하고 있는 셈이죠. 유튜브 천하라는 말이 정말 피부로 와닿네요. 그런데 사람들이 유튜브를 이렇게 많이 쓰는 것은 단순히 유튜브에 재밌는 영상이 많이 올라오기 때문이 아니고, 이 영상들의 홍수 속에서 사용자들의 취향에 딱 맞는 영상을 골라내주기 때문입니다. 필자가 자기계발이나 재테크. 패션 관련 컨텐츠를 좋아해서 그런지 관련 영상이 많이 추천된다.  그렇다면 유튜브는 어떤 방식으로 이 어마어마한 영상들 중에서 사용자가 원하는 영상을 골라내는 걸까요? 심플하게는 Matrix Factorization을 이용한 Collaborative Filtering을 쓸 수 있겠지만, 비디오와 유저 수가 수백만을 가볍게 넘기는 유튜브 정도의 스케일이 되면 다음과 같은 문제들을 풀어야 하기 때문에 그것조차도 간단하지는 않습니다. Distributed Training 하나의 서버에 비디오/유저의 latent vector를 모두 올릴 경우 속도 저하나 메모리 부족 문제가 발생하므로 여러 서버에 추천