Python用戶推薦系統(tǒng)曼哈頓算法實(shí)現(xiàn)完整代碼
出租車幾何或曼哈頓距離(Manhattan Distance)是由十九世紀(jì)的赫爾曼·閔可夫斯基所創(chuàng)詞匯 ,是種使用在幾何度量空間的幾何學(xué)用語,用以標(biāo)明兩個(gè)點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對軸距總和。
圖中紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離,而藍(lán)色和黃色代表等價(jià)的曼哈頓距離。曼哈頓距離——兩點(diǎn)在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|。對于一個(gè)具有正南正北、正東正西方向規(guī)則布局的城鎮(zhèn)街道,從一點(diǎn)到達(dá)另一點(diǎn)的距離正是在南北方向上旅行的距離加上在東西方向上旅行的距離,因此,曼哈頓距離又稱為出租車距離。曼哈頓距離不是距離不變量,當(dāng)坐標(biāo)軸變動(dòng)時(shí),點(diǎn)間的距離就會(huì)不同。曼哈頓距離示意圖在早期的計(jì)算機(jī)圖形學(xué)中,屏幕是由像素構(gòu)成,是整數(shù),點(diǎn)的坐標(biāo)也一般是整數(shù),原因是浮點(diǎn)運(yùn)算很昂貴,很慢而且有誤差,如果直接使用AB的歐氏距離(歐幾里德距離:在二維和三維空間中的歐氏距離的就是兩點(diǎn)之間的距離),則必須要進(jìn)行浮點(diǎn)運(yùn)算,如果使用AC和CB,則只要計(jì)算加減法即可,這就大大提高了運(yùn)算速度,而且不管累計(jì)運(yùn)算多少次,都不會(huì)有誤差。
Python用戶推薦系統(tǒng)曼哈頓算法實(shí)現(xiàn)
#-*- coding: utf-8 -*- import codecs from math import sqrt users = {"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes": 2.5, "Vampire Weekend": 2.0}, "Bill":{"Blues Traveler": 2.0, "Broken Bells": 3.5, "Deadmau5": 4.0, "Phoenix": 2.0, "Slightly Stoopid": 3.5, "Vampire Weekend": 3.0}, "Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0, "Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5, "Slightly Stoopid": 1.0}, "Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0, "Deadmau5": 4.5, "Phoenix": 3.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 2.0}, "Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0, "Norah Jones": 4.0, "The Strokes": 4.0, "Vampire Weekend": 1.0}, "Jordyn": {"Broken Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0, "Phoenix": 5.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 4.0}, "Sam": {"Blues Traveler": 5.0, "Broken Bells": 2.0, "Norah Jones": 3.0, "Phoenix": 5.0, "Slightly Stoopid": 4.0, "The Strokes": 5.0}, "Veronica": {"Blues Traveler": 3.0, "Norah Jones": 5.0, "Phoenix": 4.0, "Slightly Stoopid": 2.5, "The Strokes": 3.0} } # Python計(jì)算曼哈頓距離 www.iplaypy.com def manhattan(rate1,rate2): distance = 0 commonRating = False for key in rate1: if key in rate2: distance+=abs(rate1[key]-rate2[key]) commonRating=True if commonRating: return distance else: return -1 # python返回最近距離用戶 def computeNearestNeighbor(username,users): distances = [] for key in users: if key<>username: distance = manhattan(users[username],users[key]) distances.append((distance,key)) distances.sort() return distances #推薦python實(shí)現(xiàn) def recommend(username,users): #獲得最近用戶的name nearest = computeNearestNeighbor(username,users)[0][1] recommendations =[] #得到最近用戶的推薦列表 neighborRatings = users[nearest] for key in neighborRatings: if not key in users[username]: recommendations.append((key,neighborRatings[key])) recommendations.sort(key=lambda rat:rat[1], reverse=True) return recommendations if __name__ == '__main__': print recommend('Hailey', users)
總結(jié)
以上就是本文關(guān)于Python用戶推薦系統(tǒng)曼哈頓算法實(shí)現(xiàn)完整代碼的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
python項(xiàng)目對接釘釘SDK的實(shí)現(xiàn)
這篇文章主要介紹了python項(xiàng)目對接釘釘SDK的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07django框架使用orm實(shí)現(xiàn)批量更新數(shù)據(jù)的方法
這篇文章主要介紹了django框架使用orm實(shí)現(xiàn)批量更新數(shù)據(jù)的方法,結(jié)合實(shí)例形式簡單分析了Django基于orm操作數(shù)據(jù)庫更新數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-06-06Python實(shí)現(xiàn)的文本簡單可逆加密算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的文本簡單可逆加密算法,結(jié)合完整實(shí)例形式分析了Python自定義加密與解密算法具體實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-05-05使用Python制作一個(gè)極簡四則運(yùn)算解釋器
這篇文章主要介紹了使用Python制作一個(gè)極簡四則運(yùn)算解釋器,在使用工具之前,至少也要了解工具的作用,需要的朋友可以參考下2023-04-04教你使用Python寫一個(gè)簡單的JSONParser
這篇文章主要介紹了教你使用Python寫一個(gè)簡單的JSONParser,它的整個(gè)效果,有點(diǎn)類似于 python 標(biāo)準(zhǔn)庫 json 的 json.load() 方法,需要的朋友可以參考下2023-04-04