3

問題は、文字列のリストが 2 つあることです。一方のリストは他方のリストの概算であり、概算の精度を測定する何らかの方法が必要です。

近似を採点するその場しのぎの方法として、文字列に対応する数値に基づいてソートした後、各リスト (近似と答え) を 3 つのパーティション (高、中、低) にバケット化しました。次に、近似のすべての要素を比較して、正しいリストの同じパーティションに文字列が存在するかどうかを確認します。

正しく分類された文字列の数を合計し、文字列の総数で割ります。これが見積もりの​​精度を測定する非常に大まかな方法​​であることは理解しており、より良い代替手段が利用可能であることを望んでいました. これは、より大きな作業のごく一部に過ぎず、一からやり直す必要がないようにしたいと考えていました。

編集:私は十分に明確ではなかったと思います。2 つのリストが完全に等しい必要はありません。リストが類似していることを示す何らかの尺度が必要です。たとえば、私たちが採用した高-中-低 (HML) アプローチは、推定されたリストが十分に類似していることを示しています。このアプローチの欠点は、推定リストの項目が「高」ブラケットの下部にあり、実際のリストではその項目が中間セットの上部にある場合、スコア アルゴリズムが配信に失敗することです。

HML アプローチに加えて、各パーティションの下位 20% が次のパーティションの上位 20% と比較されるか、これらの線に沿ったものである可能性があります。

助けてくれてありがとう!!

4

3 に答える 3

1

そのため、一連の項目を取得して、高、中、低の 3 つのカテゴリのパーティションにグループ化しています。まず、これら 3 つのパーティションを表すオブジェクトを作成しましょう。

public class Partitions<T>
{
    public IEnumerable<T> High { get; set; }
    public IEnumerable<T> Medium { get; set; }
    public IEnumerable<T> Low { get; set; }
}

次に、見積もりを作成するために、これらのオブジェクトを 2 つ取得します。1 つは実際のオブジェクトで、もう 1 つは見積もり用です。優先度ごとに、両方のコレクションに含まれるアイテムの数を確認します。これは「交差点」です。各セットの交点の数を合計します。

次に、その数を合計で割ります。

public static double EstimateAccuracy<T>(Partitions<T> actual
    , Partitions<T> estimate)
{
    int correctlyCategorized = 
        actual.High.Intersect(estimate.High).Count() +
        actual.Medium.Intersect(estimate.Medium).Count() +
        actual.Low.Intersect(estimate.Low).Count();

    double total = actual.High.Count()+
        actual.Medium.Count()+
        actual.Low.Count();

    return correctlyCategorized / total;
}

もちろん、これを 3 つの優先度ではなく一連のシーケンスに一般化すると、各シーケンスがバケットに対応する (つまり、3 つだけでなく N 個のバケットがある) 場合、コードは実際には簡単になります。

public static double EstimateAccuracy<T>(
    IEnumerable<IEnumerable<T>> actual
    , IEnumerable<IEnumerable<T>> estimate)
{
    var query = actual.Zip(estimate, (a, b) => new
    {
        valid = a.Intersect(b).Count(),
        total = a.Count()
    }).ToList();
    return query.Sum(pair => pair.valid) /
        (double)query.Sum(pair => pair.total);
}
于 2014-01-09T21:35:47.207 に答える
0

両方の を取り、List<String>各要素を に結合しますIEnumerable<Boolean>

public IEnumerable<Boolean> Combine<Ta, Tb>(List<Ta> seqA, List<Tb> seqB)
{
  if (seqA.Count != seqB.Count)
    throw new ArgumentException("Lists must be the same size...");

  for (int i = 0; i < seqA.Count; i++)
    yield return seqA[i].Equals(seqB[i]));
}

次に、Aggregate()どの文字列が一致するかを確認し、現在の合計を保持するために使用します。

var result = Combine(a, b).Aggregate(0, (acc, t)=> t ? acc + 1 : acc) / a.Count; 
于 2014-01-09T21:16:07.090 に答える