个性化推荐算法python实现


基于ItemCF算法

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 15:36:15 2015


@author: tanyouwei

"""



import math


# ItemCF算法
def ItemSimilarity(train):
    C = dict()
    N = dict()
    for u,items in train.items():
        for i in items.keys():
            N[i] += 1
            for j in items.keys():
                if i == j:
                    continue
                C[i][j] += 1
    W = dict()
    for i,related_items in C.items():
        for j,cij in related_items.items():
            W[i][j] = cij / math.sqrt( N[i] * N[j])
    return W


# ItemCF-IUF算法
def ItemSimilarity_v2(train):
    C = dict()
    N = dict()
    for u,items in train.items():
        for i in items.keys():
            N[i] += 1
            for j in items.keys():
                if i == j:
                    continue
                C[i][j] += 1 / math.log(1+len(items)*1.0)
    W = dict()
    for i,related_items in C.items():
        for j,cij in related_items.items():
            W[i][j] = cij / math.sqrt( N[i] * N[j])
    return W


def Recommend(train,user_id,W,K):
    rank = dict()
    ru = train[user_id]
    for i,pi in ru.items():
        for j,wj in sorted(W[i].items,key=itemgetter(1),reverse=True)[0:K]:
            if j in ru:
                continue
            rank[j] += pi*wj

    return rank




基于UserCF算法

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 15:36:15 2015


@author: tanyouwei
"""


import math
'''
基于UserCF的推荐算法
'''
# UserCF算法
def UserSimilarity(train):
    item_users = dict()
    for u,items in train.items():
        for i in items.keys():
            if i not in item_users:
                item_users[i] = set()
            item_users[i].add(u)
    C = dict()
    N = dict()
    for i,users in item_users.items():
        for u in users:
            N[u] += 1
            for v in users:
                if u == v:
                    continue
                C[u][v] += 1
    W = dict()
    for u,related_users in C.items():
        for v,cuv in related_users.items():
            W[u][v] = cuv / math.sqrt(N[u] * N[v])
    return W


# User-IIF算法
def UserSimilarity_v2(train):
    item_users = dict()
    for u,items in train.items():
        for i in items.keys():
            if i not in item_users:
                item_users[i] = set()
            item_users[i].add(u)
    C = dict()
    N = dict()
    for i,users in item_users.items():
        for u in users:
            N[u] += 1
            for v in users:
                if u == v:
                    continue
                C[u][v] += 1 / math.log(1+len(users))
    W = dict()
    for u,related_users in C.items():
        for v,cuv in related_users.items():
            W[u][v] = cuv / math.sqrt(N[u] * N[v])
    return W


def Recommend(user,train,W):
    rank = dict()
    interacted_items = train[user]
    for v,wuv in sorted(W[u].items,key=itemgetter(1),reverse=True)[0:K]:
        for i,rvi in train[v].items:
            if i in interacted_items:
                continue
            rank[i] += wuv*rvi
    return rank




基于时间上下文的个性化推荐

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 15:36:15 2015


@author: tanyouwei
"""



import math

def RecentPopularity(records,alpha,T):
    ret = dict()
    for user,item,tm in records:
        if tm >= T:
            continue
        addToDict(ret,item,1/(1.0+alpha*(T-tm)))
    return ret


def addToDict(dicts,item,value):
    pass


def ItemSimilarity(train,alpha):
    C = dict()
    N = dict()
    for u,items in train.items():
        for i,tui in items.items():
            N[i] += 1
            for j,tuj in items.items():
                if i == j:
                    continue
                C[i][j] += 1 / (1+alpha*abs(tui-tuj))
    W = dict()
    for i,related_items in C.items():
        for j,cij in related_items.items():
            W[i][j] = cij / math.sqrt(N[i] * N[j])
    return W


def RecommendItemCF(train,user_id,W,K,t0):
    rank = dict()
    ru = train[user_id]
    for i,pi in ru.items():
        for j,wj in sorted(W[i].items(),\
                key=itemgetter(1),reverse=True)[0:K]:
            if j,tuj in ru.items():
                continue
            rank[j] += pi * wj / (1 + alpha * (t0 - tuj))
    return rank




def UserSimilarity(train):
    item_users = dict()
    for u,items in train.items():
        for i,tui in items.items():
            if i not in item_users:
                item_users[i] = dict()
            item_users[i][u] = tui


    C = dict()
    N = dict()
    for i,users in item_users.items():
        for u,tui in users.items():
            N[u] += 1
            for v,tvi in users.items():
                if u == v:
                    continue
                C[u][v] += 1 / (1 + alpha * abs(tui - tvi))
    W = dict()
    for u,related_users in C.items():
        for v,cuv in related_users.items():
            W[u][v] = cuv / math.sqrt(N[u] * N[v])
    return W


def RecommendUserCF(user,T,train,W):
    rank = dict()
    interacted_items = train[user]
    for v,wuv in sorted(W[u].items,key=itemgetter(1),\
            reverse=True)[0:K]:
        for i,tvi in train[v].items:
            if i in interacted_items:
                continue
            rank[i] += wuv / (1 + alpha * (T - tvi))
    return rank





基于LFM算法的个性化推荐


# -*- coding: utf-8 -*-

"""
Created on Wed Sep 30 15:36:15 2015


