js散度python代码踩坑
方式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代码踩坑相关推荐
- 西安交通大学915考研--编程题Java代码踩坑(2020年真题)
西安交通大学915考研–编程题Java代码踩坑(2020年真题) 目录 西安交通大学915考研--编程题Java代码踩坑(2020年真题) 2020.1--寻找方程组的解 2020.2--几组数中筛选 ...
- 如何运行开源游戏?八分音符酱python版踩坑记录
如何运行开源游戏?八分音符酱python版踩坑记录 如何从零到一搭建一个python游戏?这篇博客将以八分音符酱介绍详细过程. 下载源代码源代码 搭建python环境 参考此网站 此游戏运行基于pyt ...
- cxfreeze打包python项目踩坑笔记
先说结论 推荐使用cxfreeze-quickstart命令来手动配置打包参数. 若项目包含有ctypes加载的dll文件,需要在setup.py的buildOptions内传入,include_fi ...
- Python之父龟叔:考虑在浏览器里面使用 Python.js 运行 Python 代码
文 | 局长 出品 | OSC开源社区 Mypy 项目核心团队的成员 ethanhs 发表推特称,得益于 Python 团队核心开发者 @ChristianHeimes 最近提交的 commit,他找 ...
- linux python3.8源码安装_linux 下从源码安装 Python——小白踩坑记
实验室服务器使用的系统为 Ubuntu 16.04,自带的 python 版本为 Python 2.7.12 和 Python 3.5.2,命令行下使用$ python命令来启动 python 时默认 ...
- 从一道面试题说起—js隐式转换踩坑合集
前方提醒: 篇幅较长,点个赞或者收藏一下,可以在下一次阅读时方便查找 提到js的隐式转换,很多人第一反应都是:坑. 的确,对于不熟悉的人来说,js隐式转换存在着很多的让人无法预测的地方,相信很多人都深 ...
- python import 踩坑指南 / sys.path失效解决方案
不关心故事背景的朋友们可以直接跳到"解决方案"- 文章目录 故事背景 历史方案 解决方案 故事背景 最近在用thrift的时候遇到一个问题,thrift生成的python文件之间的 ...
- Windows 10环境下「MSCOCO Captions」评估代码踩坑记录
文章目录 引言 解决python2→python3.x问题 验证评估代码是否可以正确运行 解决 jar 包运行出错的原因 排查jar包运行出错的原因 解决Could not reserve enoug ...
- 新手使用python易踩坑语法:if语句中or 与in连用
试想一下以下代码运行结果. a=["b","c","d","e"] for i in a:if "g" ...
最新文章
- linux网站权限怎么设置好,linux网站权限设置方法,网站安全配置,linux网站权限...
- 1086 就不告诉你
- java继承中构造方法_java之继承中构造方法总结(文字版)
- Python基础教程:变量和注释
- objc_msgSend() 使用报错解决方案
- 使用 pylint 检测python代码质量(sonar-scanner调用pylint,然后数据交给sonar服务器)
- 双目标帕累托优化_多目标稳健性决策规划(MORDM)
- 实时内核(Core)和实时操作系统(RTOS)有何不同?
- python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏
- Exps on March 21st
- jqGrid 使用案例及笔记
- 毕设题目:Matlab语音加密
- 小窍门:简历邮箱格式的正确写法,个人简历怎么发送到邮箱?
- 三,python基础初识。
- 论文精读 ——《BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection》
- java软件工程师自我评价_Java开发工程师岗位自我评价范文
- Oracle硬解析,软解析,软软解析介绍
- 邮件安全隐患有哪些?邮件安全如何保护?
- centos7 离线安装docker和docker-compose
- Final Cut Pro 一篇入门(没废话、干货)
热门文章
- python编程词典_Python编程20:字典的遍历和排序
- 世界第一位半机械人出现
- liunx使用sakura frp进行进行内网穿透,搭建网站
- win7锁定计算机任务栏,win7计算机快捷键没有了怎么办?将计算机图标锁定到任务栏的方法...
- GO语言凭什么是区块链的首选语言
- 武汉新时标文化传媒有限公司媒影视剧侵权须常态化监管
- java url安全的base64编码_URL安全的Base64编码
- docker启动fastdfs
- jango的CSRF跨站请求伪造即解决方法
- C++ Primer plus学习总结(未完成)