0

我仍然是 Python 的初学者。我正在尝试实现一种涉及向量和向量之间的归一化差异的算法。方程为

Sr = 1 - ( || r1 - r2|| / || r1 + r2|| )

A given example gives r1 and r2 as shown below. 

r1 = {1 2 3 4 5 6 0 3 3 0 0 0 1 1}
r2 = {4 0 3 0 0 0 1 2 3 5 6 7 8 9}

Sr = 0.2023

公式的分解看起来像这样。

r1-r2 is the subtracting the item1 in r1 to the item1 in r2, subtracting the item2 in r1 to item2 in r2,..., until item-n in r1 and r2.

Let's say M is the total sum of (r1-r2)
M = sum(r1-r2) = sum[(1-4) + (2-0) +...+(1-9)]

||r1 - r2|| = math.sqrt(x)(math.(M, 2))

基本上我可以做所有其他与数学相关的函数,但是我在找到一种有效的方法来计算 M 时遇到问题,我需要从两个列表索引中逐个索引添加/减去数字。任何建议都会很棒。谢谢!

4

6 回答 6

0

要完成sum数学问题的一部分,您可以执行以下操作:

sum(map(operator.__sub__, r1, r2))

r1这将在元素 or和之间执行减法运算r2,然后对结果列表求和。

于 2013-04-10T04:49:32.290 回答
0

numpy可以简化您的生活:

>>> import numpy as np
>>> r1 = np.array([1, 2, 3, 4, 5, 6, 0, 3, 3, 0, 0, 0, 1, 1])
>>> r2 = np.array([4, 0, 3, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9])
>>> 1 - np.linalg.norm(r1-r2) / np.linalg.norm(r1+r2)
0.20227596478253429

您的问题没有明确说明您需要哪种规范。但答案似乎是正确的,这意味着您需要常规的 2 范数。另见numpy.linalg.norm

于 2013-04-10T04:57:14.793 回答
0

这是你想要的吗?

>>> r1 = [1, 2, 3 ,4 ,5 ,6 ,0 ,3 ,3 ,0 ,0 ,0 ,1 ,1]
>>> r2 = [4 ,0 ,3 ,0 ,0 ,0 ,1 ,2 ,3 ,5, 6 ,7 ,8 ,9]
>>> [r1[i]-r2[i] for i in range(0,len(r1))]
[-3, 2, 0, 4, 5, 6, -1, 1, 0, -5, -6, -7, -7, -8]
>>> [r1[i]+r2[i] for i in range(0,len(r1))]
[5, 2, 6, 4, 5, 6, 1, 5, 6, 5, 6, 7, 9, 10]
于 2013-04-10T04:35:19.837 回答
0
>>> r1 = [1, 2, 3, 4, 5, 6, 0, 3, 3, 0, 0, 0, 1, 1]
>>> r2 = [4, 0, 3, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9]
>>> sum([x-y for x, y in zip(r1, r2)])
-19

解释:

  • zip 以形式返回一个元组列表[(r1[0], r2[0]),...,(r1[n], r2[n])]
  • 列表推导将执行r1[n]-r2[n]并返回结果列表
于 2013-04-10T04:38:39.150 回答
0

对于总和只是做

map(sum, zip(r1, r2))

为了不同,你可以做

map(lambda t: t[0] - t[1] ,zip(r1, r2))

wherer1r2是列表。

于 2013-04-10T04:40:18.103 回答
0

感谢所有回答的人。如果我可以投票给你们所有人,我会的。我决定选择 Reinier Torenbeek 的答案,因为它在一个简单的函数中完成了我想要为这个方程做的所有事情。

这就是我在这部分中使用方程式的方式。

def wordOrderSim(list1, list2):
    r1 = np.array(list1)
    r2 = np.array(list2)
    Sr = 1 - np.linalg.norm(r1-r2) / np.linalg.norm(r1+r2)
    return Sr

r1 = [1, 2, 3 ,4 ,5 ,6 ,0 ,3 ,3 ,0 ,0 ,0 ,1 ,1]
r2 = [4 ,0 ,3 ,0 ,0 ,0 ,1 ,2 ,3 ,5, 6 ,7 ,8 ,9]

print wordOrderSim(r1, r2)

感谢 Serdalis、Sushant Gupta、Sheng 和 Paulo Scardine 的回答,因为它确实回答了我的问题,但我忘了提到,在 r1 和 r2 中添加/减去数字之后,每个数字都必须是其中两个的幂将所有数字加在一起之前的原始数字。抱歉,如果没有正确的数学符号,我很难解释它们。

r1-r2 = [-3, 2, 0, 4, 5, 6, -1, 1, 0, -5, -6, -7, -7, -8]
sum(r1-r2) = [(-3^2) + (2^2) + (0^2) + (4^2) + (5^2) + (6^2) + (-1^2) + (1^2) + (0^2) + (-5^2 + (-6^2) + (-7^2) + (-7^2) + (-8^2)]
于 2013-04-10T05:24:29.213 回答