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

seb*_*piq 4 python machine-learning scikit-learn supervised-learning

我有数以千计的向量,每个向量约有20个特征.

给定一个查询向量和一组潜在匹配,我希望能够选择最佳N匹配.

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

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

score(query, resultA) > score(query, resultB) > score(query, resultC)
Run Code Online (Sandbox Code Playgroud)

所以我认为这更像是一个学习排名的问题,我发现了Python的各种链接:

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

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

小智 5

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

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

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

  1. 你正在使用什么样的数据?它来自哪里,它代表什么?特征空间是仅由实数组成还是包含二进制值,分类值或所有这些?用于同构和异构数据的Wiki.

对于真正有价值的特征空间,欧几里德距离(L2)通常是使用的选择度量,有20个特征你应该没问题.从这个开始.否则,您可能需要考虑城块距离(L1)或其他指标,如Pearson相关性,余弦距离等.您可能需要对数据进行一些工程设计才能执行任何其他操作.

  1. 功能是否相同?例如x1 = [0,1],x2 = [0,100]

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

  1. 所有功能都相关吗?

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


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

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