【Educoder数据挖掘实训】用广义Jaccard系数计算相似度
开挖!!!!
相似度就是比较两个事物的相似性。一般通过计算事物的特征之间的距离,如果距离小,那么相似度大;如果距离大,那么相似度小。比如两种水果,将从颜色,大小,维生素含量等特征进行比较相似性。
这里的相似度有点类似于我们之前提到过用值域法筛选异常值时候的参数,当然还是有很大区别的。
首先介绍
J
a
c
c
a
r
d
Jaccard
Jaccard系数。
对于两个特征向量
A
,
B
A,B
A,B,定义
F
x
y
F_{xy}
Fxy为同位置下
A
A
A为
x
x
x且
B
B
B为
y
y
y的数量。
定义
A
B
AB
AB的相似度
s
=
F
00
+
F
11
F
00
+
F
01
+
F
10
+
F
11
s = \frac{F_{00}+F_{11}}{F_{00}+F_{01}+F_{10}+F_{11}}
s=F00+F01+F10+F11F00+F11。
对于集合来讲,两个集合
x
,
y
x,y
x,y的相似度
s
=
∣
x
∩
y
∣
∣
x
∪
y
∣
s = \frac{|x\cap y|}{|x \cup y|}
s=∣x∪y∣∣x∩y∣。
对于广义
J
a
c
c
a
r
d
Jaccard
Jaccard系数,其不同点在于可能不止二值,可能是整数集或者实数集。
那么我们定义为
E
j
(
x
,
y
)
=
x
y
∣
∣
x
∣
∣
2
+
∣
∣
y
∣
∣
2
−
x
y
E_j(x,y) = \frac{xy}{||x||^2+||y||^2-xy}
Ej(x,y)=∣∣x∣∣2+∣∣y∣∣2−xyxy。
代码实现就比较容易了
###-----------编写代码实现广义Jaccard系数的计算----------
def sim_tonimoto(user1, user2):
common = 0
#1.判断有没有相同的数据, 没有相同数据则返回0
################# Begin #################
for i in user1 :
if i in user2 :
common += 1
################# End #################
if common == 0:
return 0
common_num = common
user1_num = len(user1)
user2_num = len(user2)
#2.广义Jaccard系数计算
################# Begin #################
res = common_num / (user1_num + user2_num - common_num)
################# End #################
return res
a = [10,20,30] #输入数据1
b = [10,0,30] #输入数据2
#3.调用自己实现的sim_tonimoto函数
################# Begin #################
result = sim_tonimoto(a, b)
################# End #################
print(result) #输出相似度