搜索相似对象

时间:2018-12-24 15:31:04

标签: c++ arrays algorithm object similarity

假设我有以下对象数组:

Object 0:
  [0]=1.1344
  [1]=2.18
  ...
  [N]=1.86
-----------
Object 1 :
  [0]=1.1231
  [1]=2.16781
  ...
  [N]=1.8765
------------- 
Object 2 :
  [0]=1.2311
  [1]=2.14781
  ...
  [N]=1.5465  
--------
Object 17:
  [0]=1.31
  [1]=2.55
  ...
  [N]=0.75

如何比较那些对象?

您可以看到对象0和对象1非常相似,但是对象17却不相似。

我希望算法能够给我数组中所有相似的对象

3 个答案:

答案 0 :(得分:1)

您用Algorithm标记了这个问题(我不是C ++专家),所以让我们给出一个伪代码。

首先,您应该设置一个阈值,该阈值将在该阈值下不同的2个var定义为相似。第二步将是遍历所有对元素并检查相似性。

请考虑将An个对象组成数组,并将m作为每个对象中的字段数。

threshold  = 0.1
for i in (0, n):
    for j in (i+1,n):
        flag = true;
        for k in (1,m):
            if (abs(A[i][k] - A[j][k]) > threshold) 
                flag = false // if the absolute value of the diff is above the threshold object are not similar 
                break // no need to continue checks
        if (flag)
            print: element i and j similar // and do what ever

时间复杂度为O(m * n^2)

请注意,您可以使用相同的算法对对象数组进行排序-将比较函数声明为字段之间的最大差值,然后进行相应的排序。

希望有帮助!

答案 1 :(得分:1)

您的问题实质上可以归结为最近邻居搜索,这是数据挖掘中经过充分研究的问题。

对此问题有不同的解决方法。
我建议先决定要多少数量的相似元素,或者为相似性设置一个给定的阈值。比您必须遍历所有向量并计算查询向量与数据库中每个向量之间的距离函数。

由于您拥有真实的名义数据,因此我建议您使用欧几里得距离。

您可以阅读有关最近邻搜索和欧氏距离herehere的更多信息。祝你好运!

答案 2 :(得分:1)

您需要的是分类器,对于您的问题,有2种算法取决于您想要的。

如果需要找到最接近所选对象m的对象,则可以使用最近邻居算法;否则,如果需要查找相似的对象集,则可以使用k-means算法找到k个集。 / p>