@author: tanyouwei
"""




'''
items => {'12':'PHP','1203':'Storm','123':'Ubuntu'}
items_pool => [12,32,121,324,532,123,53,1203,429,2932]
user_items => {'1010':[12,1203,123,429]}
'''
def RandomSelectNagativeSample(items):
    ret = dict()
    for i in items.keys():
        ret[i] = 1
    n = 0
    for i in range(0,len(items)*3):
        item = items_pool[random.randint(0,len(items_pool)-1)]
        if item in ret:
            continue
        ret[item] = 0
        n += 1
        if n > len(items):
            break
    return ret




def InitModel(user_items,F):
    P = dict()
    Q = dict()
    for u in user_items.keys():
        if u not in P:
            P[u] = {}
        for f in range(0,F):
            P[u][f] = 1


    items = user_items.values()
    itemLen = len(items[0])
    i = 0
    while i< itemLen:
        ii = items[0][i]
        if ii not in Q:
            Q[ii] = {}
        for f in range(0,F):
            Q[ii][f] = 1
        i += 1
    return [P,Q]




def LatentFactorModel(user_items,F,N,alpha,lambda1):
    [P,Q] = InitModel(user_items,F)
    for setup in range(0,N):
        for user,items in user_items.items():
            samples = RandomSelectNagativeSample(items)
            for item,rui in samples.items():
                eui = rui - Predict(user,item)
                for f in range(0,F):
                    P[user][f] += alpha * (eui * Q[item][f] - lambda1 * P[user][f])
                    Q[item][f] += alpha * (eui * P[user][f] - lambda1 * Q[item][f])
        alpha *= 0.9
    return [P,Q]




def Recommend(user,P,Q):
    rank = dict()
    for f,puf in P[user].items():
        for i,pfi in Q[f].items():
            if i not in rank:
                rank[i] += puf * qfi
    return rank






def PersonalRank(G,alpha,root,maxsetup):
    rank = dict()
    #rank = {x:0 for x in G.keys()}
    rank = rank.fromkeys(G.keys(),0)
    rank[root] = 1
    for k in range(maxsetup):
        tmp = dict()
        #tmp = {x:0 for x in G.keys()}
        tmp = tmp.fromkeys(G.keys(),0)
        for i,ri in G.items():
            for j,wij in ri.items():
                if j not in tmp:
                    tmp[j] = 0
                tmp[j] += alpha * rank[i]/(1.0*len(ri))
                if j == root:
                    tmp[j] += 1 - alpha
        rank = tmp


        print 'iter:' + str(k) + "\t",
        for key,value in rank.items():
            print "%s:%.3f,\t" % (key,value),
        print
    return rank


if __name__ == '__main__':
    G = {'A':{'a':1,'c':1},
     'B':{'a':1,'b':1,'c':1,'d':1},
     'C':{'c':1,'d':1},
     'a':{'A':1,'B':1},
     'b':{'B':1},
     'c':{'A':1,'B':1,'C':1},
     'd':{'B':1,'C':1}}
    PersonalRank(G,0.85,'A',20)

'''

#items_pool = {'12':'PHP','32':'Nginx','121':'Apache','324':'Erlang','532':'Linux','123':'Ubuntu','53':'Java','1203':'Storm','429':'Kafka','2932':'Flume'}
items_pool = [12,32,121,324,532,123,53,1203,429,2932]
items = {'12':'PHP','1203':'Storm','123':'Ubuntu'}
user_items = {'1010':[12,1203,123,429]}


#print RandomSelectNagativeSample(items)
print InitModel(user_items,4)
'''






基于图的推荐算法

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 15:36:15 2015


@author: tanyouwei
"""


'''
    基于图的推荐算法,二分图
'''




def PersonalRank(G,alpha,root,maxsetup):
    rank = dict()
    #rank = {x:0 for x in G.keys()}
    rank = rank.fromkeys(G.keys(),0)
    rank[root] = 1
    for k in range(maxsetup):
        tmp = dict()
        #tmp = {x:0 for x in G.keys()}
        tmp = tmp.fromkeys(G.keys(),0)
        for i,ri in G.items():
            for j,wij in ri.items():
                if j not in tmp:
                    tmp[j] = 0
                tmp[j] += alpha * rank[i]/(1.0*len(ri))
                if j == root:
                    tmp[j] += 1 - alpha
        rank = tmp


        print 'iter:' + str(k) + "\t",
        for key,value in rank.items():
            print "%s:%.3f,\t" % (key,value),
        print
    return rank


