方式1:需要聚合出结果

(输入的为某个值)

import pandas as pd
import numpy as np
import scipy.stats as ss# 忽略警告
import warnings
warnings.filterwarnings('ignore')# JS散度
def js_divergence1(p,q):M = (p+q)/2 # 自定义函数: 加了判断语句,防止 'NaN' 报错js1 = 0.5*np.sum(  0 if np.isnan( p*np.log(p/M)) else p*np.log(p/M)) +  \0.5*np.sum( 0 if np.isnan(q*np.log(q/M)) else  q*np.log(q/M) )return round(float(js1),6)# 构建测试数据
lists = [['data center','X',94,47],['data center','Y',6,3],['ads','A1',50,24],['ads','A2',20,21],['ads','A3',20,4],['ads','A4',10,1],['device type','pc',50,49],['device type','mobile',25,1],['device type','tablet',25,0]]
df = pd.DataFrame(lists, columns=['dimension','indicator','pred','actual'])
df_s = df.groupby('dimension')[['pred','actual']].transform('sum')
df_s.columns = ['pred_sum','actual_sum']df = pd.concat([df,df_s],axis =1)# 计算suprise: p、q
df['p'] = df['pred']/df['pred_sum']
df['q'] = df['actual']/df['actual_sum']
dfdf_js = df[['p', 'q']].apply(lambda x: js_divergence1(x['p'], x['q']), axis=1)
df_js# 以 dimension = 'device type' 为例
df[-3:]['js'].sum() # 0.184203

方式2:直接就散出维度的js值

要求输入,array_like 数组、列表组织的数据形式,进过实验输入Series的p,q 使用下面的函数,可以容纳任意离散分布的对比对象出现密度为0,然后导致 NAN值出现的情况

