【发布时间】:2016-06-26 14:34:45
【问题描述】:
我有一个向量,例如A=[2.30 2.32 2.67 2.44 2.31 1.23] 我有兴趣在这个向量中找到所有最接近(几乎相等)的值。 上面例子的答案应该是索引 1,2 和 5。
我不知道如何规定公差,但结果值应该几乎相等。任何机构都可以提供提示吗?
【问题讨论】:
我有一个向量,例如A=[2.30 2.32 2.67 2.44 2.31 1.23] 我有兴趣在这个向量中找到所有最接近(几乎相等)的值。 上面例子的答案应该是索引 1,2 和 5。
我不知道如何规定公差,但结果值应该几乎相等。任何机构都可以提供提示吗?
【问题讨论】:
我建议以下方法:
%initialize A
A=[2.30 2.32 2.67 2.44 2.31 1.23];
%initilize an epsilon parameter which defines how close 2 values should be to one another to considered identical.
EPSILON = 0.05;
%generates all possible lists of pairs coordinates from A
[p,q] = meshgrid(1:n);
mask = logical(tril(ones(n,n))-eye(n,n));
allPairs = [p(mask),q(mask)];
%find pairs with absolute difference below epsilon
validPairs = abs(A(allPairs(:,1))- A(allPairs(:,2))) < EPSILON;
%result - pairs of numbers which are close to one another
allPairs(validPairs,:)
结果:
ans =
1 2
1 5
2 5
*生成所有可能对的代码取自@Lambdageek solution
【讨论】:
如果您想用数学术语表示距离,可以使用欧几里得距离。这是表达式:
如果你有更高维度的空间(你有),你可以从维基百科获得一些信息。但它仍然是直截了当的:
https://en.wikipedia.org/wiki/Euclidean_distance#n_dimensions
由于欧几里得距离不是高维空间中的最佳距离度量,因此有人建议使用余弦相似度:
https://en.wikipedia.org/wiki/Cosine_similarity
您还可以使用诸如 k-means 或 k-nearest-neighbors 之类的算法来解决此任务。
如果您只是在其中寻找最相似的值:
定义阈值。假设 0.01
选择向量的第一个元素(xi,其中 i=0)
选择不是xi的第一个元素(xj,其中j=i+1)
通过例如 dist = sqrt((xi - xj)^2) 比较 xi 和 xj。如果
dist 小于或等于您的阈值,xi 和 xj 非常
类似。
增加 xj 并再次比较
如果 xj 在向量的末尾,则递增 xi
【讨论】:
这种方法不需要任何定义的绝对公差, 相反,需要相对于最小差异的容差。 它总是在数据中寻找最接近的组。 如果您的数据中有完全重复的值,在这种形式中它将不起作用, 但您也可以轻松扩展它以很好地处理这种情况。
A=[2.30 2.32 2.67 2.44 2.31 1.23];
diffFactor=3;
Asorted=sort(A);
Adiff=abs(Asorted(1:end-1)-Asorted(2:end));
[minDiff,minInd]=min(Adiff);
commonValue=Asorted(minInd);
resultIndex=find(A>=commonValue-diffFactor*minDiff & A<=commonValue+diffFactor*minDiff)
【讨论】: