计算两个配置文件之间的共同特征数量的相似性

时间:2015-05-04 07:19:30

标签: machine-learning cluster-analysis similarity unsupervised-learning

我正在研究社交网络配置文件的群集问题,每个配置文件都由配置文件描述中“关注期限发生”的次数表示。为了有效地进行聚类,我试图在两个配置文件之间找到正确的相似性度量(或距离函数)。

所以我要说下面有个人资料表

            basketball  cricket python
profile1        4           2     1
profile2        2           1     3
profile3        2           1     0

现在,通过计算欧氏距离,我得到了

distance (profile1,profile2) = 3
distance (profile2,profile3) = 3
distance (profile3,profile1) = 2.45

现在,这很好,但我脑子里有两个问题

这里我们忽略了常见的功能数量,例如,即使配置文件1和配置文件3最接近,按照人类的直觉,配置文件1和配置文件2至少在所有三种兴趣中都有一些价值 - 篮球,板球和python因此这两个配置文件可能更相似,而不是配置文件1和配置文件3,其中其中一个(配置文件3)没有提到配置文件中的python。我也不想只计算相似的距离特征,这肯定会产生错误的结果。

我的第一个问题 - 我有什么方法可以通过任何既定的方式来适应这种直觉?

我的第二个问题 - 可能有些个人资料作者比其他人更冗长,如何调整?因为有4次出现python的配置文件的详细作者可能与较少详细的作者2出现的python相同。

我无法为这个问题提出好的头衔。很抱歉,如果它令人困惑。

1 个答案:

答案 0 :(得分:1)

首先,像您一样计算您的个人资料。那么关键的一步将是某种规范化。您可以将数字除以总数,以便数字总和为1,或者您可以将它们除以欧几里德范数,以便它们具有欧几里德范数1.

例如,使用sum normalization,第一个配置文件将变为(舍入)

0.57, 0.29, 0.14

并使用欧几里德标准化,它将成为

0.87, 0.44, 0.22

这将确保所有配置文件都表示在相同的数字范围内,并将照顾"过于冗长的配置文件作者"。

下面是一个示例IPython会话,它显示了如何按行总和来规范化行以及如何计算规范化行之间的欧几里德距离。您将看到,在规范化之后,配置文件1和3可以更加接近,正如您所期望的那样。

In [22]: p = array([[4,2,1],[2,1,3],[2,1,0]])

In [23]: p
Out[23]: 
array([[4, 2, 1],
       [2, 1, 3],
       [2, 1, 0]])

In [24]: p = p / p.sum(axis=1)[:,newaxis]

In [25]: p
Out[25]: 
array([[ 0.57142857,  0.28571429,  0.14285714],
       [ 0.33333333,  0.16666667,  0.5       ],
       [ 0.66666667,  0.33333333,  0.        ]])

In [26]: p.sum(axis=1)
Out[26]: array([ 1.,  1.,  1.])

In [27]: norm(p[0] - p[1])   # distance 1-2
Out[27]: 0.44543540318737401

In [28]: norm(p[0] - p[2])   # distance 1-3
Out[28]: 0.17817416127494959

In [29]: norm(p[1] - p[2])   # distance 2-3
Out[29]: 0.62360956446232352

最后,如果你想更多地考虑一个配置文件是否提到了一个兴趣,而不是更频繁地提到它的频率,你可以在规范化之前做一个额外的步骤:简单地为每一个计算pow(x, alpha)您的个人资料向量的元素x,其中alpha是介于0和1之间的参数。这里,1表示与之前一样的标准线性加权,并且当您使alpha接近0时,它表示仅提及兴趣很重要,而不是经常。例如,使用alpha = 0.5(取配置文件的平方根),我们得到:

In [32]: p = array([[4,2,1],[2,1,3],[2,1,0]])

In [33]: p = sqrt(p)

In [34]: p
Out[34]: 
array([[ 2.        ,  1.41421356,  1.        ],
       [ 1.41421356,  1.        ,  1.73205081],
       [ 1.41421356,  1.        ,  0.        ]])

In [35]: p = p / p.sum(axis=1)[:,newaxis]

In [37]: norm(p[0] - p[1])   # distance 1-2
Out[37]: 0.2353133053319465

In [38]: norm(p[0] - p[2])   # distance 1-3
Out[38]: 0.27881275777438091

In [39]: norm(p[1] - p[2])   # distance 2-3
Out[39]: 0.51412606310632747

现在,配置文件1和2是最接近的匹配,因为我们更加强调他们都提到Python的事实,而不是他们提到它的频率。