python

作者: keaidelele | 来源:发表于2017-03-28 20:11 被阅读26次

    今天看到了一个实现了js距离 jesson shannon distance 的代码
    其中 sum(_p * log(_p/_q) for (_p,_q) in zip(p,q) if _p!=0)这个代码写的特别好,其实就是公式:

    zip(p,q)的作用是将两个向量两两匹配成为元祖,zip(p,q)={(p1,q1),(p2,q2),...,(pn,qn)}
    sum(_p * log(_p/_q) for (_p,_q) in zip(p,q) if p!=0) 的意思就是:
    \sum
    {i=1}^{n}p_i\text{log}\frac{p_i}{q_i}

    Paste_Image.png
    from math import log
    from numpy import array
    
    class JSD:
        def KLD(self,p,q):
            if 0 in q :
                raise ValueError
            return sum(_p * log(_p/_q) for (_p,_q) in zip(p,q) if _p!=0)
    
        def JSD_core(self,p,q):
            M = [0.5*(_p+_q) for _p,_q in zip(p,q)]
            return 0.5*self.KLD(p,M)+0.5*self.KLD(q,M)
    
    #********Test*******
    p = [2,3,4,1,1]
    q = [3,3,2,1,0]
    
    jsd = JSD()
    print jsd.JSD_core(p,q)
    print jsd.JSD_core(q,p)
    
    

    相关文章

      网友评论

          本文标题:python

          本文链接:https://www.haomeiwen.com/subject/zklsottx.html