File size: 1,484 Bytes
2e37891
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 객석 수 유사도 함수
def compute_capacity_similarity(cap1, cap2):
    try:
        if cap1 <= 0 or cap2 <= 0:
            return 0.0
        return min(cap1, cap2) / max(cap1, cap2)
    except:
        return 0.0

# 공연장 추천 함수
def recommend_venues(perf_vector, df, weights=[0.5, 0.3, 0.2], alpha=0.7):
    """
    perf_vector: [티켓가, 장르점수, 검색량] 형태의 신규 공연 벡터
    df: 공연장 데이터프레임 (공연장벡터 + 객석 수 포함)
    weights: 각 성분별 가중치
    alpha: 종합 유사도 계산 시 벡터 유사도 비중
    """
    perf_vec = np.array(perf_vector) * np.array(weights)

    # 공연장 벡터 유사도 계산
    df["공연장벡터"] = df["공연장벡터"].apply(lambda x: np.array(x) * np.array(weights))
    df["유사도"] = df["공연장벡터"].apply(lambda v: cosine_similarity([perf_vec], [v])[0][0])

    # 객석 수 유사도 계산
    target_capacity = perf_vector[0] * 200000  # 역정규화된 객석 수 기준 (티켓가 기준과 맞춰짐)
    df["객석수유사도"] = df["객석 수"].apply(lambda c: compute_capacity_similarity(target_capacity, c))

    # 종합 유사도
    df["종합유사도"] = alpha * df["유사도"] + (1 - alpha) * df["객석수유사도"]

    # 정렬 후 반환
    result = df.sort_values("종합유사도", ascending=False).reset_index(drop=True)
    return result