我的数据集包含不同的值:
Set1 = {X1,X2,...,Xn}
Set2 = {X1,X2,...,Xn}
...
X值具有不同的范围(这正是为什么我无法找出解决我的问题所需的算法) - 一些是严格的[0.0 - 1.0]值,其他可能在不同/任何范围内。
我需要找到一种方法来" group"这些集合,换句话说 - 找到"相似性"在两个给定集之间。
显然,我可以简单地写出长链#34; IF"将每个值与另一个值进行比较的语句,如果它们相差一些DELTA金额,我可以指出两个给定的集合不是"相似的"。问题是,我的集很庞大,包含动态数据。因此,我需要一个泛型函数来计算每个集合的某种哈希值(至少是我思考的方式):
int hash1 = HashFunction(Set1)
int hash2 = HashFunction(Set2)
if(| hash1 - hash2 |< DELTA):return"集合类似"
我真的很感激如何实施它的任何提示或想法。
更新
通过评论阅读我意识到也许我应该稍微改变一下我的问题:你对一个好的"相似性的建议是什么?度量?
通过"相似性"我的意思是一些动态值,表明"关闭"设定'价值观是。例如,如果我有一个测试集: SetA {0.5,100} ,那么 SetB {0.5,100} 应该产生1(或其他一些表示完美匹配的值) )。同样比较 SetA 与 SetC {0.1,300} 应该返回更低的"匹配"值,而 SetD {0.45,101} 应返回类似于"完全匹配"的值。这里要注意的关键事项,例如0.45和0.5的值是"更相似"比值100和300因为: | 0.45 - 0.5 | / max(0.45,0.5)< | 100 - 300 | / max(100,300)。
如果我只计算2组之间的差值之和,它就不会给我任何有意义的结果(因为两组可以包含完全不同的数字(从逻辑的角度来看),但是相互抵消不正确结果)
答案 0 :(得分:0)
所以,你想知道两个物体之间的距离。在数学中,集合与为集合中的对象提供距离的操作一起称为metric space。
显然,该指标有几种可能的选择。常见的是绝对差值之和(距离= | x1-y1 | + | x2-y2 | + ...)和平方差之和(距离=(x1-y1)²+(x2-y2)²+ ...)。如果这些指标不适合您,请通过“类似”来定义您的意思。
答案 1 :(得分:0)
由于您的集合具有相同的基数,但您不关心顺序(即,它们是集,而不是向量),我建议的方法是:对集合进行排序并将它们视为向量。
现在问题是,选择R 2 metric。
选项很多。基本上,您可以在R上选择任何度量并按坐标方式组合它们。
因此,如果您想要相对差异,可以定义
reldist(x,y)= abs(x-y)/ max(x,y)
dist 1 (A,B)= sum i (reldist(a i ,b i ) )
或
DIST <子> 2 子>(A,B)= SQRT(总和<子> I 子>(reldist(一<子> I 子>,B <子> I 子>) 2 ))
记住,A和B是排序的,所以 i 应匹配b i 。