机器学习:找到与查询向量最接近的结果

时间:2015-10-04 13:40:58

标签: python machine-learning scikit-learn supervised-learning

我有数以千计的向量,每个向量约有20个。

鉴于一个查询向量和一组潜在匹配,我希望能够选择最佳N匹配。

我花了几天时间尝试回归(使用SVM),使用我自己创建的数据集训练模型:每个向量是查询向量和结果向量的串联,我给出了一个分数(主观评估)0到1,0之间完美匹配,1表示最差匹配。

我没有取得很好的成绩,我相信有一个原因可能是主观上很难分配这些分数。另一方面,更容易的是主观地对结果进行排名(score是一个未知函数):

score(query, resultA) > score(query, resultB) > score(query, resultC)

所以我相信这更像Learning to rank的问题而且我找到了Python的各种链接:

但我无法理解它是如何运作的。我真的很困惑所有的术语,成对排名等...(请注意,我对机器学习一无所知,因此我感觉有点迷失)等......所以我不喜欢了解如何将此问题应用于我的问题。

有人可以帮助我澄清事情,指出我想解决的问题的确切类别,甚至更好的我如何用Python实现这一点(scikit-learn)?

1 个答案:

答案 0 :(得分:5)

在我看来,您要做的是简单地计算查询与其余数据之间的距离,然后将最接近的N个向量返回到查询中。这是一个搜索问题。 没有排序,您只需测量查询与数千个向量之间的距离"。最后,您对距离进行排序并获取最小的N值。这些对应于查询中最相似的N个向量。

为了提高比较效率,您可以使用KD-Trees或其他有效的搜索结构:http://scikit-learn.org/stable/modules/neighbors.html#kd-tree

然后,看看Lp空间的维基百科页面。在选择适当的指标之前,您需要考虑数据及其表示:

  1. 您使用的是哪种数据?它来自哪里,它代表什么?特征空间是仅由实数组成还是包含二进制值,分类值或所有这些?用于同构和异构数据的Wiki。
  2. 对于实值特征空间,欧几里德距离(L2)通常是使用的选择度量,有20个特征你应该没问题。从这个开始。否则,您可能需要考虑城市街区距离(L1)或其他指标,如Pearson相关性,余弦距离等。 在完成任何其他操作之前,您可能需要对数据进行一些工程设计。

    1. 功能是否相同?例如x1 = [0,1],x2 = [0,100]
    2. 如果没有,请尝试扩展您的功能。这通常是一个试验和错误的问题,因为某些功能可能会有噪音,在这种情况下缩放可能没有帮助。 要解释这一点,请考虑具有两个特征的数据集:高度和重量。如果高度以厘米(10 ^ 3)为单位且重量以千克(10 ^ 1)为单位,那么您应该将cm转换为米,这样两个特征的重量相等。对于具有多种值的特征空间,这通常是一个好主意,这意味着您有两个特征的大量值。理想情况下,您希望所有功能都能正常分布,只有一点噪音 - 请参阅中心极限定理。

      1. 所有功能都相关吗?
      2. 如果您正在使用实值数据,则可以使用主成分分析(PCA)对要素进行排名,并仅保留相关要素。 否则,您可以尝试选择功能http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection 减小空间的尺寸可以提高性能,但在您的情况下并不重要。

        如果您的数据包含连续,分类和二进制值,则可以扩展或标准化数据。使用您对数据的了解来提供适当的表示。这是大部分工作,或多或少是黑色艺术。试错。

        作为旁注,基于度量的方法(如knn和kmeans)只是存储数据。学习从记忆结束开始。