【问题标题】:Search similar object搜索相似对象
【发布时间】:2018-12-24 15:31:04
【问题描述】:
假设我有以下对象数组:
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 与它们中的任何一个都不相同。
我想要一个算法,它可以给我数组中所有相似的对象
【问题讨论】:
标签:
c++
arrays
algorithm
object
similarity
【解决方案1】:
你用Algorithm标记这个问题(我不是C++专家)所以让我们给出一个伪代码。
首先,您应该设置一个阈值,该阈值定义 2 var 在该阈值下具有不同的相似性。第二步是遍历所有元素对并检查相似性。
将A 视为包含n 对象的数组,将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)。
请注意,您可以使用相同的算法对对象数组进行排序 - 将比较函数声明为字段之间的最大差异,然后进行相应的排序。
希望对您有所帮助!
【解决方案2】:
您的问题本质上归结为最近邻搜索,这是数据挖掘中一个经过充分研究的问题。
有不同的方法来解决这个问题。
我建议首先决定你想要多少相似元素,或者为相似性设置一个给定的阈值。比您必须遍历所有向量并计算查询向量和数据库中每个向量之间的距离函数。
我建议您在您的情况下使用欧几里得距离,因为您有真实的名义数据。
您可以阅读有关最近邻搜索和欧几里得距离here 和here 的更多信息。祝你好运!
【解决方案3】:
你需要的是一个分类器,对于你的问题,有两种算法取决于你想要什么。
如果您需要找到与所选对象-m最相似的对象,您可以使用最近邻算法,或者如果您需要找到相似的对象集合,您可以使用k-means算法查找k个集合。