常用的下面一些距離計算方式
- 歐式距離(Euclidean Distance)
- 餘弦相似度(Cosine)
- 皮爾遜相關係數(Pearson)
- 修正餘弦相似度(Adjusted Cosine)
- 漢明距離(Hamming Distance)
- 曼哈頓距離(Manhattan Distance)
1.歐式距離(Euclidean Distance)
歐式距離全稱是歐幾裏距離,是最易於理解的一種距離計算方式,源自歐式空間中兩點間的距離公式。
公式:
2.餘弦相似度(Cosine)
首先,樣本數據的夾角餘弦並不是真正幾何意義上的夾角餘弦,只不過是借了它的名字,實際是借用了它的概念變成了是代數意義上的“夾角餘弦”,用來衡量樣本向量間的差異。夾角越小,餘弦值越接近於1,反之則趨於-1。我們假設有x1與x2兩個向量:
歐式距離和夾角餘弦的區別:
對比以上的結果的 dataA 與 dataB 這兩組數據,會發現 dataA 與 dataB 的歐式距離相似度比較小,而夾角餘弦相似度比較大,即夾角餘弦更能反映兩者之間的變動趨勢,兩者有很高的變化趨勢相似度,而歐式距離較大是因爲兩者數值有很大的區別,即兩者擁有很高的數值差異。
3.皮爾遜相關係數(Pearson)
公式:
皮爾遜相關係數公式實際上就是在計算夾角餘弦之前將兩個向量減去各個樣本的平均值,達到中心化的目的。從知友的回答可以明白,皮爾遜相關函數是餘弦相似度在維度缺失上面的一種改進方法。
4.修正餘弦相似度(Adjusted Cosine)
爲什麼要修正餘弦相似度?
X和Y兩個用戶對兩個內容的評分分別爲(1,2)和(4,5),使用餘弦相似度得到的結果是0.98,兩者極爲相似。但從評分上看X似乎不喜歡2這個 內容,而Y則比較喜歡,餘弦相似度對數值的不敏感導致了結果的誤差,需要修正這種不合理性.
公式:
其中a是x的均值,其實這個修正公式也有點不太理解,歡迎補充評論。
代碼:
# 修正餘弦相似度
# 修正cosine 減去的是對item i打過分的每個user u,其打分的均值
data = np.mat([[1,2,3],[3,4,5]])
avg = np.mean(data[:,0]) # 下標0表示正在打分的用戶
def AdjustedCosine(dataA,dataB,avg):
sumData = (dataA - avg) * (dataB - avg).T # 若列爲向量則爲 dataA.T * dataB
denom = np.linalg.norm(dataA - avg) * np.linalg.norm(dataB - avg)
return 0.5 + 0.5 * (sumData / denom)
print(AdjustedCosine(data[0,:],data[1,:],avg))
5.漢明距離(Hamming Distance)
漢明距離表示的是兩個字符串(相同長度)對應位不同的數量。比如有兩個等長的字符串 str1 = "11111" 和 str2 = "10001" 那麼它們之間的漢明距離就是3(這樣說就簡單多了吧。哈哈)。漢明距離多用於圖像像素的匹配(同圖搜索)。
6.曼哈頓距離(Manhattan Distance)
兩個向量相減的1範數。
代碼:
# 曼哈頓距離(Manhattan Distance)
def Manhattan(dataA,dataB):
return np.sum(np.abs(dataA - dataB))
print(Manhattan(dataA,dataB))
參考: