比较阵列之间的距离?

use*_*792 2 c# algorithm similarity

如何比较两个数组之间的相似性?说我有:

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]
Run Code Online (Sandbox Code Playgroud)

关于上面的数组,答案应该是数组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]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,阵列3应该是答案.

然而,使用我当前的算法(我将在稍后给出),答案变为数组3.这是我正在使用的:

for (int i = 0; i < basearray.Length; i++)
{
  temp = (basearray[i] - arrayX[i]);
  dist += temp * temp;
}
Run Code Online (Sandbox Code Playgroud)

所以,我认为我的算法出了问题?或许,我需要使用'不同'的算法而不是距离(因为基本上,.25 IS接近0比1,但我想要的是其他).

谢谢!

更新:

我找到了答案!感谢所有人的帮助.这里是:

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'
Run Code Online (Sandbox Code Playgroud)

Mic*_*ber 5

看起来你想比较数组作为光线(只是方向),但你将它们作为矢量(方向和幅度)进行比较.我建议将数组与余弦相似性进行比较,余弦相似度只是矢量之间角度的余弦,因此只比较它们的方向.对于所显示的阵列,基本阵列和阵列1之间的余弦相似度为0.94,而阵列2的余弦相似度为0.82,符合您的预期.