c# - 比较阵列之间的距离?

标签 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]

关于上面的数组,答案应该是数组 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/

相关文章:

java - 预计算大型值表

java - 寻找wordnet中同义词集之间的距离

python - 使用 Word Mover Distance 和 Bert-Embedding 记录相似度

opencv - OpenCV 中的模板匹配可以处理两个相同大小的图像吗?

c# - C#—在Convert.ToInt32(...)之后,循环将不接受非数字输入

c# - Web 应用程序与 Linux 多用户应用程序

c# - Prism + MVVM + Access Keys + UpdateSourceTrigger ="LostFocus"- 这不会让我在不首先失去焦点的情况下保存更新的文本框

performance - 使用另一个堆栈对堆栈进行排序

c# - 如何使用自定义顺序属性对枚举进行排序?

c++ - 如何在矩阵中搜索相同值的区域?