2017-04-16 91 views
-1

此问题是对previous question的补充。Python中用于实数数据集的信息内容

我需要计算来自两个Python列表的信息内容。这些列表包含实数。我明白,如果概率是从列表的直方图计算出来的,我可以使用下面的公式。

sum_ij p(x_i,y_j) log_2 (p(x_i,y_j)/(p(x_i)p(y_j))/- sum_i p(y_i) log_2 p(y_i) 

是否有任何内置的Python API来计算信息内容?

对上一个问题的回答建议使用来自BioPythoninformation_content() API。但该功能仅适用于字母符号。

谢谢。

+0

是你的价值观离散或连续? – Paul

+0

@保罗他们是连续的。 –

回答

2

对于离散分布,可以使用上述的biopython或scikit-learn的sklearn.metrics.mutual_info_score。但是,两者都使用您引用的公式(其用于符号数据)计算“符号”数据之间的互信息。无论哪种情况,您都会忽视数据的值具有固有的顺序。

对于连续分布,最好使用Kozachenko-Leonenko的k最近邻估计熵(K & L 1987)和相应的Kraskov,...,Grassberger(2004)估计互信息。这些规避了计算概率密度函数的中间步骤,并且直接从数据点到其最近邻居的距离估计熵。

Kozachenko-Leonenko估计量的基本思想是查看相邻数据点之间的平均距离(的某个函数)。直觉是,如果这个距离很大,数据中的离差很大,因此熵很大。在实践中,不是取最近邻距离,而是取k-最近邻距离(其中k通常是5-20范围内的小整数),这趋于使估计更稳健。

我有我的github上这两种方案:https://github.com/paulbrodersen/entropy_estimators