if __name__ == '__main__':
    G = {'A':{'a':1,'c':1},
     'B':{'a':1,'b':1,'c':1,'d':1},
     'C':{'c':1,'d':1},
     'a':{'A':1,'B':1},
     'b':{'B':1},
     'c':{'A':1,'B':1,'C':1},
     'd':{'B':1,'C':1}}
    PersonalRank(G,0.85,'C',20)






基于标签的推荐算法


# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 15:36:15 2015


@author: tanyouwei
"""



import math


#标签流行度算法
def TagPopularity(records):
    tagfreq = dict()
    for user,item,tag in records:
        if tag not in tagfreq:
            tagfreq[tag] = 1
        else:
            tagfreq[tag] += 1
    return tagfreq


#物品相似度余弦算法
def CosineSim(item_tags,i,j):
    ret  = 0
    for b,wib in item_tags[i].items():
        if b in item_tags[j]:
            ret += wib * item_tags[j][b]
    ni = 0
    nj = 0
    for b,w in item_tags[i].items():
        ni += w * w
    for b,w in item_tags[j].items():
        nj += w * w
    if ret == 0:
        return 0
    return ret / math.sqrt(ni * nj)


#推荐物品的多样性算法
def Diversity(item_tags,recommend_items):
    ret = 0
    n = 0
    for i in recommend_items.keys():
        for j in recommend_items.keys():
            if i == j:
                continue
            ret += CosineSim(item_tags,i,j)
            n += 1
    return ret / (n * 1.0)




def addValueToMat(dicts,index,k,v):
    if index not in dicts:
        dicts[index] = dict()
        dicts[index][k] = v
    else:
        if k not in dicts[index]:
            dicts[index][k] = v
        else:
            dicts[index][k] += v


def InitStat(records):
    user_tags = dict() #存储 user_tags[u][b] = n(u,b)
    tag_items = dict() # tag_items[b][i] = n(b,i)
    user_items = dict()
    for user,item,tag in records.items():
        addValueToMat(user_tags,user,tag,1)
        addValueToMat(tag_items,tag,item,1)
        addValueToMat(user_items,user,item,1)




def Recommend(user):
    recommend_items = dict()
    tagged_items = user_items[user]
    for tag,wut in user_tags[user].items():
        # wut = wut*1.0/math.log(1+len(tag_users[tag])) #TagBasedTFIDF and TagBasedTFIDF++
        for item,wti in tag_items[tag].items():
            # wti = wti*1.0/math.log(1+len(user_items[user])) #TagBasedTFIDF++
            if item in tagged_items:
                continue
            if item not in recommend_items:
                recommend_items[item] = wut * wti
            else:
                recommend_items[item] += wut * wti
    return recommend_items




if __name__ == "main":
    user_tags = dict()
    user_items = dict()
    tag_items = dict()


    records = dict()
    user = '1220';


    InitStat(records)
    rec_items = Recommend(user)

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
音乐推荐算法Python实现可以使用基于用户的协同过滤推荐算法和基于项目的协同过滤推荐算法。在Python中,可以使用一些常用的库来实现这些算法,例如numpy、pandas和scikit-learn。 基于用户的协同过滤推荐算法可以通过计算用户之间的相似度来推荐相似用户喜欢的音乐。可以使用用户对音乐的评分数据来计算用户之间的相似度,然后根据相似用户的喜好推荐音乐给目标用户。 基于项目的协同过滤推荐算法可以通过计算音乐之间的相似度来推荐相似的音乐给用户。可以使用音乐的特征数据(如歌手、风格、时长等)来计算音乐之间的相似度,然后根据相似音乐推荐给用户。 除了协同过滤算法,还可以使用其他推荐算法,例如基于内容的推荐算法(通过分析音乐的内容特征来推荐相似的音乐)和深度学习算法(使用神经网络来学习用户和音乐之间的关系)。 在项目中,可以使用Python的Django框架和MySQL数据库来实现在线音乐推荐系统。前台用户可以注册、登录、浏览音乐、搜索音乐、评分音乐、收藏音乐、评论音乐等功能。后台管理员可以管理用户、音乐、音乐类型、评分、收藏、评论、歌单、兴趣标签、播放记录、权限等。 个性化推荐功能可以根据用户的喜好和行为来推荐音乐。无论是否登录,可以在前台首页展示热点推荐音乐。登录用户可以在前台首页展示个性化推荐音乐,通过协同过滤推荐算法和评分数据来推荐音乐。如果没有推荐结果,还可以进行喜好标签推荐,随机查找喜好标签下的音乐。 整个项目可以使用Python 3.8、Django 3、MySQL 8以及一些前端工具和库(如HTML页面、JavaScript脚本、jQuery脚本、Bootstrap前端框架、layer弹窗组件、webuploader文件上传组件等)来完成。 希望以上信息对您有所帮助。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值