In python I do not rummage. Prog is not mine. Rumor has it that the program has run from other people.

from math import sqrt import hashlib import matplotlib.pyplot as plt import random def get_book_id(book): return int(hashlib.md5(book.encode('utf-8')).hexdigest(), 16) # Загрузка данных def load_data(path='./data/BX-CSV-Dump/BX-Book-Ratings.csv'): #загружаем предпочтения data = {} books = {} i = 0 book_id = 1 for line in open(path): if i < 10000: i += 1 try: (user, book, rating) = line.split('\t') if int(rating) == 0: continue data.setdefault(user, {}) data[user][book] = int(rating) if book not in books: books[book] = get_book_id(book) book_id += 1 except Exception: print(i) raise Exception else: return data, books # Визуализация матрицы R def visualize_R(data, books): # из data формируем два массива (по x и по y) x = [] y = [] for user in data: for book in data[user]: x.append(int(user)) y.append(books[book]) plt.plot(x, y, 'r,') plt.show() # реализация функции близости (манхэттенское расстояние) def sim_distance_1(prefs, person1, person2): #Получить список предметов, оцененных обоими si = {} random.seed(1) for item in prefs[person1]: if item in prefs[person2]: si[item] = 1 #Если нет ни одной общей оценки, вернуть 0 if len(si) == 0: return 0 #len - длина строки #сложить разность модулей sum_of_modules = sum([abs(prefs[person1][item]-prefs[person2][item]) for item in prefs[person1] if item in prefs[person2]]) return 1/(1+sum_of_modules) # реализация функции близости (косинусная мера близости) def sim_distance_2(prefs, person1, person2): def dotProduct (vecA, vecB): d = 0.0 for dim in vecA: if dim in vecB: d += vecA[dim]*vecB[dim] return d random.seed(2) return dotProduct(prefs[person1], prefs[person2]) / sqrt(dotProduct(prefs[person1], prefs[person1])) / sqrt(dotProduct(prefs[person2], prefs[person2])) # Возвращает отранжированных k пользователей для объекта object_id def topMatches(prefs_learn_data, user, object_id, k=5, similarity=sim_distance_1): # Выбираем только тех пользователей, которые оценили object_id prefs_with_object_id = {} for u in prefs_learn_data: if object_id in prefs_learn_data[u]: prefs_with_object_id[u] = prefs_learn_data[u] #добавляем самого пользователя, нужен для расчета метрики сходства prefs_with_object_id[user] = prefs_learn_data[user] # получаем список оценок (с собой не сравниваем!) # Формат (мера близости, реальная оценка, айдишник пользователя) scores = [(similarity(prefs_with_object_id, user, other), prefs_learn_data[other][object_id], other) for other in prefs_with_object_id if other != user] scores.sort() scores.reverse() # Если есть нулевые или отрицательные значения, то удалить их result_scores = [score for score in scores if score[0] > 0] return result_scores[0:k] # Получить неизвестную оценку объекта для пользователя def get_rating(prefs_learn_data, user, object_id, similarity=sim_distance_1): # Получаем наиболее похожих пользователей scores = topMatches(prefs_learn_data, user, object_id, similarity=similarity) # Если для пользователя не нашлось похожих пользователей (белая ворона), то вернуть 0 if len(scores) == 0: return 0 # Вычисляем сумму произведений оценок на меру близости sum_sim_score = sum(score[0]*score[1] for score in scores) # Вычисляем сумму всех мер близости sum_sims = sum(score[0] for score in scores) # Вычисляем рейтинг rating = sum_sim_score/sum_sims return rating # Расчет среднеквадратической ошибки def calculate_error(rating_real, rating_predict): sum = 0 for i in range(len(rating_real)-1): sum += pow(rating_real[i]-rating_predict[i], 2) return sqrt(sum/len(rating_real)) # Тестирование разработанной системы на тестовой выборке def test_data(): # загружаем всю выборку и дальше ее будем использовать для прогноза оценки для тестовой выборки (full_data, books) = load_data(path='./data/BX-CSV-Dump/BX-Book-Ratings.csv') # получаем обучающую выборку и дальше ее будем использовать для прогноза оценки для тестовой выборки testing_data = {} learn_data = {} for user in full_data: testing_data.setdefault(user, {}) learn_data.setdefault(user, {}) for book in full_data[user]: # если в обучающую выборку ещё не добавили ни одной оценки текущего пользователя, то добавляем: if len(learn_data[user]) < 1: learn_data[user][book] = full_data[user][book] else: # остальные оценки добавляем в тестовую выборку: testing_data[user][book] = full_data[user][book] # визуализируем выборку visualize_R(learn_data, books) # загружаем тестовую выборку # прогнозируем рейтинги для тестовой выборки (считаем по обучающей!) rating_real = [] rating_predict = [] for user in learn_data: for book in learn_data[user]: rating_real.append(learn_data[user][book]) rating_predict.append(get_rating(learn_data, str(user), str(book), similarity=sim_distance_1)) for i in xrange(len(rating_predict)): rating_predict[i] = random.randint(0, 10) print (' real'), rating_real print (' predict'), rating_predict # замена нулей на нейтральную оценку for i in xrange(len(rating_predict)): if rating_predict[i] == 0: rating_predict[i] = 5 #проверка замены print ('new predict'), rating_predict # вычисляем ошибку RMSE print(calculate_error(rating_real, rating_predict)) test_data() 

enter image description here

Something went wrong. There was no first error on python 2.7. Understand, forgive, stupid to explain.

  • one
    Judging by the code, the file should contain three values ​​on each line, separated by tabs. You apparently only have one value in the file in any of the lines. - insolor
  • The input file is broken - eri

0