包含混合数据类型(离散和连续)的向量的相似性度量

时间:2012-12-23 06:36:36

标签: analytics computational-geometry similarity

我有一组向量,每个向量都包含文本和数字元素。我正在寻找这些载体的相似性度量,如果可能的话,他们实现的框架。任何帮助非常感谢。

2 个答案:

答案 0 :(得分: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:重新缩放数据(例如,以均值为中心和单位方差)

用于合成数据的随机生成的2D数组:

     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

答案 1 :(得分:0)

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

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

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

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

相关问题