Python中数学公式的语法

时间:2013-10-29 10:57:56

标签: python syntax formula

我正在尝试用Python实现一个数学公式,我是初学者,所以请和我一起工作。

我有两个3列制表符分隔文件:

例如: inputA:

abandonment-n about-bring-v 32.5890
abandonment-n about-complaint-n 5.5112
abandonment-n about-concern-n 10.6714
abandonment-n among-1-crowd-n 11.4496

inputB:

aardvark-n about-fact-n 7.4328
aardvark-n about-information-n 6.5145
aardvark-n about-know-v 6.4239
aardvark-n among-1-crowd-n 9.9085

inputB:

我尝试实现的公式应该将这两个文件视为输入。

数学上,公式如下:

Similarity Measure,如this paper

中所述

其中,f =特征,Fx =特征向量,w =特征权重。

这是我到目前为止所提出的:

将两个输入导入为dict,其中[feature:weight]。

让我们说inputA = x和inputB = y。

然后,我为公式设计的语法如下:

score = sum(i for i in x if i in y) * w(i) / sum(i for i in x)* w(i)

在这种情况下,*w(i)应该乘以相应特征的权重。

有人可以帮我解决Python中的数学语法(根据我试图转换的公式,是否正确),因为这是我第一次尝试使用它?

提前谢谢

2 个答案:

答案 0 :(得分:4)

关闭,但不完全。你想要这样的东西:

from __future__ import division # this must be the very first import statement
score = sum(i*w(i) for i in x if i in y) / sum(i * w(i) for i in x)

基本上,在这两种情况下你都离开了w(i),这不是公式所做的;此外,w(i)无论如何都没有任何意义,因为i只存在于总和中。

检查元素是否在列表中可能很昂贵。你可以做得更好:

from __future__ import division # this must be the very first import statement
xx = set(x)
yy = set(y)
score = sum(i*w(i) for i in xx & yy) / sum(i * w(i) for i in x)

其中xx & yyxx.intersection(yy)的Python简写。这假定xy从不包含重复元素,但考虑到公式中使用的符号,这似乎是一个安全的假设。

答案 1 :(得分:2)

当你怀疑sintax和正确性时,最好创建一个测试用例。我更喜欢doctests,但这取决于讨论。

def score(x, y, w):
    """
    Calcutates directional distributional similarity http://dl.acm.org/citation.cfm?id=1897650

    >>> score([1, 2], [1, 3], {1:2, 2:1, 3:1})
    0.42857142857142855
    """
    return sum(i for i in x if i in y) * w[i] / sum(i for i in x)* w[i]

用鼻子运行

pip install nose
nosetests  --with-doctests

给出了你的代码

Failed example:
    score([1, 2], [1, 3], {1:2, 2:1, 3:1})
Exception raised:
    Traceback (most recent call last):
       ...
    NameError: global name 'i' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.531s

FAILED (failures=1)

因此您可以检查错误并修复。 输出略微修改的@ misha代码

def score(x, y, w):
    """
    Calcutates directional distributional similarity http://dl.acm.org/citation.cfm?id=1897650

    >>> score([1, 2], [1, 3], {1:1.5, 2:1.0, 3:1.0})
    0.42857142857142855
    """
    xx = set(x)
    yy = set(y)
    return 1.0 * sum(i*w[i] for i in xx & yy) / sum(i * w[i] for i in x) 

将是

.
----------------------------------------------------------------------
Ran 1 test in 0.016s

OK

如果您删除此1.0*部分,则会得到纠正:

Failed example:
    score([1, 2], [1, 3], {1:2, 2:1, 3:1})
Expected:
    0.42857142857142855
Got:
    0

更高级的测试用例有助于正确性检查。