2012-04-04 52 views
1

请看图形图和数据。什么是方法或算法找到最密切匹配(最高相似度)之间的情节“px4”和其他情节。任何建议,将不胜感激,如果存在任何C#库或VF-Graph识别算法可以适应这个问题。最接近的匹配(识别)线图绘制方法或算法

px PLOTS from data

DATA

enr px1 px2 px3 px4 px5 px6 
    1 90 5 15 20 60 10 
    2 70 10 20 30 85 15 
    3 100 15 15 10 32 18 
    4 80 20 8 3 9 44 
    5 60 25 3 5 15 12 
    6 50 30 12 8 24 16 
    7 70 18 28 24 70 25 
    8 90 12 32 28 84 22 
    9 75 20 12 15 45 16 
    10 65 10 20 18 54 25 
+0

在一天结束时,答案取决于你为什么需要这样做。如果这是C#作业中的一些编程,那么使用任何旧方法可能都不错,但对不同方法的调查越多越好。但是,如果你需要这样做来分析政府医疗数据,那么你最好用某种统计学博士来聘用某人。 :-) – 2012-04-04 09:55:56

回答

3

我没有统计专家。但是......我会画出一个情节,比较每个点与另一个情节的等值点之间的差异,一次一个点。我将使用Math.Abs​​()将这10个差异中的每一个转换为一个正数,然后使用您希望的任何方法(平均值,中位数等)对10个差值取平均值。我会重复每个比较其他情节。大多数计算可以一路走开,您只需要保留每个图的平均数。最小的平均值可能是最接近匹配的情节。

因为我也不多了今天要做的事......

Dictionary<string, int[]> plots = new Dictionary<string, int[]>(); 

plots.Add("px1", new int[] { 90, 70, 100, 80, 60, 50, 70, 90, 75, 65 }); 
plots.Add("px2", new int[] { 5, 10, 15, 20, 25, 30, 18, 12, 20, 10 }); 
plots.Add("px3", new int[] { 15, 20, 15, 8, 3, 12, 28, 32, 12, 20 }); 
plots.Add("px4", new int[] { 20, 30, 10, 3, 5, 8, 24, 28, 15, 18 }); 
plots.Add("px5", new int[] { 60, 85, 32, 9, 15, 24, 70, 84, 45, 54 }); 
plots.Add("px6", new int[] { 10, 15, 18, 44, 12, 16, 25, 22, 16, 25 }); 

string test = "px4"; 
string winner = string.Empty; 
double smallestAverage = double.MaxValue; 

foreach (string key in plots.Keys) 
{ 
    if (key == test) 
    { 
     continue; 
    } 

    int[] a = plots[test]; 
    int[] b = plots[key]; 

    double count = 0; 

    for (int point = 0; point <= 9; point++) 
    { 
     count += Math.Abs(a[point] - b[point]); 
    } 

    double average = count/10; 

    if (average < smallestAverage) 
    { 
     smallestAverage = average; 
     winner = key; 
    } 
} 

Console.WriteLine("Winner: {0}", winner); 
+0

这实质上是使用矢量1-范数。小心你的'平均';你正在执行整数除法。请注意,如果您根本不计算平均值,但是使用总和/'count',您仍然会得到相同的结果。 – Rawling 2012-04-04 09:26:22

+0

干杯,你说得对,我已经把'count'从'int'改成了'double'。除以10的分割也相当多,只有在需要记录或显示平均值时才有用。 – 2012-04-04 09:34:12

2

有字面上的定义你的两个图表之间的“差异化”的无数种方式。

如果您将图表视为10维向量,则可以使用vector norm

如果您想将它们视为区间[1,10]上的实值函数,则可以使用L^p-space上的标准。 (虽然这应该涉及集成,因为你的函数都是由直线段组成的,所以你可以精确地计算这个范数,而不必做积分的数值近似。)

真的,你需要决定如何定义“类似的“,然后选择一种像你期望的那样的方法。

+0

感谢有想法...我正在考虑匹配标准的相关和回归线再次感谢。 – Raj 2012-04-05 02:44:26