我仍然是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时遇到问题,我需要通过索引从两个列表索引中添加/减去数字。任何建议都会很棒。谢谢!
答案 0 :(得分: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]
答案 1 :(得分: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
说明:
[(r1[0], r2[0]),...,(r1[n], r2[n])]
r1[n]-r2[n]
并返回结果列表答案 2 :(得分:0)
总结一下
map(sum, zip(r1, r2))
并且你可以做差异
map(lambda t: t[0] - t[1] ,zip(r1, r2))
其中r1
和r2
是列表。
答案 3 :(得分:0)
要解决数学问题的sum
部分,您可以执行以下操作:
sum(map(operator.__sub__, r1, r2))
这将在元素或r1
和r2
之间执行减法,然后对结果列表求和。
答案 4 :(得分: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
答案 5 :(得分: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)]