<jupyter_start><jupyter_text>Descrição do Problema. Este projeto tem como principal objetivo desenvolver um sistema de apoio a recomendação. Para está analise iremos utilizar a base de dados [MovieLens](https://grouplens.org/datasets/movielens/) que consiste numa base de dados onde os dados foram coletados através do site da MovieLens (movielens.umn.edu) durante o período de sete meses a partir de 19 de setembro, 1997 até 22 de abril de 1998. Esses dados foram limpos - usuários que tinha menos de 20 classificações ou não tinha demografia completa informações foram removidas deste conjunto de dados. Descrições detalhadas dê o arquivo de dados pode ser encontrado no final deste arquivo.Á partir desses dados foi desenvolvido um sistema de recomendação baseado em dois algoritimos que explicamos abaixo.  Leitura do Conjunto de DadosAbaixo o algoritimo é reponsavel pela leitura de um conjunto especifico da base de dados [ml-100k](https://grouplens.org/datasets/movielens/), onde iremos utilizar o conjunto especifico de teste e a base de intems, considerando os 1000 usuario presentes.<jupyter_code>items_stream = open('../ml-100k/u.item', 'r')
item_data = items_stream.read().split('\n')
item_data = list(map(lambda item: item.split('|')[:2], item_data))
items_stream.close()
database = pd.read_csv('../ml-100k/u1.base.csv')
user_set = set(database.user_id)
item_set = set(database.item_id)
not_watch = {user: item_set.difference(database.query('user_id == %s' %(user)).item_id) for user in user_set}
files_dir = os.path.expanduser('../ml-100k/')
reader = Reader('ml-100k')<jupyter_output><empty_output><jupyter_text>Leitura do Conjunto de TesteConsideramos para a o conjunto de teste a base 1 contida no conjunto dos dados.<jupyter_code>train_file = files_dir + 'u%d.base'
test_file = files_dir + 'u%d.test'
folds_files = [(train_file % i, test_file % i) for i in [1]]

data = Dataset.load_from_folds(folds_files, reader=reader)
pkf = PredefinedKFold()<jupyter_output><empty_output><jupyter_text>Algoritmos utilizados Para está analise utilizamos dois algoritimos diferente para observar o resultados, ambos os algoritimos estão presentes na biblioteca surprise. São eles:+ KNN+ SVD  KNN+ A ideia principal do KNN é determinar o rótulo de classificação de uma amostra baseado nas amostras vizinhas advindas de um conjunto de treinamento.+ Passos:    + 1-Escolha um vértice arbitrário como vértice atual.    + 2-Descubra a aresta de menor peso que seja conectada ao vértice atual e a um vértice não visitado V.    + 3-Faça o vértice atual ser V.    + 4-Marque V como visitado.    + 5-Se todos os vértices no domínio estiverem visitados, encerre o algoritmo.    + 6-Se não vá para o passo 2.+ Mais detalhe sobre a formulação e como funciona o algoritimo pela biblioteca [aqui](http://surprise.readthedocs.io/en/stable/knn_inspired.htmlsurprise.prediction_algorithms.knns.KNNBasic).  SVDO famoso algoritmo SVD , popularizado por <NAME> durante o Prêmio Netflix. Quando as linhas de base não são usadas, isso é equivalente à fatoração de matrizes probabilísticas.Mais detalhe sobre a formulação e como funciona o algoritimo pela biblioteca [aqui](http://surprise.readthedocs.io/en/stable/matrix_factorization.htmlmatrix-factorization-based-algorithms).<jupyter_code>sim_options = {
    'name': 'cosine',
    'user_based': True  # compute  similarities between items
}

algo = KNNBasic(sim_options=sim_options, k=4, min_k=2)
algo_svd = SVD()
for trainset, testset in pkf.split(data):

    # train and test algorithm.
    algo_svd.fit(trainset)
    algo.fit(trainset)
    predictions = algo.test(testset)
    predictions_svd = algo_svd.test(testset)
    accuracy.rmse(predictions,verbose=True)
    accuracy.rmse(predictions_svd,verbose=True)<jupyter_output>Computing the cosine similarity matrix...
Done computing similarity matrix.
RMSE: 1.1118
RMSE: 0.9472<jupyter_text>Métodos utilizados.Abaixo estão os metodos que retornar o top 5 dos filmes de acordo com o SVD ou KNN e também o metodo que retornar o top 5 de usuarios de acordo com o KNN que possui perfil similar com o perfil selecionado na pesquisa.<jupyter_code>def get_top_5(uid):
    top = []
    items = not_watch[int(uid)]
    
    for item in items:
        top.append((item, algo.predict(uid=uid, iid=str(item)).est))
    
    return sorted(top, key=lambda item: item[1], reverse=True)[:5]


def get_top_5_movies_KNN(uid):
    top_5 = get_top_5(uid)
    return [item_data[int(item[0])][1] for item in top_5]
def get_top2_5(uid):
    top = []
    items = not_watch[int(uid)]
    
    for item in items:
        top.append((item, algo_svd.predict(uid=uid, iid=str(item)).est))
    
    return sorted(top, key=lambda item: item[1], reverse=True)[:5]

def get_top_5_movies_SVD(uid):
    top_5 = get_top2_5(uid)
    return [item_data[int(item[0])][1] for item in top_5]
def get_top_5_neighbors(uid):
    inner_uid = algo.trainset.to_inner_uid(uid)
    neighbords = algo.get_neighbors(iid=inner_uid, k=5)
    return [algo.trainset.to_raw_uid(iid) for iid in neighbords]
def get_top_5_cosine(uid):
    x = algo.sim
    y = get_top_5_neighbors(uid)
    user = int(uid)-1
    result = list()
    for i in range(5):
        result.append(x[user][int(y[i])-1])
    return result
def get_top_neighbors(uid):
    y = get_top_5_neighbors(uid)
    x = get_top_5_cosine(uid)
    result = list()
    for i in range(5):
        result.append("%.4f - %.4f" %(float(y[i]),float(x[i])))
    return result<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09757432062739377, 'fraction_numerical': 0.016414371694327922, 'mean_word_length': 4.636176772867421, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '320051', 'license': 'Apache-2.0', 'n_tokens_mistral': 2044, 'n_tokens_neox': 1997, 'n_words': 564, 'path': 'reposts/recommendation_algorithm.ipynb', 'repo_name': 'viniaraujoo/Recommender-system', 'size': '5487'}