基於餘弦定理計算相似度的應用很多,比如推薦系統中的協同過濾,計算文字的相似性等等。它用計算兩者空間向量的夾角來表示兩者的相似性。
先看一下餘弦定理的公式: wu
v=∑u
ivi∑
u2i‾
‾‾‾‾
‾√∑v
2i‾‾
‾‾‾‾
√ 上訴公式表示uv兩者的相似度,ui表示u在i緯度的數值。
在使用者行為資料(使用者只有操作和未操作兩種狀態,也就是0,1)中公式可以表示為: wu
v=|n
(u)⋂
n(v)
||n(
u)||
n(v)
|‾‾‾
‾‾‾‾
‾‾‾‾
‾√我們預設資料是使用者行為資料,如使用者a操作了物品a表示為:a a
我們的資料來源是log日誌:
a aa c
b cb b
c a把資料整理成乙個user_item表
a a c
b c b
c a我們發現這個矩陣是稀疏的,如果兩兩算相似性,有操作交集是0的情況,複雜度太高。可以換一種思路,現求得交集不為零的使用者對,再除以公式的分母。,這就需要乙個倒排表了。
a a c
c a b
b b下面是python實現的例子,輸入的是使用者行為資料
(a,a),
(a ,c),
(b, c),
(b, b),
(c, a)
import math
defusersimilarity
(train):
user_item=dict()
item_user=dict()
n=dict()
for line in train:
u=line[0]
i=line[2]
if u not
in user_item:
user_item[u]=set()
user_item[u].add(i)
if u not
in n:
n[u]=0
n[u]+=1
if i not
in item_user:
item_user[i]=set()
item_user[i].add(u)
c=dict()
for u in user_item:
c[u]=dict()
for i in user_item[u]:
for v in item_user[i]:
if u==v:
continue
c[u][v]+=1
for u in c:
for v in c[u]:
c[u][v]=c[u][v]/math.sqrt(n[u]*n[v])
return c
余弦相似度
余弦距離 歐氏距離和傑卡德相似性度量的對比分析 1 余弦距離 余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。向量,是多維空間中有方向的線段,如果兩個向量的方向一致,即夾角接近零,那麼這兩個向量就相近。而要確定兩個向量方向是否一致,這就要用到餘弦定理...
余弦相似度
余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。公式如下 python實現如下 import numpy as np from scipy.spatial.distance i...
余弦相似度及基於python的余弦相似度實現
余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。對於兩個向量,可以想象成空間中的兩條線段,都是從原點 0,0,出發,指向不同的方向。兩條線段之間形成乙個夾角 如果夾角為0度,則意味著方向相同 線段重合 如果夾角為90度,意味著形成直角,方向完全不相似 如果夾角為180...