import pandas as pd
import numpy as np
import scipy.stats as ss# 忽略警告
import warnings
warnings.filterwarnings('ignore')# JS散度
def js_divergence1(p,q):# p,q 为Series sum(1,2,nan) 可为3 M = (p+q)/2 js1 = 0.5*np.sum(p*np.log(p/M)) +  0.5*np.sum( q*np.log(q/M))return round(float(js1),6)def js_divergence2(p,q):p = np.array(p)q = np.array(q)M = (p+q)/2 # 方法二:调用scipy包js2 = 0.5*ss.entropy(p,M)+0.5*ss.entropy(q,M)return round(float(js2),6)"""
数据结构:
维度|指标|预测|实际
dimension|indicator|pred|actual"""# 构建测试数据
lists = [['data center','X',94,47],['data center','Y',6,3],['ads','A1',50,24],['ads','A2',20,21],['ads','A3',20,4],['ads','A4',10,1],['device type','pc',50,49],['device type','mobile',25,1],['device type','tablet',25,0]]
df = pd.DataFrame(lists, columns=['dimension','indicator','pred','actual'])
df_s = df.groupby('dimension')[['pred','actual']].transform('sum')
df_s.columns = ['pred_sum','actual_sum']df = pd.concat([df,df_s],axis =1)# 计算suprise: p、q
df['p'] = df['pred']/df['pred_sum']
df['q'] = df['actual']/df['actual_sum']
df# 再次包装了个函数
def js_dim(df,col):df_s = df.loc[df.dimension == col,: ]return js_divergence2(df_s['p'],df_s['q'])js_compute(df,'device type')

函数参数:关于python中的entropy

Docstring:
Calculate the entropy of a distribution for given probability values.If only probabilities `pk` are given, the entropy is calculated as
``S = -sum(pk * log(pk), axis=axis)``.If `qk` is not None, then compute the Kullback-Leibler divergence
``S = sum(pk * log(pk / qk), axis=axis)``.This routine will normalize `pk` and `qk` if they don't sum to 1.Parameters
----------
pk : array_likeDefines the (discrete) distribution. Along each axis-slice of ``pk``,element ``i`` is the  (possibly unnormalized) probability of event``i``.
qk : array_like, optionalSequence against which the relative entropy is computed. Should be inthe same format as `pk`.
base : float, optionalThe logarithmic base to use, defaults to ``e`` (natural logarithm).
axis: int, optionalThe axis along which the entropy is calculated. Default is 0.Returns
-------
S : {float, array_like}The calculated entropy.Examples
-------->>> from scipy.stats import entropyBernoulli trial with different p.
The outcome of a fair coin is the most uncertain:>>> entropy([1/2, 1/2], base=2)
1.0The outcome of a biased coin is less uncertain:>>> entropy([9/10, 1/10], base=2)
0.46899559358928117Relative entropy:>>> entropy([1/2, 1/2], qk=[9/10, 1/10])
0.5108256237659907

附加:

# js : 两者相加
0.5*sum(p*np.log(p/M)) + 0.5 *sum([0 if np.isnan(x) else x for x in np.array(q*np.log(q/M))]) # 基于数组
0.5*sum(p*np.log(p/M)) +0.5 *sum([0 if np.isnan(x) else x for x in q*np.log(q/M)]) # 基于Series

js散度python代码踩坑相关推荐

  1. 西安交通大学915考研--编程题Java代码踩坑(2020年真题)

    西安交通大学915考研–编程题Java代码踩坑(2020年真题) 目录 西安交通大学915考研--编程题Java代码踩坑(2020年真题) 2020.1--寻找方程组的解 2020.2--几组数中筛选 ...

  2. 如何运行开源游戏?八分音符酱python版踩坑记录

    如何运行开源游戏?八分音符酱python版踩坑记录 如何从零到一搭建一个python游戏?这篇博客将以八分音符酱介绍详细过程. 下载源代码源代码 搭建python环境 参考此网站 此游戏运行基于pyt ...

  3. cxfreeze打包python项目踩坑笔记

    先说结论 推荐使用cxfreeze-quickstart命令来手动配置打包参数. 若项目包含有ctypes加载的dll文件,需要在setup.py的buildOptions内传入,include_fi ...

  4. Python之父龟叔:考虑在浏览器里面使用 Python.js 运行 Python 代码

    文 | 局长 出品 | OSC开源社区 Mypy 项目核心团队的成员 ethanhs 发表推特称,得益于 Python 团队核心开发者 @ChristianHeimes 最近提交的 commit,他找 ...

  5. linux python3.8源码安装_linux 下从源码安装 Python——小白踩坑记

    实验室服务器使用的系统为 Ubuntu 16.04,自带的 python 版本为 Python 2.7.12 和 Python 3.5.2,命令行下使用$ python命令来启动 python 时默认 ...

  6. 从一道面试题说起—js隐式转换踩坑合集

    前方提醒: 篇幅较长,点个赞或者收藏一下,可以在下一次阅读时方便查找 提到js的隐式转换,很多人第一反应都是:坑. 的确,对于不熟悉的人来说,js隐式转换存在着很多的让人无法预测的地方,相信很多人都深 ...

  7. python import 踩坑指南 / sys.path失效解决方案

    不关心故事背景的朋友们可以直接跳到"解决方案"- 文章目录 故事背景 历史方案 解决方案 故事背景 最近在用thrift的时候遇到一个问题,thrift生成的python文件之间的 ...

  8. Windows 10环境下「MSCOCO Captions」评估代码踩坑记录

    文章目录 引言 解决python2→python3.x问题 验证评估代码是否可以正确运行 解决 jar 包运行出错的原因 排查jar包运行出错的原因 解决Could not reserve enoug ...

  9. 新手使用python易踩坑语法:if语句中or 与in连用

    试想一下以下代码运行结果. a=["b","c","d","e"] for i in a:if "g" ...

最新文章

  1. linux网站权限怎么设置好,linux网站权限设置方法,网站安全配置,linux网站权限...
  2. 1086 就不告诉你
  3. java继承中构造方法_java之继承中构造方法总结(文字版)
  4. Python基础教程:变量和注释
  5. objc_msgSend() 使用报错解决方案
  6. 使用 pylint 检测python代码质量(sonar-scanner调用pylint,然后数据交给sonar服务器)
  7. 双目标帕累托优化_多目标稳健性决策规划(MORDM)
  8. 实时内核(Core)和实时操作系统(RTOS)有何不同?
  9. python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏
  10. Exps on March 21st
  11. jqGrid 使用案例及笔记
  12. 毕设题目:Matlab语音加密
  13. 小窍门:简历邮箱格式的正确写法,个人简历怎么发送到邮箱?
  14. 三,python基础初识。
  15. 论文精读 ——《BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection》
  16. java软件工程师自我评价_Java开发工程师岗位自我评价范文
  17. Oracle硬解析,软解析,软软解析介绍
  18. 邮件安全隐患有哪些?邮件安全如何保护?
  19. centos7 离线安装docker和docker-compose
  20. Final Cut Pro 一篇入门(没废话、干货)

热门文章

  1. python编程词典_Python编程20:字典的遍历和排序
  2. 世界第一位半机械人出现
  3. liunx使用sakura frp进行进行内网穿透,搭建网站
  4. win7锁定计算机任务栏,win7计算机快捷键没有了怎么办?将计算机图标锁定到任务栏的方法...
  5. GO语言凭什么是区块链的首选语言
  6. 武汉新时标文化传媒有限公司媒影视剧侵权须常态化监管
  7. java url安全的base64编码_URL安全的Base64编码
  8. docker启动fastdfs
  9. jango的CSRF跨站请求伪造即解决方法
  10. C++ Primer plus学习总结(未完成)