4

我有一组向量,每个向量都包含文本和数字元素。我正在寻找此类向量的相似性度量,并在可能的情况下寻找它们实现的框架。非常感谢任何帮助。

4

2 回答 2

3

对我来说,这是一个数据建模问题,而不是寻找合适的相似度指标。

例如,您可以使用欧几里得距离,前提是您

  • 重新调整您的数据(例如,以均值为中心和单位方差);和

  • 重新编码“文本”元素(我假设您的意思是离散变量,例如存储性别为男性和女性值的字段)

例如,想象一个由数据向量组成的数据集,每个数据向量具有四个特征(列或字段):

minutes_per_session, sessions_per_week, registered_user, sex

前两个是连续的(又名“数字”)变量——即,正确的值是 12.5、4.7 等等。

后两个是离散的,显然需要转换。

第 1 步:重新编码离散变量

常用的技术是将每个离散特征重新编码为一系列特征,一个特征对应于为该特征记录的每个值(并且其中每个特征都被赋予该原始特征的值的名称)。

因此,存储每个用户的性别的单个列可能具有 M 和 F 的值,这将被转换为两个特征(字段或列),因为性别有两个可能的值。

所以用户性别的值列:

 ['M']
 ['M']
 ['F']
 ['M']
 ['M']
 ['F']
 ['F']
 ['M']
 ['M']
 ['M']

变成两列

[1, 0]
[1, 0]
[0, 1]
[1, 0]
[1, 0]
[0, 1]
[0, 1]
[1, 0]
[1, 0]
[1, 0]

第 2 步:重新缩放数据(例如,以均值为中心和单位方差)

用于合成数据的随机生成的二维数组:

     array([[ 3.,  5.,  2.,  4.],
            [ 9.,  2.,  0.,  8.],
            [ 5.,  1.,  8.,  0.],
            [ 9.,  9.,  7.,  4.],
            [ 3.,  1.,  6.,  2.]])

for each column: calculate the mean
then subtract the mean from each value in that column:

>>> A -= A.mean(axis=0)
>>> A
      array([[-2.8,  1.4, -2.6,  0.4],
             [ 3.2, -1.6, -4.6,  4.4],
             [-0.8, -2.6,  3.4, -3.6],
             [ 3.2,  5.4,  2.4,  0.4],
             [-2.8, -2.6,  1.4, -1.6]])

for each column:now calculate the *standard deviation*
then divide each value in that column by this std:

>>> A /= A.std(axis=0)

verify:

>>> A.mean(axis=0)
      array([ 0., -0.,  0., -0.])

>>> A.std(axis=0)
      array([ 1.,  1.,  1.,  1.])

所以由四列组成的原始数组现在有六列;成对相似度可以通过欧几里得距离来衡量,如下所示:

take the first data vectors (rows):
>>> v1, v2 = A1[:2,:]

欧几里得距离,对于 2 特征空间:

dist = ( (x2 - x1)**2 + (y2 - y1)**2 )**0.5

>>> sm = NP.sum((v2 - v1)**2)**.5
>>> sm
      3.79
于 2012-12-23T07:57:05.483 回答
0

文本数据的一个很好的度量是Levenshtein 距离(或编辑距离),它计算您应该更改多少字符串以获取另一个字符串。以一种计算量较小的方式,汉明距离提供了类似的度量,但要求字符串具有相同的大小。将字母转换为它们的 ASCII 表示不太可能给出相关结果(或者这取决于您的应用程序和您对距离的使用):“Z”更接近“S”还是“A”?

结合数值数据的欧几里得距离(如果您希望它们位于欧几里德平面内……如果它们表示地球上的坐标、角度等,则可能不是这种情况),您可以对所有平方进行求和和加权距离以获得最终度量。例如,您将得到 d(A,B) = sqrt( weight1*Levenshtein(textA, textB)^2 + weight2*Euclidean(numericA, numericB)^2)

现在出现了如何设置这些权重的问题。例如,如果您正在测量以公里为单位的微小数字数据,并且您使用非常长的字符串计算编辑距离,则数字数据几乎无关紧要,因此您需要更多地权衡它们。这是特定领域的,只有您可以根据您的数据和应用程序选择此类权重。

最后,一切都取决于您未指定的应用程序,以及您未提及它们所代表的数据。一个应用程序可以构建一个加速结构——在这种情况下,任何不太愚蠢的度量都可以工作(包括将字母转换为 ASCII 数字);或者可能是查询数据库或显示这些点,这更重要。对于您的数据,数字数据可以表示平面或地球上的坐标(这会改变度量),而文本数据可以是单个字母,您想检查它与另一个字母的相似程度,或完整的可能与另一个文本相差几个字母的文本......如果没有更精确,很难分辨。

于 2012-12-24T02:21:32.047 回答