Skip to main content
 首页 » 编程设计

python之假设我有 2 个向量。我可以使用什么算法来比较它们

2025年05月04日16qq78292959

公司 1 有这个向量:

['books','video','photography','food','toothpaste','burgers'] ... ... 

公司 2 有这个向量:

['video','processor','photography','LCD','power supply', 'books'] ... ... 

假设这是一个频率分布(我可以把它做成一个元组,但输入太多)。
如您所见...这些向量有重叠的部分。 “视频”和“摄影”在两个向量之间似乎是“相似的”,因为它们处于相似的位置。而且...“书籍”显然是公司 1 的强项。 排序和定位确实很重要,因为这是一种频率分布。

您可以使用什么算法来解决这个问题?使用这些向量,您可以使用哪些算法为这些公司提供有值(value)的数据?

我不熟悉文本挖掘和信息检索。有人可以指导我了解与这个问题相关的主题吗?

请您参考如下方法:

如果位置非常重要,正如您所强调的,那么关键指标将基于不同向量中相同项目之间的位置差异(例如,您可以对差异的绝对值求和,或者它们的正方形)。需要解决的大问题是——在一个向量中存在(比如第 N 个)而在另一个向量中完全不存在的项目的权重是多少。这是一个相对较小的问题——例如,就好像丢失的元素实际上是在实际元素之后出现的——还是一个非常、非常大的问题?如果不进一步了解实际应用领域,就不可能这么说。你可以尝试各种方法来处理这个问题,看看他们在你关心的示例案例中给出了什么结果!

例如,假设“丢失的元素与存在的元素大致相同,就在实际元素之后”。然后,您可以将每个输入向量预处理为字典映射项以定位(如果您必须比较多对输入向量,则至关重要的优化!):

def makedict(avector): 
  return dict((item, i) for i, item in enumerate(avector)) 

然后,比较两个这样的指令:

def comparedicts(d1, d2): 
  allitems = set(d1) | set(d2)       
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems] 
  return sum(d * d for d in distances) 

(或者,abs(d) 而不是最后一个语句中的平方)。为了使丢失的项目更重(使 dicts,即向量,被认为更远),您可以使用两倍的长度而不是仅仅长度,或者在其他类似结构的程序中使用一些大常数,例如 100。