python 49

맥주 추천시스템 구현 - 5. CF 기반 추천시스템 구현

🔗아이템 기반 협업필터링(CF) 추천시스템 구현에 사용할 알고리즘은 아이템기반 CF입니다. 협업필터링(CF)은 최근접 이웃 협업필터링과 잠재 요인 협업필터링으로 나뉩니다. 그리고 최근접 이웃 협업필터링은 다시 유저 기반과 아이템 기반으로 나뉩니다. 그 중에서도 아이템 기반을 선택한 이유는 다음과 같습니다. 유저 개인의 취향이 너무 다양하다. 그에 반해 리뷰를 남기는 맥주 수는 한정적이다. 따라서 아이템 기반으로 추천하는 것이 적절하다고 판단했습니다. 🎇데이터 정제하기 수집한 맥주 데이터에는 리뷰가 1개인 맥주들이 있습니다. 리뷰를 남긴 유저들도 마찬가지입니다. 이는 추천시스템의 성능을 저하시킬 수 있으므로 최소 10개 이상의 리뷰를 가진 맥주와 유저들만으로 이루어진 데이터셋을 구성합니다. import p..

맥주 추천시스템 구현 - 4. 클러스터링

📊맥주별 클러스터링 시각화 이번엔 맥주 데이터를 5가지 평가 요소를 기준으로 클러스터링 해보았습니다. 향, 외관, 맛 등의 요소에 따라 서로 다른 군집들이 나타날 것 같았기 때문입니다. 우선 필요한 라이브러리들을 import하고 데이터도 불러오겠습니다. 시각화 라이브러리로는 📊plotly를 사용했습니다. import pandas as pd import numpy as np import plotly.express as px import plotly.graph_objects as go import plotly.io as po from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler, MinMaxScaler impor..

[이진탐색] Binary Search - Python

이진탐색 Binary Search 이진탐색과정 이진 탐색의 경우 정렬된 상태에서 수행해야합니다. 이진탐색의 경우 크기가 절반씩 줄어듦으로 순차탐색보다 빠릅니다. 중간 위치를 찾은 뒤 찾는 값과 비교합니다. 같으면 해당 위치를 return합니다. 찾는 값이 중간 위치보다 작으면 왼쪽에서 이진 탐색을 수행합니다. 찾는 값이 중간 위치보다 크면 오른쪽에서 이진 탐색을 수행합니다. def binary_search(data, var): left=0 right=len(data)-1 while left var: right = mid-1 elif data[mid] < var: left = mid+1 return -1 data = [1, 3, 6, 7, 10, 14, 29, 45] print(binary_search(d..

알고리즘 2020.12.25

[버블 정렬] Bubble Sort - Python

버블 정렬 Bubble Sort 버블 정렬 버블 정렬의 시간복잡도는 Worst case - O(n^2), Best case - O(n^2), Average acse - O(n^2)이다. 인접한 값과 계속 비교해나가며 루프를 1번 수행할때마다 1개의 값이 자리를 찾아간다. 앞의 값이 뒤의 값보다 클 경우 위치를 계속 바꿔나가며 마지막 index에 도달하므로 버블정렬이라 부른다. n개의 원소가 주어졌을 때, n*(n-1)/2만큼의 비교를 진행한다. def bubble_sort(data): # 비교 횟수를 저장할 변수 compare_count = 0 # 총 N(N+1)/2번만큼 계산 for j in range(len(data)-1): for i in range(0, len(data)-1-j): compare_..

알고리즘 2020.12.25

[퀵 정렬] Quick Sort - Python

퀵 정렬 Quick Sort 퀵 정렬 시간복잡도는 Worst 경우 O(n^2), Average : O(nlogn), Best - O(nlogn) pivot을 어떻게 설정하느냐에 따라 성능이 달라질 수 있음 값들이 이미 정렬되어 있는 경우 Worst Case : Random하게 섞어주는 방식 사용 가능 퀵정렬 과정 리스트 개수가 1개일 때 재귀 종료 0번째 값을 pivot으로 설정 pivot보다 작거나 큰 값을 low, high 리스트에 저장 저장한 low, high에 각각 재귀적으로 quick을 적용 최종 low, high, pivot을 병합 def quick(data): # 재귀 함수 종료 조건 if len(data) < 2: return data result = [] # pivot값 설정 pivot ..

알고리즘 2020.12.24

[병합 정렬] Merge Sort - Python

병합 정렬 Merge Sort Merge Sort 시간복잡도는 Worst - O(NlogN), Average - O(NlogN), Best - O(NlogN) Merge Sort의 경우 원래 리스트의 크기만큼의 추가공간이 필요하다. 입력 Data의 크기가 클 경우 Overhead가 증가할 수 있다. Divide & Conquer 단계를 수행하므로 시간 복잡도는 LogN이다. Merge Sort는 3단계로 구성된다. 각 리스트를 절반으로 나누는 Divide 단계 나눠진 리스트를 정렬하는 Conquer 단계 정렬된 리스트를 하나로 합치는 Combine 단계 def merge_sort(data): result = [] # 중간 index 구하기 mid = (len(data))//2 # 재귀 종료 조건 if l..

알고리즘 2020.12.24

[선택정렬, 삽입정렬] - Selection Sort, Insertion Sort (Python)

선택, 삽입 정렬 특정값 index를 찾는 알고리즘 find_index() : List 안에 있는 값을 찾아서 해당 위치를 반환해주는 함수 def find_index(list_, var): res_index = -1 for i in range(len(list_)): if list_[i] == var: res_index = i break return res_index data = [24, 10, 3, 8, 33, 27, 46] print(find_index(data, 8)) Selection Sort 시간복잡도는 Worst - O(N^2), Avgerage - O(N^2), Best - O(N^2) for문을 돌며 가장 작은 값을 찾아 0번째부터 바꿔나간다. for문을 2번 돌아야 한다. i==0부터 li..

알고리즘 2020.12.23

[재귀] Recursion - Python

재귀 사용하기 1. Factorial 구하기 - Factorial(5) = 1*2*3*4*5 - Factorial을 for문과 재귀로 구현 def factorial(n): res = 1 for i in range(1,n+1): res = res*i return res print(factorial(10)) # 재귀로 구현하기 def factorial(n): if n == 1: return 1 else: return n*factorial(n-1) print(factorial(3)) print(factorial(5)) print(factorial(10)) 2. 최대공약수 구하기 - 두 수 a,b 중 작은 것으로 나누어 떨어지면 그 수가 최대공약수 - 나누어 떨어지지 않으면 작은 수를 1씩 감소시킨 값으로 a,..

[파이썬 기초] - List, Set (Python)

파이썬 기초 자료구조와 알고리즘 1. 1부터 n까지의 연속한 숫자의 합을 구하는 알고리즘 방법 1. def sum_n(n): sum = 0 for i in range(1, n+1): sum = sum + i return sum print(sum_n(10)) 방법 2. def sum_n(n): return n*(n+1)/2 print(sum_n(10)) 2. 최대값 구하는 알고리즘 : List 자료구조 - len(a), append(x), insert(i,x), pop(i), clear(), x in a def find_max(list_): max = -2147000000 for data in list_: if max < data: max = data return max list_ = [10, 5, 8, ..