當前位置:
首頁 > 知識 > SlopOne推薦演算法(附Python源碼)

SlopOne推薦演算法(附Python源碼)



微信公眾號


關鍵字

全網搜索最新排名


【機器學習演算法】:排名第一


【機器學習】:排名第二


【Python】:排名第三


【演算法】:排名第四








SlopOne是一個非常簡單的協同過濾演算法。他的基本思想非常簡單,如果用戶u已經對物品j打過分,現在對物品i進行打分,那麼只需要計算出同時對物品i和物品j打分的用戶中他們分數之差的平均,那麼我們就可以根據這個分數之差來計算用戶u對物品i的打分了,當然,這樣的物品j也有很多歌,有的物品和j共同大份的用戶比較少,有的比較多,那麼顯而易見的是共同打分多的那個物品在評分是所佔的比重應該大一些。舉個例子,如下圖所示





現在要預測Lucy對Item1的評分。首先可以知道用戶Lucy對Item2和Item3打過分,現在計算Item1和Item2的平均差值,即((5-3)+(3-4))/2 = 0.5,在計算Item1和Item3的平均差值,即5-2 = 3,那麼根據Item1和Item2的平均差值來看Lucy對Item1的評分可能為2+0.5 = 2.5,同時根據Item1和Item3的平均差值Lucy對Item1的評分可能為5+3=8,最終用戶Lucy對Item1的評分為(2.5*2+8*1)/(2+1)=13/3=4.33。




使用movielens數據


鏈接:https://grouplens.org/datasets/movielens/




Python代碼如下


#coding:utf-8


import re


import math




#讀取數據,並生成矩陣


def getMatrix():


mat = {}

f = open("u.data", "r")


for line in f:


list = map(int, line.strip("
").split(" "))


if list[0] in mat:


mat[ list[0] ][ list[1] ] = list[2]


else:


mat[ list[0] ] = { list[1] : list[2] }


f.close()


return mat



#計算某個用戶的平均分


def getAvg(usr):


res = 0.0


for i in usr:


res += usr[i]


return res / len(usr)




#預測分數, 返回矩陣mat中用戶usr對item的評分


def getSlopOne(mat, user, item):

#用戶user的所有item的列表


list = mat[user]


#分子


mole = 0.0


#分母


demo = 0.0


#對於每一個物品,都計算它和物品item的差值,最終算出相對它item的score


for it in list:


diff_sum = 0.0


user_num = 0


for us in mat:


us_it = mat[us]


#如果該user同時評價過這兩個item,則採納他的評分


if item in us_it and it in us_it:


diff_sum += us_it[item] - us_it[it]


user_num += 1


#如果item被人評價過


if user_num:


diff_avg = diff_sum / user_num


mole += (list[it] + diff_avg) * user_num


demo += user_num


#如果沒有人評價過,則取這個人的平均分


if user_num == 0:


return getAvg(list)


#否則返回最終的score


return mole / demo



def main():


mat = getMatrix()


rf = open("u.data", "r")


wf = open("o.data", "w")


for line in rf:


list = map(int, line.strip("
").split(" "))


score = getSlopOne(mat, list[0], list[1])


output = str(list[0]) + " " + str(list[1]) + " " + str(list[2]) + " " + str(score) + "
"


wf.write(output)


rf.close()


wf.close()




if __name__ == "__main__":


main()








投稿、商業合作


請發郵件到:357062955@qq.com


更多精彩請閱讀原文



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python到底是不是數據分析最好的語言?聽聽這位大神怎麼說...
蝸牛般的 Python 深拷貝:為了 1% 情形,犧牲 99% 情形下的性能
學習Python編程的19個資源
用Python支持 7 億月活用戶的應用?Instagram 是這樣實現的
是Python新手應該可以注意一下

TAG:Python |

您可能感興趣

演算法:Sums In A Triangle
Bayesian Personalized Ranking 演算法解析及Python實現
dijkstra演算法O(n2) 堆優化O(nlogn)
IPFS&FileCoin-PoRep和PoSt演算法
書評:《演算法之美( Algorithms to Live By )》
一文讀懂物體分類AI演算法:LeNet-5 AlexNet VGG Inception ResNet MobileNet
華為、MIT韓松論文;DeepMind開源OpenSpiel;目標檢測演算法全面綜述
超越MnasNet、Proxyless:小米開源全新神經架構搜索演算法FairNAS
用Python 實現的機器人演算法示例集合——PythonRobotics
Machine Learning:十大機器學習演算法
Tile-based Optical Flow 演算法流程與基本思想
Google前AI主管John Giannandrea進入蘋果 改進Siri演算法
Adaboost演算法及python實戰
Facebook開源「Detectron」,用於AR研究的計算機視覺演算法!
Python LZW 演算法
測試Apache使用Openssl及修改Openssl加密演算法執行順序
利用搖滾樂隊學習TensorFlow,Word2Vec模型和TSNE演算法
加速AR對象分類,Facebook開源計算機視覺演算法Detectron
Facebook開源適用於VR的動態模糊AI演算法:DeepFocus
一文讀懂進化演算法Evolutionary Algorithm簡介