1.在我們逛淘寶,亞馬遜桥滨,今日頭條的時(shí)候,往往你在買了一件東西以后,亞馬遜和淘寶都會(huì)給你推薦相似性的一些物品齐媒,今日頭條在你點(diǎn)擊對(duì)關(guān)于老司機(jī)的帖子感興趣的時(shí)候蒲每,就會(huì)把關(guān)于老司機(jī)的帖子推薦給你,這是很有意思的喻括。
2.推薦就分為了基于人的推薦和基于物品的推薦邀杏,基于物品的推薦就類似于我第一條寫的東西,當(dāng)你購買一件物品或者點(diǎn)擊一條新聞的時(shí)候双妨,就會(huì)推薦給你類似的東西』床現(xiàn)在我們來談?wù)勱P(guān)于人的推薦,協(xié)作型推薦刁品。當(dāng)你想看一部電影的時(shí)候泣特,最簡單的方式是什么呢?可以去豆瓣上面看一看評(píng)分挑随?如果沒有網(wǎng)怎么辦状您,那就吃飯的時(shí)候咨詢一下旁邊的朋友唄,如果你倆對(duì)一部或者多部已經(jīng)看過的影片聊得很來兜挨,那么他推薦給你的影片你有很大的可能性也愛看膏孟,這就是我們基于人的推薦,根據(jù)興趣差不多的人來看看他們還看過一些其他什么樣的影片拌汇,把他們覺得口碑很好的影片可以排個(gè)序柒桑,然后將最頂?shù)挠捌扑]給用戶就行了。
3.那么上面的過程是我們自己根據(jù)經(jīng)驗(yàn)來推想的場(chǎng)景噪舀,那么應(yīng)該怎么用計(jì)算機(jī)語言還有數(shù)學(xué)來描述這種現(xiàn)況呢魁淳?下面我們就來講解一下,我們有一些數(shù)據(jù)与倡,其中記錄了一些用戶對(duì)影片的評(píng)分界逛,那么我們?cè)趺磥砗饬浚男┯脩魰?huì)有一些比較相同的愛好呢纺座?所以息拜,為了解決這個(gè)問題我們又提出來了兩個(gè)方法來衡量這個(gè)問題,也就是來描述這個(gè)問題净响,其中一個(gè)叫做歐幾里得距離少欺,另外一個(gè)叫做皮爾遜相關(guān)系數(shù)。通過兩個(gè)數(shù)學(xué)方法來描述這個(gè)問題馋贤。
4.歐幾里得距離狈茉,我忘了我們是在初中還是高中學(xué)習(xí)過這個(gè)問題,不過我們當(dāng)時(shí)學(xué)習(xí)的是二維的掸掸,相信大家肯定也學(xué)習(xí)過氯庆,在一個(gè)二維的坐標(biāo)系中蹭秋,我們想要衡量兩個(gè)點(diǎn)的相距的距離,應(yīng)該怎么計(jì)算呢堤撵?應(yīng)該是d=√[(x1-x2)2+(y1-y2)2],這是二維坐標(biāo)系中的距離計(jì)算方法仁讨。剛剛我們知道我們現(xiàn)在的數(shù)據(jù)中里面是一個(gè)dict然后里面是人名對(duì)應(yīng)另外一個(gè)dict(電影對(duì)象:評(píng)分),我們將里面不同電影稱之為特征,然后我們就可以將其抽象成數(shù)據(jù)的維度实昨,當(dāng)然我們?cè)诔踔谢蛘吒咧械臅r(shí)候?qū)W過的只是最簡單的二維調(diào)用洞豁,所以我們可以將上述公式進(jìn)行擴(kuò)展,維度之間進(jìn)行相減之后然后求根荒给,這就變成了我們現(xiàn)在的歐幾里得距離的擴(kuò)展計(jì)算丈挟,適應(yīng)于多個(gè)維度之間的計(jì)算。這里面的話所對(duì)應(yīng)的維度當(dāng)然要相同志电,什么叫做所對(duì)應(yīng)的維度要相同呢曙咽?也就是對(duì)相同的電影進(jìn)行判斷,而不是對(duì)應(yīng)的順序來進(jìn)行判斷挑辆。
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 16 09:16:32 2016
@author: zhangxu
"""
critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,
'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,
'The Night Listener': 3.0},
'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,
'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,
'You, Me and Dupree': 3.5},
'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
'Superman Returns': 3.5, 'The Night Listener': 4.0},
'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
'The Night Listener': 4.5, 'Superman Returns': 4.0,
'You, Me and Dupree': 2.5},
'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,
'You, Me and Dupree': 2.0},
'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}
from math import sqrt
def calculateDistance(datas,person1,person2):
person1MovieDataSet = datas[person1]
person2MovieDataSet = datas[person2]
commonMovieNames = []
for movieName in person1MovieDataSet:
if movieName in person2MovieDataSet:
commonMovieNames.append(movieName)
if(len(commonMovieNames) == 0):
return 0
sum = 0.0
for movieName in commonMovieNames:
sum += pow(datas[person1][movieName] - datas[person2][movieName],2)
return 1/(1+sqrt(sum))
//給用戶進(jìn)行打分例朱,選擇推薦值最近的用戶
def topMatch(datas,other,top=1,fun=calculateDistance):
scores = [(fun(datas,person,other),person) for person in datas if person != other]
scores.sort()
scores.reverse()
return scores[0:top]
print topMatch(critics,'Lisa Rose',3)
print calculateDistance(critics,'Lisa Rose','Gene Seymour')