如何比较两个数组之间的相似度?假设我有:
Base Array: [.5,0,0,0,.25,0,0,.25,0,0,0,0]
Array 1: [1,0,0,0,1,0,0,1,0,0,0,0]
Array 2: [0,0,1,0,0,0,1,0,0,1,0,0]
Array 3: [1,0,0,0,0,0,0,0,0,0,0,0]
关于上面的数组,答案应该是数组 1。答案是数组 1,因为数组元素在结构上与基本数组的数组元素“更接近”。与数组 3 不同,.25 更接近 1 而不是 0。另一个例子:
Base Array: [.75,0,0,0,0,0,0,0,.25,0,0,0]
Array 1: [1,0,0,0,1,0,0,1,0,0,0,0]
Array 2: [0,0,1,0,0,0,1,0,0,1,0,0]
Array 3: [1,0,0,0,0,0,0,0,0,0,0,0]
在这种情况下,数组 3 应该是答案。
但是,使用我当前的算法(我稍后会给出),答案变成数组 3。这是我正在使用的:
for (int i = 0; i < basearray.Length; i++)
{
temp = (basearray[i] - arrayX[i]);
dist += temp * temp;
}
那么,我认为我的算法有问题吗?或者,我可能需要使用一种“不同”的算法而不是距离(因为本质上,0.25 比 1 更接近 0,但我想要的不是这样)。
谢谢!
更新:
我找到答案了!感谢所有这些人的帮助。在这里:
float[] pbaseArrX = new float[3];
float[] pcompArrX = new float[3];
float dist1 = 0, dist2 = 0;
for (int i = 0; i < baseArrX.Count; i++)
{
pbaseArrX[i] = baseArrX[i] / (baseArrX[0] + baseArrX[1] + baseArrX[2]);
}
//Do the following for both compArr1 and compArr2;
for (int i = 0; i < compArrX.Count; i++)
{
pcompArrX[i] = pcompArrX[i] / (pcompArrX[0] + pcompArrX[1] + pcompArr[2]);
}
//Get distance for both
for (int i = 0; i < pcompArrX.Count; i++)
{
distX = distX + ((pcompArrX[i] - pbaseArrX[i])^2);
}
//Then just use conditional to determine which is 'closer'
最佳答案
您似乎想将阵列作为射线(仅方向)进行比较,但您将它们作为矢量(方向和大小)进行比较。我建议将数组与 cosine similarity 进行比较,这只是向量之间角度的余弦,因此仅比较它们的方向。对于所提供的数组,基本数组与数组 1 之间的余弦相似度为 0.94,而与数组 2 的余弦相似度为 0.82,符合您的预期。
关于c# - 比较阵列之间的距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382524/