集体智慧编程--推荐系统

<pre name="code" class="python"># -*- coding: utf-8 -*-
# 用户数据
from math import sqrt

critics = {
    'user1': {'goods1': 2.5, 'goods2': 3.5, 'goods3': 3.0, 'goods4': 3.5, 'goods5': 2.5, 'goods6': 3.0},
    'user2': {'goods1': 3.0, 'goods2': 3.5, 'goods3': 1.5, 'goods4': 5.0, 'goods6': 3.0, 'goods5': 3.5},
    'user3': {'goods1': 2.5, 'goods2': 3.0, 'goods4': 3.5, 'goods6': 4.0},
    'user4': {'goods2': 3.5, 'goods3': 3.0, 'goods6': 4.5, 'goods4': 4.0, 'goods5': 2.5},
    'user5': {'goods1': 3.0, 'goods2': 4.0, 'goods3': 2.0, 'goods4': 3.0, 'goods6': 3.0, 'goods5': 2.0},
    'user6': {'goods1': 3.0, 'goods2': 4.0, 'goods6': 3.0, 'goods4': 5.0, 'goods5': 3.5},
    'user7': {'goods2': 4.5, 'goods5': 1.0, 'goods4': 4.0}
}


def sim_pearson(prefs, p1, p2):
    """
    相似度调查
    :param prefs: 用户个人喜好的字典
    :param p1:
    :param p2:
    :return:
    """
    si = {}
    for item in prefs[p1]:
        if item in prefs[p2]: si[item] = 1

    if len(si) == 0: return 0

    n = len(si)

    sum1 = sum([prefs[p1][it] for it in si])
    sum2 = sum([prefs[p2][it] for it in si])

    sum1Sq = sum([pow(prefs[p1][it], 2) for it in si])
    sum2Sq = sum([pow(prefs[p2][it], 2) for it in si])

    pSum = sum([prefs[p1][it] * prefs[p2][it] for it in si])
    num = pSum - (sum1 * sum2 / n)
    den = sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
    if den == 0: return 0

    r = num / den
    return r


def topMatches(prefs, person, n=5, similarity=sim_pearson):
    '''
    获取相似度最高的5个
    :param prefs:
    :param person:
    :param n:
    :param similarity:
    :return:
    '''
    scores = [(similarity(prefs, person, other), other)
              for other in prefs if other != person]
    scores.sort()
    scores.reverse()
    return scores[0:n]


def getRecommendations(prefs, person, similarity=sim_pearson):
    '''
    获得推荐
    :param prefs:评分高低
    :param person: 用户
    :param similarity: 相似度
    :return:
    '''


    totals = {}
    simSums = {}
    for other in prefs:
        if other == person: continue
        sim = similarity(prefs, person, other)

        if sim <= 0: continue
        for item in prefs[other]:

            if item not in prefs[person] or prefs[person][item] == 0:
                totals.setdefault(item, 0)
                totals[item] += prefs[other][item] * sim
                simSums.setdefault(item, 0)
                simSums[item] += sim

    rankings = [(total / simSums[item], item) for item, total in totals.items()]

    rankings.sort()
    rankings.reverse()
    return rankings

i=1


for usr in critics.keys():
    print usr,
    print (getRecommendations(critics,usr))
    i+=1


 

猜你喜欢

转载自blog.csdn.net/z471365897/article/details/51170181