과거 데이터의 synopsis_numpy_scale열 값인 리스트가 문자열형태로 되어있어서 이것을 파이썬의 리스트로 변환
# past_data['synopsis_numpy_scale']는 데이터프레임 열 중 하나로, 각 행에는 Python의 리스트 형태로 저장되어 있음
# 데이터프레임에서 synopsis_numpy_scale 열의 값을 파싱하여 리스트로 변환
# ast.literal_eval 함수는 문자열을 파이썬의 리터럴 구문으로
# "[1, 2, 3]"로 저장되어 있다면, ast.literal_eval을 적용하면 이 문자열이 파이썬의 리스트 [1, 2, 3]로 변환
past_data['synopsis_numpy_scale'] = past_data['synopsis_numpy_scale'].apply(ast.literal_eval)
KNN 모델 초기화 및 모델학습
현재 데이터 로드
현재 데이터의 synopsis_numpy_scale열 값인 리스트가 문자열형태로 되어있어서 이것을 파이썬의 리스트로 변환
# 데이터프레임에서 synopsis_numpy_scale 열의 값을 파싱하여 리스트로 변환
present_data['synopsis_numpy_scale'] = present_data['synopsis_numpy_scale'].apply(ast.literal_eval)
*KNN 모델 초기화 및 모델학습
예를 들어 과거 데이터에서 작품을 선택 (musical_id가 3885인 작품) 후 유클리디안 거리계산을 사용하여 유사한 작품을 찾음
# 선택한 작품과 유사한 작품 찾기
distances, indices = knn_model_present.kneighbors([past_data_scaled[selected_work_index_past]]) # 내주적으로 유클리디안 거리가 계산됨
print("선택한 작품:")
print(past_data.iloc[selected_work_index_past]['title'])
print("")
print("유사한 작품들:")
for i in range(1, len(indices.flatten())):
index = indices.flatten()[i]
normalized_distance = normalized_distances.flatten()[i]
title = past_data.iloc[index]['title']
print(f"유사한 작품: {title}, 정규화된 유사도: {normalized_distance}%")
![image](https://github.com/team-i-Five/code_Machine-learning/assets/79692357/bf04d29f-207c-4717-bb6a-a0f8215aa02a)
---
# KNN-Euclidean Distance 모델 수정 (231116)
- 어제 코드가 과거 작품 기준으로 과거 작품 추천하는 코드라서, 과거 작품을 선택하면 현재 상영중인 작품 추천하는 코드로 수정함
### 수정된 코드
![image](https://github.com/team-i-Five/code_Machine-learning/assets/135298407/2e50e890-8903-47a7-b2be-93772d98577e)
### 결과
![image](https://github.com/team-i-Five/code_Machine-learning/assets/135298407/12369a5e-48d7-416e-b747-0b6280689bdb)
해당 코드는 `branch 0.1.3/model_test` - `model_test/Knn_musical_v2.ipynb`확인하실 수 있습니다.
KNN-Euclidean Distance 모델링 (231115)
과거 데이터 로드
과거 데이터의 synopsis_numpy_scale열 값인 리스트가 문자열형태로 되어있어서 이것을 파이썬의 리스트로 변환
KNN 모델 초기화 및 모델학습
현재 데이터 로드
현재 데이터의 synopsis_numpy_scale열 값인 리스트가 문자열형태로 되어있어서 이것을 파이썬의 리스트로 변환
*KNN 모델 초기화 및 모델학습
최대 거리와 최소 거리 계산
max_distance = distances.max() min_distance = distances.min()
정규화된 유사도 계산
normalized_distances = 100 * (1 - (distances - min_distance) / (max_distance - min_distance))
유사한 작품 출력
print("선택한 작품:") print(past_data.iloc[selected_work_index_past]['title']) print("") print("유사한 작품들:") for i in range(1, len(indices.flatten())): index = indices.flatten()[i] normalized_distance = normalized_distances.flatten()[i] title = past_data.iloc[index]['title'] print(f"유사한 작품: {title}, 정규화된 유사도: {normalized_distance}%")