我有一组向量,每个向量都包含文本和数字元素。我正在寻找这些载体的相似性度量,如果可能的话,他们实现的框架。任何帮助非常感谢。
答案 0 :(得分:3)
对我来说,这是一个数据建模问题,而不是找到适当的类似度量标准。
例如,如果你
,你可以使用 欧几里德距离重新调整您的数据(例如,以平均为中心和单位差异);以及
重新编码“文本”元素(我假设你的意思是离散变量,例如存储性别与男性和女性价值的字段)
minutes_per_session, sessions_per_week, registered_user, sex
前两个是连续(又称“数字”)变量 - 即正确的值是12.5,4.7等等。
后两个是离散的,显然需要转换。
常见的技术是将每个离散特征重新编码为一系列特征,一旦为该特征记录每个值的特征(并且其中每个特征都被赋予该原始特征的值的名称)。
因此,存储每个用户的性别的单个列可能具有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]
用于合成数据的随机生成的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数字);或者它可能是查询数据库或显示这些点,为此更重要。对于您的数据,数字数据可以表示平面上或地球上的坐标(这会改变指标),文本数据可以是一个单个字母,您要检查它与另一个相似多少,或者一个完整的可以通过几个字母关闭到另一个文本的文本...没有更多的精确度,很难分辨。