向量C#的相似度计算

时间:2018-11-25 05:08:29

标签: c# algorithm

我有一些数据向量,例如:

681,305,305,304,667,92.87,254.51,100.24  has "A" as key

460,682,702,683,443,89.17,273.83,102.19 has"B" as key

593,395,413,418,564,71.13,17.67,83.79 has "C" as key

然后,从我的设备中,我获得了数据样本,需要将其转换为密钥。数据示例如下:

593,395,413,418,564,71.13,17.67,83.79

我想计算获得的数据与上述数据的三个样本的相似度,看看哪个与获取的数据最相似,然后选择要返回的样本关键字。我正在使用C#。

有没有计算算法?请帮助我,谢谢!

2 个答案:

答案 0 :(得分:1)

基于一些假设,您可以做出相似性决定。我在C#中提出了一个简单的程序,用于基于相同索引中值之间的绝对差之和求出相似性。总和最少的那个将是最相似的。您可以通过类似的方式扩展解决方案。

using System;
using System.Collections.Generic;
public class Test
{
  public static void Main()
  {
     Dictionary<string, List<double> > map = new Dictionary<string, List<double> >();
     List<double>listA =  new List<double>(new double[]{681,305,305,304,667,92.87,254.51,100.24});
     map.Add("A", listA);
     List<double>listB =  new List<double>(new double[]{460,682,702,683,443,89.17,273.83,102.19});
     map.Add("B", listB);
     List<double>listC = new List<double>(new double[]{593,395,413,418,564,71.13,17.67,83.79});
     map.Add("C", listC);
     List<double>testList = new List<double>(new double[]{593,395,413,418,564,71.13,17.67,83.79});
     string ans = mostSimilarKey(testList, map);
     Console.WriteLine("Most similar key is: "+ans);
  }

  static string mostSimilarKey(List<double>testList, Dictionary<string, List<double> > map) {
    double minDifference = Double.MaxValue;
    string ans = "";
    foreach (var pair in map) {
        double absoluteDifference = getAbsoluteDifference(testList, pair.Value);
        if (absoluteDifference < minDifference) {
            minDifference = absoluteDifference;
            ans = pair.Key;
        }
    }
    return ans;
 }

 static double getAbsoluteDifference(List<double>testList, List<double>list) {
    double absoluteDifference = 0.0;
    for (int i = 0; i < testList.Count; ++i) {
        absoluteDifference += Math.Abs(testList[i] - list[i]);
    }
    return absoluteDifference;
  }
}

答案 1 :(得分:0)

有很多可能的方法:

  1. 在可能的对之间计算Minkowski distances并选择最接近的对。

  2. 对于每两个数组A和B,您可以计算一个差值/增量D数组,其中D i = | A i -B i |。对于此数组,您可以计算meanvariance,也许其他moments并从中推断。

...

但是如何使用这些数量取决于数据的含义及其对性能的影响。


正如您在评论中指出的那样,数据实际上包含两个部分:力和角度,因此最有可能需要比较的不是整个数组,而是两个长度为4和3的子数组。