我有一些数据向量,例如:
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#。
有没有计算算法?请帮助我,谢谢!
答案 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)
有很多可能的方法:
在可能的对之间计算Minkowski distances并选择最接近的对。
对于每两个数组A和B,您可以计算一个差值/增量D数组,其中D i = | A i -B i |。对于此数组,您可以计算mean,variance,也许其他moments并从中推断。
...
但是如何使用这些数量取决于数据的含义及其对性能的影响。
正如您在评论中指出的那样,数据实际上包含两个部分:力和角度,因此最有可能需要比较的不是整个数组,而是两个长度为4和3的子数组。