我有数千个向量,每个向量大约有20个特征。
给定一个查询向量和一组潜在匹配,我希望能够选择最佳的N
匹配。
我花了几天时间尝试回归(使用SVM),用我自己创建的数据集训练我的模型:每个向量是查询向量和结果向量的连接,我给出0到1之间的分数(主观评估),0为完美匹配,1为最差匹配。
我没有取得很好的成绩,我相信其中一个原因可能是很难主观地分配这些分数。另一方面,更容易的是对结果进行主观排序(score
是一个未知函数):
score(query, resultA) > score(query, resultB) > score(query, resultC)
所以我相信这更多的是一个学习排名的问题,我已经找到了Python的各种链接:
- http://fa.bianp.net/blog/2012/learning-to-rank-with-scikit-learn-the-pairwise-transform/
- https://gist.github.com/agramfort/2071994…
但我还没能真正理解它是如何工作的。我对所有的术语都很困惑,成对排序等等…(注意,我对机器学习一无所知,因此我觉得有点迷路了)等等……所以我不知道如何把这个应用到我的问题上。
有没有人能帮我澄清一些事情,指出我想解决的问题的确切类别,甚至更好的是我如何在Python (scikit-learn)中实现它?
在我看来,你要做的就是简单地计算查询和其余数据之间的距离,然后返回最接近的N个向量到你的查询。这是一个搜索问题。没有排序,您只需测量您的查询和"数千个向量"之间的距离。最后,对距离进行排序,取最小的N个值。它们对应于与您的查询最相似的N个向量。
为了提高比较的效率,您可以使用KD-Trees或其他有效的搜索结构:http://scikit-learn.org/stable/modules/neighbors.html#kd-tree
然后,看看维基百科关于Lp空间的页面。在选择合适的度量之前,您需要考虑数据及其表示:
- 您使用的是哪种数据?它来自哪里?它代表什么?特征空间是仅由实数组成,还是包含二进制值、分类值或全部?同构和异构数据的Wiki。
对于实值特征空间,通常使用欧几里得距离(L2)作为选择度量,有20个特征就可以了。从这个开始。否则,你可能不得不考虑城市街区距离(L1)或其他指标,如Pearson’s correlation、余弦距离等。在你做其他事情之前,你可能需要对数据做一些工程。
- 特征是否在同一尺度上?例如:x1 = [0,1], x2 = [0,100]
- 是否所有功能都相关?
如果没有,那么尝试缩放你的特征。这通常是一个反复试验的问题,因为某些特征可能会有噪声,在这种情况下缩放可能没有帮助。为了解释这一点,考虑一个具有两个特征的数据集:身高和体重。如果身高的单位是厘米(10^3),体重的单位是千克(10^1),那么你应该把厘米转换成米,这样两个特征的重量就相等了。对于具有广泛值范围的特征空间,这通常是一个好主意,这意味着您对两个特征都有很大的值样本。理想情况下,你会希望所有的特征都是正态分布,只有一点噪声——参见中心极限定理。
如果你处理的是真实有价值的数据,你可以使用主成分分析(PCA)对特征进行排序,只保留相关的特征。否则,您可以尝试功能选择http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection减少空间的维度可以提高性能,尽管在您的情况下这并不重要。
如果你的数据由连续的、分类的和二值组成,那么目标是扩展或标准化数据。使用您对数据的了解来提出适当的表示。这是大部分作品,或多或少是一种黑色艺术。试错。
作为旁注,基于度量的方法,如knn和kmeans只是存储数据。学习从记忆的终点开始。