1.问题介绍
在基于标签的推荐系统中 ,经常需要选择一组标签作为用户画像,例如某人喜欢英国爱尔兰法国等国家的音乐,那么就可以为他打上一个“西欧音乐爱好者”的标签。
在相关资料中,有人提到利用最小描述长度MDL的方法来进行选择,例如肖仰华的《知识图谱概念与技术》。但是在这些资料中,对于具体做法并不明确。自己之前做的工作中,有涉及到标签选择的任务,因此这里分享一下自己对于MDL和标签选择理解,并结合一个与“国家”相关的案例做说明。
2.原理
在资料中,假设 C C C是要使用的标签组,X是一组实体,那么针对X,标签 C C C的编码长度由以下两部分构成:
M D L ( C , X ) = − l o g P ( C ) + ∑ x i ∈ x − l o g P ( x i ∣ C ) MDL(C,X)=-logP(C)+ \sum_{x_i \in x}-logP(x_i|C) MDL(C,X)=−logP(C)+xi∈x∑−logP(xi∣C)
其中第一部分是标签组
C
C
C的先验概率或信息量,第二部分
P
(
x
i
∣
C
)
P(x_i|C)
P(xi∣C)是给定实体
x
i
x_i
xi能够联想到标签C的概率,MDL的值越小,说明当前标签组C的信息量越多,并且越容易通过标签组C联想到实体组X,具体而言:
l
o
g
P
(
C
)
=
l
o
g
n
C
n
T
o
t
a
l
logP(C)=log\frac{n_{C}}{n_{Total}}
logP(C)=lognTotalnC
上面公式中, n ( C ) n_{(C)} n(C)表示当前标签C覆盖的关系数, n T o t a l n_{Total} nTotal表示总的关系数,
l
o
g
P
(
x
i
∣
C
)
=
l
o
g
n
x
i
n
C
logP(x_i|C)=log\frac{n_{x_i}}{n_{C}}
logP(xi∣C)=lognCnxi
上面公式中,
n
C
n_C
nC含义不变,仍表示当前标签C覆盖的关系数,而
n
x
i
n_{x_i}
nxi可以表示在关系
C
C
C下,
x
i
x_i
xi出现的总次数。
3.例子
下面举例说明,例如现在有200个国家,其中亚洲国家50个,东亚国家10个,西亚国家10个,中亚国家10个,东南亚20个。
例子1:
假设现在国家集合 X X X={中国,韩国,朝鲜,沙特,伊朗},候选标签组分别为 C 1 C_1 C1={亚洲}, C 2 C_2 C2={东亚,西亚}, C 2 C_2 C2={国家},简化起见,令 n x i n_{x_i} nxi均为1。按照常识,最合适的标签应该是 C 2 C_2 C2。
以标签 C 1 C_1 C1为例,
l o g P ( C ) = l o g n C n T o t a l = l o g ( 50 200 + 50 + 10 + 10 + 20 ) = l o g ( 50 300 ) logP(C)=log\frac{n_{C}}{n_{Total}} =log(\frac{50}{200+50+10+10+20} )=log(\frac{50}{300}) logP(C)=lognTotalnC=log(200+50+10+10+2050)=log(30050)
针对 x 1 x_1 x1=中国:
l o g P ( x i ∣ C 1 ) = l o g n x i n C = l o g 1 50 logP(x_i|C_1)=log\frac{n_{x_i}}{n_{C}}=log\frac{1}{50} logP(xi∣C1)=lognCnxi=log501
因此在给定 X X X和 C 1 C_1 C1的情况下,其MDL应为:
-math.log(50/300)+((-math.log(1/50))+(-math.log(1/50))+(-math.log(1/50))+(-math.log(1/50))+(-math.log(1/50)))
# 计算结果:MDL(C1,X)=21.351874496368783
同理,给定 X X X和 C 2 C_2 C2:
-math.log(10/300)+((-math.log(1/10))+(-math.log(1/10))+(-math.log(1/10)))-math.log(10/300)+(-math.log(1/10))+(-math.log(1/10))
# 计算结果:MDL(C2,X)=18.315320228294542
同理,给定 X X X和 C 3 C_3 C3:
-math.log(200/300)+((-math.log(1/200))+(-math.log(1/200))+(-math.log(1/200))+(-math.log(1/200))+(-math.log(1/200)))
# 计算结果:MDL(C3,X)=26.897051940848346
结合以上结果,应选择 C 2 C_2 C2={东亚,西亚}作为标签组,来描述 X X X={中国,韩国,朝鲜,沙特,伊朗},这符合实际感受。
例子2:
下面举例说明,例如现在有200个国家,其中亚洲国家50个,东亚国家10个,西亚国家10个,中亚国家10个,东南亚20个,欧洲、非洲、美洲国家各50个,
且国家集合 X X X={中国,韩国,美国,加拿大},为简化起见令 n x i n_{x_i} nxi均为1
则在标签组 C 1 C_1 C1={亚洲,美洲}, C 2 C_2 C2={东亚,美洲}, C 3 C_3 C3={东亚,美洲,欧洲}下,MDL值分别为:
-math.log(50/450)+(-(math.log(1/50))+(-math.log(1/50)))-math.log(50/450)+(-math.log(1/50)+math.log(1/50))
# 计算结果:C1=12.218495165528731
-math.log(10/450)+(-(math.log(1/10))+(-math.log(1/10)))-math.log(50/450)+(-math.log(1/50)+math.log(1/50))
# 计算结果:C2=10.609057253094631
-math.log(10/450)+(-(math.log(1/10))+(-math.log(1/10)))-math.log(50/450)+(-math.log(1/50)+math.log(1/50))+(-math.log(50/450))
# 计算结果C3=11.014522361202795
因此选择 C 2 C_2 C2={东亚,美洲}来解释 X X X={中国,韩国,美国,加拿大}。
例子3:
在例子2的基础上,假设现在有一个新的标签“亚洲工业强国”,并且中国,韩国与这个新概念高度相关,即前面两个例子提到的
n
x
i
n_{x_i}
nxi均不为1,假设分别为4,2,那么
C
4
C_4
C4={亚洲工业强国,美洲}下MDL的值为:
-math.log(10/450)+(-(math.log(4/10))+(-math.log(2/10)))-math.log(50/450)+(-math.log(1/50)+math.log(1/50))
# 计算结果 C4=8.529615711414795
说明概念 C 4 C_4 C4={亚洲工业强国,美洲},比概念 C 2 C_2 C2={东亚,美洲}更能解释国家集合 X X X={中国,韩国,美国,加拿大},
利用“亚洲工业强国”这个概念,更容易联想到“日本”这样的“工业强国”,而不是“香港”“澳门”这样的“金融城”。