1

我有两行数字...

1) 2 2 1 0 0 1

2) 1.5 1 0 .5 1 2

每一列都相互比较。较低的值更好。例如第 1 列第 2 行的值 (1.5) 比第 1 行 (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)

这是两行的两个分数。

对于递增加权,请使用以下内容:

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 回答