我有包含不同值的数据集:
Set1 = {X1, X2, ..., Xn}
Set2 = {X1, X2, ..., Xn}
...
X 值具有不同的范围(这正是我无法弄清楚解决我的问题所需的算法的原因) - 有些是严格的 [0.0 - 1.0] 值,有些可能在不同/任何范围内。
我需要找到一种方法来“分组”这些集合,或者换句话说 - 找到两个给定集合之间的“相似性”。
显然,我可以简单地编写长链的“IF”语句,将每个值与另一个值进行比较,如果它们相差一些 DELTA 量,我可以指出两个给定的集合不是“相似的”。问题是,我的集合很大并且包含动态数据。因此,我需要一个通用函数来计算每组的某种哈希值(至少我是这样想的):
int hash1 = HashFunction(Set1)
int hash2 = HashFunction(Set2)
if (|hash1 - hash2| < DELTA): return "Sets are similar"
我真的很感激如何实现它的任何提示或想法。
更新:
阅读评论后,我意识到也许我也应该稍微改变一下我的问题:您对良好的“相似性”指标有何建议?
“相似性”是指一些动态值,表示“接近”集合的值有多接近。例如,如果我有一个测试集: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| / 最大值(0.45, 0.5) < |100 - 300| / 最大(100, 300)。
如果我只是计算两组之间的值差之和,它不会为我提供任何有意义的结果(因为两组可以包含完全不同的数字(从逻辑角度来看),但相互抵消却给出不正确的结果)