Python簡單電影推薦算法(根據用戶看過的電影名和對其打分進行推薦)


def max_score(film):
    return data[user2][film]
def score_different(use, fil):
    score = 0
    for filmName in fil:
        # sum = abs(data[use][filmName]-user[filmName])
        # if(sum!=0):
        #     score += 3*1/(abs(data[use][filmName] - user[filmName])**2)
        # else:
        #     score+=0;
        score += (abs(data[use][filmName] - user[filmName]))**2
    return score
data = {'user' + str(i): {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
        for i in range(1, 20)}
print("各個用戶的電影打分情況:",data)
user = {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
print("用戶本人的電影打分情況:",user)
film_len = 0
user2 = ""
Film_Score = 0
user_score =  dict()
for key, value in data.items():
    film = set(value) & set(user)
    #推薦電影的各用戶推薦度分數算法:看過的相同電影數*2+(每部3*1/(看過的相同電影的評分差的平方))
    # 例如我: 1:5 2:5
    # user2:  1:8 2:8
    # 課上講的評分標准為:2*0.5+3*1/(3**2+3**2)
    # 而我的標准為:2*0.5+(3*1/(3**2)+3*1/(3**2))
    Film_Score = score_different(key, film)
    if Film_Score !=0:
        user_score[key] = 3*1/Film_Score+len(film)*0.5
    else:
        user_score[key] = len(film)*0.5+5
    # if len(film) == film_len:
    #     if score_different(key, film) < Film_Score:
    #         film_len = len(film)
    #         user2 = key
    #         Film_Score = score_different(key, film)
    # if len(film) > film_len:
    #     film_len = len(film)
    #     user2 = key
    #     Film_Score = score_different(key, film)
print("輸出用戶的推薦度分數")
print(user_score)
print("與用戶本人最相似的用戶:")
user3 = max(zip(user_score.values(),user_score.keys()))
print(max(zip(user_score.values(),user_score.keys())))
# print(user2, data[user2])
print(user3[1],data[user3[1]])
print("為用戶推薦電影:")
# print(max(set(data[user2]) - set(user), key=max_score))
# print(max(set(data[user3[1]])-set(user)))
# print(set(data[user3[1]])-set(user))
# max_value = max(set(data[user3[1]])-set(user))
# for i,j in set(data[user3[1]])-set(user):
# user4 = data[user3[1]][1]
# print(user3)
# print(user3[1])
uuu = dict(data[user3[1]])
# print(uuu)  # print(max(uuu))
maxvalue = max(uuu.values())
r_commend_film = []
for m,n in uuu.items():
    if n==maxvalue and m not in user:
        r_commend_film.append(m)
print(r_commend_film)
def max_score(film):
    return data[user2][film]
def score_different(use, fil):
    score = 0
    for filmName in fil:
        # sum = abs(data[use][filmName]-user[filmName])
        # if(sum!=0):
        #     score += 3*1/(abs(data[use][filmName] - user[filmName])**2)
        # else:
        #     score+=0;
        score += (abs(data[use][filmName] - user[filmName]))**2
    return score
data = {'user' + str(i): {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
        for i in range(1, 20)}
print("各個用戶的電影打分情況:",data)
user = {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
print("用戶本人的電影打分情況:",user)
film_len = 0
user2 = ""
Film_Score = 0
user_score =  dict()
for key, value in data.items():
    film = set(value) & set(user)
    #推薦電影的各用戶推薦度分數算法:看過的相同電影數*2+(每部3*1/(看過的相同電影的評分差的平方))
    # 例如我: 1:5 2:5
    # user2:  1:8 2:8
    # 課上講的評分標准為:2*0.5+3*1/(3**2+3**2)
    # 而我的標准為:2*0.5+(3*1/(3**2)+3*1/(3**2))
    Film_Score = score_different(key, film)
    if Film_Score !=0:
        user_score[key] = 3*1/Film_Score+len(film)*0.5
    else:
        user_score[key] = len(film)*0.5+5
    # if len(film) == film_len:
    #     if score_different(key, film) < Film_Score:
    #         film_len = len(film)
    #         user2 = key
    #         Film_Score = score_different(key, film)
    # if len(film) > film_len:
    #     film_len = len(film)
    #     user2 = key
    #     Film_Score = score_different(key, film)
print("輸出用戶的推薦度分數")
print(user_score)
print("與用戶本人最相似的用戶:")
user3 = max(zip(user_score.values(),user_score.keys()))
print(max(zip(user_score.values(),user_score.keys())))
# print(user2, data[user2])
print(user3[1],data[user3[1]])
print("為用戶推薦電影:")
# print(max(set(data[user2]) - set(user), key=max_score))
# print(max(set(data[user3[1]])-set(user)))
# print(set(data[user3[1]])-set(user))
# max_value = max(set(data[user3[1]])-set(user))
# for i,j in set(data[user3[1]])-set(user):
# user4 = data[user3[1]][1]
# print(user3)
# print(user3[1])
uuu = dict(data[user3[1]])
# print(uuu)  # print(max(uuu))
maxvalue = max(uuu.values())
r_commend_film = []
for m,n in uuu.items():
    if n==maxvalue and m not in user:
        r_commend_film.append(m)
print(r_commend_film)

以上代碼的邏輯對於推薦電影來說不是很嚴格,單純的使用其他用戶的電影評分數量和評分高低與本用戶的數據做比對,並對每個用戶計算其推薦指數:

例如: 我看了 {film1:打分5,film2:打分8}。而user1也看了這兩部電影,這時user1的推薦指數的計算就涉及到兩個標准:

(1)看過相同的電影數量:比如每部+1分,存入新定義的字典中,字典格式 key:value:{用戶:分數}

(2)相同電影的打分情況:各部電影分數方差的倒數(要考慮到完全相同,方差為0的情況)(用條件語句就可以解決)

綜上,哪個用戶的最終得分高,就推薦哪個用戶看過的電影(而且是被推薦電影的用戶沒看過的電影)

以上只是python課堂的一個小作業,還待改進


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM