我有一组向量,每个向量都包含文本和数字元素。我正在寻找此类向量的相似性度量,并在可能的情况下寻找它们实现的框架。非常感谢任何帮助。
2 回答
对我来说,这是一个数据建模问题,而不是寻找合适的相似度指标。
例如,您可以使用欧几里得距离,前提是您
重新调整您的数据(例如,以均值为中心和单位方差);和
重新编码“文本”元素(我假设您的意思是离散变量,例如存储性别为男性和女性值的字段)
例如,想象一个由数据向量组成的数据集,每个数据向量具有四个特征(列或字段):
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
文本数据的一个很好的度量是Levenshtein 距离(或编辑距离),它计算您应该更改多少字符串以获取另一个字符串。以一种计算量较小的方式,汉明距离提供了类似的度量,但要求字符串具有相同的大小。将字母转换为它们的 ASCII 表示不太可能给出相关结果(或者这取决于您的应用程序和您对距离的使用):“Z”更接近“S”还是“A”?
结合数值数据的欧几里得距离(如果您希望它们位于欧几里德平面内……如果它们表示地球上的坐标、角度等,则可能不是这种情况),您可以对所有平方进行求和和加权距离以获得最终度量。例如,您将得到 d(A,B) = sqrt( weight1*Levenshtein(textA, textB)^2 + weight2*Euclidean(numericA, numericB)^2)
现在出现了如何设置这些权重的问题。例如,如果您正在测量以公里为单位的微小数字数据,并且您使用非常长的字符串计算编辑距离,则数字数据几乎无关紧要,因此您需要更多地权衡它们。这是特定领域的,只有您可以根据您的数据和应用程序选择此类权重。
最后,一切都取决于您未指定的应用程序,以及您未提及它们所代表的数据。一个应用程序可以构建一个加速结构——在这种情况下,任何不太愚蠢的度量都可以工作(包括将字母转换为 ASCII 数字);或者可能是查询数据库或显示这些点,这更重要。对于您的数据,数字数据可以表示平面或地球上的坐标(这会改变度量),而文本数据可以是单个字母,您想检查它与另一个字母的相似程度,或完整的可能与另一个文本相差几个字母的文本......如果没有更精确,很难分辨。