File size: 2,259 Bytes
edc4276
946af09
01e4bba
 
c4d5407
 
946af09
6868cdb
401d1a7
946af09
 
edc4276
946af09
 
a4492f7
85af53b
78e9b61
 
 
 
 
 
 
 
85af53b
ff3aa08
78e9b61
 
 
 
 
 
 
 
 
 
 
a4492f7
ff3aa08
85af53b
c18e3ad
946af09
 
577a126
78e9b61
3246224
f47cfde
3246224
 
 
 
4b6c2b9
3246224
 
9652cc9
3246224
 
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import streamlit as st
import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.sequence import pad_sequences
import joblib
import pandas as pd
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

# Load the KNN model
knn_model = joblib.load('knn_model.joblib')

# Load the dataset
df = pd.read_csv('df1.csv')

# Preprocess for KNN
audio_feature_columns = ['danceability', 'energy', 'key', 'loudness', 'mode', 'speechiness',
       'acousticness', 'instrumentalness', 'liveness', 'valence', 'tempo',
       'duration_ms', 'time_signature']

audio_features = df[audio_feature_columns]
mood_cats = df[['mood_cats']]
mood_cats_df = pd.DataFrame(mood_cats)

# Normalize audio features for KNN
scaler_knn = StandardScaler()
audio_features_scaled_knn = scaler_knn.fit_transform(audio_features)
audio_features_df_knn = pd.DataFrame(audio_features_scaled_knn, columns=audio_feature_columns)
combined_features_knn = pd.concat([mood_cats_df, audio_features_df_knn], axis=1)

# Function for KNN-based recommendation
def recommend_knn(query_index, n_recommendations=5):
    distances, indices = knn_model.kneighbors(combined_features_knn.iloc[query_index].values.reshape(1, -1), n_neighbors=n_recommendations)
    recommended_songs = df.iloc[indices.flatten()].copy()
    # Convert distances to scores
    recommended_songs['score'] = 1 / (1 + distances.flatten())  # Inverse of distance
    return recommended_songs

# Set up the title of the app
st.title('KNN Recommender App')

# Get song index from user input
song_index_to_recommend = st.number_input('Enter song index:', min_value=0, max_value=len(df)-1, value=0)

# Combine emotion and audio features for recommendation
# combined_features = np.concatenate([emotion, audio_features_scaled_knn[song_index_to_recommend]])

# Get KNN recommendations
knn_recs = recommend_knn(song_index_to_recommend)

# Display KNN recommendations
st.write("KNN Recommendations:")
if not knn_recs.empty:
    for index in knn_recs.index:
        st.write(f"Song Index: {index}, Title: {df.iloc[index]['track_name']}, Artist: {df.iloc[index]['track_artist']}, Score: {knn_recs.loc[index, 'score']}")
else:
    st.write("No recommendations found.")