2009-11-08 3 views
1

j'ai deux rangées de numéros ...algorithme pondéré ultérieur pour la comparaison

1) 2 2 1 0 0 1

2) 1,5 1 0 .5 1 2

Chaque colonne est comparée l'un à l'autre. Les valeurs inférieures sont meilleures. Par exemple la colonne 1, la valeur de la rangée 2 (1.5) est plus précise que la rangée 1 (2)

En comparaison normale je prendrais à la somme de chaque rangée et comparerais à l'autre rangée pour trouver la plus basse somme (la plus précise). Dans ce cas, les deux seraient égaux.

Je veux créer deux autres méthodes de comparaison Lorsque les valeurs montent dans la colonne 1, elles doivent être pondérées plus (col 2 doit contenir plus de poids à 1, 3 à 2, et ainsi de suite)

également le

opposé

À l'origine, je pensais qu'il serait préférable de diviser la valeur par sa position, mais cela ne fonctionne pas correctement.

Quelle serait la meilleure façon de le faire d'affilée?

Merci!

+0

Je ne comprends pas. D'abord, vous dites "Chaque colonne est comparée", ensuite vous comparez uniquement les valeurs calculées pour la ligne entière. Aucune comparaison de colonnes n'est effectuée. Cette première déclaration est-elle correcte? –

+0

Aucune comparaison de colonne n'est réellement effectuée. La somme de chaque ligne est comparée à une autre ligne. La valeur la plus basse étant la meilleure. –

Répondre

2

Tout ce que vous faites, c'est de calculer le produit de votre matrice avec un vecteur de pondération. Voir this page pour plus d'informations sur la multiplication matricielle.

I.e.votre vecteur M est

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 | 

et dans votre premier cas, le vecteur de pondération w est:

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

le produit dont vous donne:

M x w = (6, 6) 

qui sont les deux scores pour la deux rangées.

Pour une utilisation pondération ascendante quelque chose comme:

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

qui vous donne:

M x w = (15, 22.5) 

et pour un poids descendant, vous pouvez utiliser soit:

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

ou

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

(Les vecteurs de note sont transposés pour la lisibilité).

1

A l'origine, toutes les valeurs ont le même poids, afin que vos facteurs pour les valeurs de n sont 1/n, de sorte que votre somme est:

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

Votre tentative de diviser la valeur par sa position serait:

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

Ce qui est encore une approche valide, mais fait le contraire de ce que vous voulez (la colonne 1 a le plus de poids).

Qu'est-ce que vous voulez est quelque chose comme ceci:

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

Vous pouvez également envisager de commencer par 1/n + 1 et se terminent par 1/2 de sorte que la dernière valeur sera un peu moins important.

0

Je ne sais pas si je comprends ce que tu veux faire, mais peut-être il est ceci:

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

w [] serait un tableau avec les poids par colonne (par exemple: w = {1, 2,3,4,5}), bien que pourrait bien être n'importe quelle autre valeur/fonction. Donc, à la fin, si la différence est supérieure à 0, un [] est meilleur, et si c'est inférieur à 0, c'est pire.

Questions connexes