import pandas as pd import numpy as np from scipy.sparse import csr_matrix from sklearn.neighbors import NearestNeighbors # Define create_matrix function def create_matrix(df): # Adapt the function to match your DataFrame's column names and structure N = len(df['user_id_mapping'].unique()) # Adjusted to 'user_id_mapping' M = len(df['book_id'].unique()) # Adjusted to 'book_id' # Map IDs to indices user_mapper = dict(zip(np.unique(df["user_id_mapping"]), list(range(N)))) book_mapper = dict(zip(np.unique(df["book_id"]), list(range(M)))) # Map indices to IDs user_inv_mapper = dict(zip(list(range(N)), np.unique(df["user_id_mapping"]))) book_inv_mapper = dict(zip(list(range(M)), np.unique(df["book_id"]))) user_index = [user_mapper[i] for i in df['user_id_mapping']] # Adjusted to 'user_id_mapping' book_index = [book_mapper[i] for i in df['book_id']] # Adjusted to 'book_id' # Use 'Actual Rating' for the matrix values; corrected data handling for sparse matrix creation X = csr_matrix((df["Actual Rating"], (book_index, user_index)), shape=(M, N)) return X, user_mapper, book_mapper, user_inv_mapper, book_inv_mapper """ Find similar books using KNN """ # Define find_similar_books function - Source - https://www.geeksforgeeks.org/recommendation-system-in-python/?ref=rp def find_similar_books(book_id, X, k,book_mapper,book_inv_mapper, metric='cosine'): neighbour_ids = [] book_ind = book_mapper[book_id] book_vec = X[book_ind] k+=1 kNN = NearestNeighbors(n_neighbors=k, algorithm="brute", metric=metric) kNN.fit(X) book_vec = book_vec.reshape(1,-1) distances, indices = kNN.kneighbors(book_vec, return_distance=True) for i in range(0,k): n = indices.item(i) neighbour_ids.append(book_inv_mapper[n]) neighbour_ids.pop(0) return distances, neighbour_ids