Jekyll2020-02-28T11:11:44+00:00https://socc-io.github.io/atom.xmlSOCC Tech Blog개발자 동아리 SOCC의 활동 내역을 기록하는 블로그 입니다.{"name"=>nil, "picture"=>nil, "email"=>nil, "twitter"=>nil, "links"=>[{"title"=>nil, "url"=>nil, "icon"=>nil}]}Recommendation System의 기초2020-02-14T00:00:00+00:002020-02-28T19:25:52+00:00https://socc-io.github.io/docs/recommendation/Recommendation%EC%9D%98%20%EA%B8%B0%EC%B4%88.md<p>추천 시스템에 대한 기초 내용에 대해 공부해 보자.</p>
<h1 id="추천-시스템의-종류">추천 시스템의 종류</h1>
<p>추천 시스템은 크게, Content based method, Colaborative filtering method, hybrid method로 나뉜다.</p>
<p><img src="../../images/recommendation_graph.png" alt="Recommendation-Graph" /></p>
<p><strong>Content based 방법</strong>은 서로 비슷한 아이템들을 사용자에게 추천하는 방식을 말한다.
예를 들어 헐크라는 영화와, 어벤져스 영화는 서로 히어로 영화이고, 등장인물이 비슷하기 때문에, 비슷한 영화라고 볼 수 있다. 따라서 헐크 영화를 좋아하는 사용자가 있다면, 어벤져스 영화도 좋아할 것이라고 생각하고 추천하는 방식이다.</p>
<p><strong>Colaborative filtering 방법</strong>은 서로 취향이 비슷한 사용자에게 다른 사용자가 선택했던 아이템을 추천 하는 방식이다. 만약 A라는 사용자와, B라는 사용자가 좋아한 영화목록이 비슷하다면, A 사용자가 높은 평점을 준 영화를 B 사용자가 아직 보지 않았다면, B라는 사용자에게 그 영화를 추천해 주는 방식이다.</p>
<p><strong>Hybrid method</strong>는 Content based method, Colaborative filtering 방법 둘다 섞어서 적용한 추천 방식이다.</p>
<blockquote>
<h2 id="1-협업-필터링-collaborative-filtering-방식">1. 협업 필터링 (Collaborative filtering) 방식</h2>
<p>협업 필터링 방식에서는 사용자별 아이템 선호도를 나타내는 2차원의 행렬을 데이터로써 사용한다.<br />
2차원 행렬의 row는 사용자, col은 아이템으로 나타낸다. (혹은 그 반대로)<br />
예를 들어 2차원 행렬의 a 번째 row의 b번째 col에 있는 element값은 a 사용자가 b 아이템에 대한 선호도를 나타낸다.<br />
모든 사용자가, 모든 아이템에 대한 선호도를 표기할 수는 없기 때문에 (사용자가 존재하는 모든 아이템을 사보고 리뷰할 수는 없기 때문에) 2차원 행렬은 아래 그림과 같이 대부분의 element가 비어있는 <strong>sparse matrix</strong>로 표현된다.<br />
<img src="../../images/Sparse_Matrix.png" alt="Sparse_matrix" /><br />
이 <strong>sparse matrix</strong>에서 각각의 사용자, 혹은 아이템들의 유사도를 측정하고, 그 유사도를 기반으로 추천을 하게 된다.<br />
협업 필터링 방식은 다른 방식과 다르게, 아이템과, 유저에 대한 정보가 필요가 없으며 오직 아이템과 사용자간의 상호 작용 데이터만 필요하다.</p>
</blockquote>
<blockquote>
<h3 id="1-1-유사도-측정-기준">1-1 유사도 측정 기준</h3>
<p>협업 필터링에서는 아이템들간의 유사도를 측정하는 <strong>item-to-item</strong> 방식, 유저들간의 유사도를 측정하는 <strong>user-to-user</strong> 방식이 있다.</p>
<blockquote>
<h3 id="1-1-1-item-to-item">1-1-1 Item to item</h3>
<p>Item-to-item 방식에서는 유저와 아이템간의 선호도를 나타내는 행렬에서 여러 유저들의 선호도를 기반으로 어떠한 아이템들이 서로 유사한지 계산한다.
이 방식과 content based method가 다른 점은, content based method는 아이템의 내용을 기반으로 유사도를 측정하는 반면, item-to-item colaborative filtering은 사용자들의 선호도 데이터만 이용하여, 아이템 간의 유사도를 측정한다. (만약 두가지 방법 모두 사용하여 유사도를 측정한다면, hybrid method가 된다.)
사용자가 A라는 아이템을 좋아한다고 판단이 되면, 유사도 측정을 통해 아이템 A와 가장 비슷한 아이템을 고르고 사용자에게 추천하게 된다.</p>
<h3 id="1-1-2-user-to-user">1-1-2 User to user</h3>
<p>User-to-user 방식에서는 유저와 아이템간의 선호도를 나타내는 행렬에서 여러 유저들의 선호도를 기반으로 어떠한 유저들이 서로 유사한지 계산한다.
A라는 사용자와, B라는 사용자가 서로 좋아하는 영화 목록이 비슷하다면, A 사용자가 본 영화들을 B 사용자에게 추천하는 방식이다.</p>
</blockquote>
</blockquote>
<blockquote>
<h2 id="1-2-유사도를-구하는-방식">1-2 유사도를 구하는 방식</h2>
<p>협업 필터링 방식에서 유사도를 구하는 방식은 크게 2가지로 나뉜다.</p>
<blockquote>
<h3 id="1-2-1-model-방식">1-2-1 Model 방식</h3>
<p>Model 방식은 주어진 데이터셋을 기반으로 학습한 모델을 사용하여(parameter를 학습하여) 추천을 하는 방식이다. Model 방식은 아이템과, 사용자간의 상호작용을 나타내는 2차원의 행렬에서 비어있는 element들을 학습된 모델을 통해 채워넣는 방식으로 추천하는 방식을 사용한다.</p>
<h3 id="1-2-2-memory-based-방식">1-2-2 Memory based 방식</h3>
<p>memory based 방식은 주어진 데이터에 바로 계산되어 나온 결과를 기반으로 추천을 하는 방식이다.<br />
memory based 방식은 수식을 통해 예측값을 구하게 된다. memory based 방식에서 대표적으로 사용되는 방식은 cosine 유사도나, pearson 상관관계도이다. 이러한 수식으로 유사한 사용자들을 찾아내고, 유사한 사용자가 선택한 아이템을 추천하는 방식을 사용한다.</p>
<h3 id="-cosine-유사도란">* cosine 유사도란</h3>
<p><img src="../../images/cosine_similarity.png" alt="cosine_similarity" /><br />
cosine 유사도를 구하는 수식<br />
각각 비교할 데이터를 벡터로 표현하고, 내적값을 이용하여 두개의 벡터 사이의 각도가 작으면 작을 수록 벡터의 방향이 비슷하다는 점을 활용하여, 유사도를 구하는 방식이다.</p>
<h3 id="-pearson-유사도란">* pearson 유사도란</h3>
<p><img src="../../images/pearson_correlation.png" alt="pearson_correlation" /><br />
두 변수의 상관관계를 구하는 pearson correlation 공식이다.</p>
</blockquote>
</blockquote>
<blockquote>
<h2 id="2-content-based-methods">2. Content based methods</h2>
<p>Content based method는 추천하고자 하는 아이템들의 특징을 분석하여, <strong>아이템간 유사도</strong>를 계산하여 사용자에게 추천하는 방식이다.<br />
사용자가 이전에 좋아한 아이템과 최대한 비슷한 아이템을 찾아서 추천하며, 아이템의 특징을 뽑아내기 위해, Doc2vec기법을 사용하여 텍스트 데이터 feature vector를 뽑아내거나, 이미지 기반의 데이터를 feature vector로 뽑아내어, vector간의 유사도를 측정하여 아이템 유사도를 계산한다.<br />
Content based method는 협업 필터링 기법과 다르게 Cold starting 문제에 대해 비교적 자유롭다.<br />
새로운 아이템에 대하여 feature vector를 뽑아내는 방식은 기존 데이터셋과 관련이 없기 때문이다. 하지만 한번 사용자가 특정 아이템에 대한 추천을 받게 되면, 그 뒤로 계속 비슷한 아이템만 추천 받게 된다는 문제점이 있다.</p>
</blockquote>
<p>다음 포스팅에서는 어떻게 머신러닝 기법을 Collaborative filtering에 적용하는 지 알아보도록 하자.</p>
<h2 id="references">References</h2>
<p><a href="https://towardsdatascience.com/various-implementations-of-collaborative-filtering-100385c6dfe0">Various Implementations of Collaborative Filtering</a><br />
<a href="https://towardsdatascience.com/introduction-to-recommender-systems-6c66cf15ada">Introduction to recommender systems</a></p>{"name"=>nil, "picture"=>nil, "email"=>nil, "twitter"=>nil, "links"=>[{"title"=>nil, "url"=>nil, "icon"=>nil}]}추천 시스템에 대한 기초 내용에 대해 공부해 보자.SOCC Tech Blog 사용법2020-02-02T00:00:00+00:002020-02-02T19:25:52+00:00https://socc-io.github.io/docs/jekyll/Blog-Manual<p>Jekyll로 운영 되는 github io 홈페이지에 포스팅을 올리는 방법에 대해 알아봅니다.</p>
<h2 id="git-repository-clone-하기">Git Repository Clone 하기</h2>
<p>일반적인 블로그에서 글을 쓰는 것과 달리, github page는 git repository에 블로그 내용을 작성하고, 커밋한 뒤, push하는 방식으로 글을 작성할 수 있습니다. 따라서, 먼저 github 페이지 repository를 자신의 local 컴퓨터에 clone 합니다.</p>
<h2 id="github-page를-자신의-컴퓨터로-호스팅-해보기">Github page를 자신의 컴퓨터로 호스팅 해보기</h2>
<p>현재 블로그는 github에서 제공하는 서버에서 호스팅을 해 주고 있습니다. 하지만 저희가 블로그 글을 작성하고 수정할때, 글이 잘 작성되었는지 확인을 할때는 자신의 컴퓨터로 간단하게 localhost에 블로그를 띄운 뒤, 제대로 작성되었는지 확인하는 것이 더 편리합니다. 확인을 한 후 push 를 통해 github 서버로 호스팅 하는 방식이 좋습니다.</p>
<p>따라서 아래 방식을 통해 자신의 컴퓨터로 hosting을 직접 해 봅니다.</p>
<h3 id="_configyml-파일을-수정합니다">_config.yml 파일을 수정합니다.</h3>
<p>remote_theme 부분을 주석 처리하고, theme 부분에 주석 처리를 해제하여, local 모드로 바꿉니다.</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">theme</span><span class="pi">:</span> <span class="s">jekyll-theme-so-simple</span>
<span class="c1"># remote_theme: mmistakes/so-simple-theme</span>
</code></pre></div></div>
<h3 id="bundle-명령어로-모듈들을-다운받습니다">bundle 명령어로 모듈들을 다운받습니다.</h3>
<p>bundle 명령어는 ruby로 되어있는 패키지들을 다운받는 명령어 입니다.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">install</span>
</code></pre></div></div>
<h3 id="jekyll-명령어를-통해-local-컴퓨터에-웹페이지를-호스팅-합니다">jekyll 명령어를 통해 local 컴퓨터에 웹페이지를 호스팅 합니다.</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jekyll serve
</code></pre></div></div>
<h3 id="웹브라우저에서-웹-페이지가-잘-떴는지-확인합니다">웹브라우저에서 웹 페이지가 잘 떴는지 확인합니다.</h3>
<p>localhost:4000에 들어가서 화면이 잘 나오는지 확인 합니다.</p>
<h3 id="새로운-글을-작성합니다">새로운 글을 작성합니다.</h3>
<p>저희 동아리가 github io page를 블로그로 사용하는 이유는 markdown 형식으로 글을 작성할 수 있기 때문입니다.
markdown은 코드나, 수식 등 여러가지 형태의 글을 작성할때 비교적 간편하게 작성할 수 있습니다.
markdown 파일의 확장자는 .md 이며, 저희는 이제 글을 작성할 때 .md 확장자를 가진 파일을 작성하면 됩니다.
블로그에 글을 작성하기 위해서 웹페이지 구조를 다 이해할 필요가 없으며, 저희가 글을 쓰기 위해 알아야 할 부분은 _posts 폴더입니다.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> "docs/_posts"
</code></pre></div></div>
<p>다음의 경로로 들어가면 md 확장자를 가진 post들이 존재합니다. 글의 여기에 새로운 md 확장자의 글을 추가하게 되면, 자동적으로 블로그에 새로운 글이 추가가 됩니다. 또한 post 파일 윗부분에는 title, category, tag를 설정할 수 있으며, 이것을 기반으로 post들을 블로그에서 구분할 수 있습니다.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>title: "SOCC Tech Blog 사용법"
categories:
- Jekyll
tags:
- Jekyll
- blog
last_modified_at: 2020-02-02T14:25:52-05:00
</code></pre></div></div>
<p>블로그의 글을 수정한 뒤에 호스팅 된 페이지를 껏다가 jekyll serve로 다시 홈페이지를 띄워야 업데이트 됩니다. (분명 node.js의 nodemon 처럼 실시간 업데이트를 적용해 주는 방식이 있을 것 같은데 저는 잘 모르겠네요…)</p>
<h3 id="작성한-글을-저장하고-localhost에-띄워서-글이-제대로-적혀-있는지-확인-합니다">작성한 글을 저장하고 localhost에 띄워서 글이 제대로 적혀 있는지 확인 합니다.</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jekyll serve
</code></pre></div></div>
<h3 id="제대로-된것을-확인-했다면-이제-github-server에-제대로-호스팅이-될-수-있도록-_configyml을-수정합니다">제대로 된것을 확인 했다면 이제 github server에 제대로 호스팅이 될 수 있도록 _config.yml을 수정합니다.</h3>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># theme: jekyll-theme-so-simple</span>
<span class="na">remote_theme</span><span class="pi">:</span> <span class="s">mmistakes/so-simple-theme</span>
</code></pre></div></div>
<h3 id="커밋-후-push-합니다">커밋 후 push 합니다.</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nb">.</span>
git commit <span class="nt">-m</span> <span class="s2">"add post"</span>
git push origin master
</code></pre></div></div>
<p>push 이후에는 github server에서 자동적으로 호스팅을 해줍니다.
커밋 오른쪽에 초록색 체크가 뜨면 제대로 페이지가 빌드 되었다는 것을 확인 할 수 있습니다.
만약에 빨간색으로 x자가 써져 있다면, 빌드가 되지 않았다는 뜻이고, local 에서 빌드가 되는지 확인을 해봐야 합니다.</p>{"name"=>nil, "picture"=>nil, "email"=>nil, "twitter"=>nil, "links"=>[{"title"=>nil, "url"=>nil, "icon"=>nil}]}Jekyll로 운영 되는 github io 홈페이지에 포스팅을 올리는 방법에 대해 알아봅니다.