Advertisement
Guest User

DIMAN YA SDELYAL

a guest
Oct 21st, 2016
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.96 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from math import sqrt
  3. import matplotlib.pyplot as plt
  4. import isbnlib
  5.  
  6. def getBooksNumber():
  7.     i = 0
  8.     for l in open('./data/BX-CSV-Dump/BX-Books.csv'):
  9.         i = i + 1
  10.  
  11.     print i
  12.  
  13. # Загрузка данных (пример для movielen)
  14. def load_data(path='./data/BX-CSV-Dump/BX-Book-Ratings.csv'):
  15.     # загружаем предпочтения
  16.     prefs = {}
  17.     for line in open(path):
  18.         if line == '"User-ID";"ISBN";"Book-Rating"\n' : continue
  19.         line = line.replace("\"", "")
  20.         (user, isbn, rating) = line.split(";")
  21.         prefs.setdefault(user, {})
  22.         prefs[user][isbn] = int(rating)
  23.     return prefs
  24.  
  25. # Визуализация матрицы R
  26. def visualize_R(prefs):
  27.     # из prefs формируем два массива (по x и по y)
  28.     x = []
  29.     y = []
  30.     for user in prefs:
  31.         for book in prefs[user]:
  32.             x.append(int(user))
  33.             y.append(isbnlib.EAN13(book))
  34.     plt.plot(x, y, 'r.')
  35.     plt.show()
  36.  
  37.  
  38. # пример реализации функции близости (евклидово расстояние)
  39. def sim_distance_1(prefs, person1, person2):
  40.     # Получить список предметов, оцененных обоими
  41.     # print prefs
  42.     si = {}
  43.     # Если person1 нет в prefs, то вернуть 0
  44.     # if person1 not in prefs:
  45.     #    print 'aaa'
  46.     #    return 0
  47.  
  48.     for item in prefs[person1]:
  49.         if item in prefs[person2]:
  50.             si[item] = 1
  51.  
  52.     # Если нет ни одной общей оценки, вернуть 0
  53.     if len(si) == 0: return 0
  54.  
  55.     # сложить квадраты разностей
  56.     sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2)
  57.                           for item in prefs[person1] if item in prefs[person2]])
  58.  
  59.     return 1 / (1 + sum_of_squares)
  60.  
  61.  
  62. # пример реализации функции близости (коэфициент Жаккара)
  63. def sim_distance_2(prefs, person1, person2):
  64.     # Получить список предметов, оцененных обоими
  65.     # print prefs
  66.     si = {}
  67.     # Если person1 нет в prefs, то вернуть 0
  68.     # if person1 not in prefs:
  69.     #    print 'aaa'
  70.     #    return 0
  71.     # ищем одинаковые элементы
  72.     for item in prefs[person1]:
  73.         if item in prefs[person2]:
  74.             si[item] = 1
  75.     # Если нет ни одной общей оценки, вернуть 0
  76.     if len(si) == 0: return 0
  77.     # объединение
  78.     num_of_union = float(len(prefs[person1]) + len(prefs[person2]))
  79.     return len(si) / num_of_union
  80.  
  81.  
  82. # Возвращает отранжированных k пользователей для объекта object_id
  83. def topMatches(prefs_learn_data, person, object_id, k=5, similarity=sim_distance_1):
  84.     # Выбираем только тех пользователей, которые оценили object_id
  85.     prefs_with_object_id = {}
  86.     for user in prefs_learn_data:
  87.         if object_id in prefs_learn_data[user]:
  88.             prefs_with_object_id[user] = prefs_learn_data[user]
  89.     # добавляем самого пользователя, нужен для расчета метрики сходства
  90.     prefs_with_object_id[person] = prefs_learn_data[person]
  91.     # получаем список оценок (с собой не сравниваем!)
  92.     # Формат (мера близости, реальная оценка, айдишник пользователя)
  93.     scores = [(similarity(prefs_with_object_id, person, other), prefs_learn_data[other][object_id], other)
  94.               for other in prefs_with_object_id if other != person]
  95.     scores.sort()
  96.     scores.reverse()
  97.     # Если есть нулевые или отрицательные значения, то удалить их
  98.     result_scores = [score for score in scores if score[0] > 0]
  99.     return result_scores[0:k]
  100.  
  101.  
  102. # Получить неизвестную оценку объекта для пользователя
  103. def get_rating(prefs_learn_data, person, object_id, similarity=sim_distance_1):
  104.     # Получаем наиболее похожих пользователей
  105.     scores = topMatches(prefs_learn_data, person, object_id, similarity=similarity)
  106.     # Если для пользователя не нашлось похожих пользователей (белая ворона), то вернуть 0
  107.     if len(scores) == 0: return 0
  108.     # Вычисляем сумму произведений оценок на меру близости
  109.     sum_sim_score = sum(score[0] * score[1] for score in scores)
  110.     # Вычисляем сумму всех мер близости
  111.     sum_sims = sum(score[0] for score in scores)
  112.     # Вычисляем рейтинг
  113.     rating = sum_sim_score / sum_sims
  114.     return rating
  115.  
  116.  
  117. # Расчет среднеквадратической ошибки
  118. def calculate_error(rating_real, rating_predict):
  119.     sum = 0
  120.     for i in range(len(rating_real) - 1):
  121.         sum += pow(rating_real[i] - rating_predict[i], 2)
  122.     return sqrt(sum)
  123.  
  124.  
  125. def get_learn_data(prefs):
  126.     # 80 %
  127.     start = 0
  128.     end = int(len(prefs) * 0.8)
  129.     result = {}
  130.     i = start
  131.     for user in prefs:
  132.         result.setdefault(user, {})
  133.         if i < end:
  134.             result[user] = prefs.get(user)
  135.         i += 1
  136.  
  137.     return result
  138.  
  139.  
  140. def get_test_data(prefs):
  141.     # 20 %
  142.     start = int(len(prefs) * 0.8)
  143.     end = len(prefs)
  144.     result = {}
  145.     i = start
  146.     for user in prefs:
  147.         result.setdefault(user, {})
  148.         if i < end:
  149.             result[user] = prefs.get(user)
  150.         i += 1
  151.  
  152.     return result
  153.  
  154. # Тестирование разработанной системы на тестовой выборке
  155. def test_data():
  156.     # загружаем обучающую выборку и дальше ее будем использовать для прогноза оценки для тестовой выборки
  157.     data = load_data(path='./data/BX-CSV-Dump/BX-Book-Ratings.csv')
  158.     prefs_learn_data = get_learn_data(data)
  159.     test_prefs = get_test_data(data)
  160.  
  161.     # визуализируем выборку
  162.     visualize_R(prefs_learn_data)
  163.  
  164.     # загружаем тестовую выборку
  165.     #test_prefs = load_data(path='./data/ml-100k/u-test.data')
  166.     # прогнозируем рейтинги для тестовой выборки (считаем по обучающей!)
  167.     rating_real = []
  168.     rating_predict = []
  169.     for user in test_prefs:
  170.         for book in test_prefs[user]:
  171.             rating_real.append(test_prefs[user][book])
  172.             rating_predict.append(get_rating(prefs_learn_data, str(user), str(book), similarity=sim_distance_1))
  173.     # вычисляем ошибку RMSE
  174.     print rating_predict
  175.     print rating_real
  176.     print calculate_error(rating_real, rating_predict)
  177.  
  178.  
  179. test_data()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement