1. 程式人生 > >歐幾里得距離評價(Python3.x程式碼實現)

歐幾里得距離評價(Python3.x程式碼實現)

1.定義

歐幾里得度量(euclidean metric)(也稱歐氏距離)是一個通常採用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離。

2.公式

3.注意事項

(1)因為計算是基於各維度特徵的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,比如對身高(cm)和體重(kg)兩個單位不同的指標使用歐式距離可能使結果失效。

(2)歐幾里得距離是資料上的直觀體現,看似簡單,但在處理一些受主觀影響很大的評分資料時,效果則不太明顯;比如,U1對Item1,Item2 分別給出了2分,4分的評價;U2 則給出了4分,8分的評分。通過分數可以大概看出,兩位使用者褒Item2 ,貶Item1,也許是性格問題,U1 打分更保守點,評分偏低,U2則更粗放一點,分值略高。在邏輯上,是可以給出兩使用者興趣相似度很高的結論。如果此時用歐式距離來處理,得到的結果卻不盡如人意。即評價者的評價相對於平均水平偏離很大的時候,歐幾里德距離不能很好的揭示出真實的相似度。

4.程式碼實現

(1)資料集程式碼

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}}  

(2)演算法實現

import recommenfations
from math import sqrt


# 返回一個有關於person1和person2的基於距離的相似度評價
def sim_distance(prefs, person1, person2):
    # 得到兩個使用者共同評價的物品
    share_items = {}
    for item in prefs[person1]:
        if item in prefs[person2]:
            share_items[item] = 1
    # for key, value in share_items.items():
        # print(key + "-----" + str(value))
    
    # 如果兩者沒有共同之處,則返回0
    if len(share_items) == 0:
        return 0

    # 計算所有差值的平方和
    sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2)
                        for item in prefs[person1] if item in prefs[person2]])
    # for item in prefs[person1]:
        # if item in prefs[person2]:
            # print("person1:", prefs[person1][item])
            # print("person2:", prefs[person2][item])
    
    return 1/(1 + sqrt(sum_of_squares))

(3)測試程式碼

num = sim_distance(recommenfations.critics, 'Lisa Rose', 'Gene Seymour')
print(num)

輸出結果為0.29429805508554946.