我有另一个问题,我希望有人可以帮助我.
我正在使用Jensen-Shannon-Divergence来测量两个概率分布之间的相似性.相似性得分似乎是正确的,因为它们在1和0之间,假设一个使用基数2对数,0表示分布相等.
但是,我不确定某个地方是否确实存在错误,并且想知道某人是否可以说"是的,这是正确的"或"不,你做错了什么".
这是代码:
from numpy import zeros, array
from math import sqrt, log
class JSD(object):
def __init__(self):
self.log2 = log(2)
def KL_divergence(self, p, q):
""" Compute KL divergence of two vectors, K(p || q)."""
return sum(p[x] * log((p[x]) / (q[x])) for x in range(len(p)) if p[x] != 0.0 or p[x] != 0)
def Jensen_Shannon_divergence(self, p, q):
""" Returns the Jensen-Shannon divergence. """
self.JSD = 0.0
weight = 0.5
average = zeros(len(p)) #Average
for x in range(len(p)):
average[x] = weight …Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可能知道以下答案.
我正在使用Python来构建基于字符的后缀树.树中有超过1100万个节点,可以容纳大约3GB的内存.这通过使用slot类方法而不是Dict方法从7GB下降.
当我序列化树(使用最高协议)时,生成的文件要小一百多倍.
当我重新加载pickle文件时,它再次消耗3GB的内存.这个额外开销来自何处,是否与Pythons处理对类实例的内存引用有关?
更新
感谢larsmans和Gurgeh提供的非常有用的解释和建议.我正在使用树作为文本语料库中信息检索界面的一部分.
我最初将子项(最多30个)存储为Numpy数组,然后尝试硬件版本(ctypes.py_object*30),Python数组(ArrayType),以及字典和集类型.
列表似乎做得更好(使用孔雀鱼来描述内存,并且__slots__['variable',...]),但是如果可以的话,我仍然试图将它压缩一点.我对数组唯一的问题是必须事先指定它们的大小,这导致只有一个子节点的节点有点冗余,而且我有很多它们.;-)
在构造树之后,我打算将它转换为具有第二遍的概率树,但是可以在构造树时执行此操作.由于构造时间在我的情况下并不太重要,所以array.array()听起来像是有用的东西,感谢提示,真的很感激.
我会告诉你它是怎么回事.
我想要一些建议.我在Python 2.6中遇到以下错误:
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
s.Search(query)
File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
verbose=self.__verbose
File "/usr/lib/python2.6/xmlrpclib.py", line 1253, in request
return self._parse_response(h.getfile(), sock)
File "/usr/lib/python2.6/xmlrpclib.py", line 1392, in _parse_response
return u.close()
File "/usr/lib/python2.6/xmlrpclib.py", line 838, in close
raise Fault(**self._stack[0])
Fault: <Fault 1: "<type 'exceptions.TypeError'>:dictionary key must be string">
Run Code Online (Sandbox Code Playgroud)
我的代码是使用Django提供迷你搜索引擎的一部分.在Python 3中,一切都像梦一样,但Django不适用于Python 3,所以我需要回溯我的代码,这是问题的来源.
我的代码(client.py):
# -*- coding: utf-8 -*-
from __future__ import unicode_literals # This was …Run Code Online (Sandbox Code Playgroud) 不确定这是否是包中的错误或由于其他原因,但我们继续.
我正在使用以下包在相似度得分的对称矩阵(大小为10x10)上找到最大的特征值及其对应的特征向量:
scipy.sparse.linalg.eigen.arpack.eigsh
Run Code Online (Sandbox Code Playgroud)
,像这样:
scipy.sparse.linalg.eigen.arpack.eigsh(mymatrix, 1, which='LM')
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当我运行它几次(使用相同的矩阵,设置等)时,有时特征向量中的值是正的,有时是负的(参见运行3).
有谁知道为什么会这样,或者它是一个错误?似乎没有一种模式,但它只发生在每次迭代后运行代码而不关闭Python时(即每次运行后点击F5).
### Run 1: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174 ]]
### Run 2: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174 ]]
### Run 3:###
[[ 0.31056873]
[ 0.31913092]
[ 0.3149287 ]
[ 0.32262921]
[ 0.32190688]
[ 0.31292658]
[ 0.32424732]
[ 0.31885208]
[ 0.31808024]
[ 0.298174 ]]
### Run 4: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732] …Run Code Online (Sandbox Code Playgroud) python ×4
class ×1
dictionary ×1
distance ×1
eigenvalue ×1
eigenvector ×1
metrics ×1
pickle ×1
scipy ×1
unicode ×1
xmlrpclib ×1