분류 전체보기 310

[Linear Algebra] SVD(Singular Value Decomposition)

기존의 이웃 기반 협업 필터링(Neighbor Based Collaborative Filtering, NBCF)이 가지고 있는 희소성(Sparsity), 확장성(Scalarbility) 문제를 해결하기 위해 모델 기반 협업 필터링(Model Based Collaborative Filtering, MBCF)이 등장했다. MBCF의 종류는 엄청나게 다양하지만 여기서는 행렬 분해(Matrix Factorization) 중 대표적인 기법인 SVD(Singular Value Decomposition)에 대해서만 다룰 것이다. 이전에 다룬 고윳값 분해와는 조금 다른 방식으로 접근한다. SVD는 특이값 분해라고 부른다. SVD는 행렬을 고윳값과 고유벡터가 아닌, 특이벡터(Singular vector)들과 특이값(si..

[Recommender System] UBCF vs IBCF

앞 글에서 이웃 기반 방법론의 수식에 대해서 간략히 설명했다. 이웃 기반 방법론은 사용자 기반 모델, 아이템 기반 모델이 존재하는데 일반적으로 아이템 기반 모델이 성능이 조금 더 좋다고 한다. 왜 그럴까? 총 3가지 이유를 거론할 수 있을 것이다. 1. 시간 복잡도 온라인 쇼핑몰을 보면 실제 사용자 수는 엄청나게 많지만 사용자 수에 비해서 아이템 수는 상대적으로 적은 것이 일반적이다. 우리가 NBCF(Neighbor Based Collaborative Filtering)을 구현할 때를 생각해보자. $n$은 사용자의 수, $m$은 아이템의 수라고 가정하면, 사용자 간의 유사도를 계산하게 되면 사용자($u$)의 이웃의 유사도를 계산하기 위해서는 $n-1$번의 연산이 들어가게 되고, 아이템 간의 유사도를 계산..

[NLP] Stemming and Lemmatization

Stemming은 어간 추출이라 부르고 Lemmatization은 표제어 추출이라 부른다. 이론적인 부분을 조금 더 상세하게 알고 싶다면 여기로 가면 상세하게 작성해두었다. Stemming from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize stemmer = PorterStemmer() sentence = "This was not the map we found in Billy Bones's chest, but an accurate copy, \ complete in all things--names and heights and soundings--with the single exception of the red \ cros..

[NLP] Tokenization

Tokenization. 토큰화라고 불리는 이것은 단어를 작은 단위로 쪼개주는 역할을 한다. 영어를 토큰화 할 때에는 nltk를 사용하고, 한국어를 토큰화 할 때에는 konlpy를 사용한다. from nltk.tokenize import word_tokenize from nltk.tokenize import WordPunctTokenizer from torchtext.data import get_tokenizer sentence = "Don't be fooled by the dark sounding name, \ Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop." print('word_tokenize', word_tokenize(se..

[Recommender System] 이웃 기반 방법론 - Cosine, Pearson

이웃 기반 방법론은 사용자-사용자 간 유사도 혹은 상품-상품 간 유사도를 이용하자는 아이디어에서 시작됐다. 이웃 기반 모델에서는 다음과 같은 두 가지 기본 가정을 설정한다. NBCF(Neighbor Based Collaborative Filtering)라고 불리기도 한다. 1. 사용자 기반 모델 : 유사한 사용자들은 같은 상품에 대해 비슷한 평점을 부여한다. 2. 아이템 기반 모델 : 유사한 상품은 동일한 사용자에세 비슷한 방식으로 평점이 부여된다. 사용자 기반 이웃 모델을 구성하기 위해서는 타깃 사용자($i$)와 유사한 사용자를 찾기 위해서는 다른 모든 사용자와의 유사도를 계산해야한다. 유사도 계산을 수행할 때에는 사용자마다 본인의 기준이 다르기 때문에 평점 스케일이 다를 수 있음을 고려하고 계산을 수..

[Recommender System] context of recommender systems

컨텍스트의 사전적인 정의는 '이벤트를 둘러싸고 적절한 해석을위한 자원을 제공하는 프레임' 이며, 다양한 곳에서 다양한 의미로 쓰인다. 자연어 처리에서는 문장의 문맥을 뜻하고, 추천시스템에서는 시간적, 공간적 컨텍스트를 예로 들 수 있다. 고객에게 제품을 추천해줄 때 여름인데 겨울 패딩을 추천해주는 것보다는 반팔티와 같은 여름의 컨텍스트에 맞는 제품을 추천해주는 것이 구매할 확률이 높기 때문이다. 추천시스템에서는 이와 같이 도메인에 특화된 다양한 문제점들이 있기 때문에 이를 해결함으로써 고객 만족도가 더욱 높아지고, 매출액에 직결될 수 있을 것이다. 시간에 민감한 추천 시스템 : 영화를 추천해줄 때 최근 개봉한 영화를 추천해주는 것과 개봉한지 몇 년이 지난 영화를 추천해주는 것은 큰 차이가 있다. 필연적으..

[Python] logistic regression

로지스틱 회귀는 이진분류에서 사용되는 모델 중 흔히 쓰이는 모델이라고 보면 된다. 이론적인 부분을 공부하고 싶다면 여기를 눌러서 들어가면 볼 수 있다. 나는 임의로 데이터를 생성하여 분석을 진행했기 때문에 모델의 성능이 좋게 나오지는 않았다. 공식 데이터를 가지고 분석을 수행하면 보다 좋은 결과를 도출할 수 있을 것이다. def sigmoid(z): return 1/(1+np.exp(-z)) def f(x, w, b): return np.dot(x, w) + b def df(x, w, b): return x, 1 def binary_cross_entropy(z, t): return -(t*np.log(z) + (1-t)*np.log(1-z)).mean() 분석을 진행하기 앞서 로지스틱의 수식(sigmoi..

Python/Scikit-learn 2022.01.17

[Python] Monte Carlo algorithm

몬테카를로(Monte Carlo) 방법은 원하는 면적을 무한정 찍어서 그 면적을 구한다는 방식이라고 보면 된다. 정사각형 내에 원을 그리고 원의 면적을 구하고 싶다면 랜덤하게 점을 찍고 원 안에 들어간 점의 수와 전체 점을 찍은 수를 가지고 원 면적의 근삿값을 찾을 수 있을 것이다. 여기서는 몬테카를로 샘플링을 이용하여 원주율($pi$)을 근사해볼 생각이다. import matplotlib.pyplot as plt import numpy as np import math import time %matplotlib inline plt.rcParams['axes.unicode_minus'] = False plt.rcParams['font.family'] = 'NanumGothic' plt.rcParams['a..

[Python] numpy - view, copy

파이썬의 리스트의 경우 다른 객체에 할당받은 후 그 객체를 변경해도 변경되지 않지만, 넘파이 array의 경우 view(원본)을 나타내기 때문에 원본이 변경되지 않게 하거나 copy를 해주어야한다. li = [x for x in range(10)] arr_li = li[:] arr_li[0] = 100 print(li) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(arr_li) # [100, 1, 2, 3, 4, 5, 6, 7, 8, 9] 리스트의 경우 위와 같이 객체 0번을 받아서 변경을해도 변경이 되지 않는 것을 확인할 수 있다. 복사본의 경우 변경되어 있는 것이 보인다. arr = np.arange(10) arr_view = arr[:] arr_view[0] = 100 pr..

Python/Numpy 2022.01.14

[Python] 왜 넘파이를 사용해 ?

파이썬에서 벡터와 행렬 간 연산 속도는 엄청나게 느리다. 파이썬의 속도가 느리기 때문에 빠른 계산속도가 필요한 경우 C언어로 패키지를 만들어서 진행한다. 하지만 넘파이의 경우 파이썬의 연산 속도가 느린 부분을 일부 보완해줄 수 있는 엄청나게 좋은 패키지 중 하나이다. import numpy as np import time n = 150 a = np.random.rand(n, n) b = np.random.rand(n, n) c = np.zeros([n,n]) start = time.time() for i in range(n): for j in range(n): for k in range(n): c[i][j] = a[i][k] * b[k][j] print(time.time() - start) # 4.142..

Python/Numpy 2022.01.14
반응형