1

私は2行の数字を持っています...

1)2 2 1 0 0 1

2)1.5 1 0 .5 1 2

各列は互いに比較されます。値が小さいほど良いです。たとえば、列1、行2の値(1.5)は、行1(2)よりも正確です。

通常の比較では、各行の合計を取得し、他の行と比較して、最も低い合計(最も正確)を見つけます。この場合、両方が等しくなります。

他に2つの比較方法を作成したい値が列1から昇順の場合、値の重みを大きくする必要があります(列2は、1よりも重みを大きくする必要があります。3は2よりも重みを保持する必要があります)。

また反対

もともと、値をその位置で割るのが最善だと思っていましたが、それは正しく機能しません。

行に対してこれを行うための最良の方法は何でしょうか?

ありがとう!

4

3 に答える 3

2

したがって、実際に行っていることは、行列と重みベクトルの積を計算することだけです。行列乗算の詳細については、このページを参照してください。

つまり、ベクトル M は

M = | 2.0 2.0 1.0 0.0 0.0 1.0 |
    | 1.5 1.0 0.0 0.5 1.0 2.0 |

最初のケースでは、重み付けベクトル w は次のとおりです。

w = (1, 1, 1, 1, 1, 1)

その製品はあなたに与えます:

M x w = (6, 6)

これは、2 つの行の 2 つのスコアです。

昇順の重み付けには、次のようなものを使用します。

w = (1, 2, 3, 4, 5, 6)

これにより、次のことが得られます。

M x w = (15, 22.5)

降順の重みの場合、次のいずれかを使用できます。

w = (6, 5, 4, 3, 2, 1)

また

w = (1, 1/2, 1/3, 1/4, 1/5, 1/6)

(注ベクトルは読みやすくするために転置されています)。

于 2009-11-08T17:29:05.243 に答える
1

もともと、すべての値の重みは同じであるため、n 値の係数はすべて 1/n であるため、合計は次のようになります。

S = 1 * v_1 + 1 * v_2 + ... + 1 * v_n

値をその位置で除算しようとすると、次のようになります。

S = 1/1 * v_1 + 1/2 * v_2 + ... + 1/n * v_n

これは依然として有効なアプローチですが、希望とは反対のことを行います (列 1 が最も重要になります)。

あなたが望むのは次のようなものです:

S = 1/n * v_1 + 1/n-1 * v_2 + ... + 1/1 * v_n

また、1/n+1 で開始し、1/2 で終了することを検討して、最後の値の重要性を少し低くすることもできます。

于 2009-11-08T15:27:00.773 に答える
0

あなたが何をしたいのか理解できたかどうかはわかりませんが、おそらくこれは次のとおりです。

for (i=0, i<length, i++)
  difference += (a[i] - b[i]) * w[i];

w[] は、列ごとの重みを持つ配列になります (例: w={1,2,3,4,5}) が、他の値/関数でもかまいません。

つまり、差が 0 より大きい場合は a[] が優れており、0 より小さい場合は劣っています。

于 2009-11-08T15:27:18.993 に答える