【数据处理】Python:实现求条件分布函数 | 求平均值方差和协方差 | 求函数函数期望值的函数 | 概率论

   猛戳订阅! 👉 《一起玩蛇》🐍

💭 写在前面:本章我们将通过 Python 手动实现条件分布函数的计算,实现求平均值,方差和协方差函数,实现求函数期望值的函数。部署的测试代码放到文后了,运行所需环境 python version >= 3.6,numpy >= 1.15,nltk >= 3.4,tqdm >= 4.24.0,scikit-learn >= 0.22。

🔗 相关链接:【概率论】Python:实现求联合分布函数 | 求边缘分布函数

📜 本章目录:

0x00 实现求条件分布的函数(Conditional distribution)

0x01 实现求平均值, 方差和协方差的函数(Mean, Variance, Covariance)

0x02 实现求函数期望值的函数(Expected Value of a Function)

0x04 提供测试用例


0x00 实现求条件分布的函数(Conditional distribution)

实现 conditional_distribution_of_word_counts 函数,接收 Point 和 Pmarginal 并求出结果。

请完成下面的代码,计算条件分布函数 (Joint distribution),将结果存放到 Pcond 中并返回:

def conditional_distribution_of_word_counts(Pjoint, Pmarginal):"""Parameters:Pjoint (numpy array) - Pjoint[m,n] = P(X0=m,X1=n), whereX0 is the number of times that word0 occurs in a given text,X1 is the number of times that word1 occurs in the same text.Pmarginal (numpy array) - Pmarginal[m] = P(X0=m)Outputs:Pcond (numpy array) - Pcond[m,n] = P(X1=n|X0=m)"""raise RuntimeError("You need to write this part!")return Pcond​

🚩 输出结果演示:

Problem3. Conditional distribution:
[[0.97177419 0.02419355 0.00201613 0.        0.00201613][1.         0.         0.         0.        0.        ][       nan        nan        nan       nan        nan][       nan        nan        nan       nan        nan][1.         0.         0.         0.        0.        ]]

💭 提示:条件分布 (Conditional distribution) 公式如下:

\color{}P=(X_1=x_1|X_0=x_0)=\frac{P(X_0=X_0,X_1=x_1)}{P(X_0=x_0)}

💬 代码演示:conditional_distribution_of_word_counts 的实现

def conditional_distribution_of_word_counts(Pjoint, Pmarginal):Pcond = Pjoint / Pmarginal[:, np.newaxis]  # 根据公式即可算出条件分布return Pcond

值得注意的是,如果分母 Pmarginal 中的某些元素为零可能会导致报错问题。这导致除法结果中出现了 NaN(Not a Number)。在计算条件概率分布时,如果边缘分布中某个值为零,那么条件概率无法得到合理的定义。为了解决这个问题,我们可以在计算 Pmarginal 时,将所有零元素替换为一个非零的很小的数,例如 1e-10。

0x01 实现求平均值, 方差和协方差的函数(Mean, Variance, Covariance)

使用英文文章中最常出现的 a, the 等单词求出其联合分布 (Pathe) 和边缘分布 (Pthe)。

Pathe 和 Pthe 在 reader.py 中已经定义好了,不需要我们去实现,具体代码文末可以查阅。

这里需要我们使用概率分布,编写求平均值、方差和协方差的函数:

  • 函数 mean_from_distribution 和 variance_from_distribution 输入概率分布 \color{}P(Pthe) 中计算概率变量 \color{}X 的平均和方差并返回。平均值和方差保留小数点前三位即可。
  • 函数 convariance_from_distribution 计算概率分布 \color{}P(Pathe) 中的概率变量 \color{}X_0 和概率变量 \color{}X_1 的协方差并返回,同样保留小数点前三位即可。

def mean_from_distribution(P):"""Parameters:P (numpy array) - P[n] = P(X=n)Outputs:mu (float) - the mean of X"""raise RuntimeError("You need to write this part!")return mudef variance_from_distribution(P):"""Parameters:P (numpy array) - P[n] = P(X=n)Outputs:var (float) - the variance of X"""raise RuntimeError("You need to write this part!")return vardef covariance_from_distribution(P):"""Parameters:P (numpy array) - P[m,n] = P(X0=m,X1=n)Outputs:covar (float) - the covariance of X0 and X1"""raise RuntimeError("You need to write this part!")return covar

🚩 输出结果演示:

Problem4-1. Mean from distribution:
4.432
Problem4-2. Variance from distribution:
41.601
Problem4-3. Convariance from distribution:
9.235

💭 提示:求平均值、方差和协方差的公式如下

\color{}\mu =\sum_{x}^{}x\cdot P(X=x)

\color{}\sigma =\sum_{x }^{}(x-\mu )^2\cdot P(X=x)

\color{}\, Cov(X_0,X_1)=\sum_{x_0,x_1}^{}(x_0-\mu x_0)(x_1-\mu x_1)\cdot P(X_0=x_0,X_1=x_1)

💬 代码演示:

def mean_from_distribution(P):mu = np.sum(    # Σnp.arange(len(P)) * P)return round(mu, 3)  # 保留三位小数def variance_from_distribution(P):mu = mean_from_distribution(P)var = np.sum(    # Σ(np.arange(len(P)) - mu) ** 2 * P)return round(var, 3)   # 保留三位小数def covariance_from_distribution(P):m, n = P.shapemu_X0 = mean_from_distribution(np.sum(P, axis=1))mu_X1 = mean_from_distribution(np.sum(P, axis=0))covar = np.sum(   # Σ(np.arange(m)[:, np.newaxis] - mu_X0) * (np.arange(n) - mu_X1) * P)return round(covar, 3)

0x02 实现求函数期望值的函数(Expected Value of a Function)

实现 expectation_of_a_function 函数,计算概率函数 \color{}X_0,X_1 的 \color{}E[f(X_0,X_1)] 。

其中 \color{}P 为联合分布,\color{}f 为两个实数的输入,以 \color{}f(x_0,x_1)  的形式输出。

函数 \color{}f 已在 reader.py 中定义,你只需要计算 \color{}E[f(X_0,X_1)] 的值并保留后三位小数返回即可。

def expectation_of_a_function(P, f):"""Parameters:P (numpy array) - joint distribution, P[m,n] = P(X0=m,X1=n)f (function) - f should be a function that takes tworeal-valued inputs, x0 and x1.  The output, z=f(x0,x1),must be a real number for all values of (x0,x1)such that P(X0=x0,X1=x1) is nonzero.Output:expected (float) - the expected value, E[f(X0,X1)]"""raise RuntimeError("You need to write this part!")return expected

🚩 输出结果演示:

Problem5. Expectation of a funciton:
1.772

💬 代码演示:expectation_of_a_function 函数的实现

def expectation_of_a_function(P, f):"""Parameters:P (numpy array) - joint distribution, P[m,n] = P(X0=m,X1=n)f (function) - f should be a function that takes tworeal-valued inputs, x0 and x1.  The output, z=f(x0,x1),must be a real number for all values of (x0,x1)such that P(X0=x0,X1=x1) is nonzero.Output:expected (float) - the expected value, E[f(X0,X1)]"""m, n = P.shapeE = 0.0for x0 in range(m):for x1 in range(n):E += f(x0, x1) * P[x0, x1]return round(E, 3)   # 保留三位小数

0x04 提供测试用例

这是一个处理文本数据的项目,测试用例为 500 封电子邮件的数据(txt 的格式文件):

🔨 所需环境:

- python version >= 3.6
- numpy >= 1.15
- nltk >= 3.4
- tqdm >= 4.24.0
- scikit-learn >= 0.22

nltk 是 Natural Language Toolkit 的缩写,是一个用于处理人类语言数据(文本)的 Python 库。nltk 提供了许多工具和资源,用于文本处理和 NLP,PorterStemmer 用来提取词干,用于将单词转换为它们的基本形式,通常是去除单词的词缀。 RegexpTokenizer 是基于正则表达式的分词器,用于将文本分割成单词。

💬 data_load.py:用于加载文本数据

import os
import numpy as np
from nltk.stem.porter import PorterStemmer
from nltk.tokenize import RegexpTokenizer
from tqdm import tqdmporter_stemmer = PorterStemmer()
tokenizer = RegexpTokenizer(r"\w+")
bad_words = {"aed", "oed", "eed"}  # these words fail in nltk stemmer algorithmdef loadFile(filename, stemming, lower_case):"""Load a file, and returns a list of words.Parameters:filename (str): the directory containing the datastemming (bool): if True, use NLTK's stemmer to remove suffixeslower_case (bool): if True, convert letters to lowercaseOutput:x (list): x[n] is the n'th word in the file"""text = []with open(filename, "rb") as f:for line in f:if lower_case:line = line.decode(errors="ignore").lower()text += tokenizer.tokenize(line)else:text += tokenizer.tokenize(line.decode(errors="ignore"))if stemming:for i in range(len(text)):if text[i] in bad_words:continuetext[i] = porter_stemmer.stem(text[i])return textdef loadDir(dirname, stemming, lower_case, use_tqdm=True):"""Loads the files in the folder and returns alist of lists of words from the text in each file.Parameters:name (str): the directory containing the datastemming (bool): if True, use NLTK's stemmer to remove suffixeslower_case (bool): if True, convert letters to lowercaseuse_tqdm (bool, default:True): if True, use tqdm to show status barOutput:texts (list of lists): texts[m][n] is the n'th word in the m'th emailcount (int): number of files loaded"""texts = []count = 0if use_tqdm:for f in tqdm(sorted(os.listdir(dirname))):texts.append(loadFile(os.path.join(dirname, f), stemming, lower_case))count = count + 1else:for f in sorted(os.listdir(dirname)):texts.append(loadFile(os.path.join(dirname, f), stemming, lower_case))count = count + 1return texts, count

💬 reader.py:将读取数据并打印

import data_load, hw4, importlib
import numpy as npif __name__ == "__main__":texts, count = data_load.loadDir("data", False, False)importlib.reload(hw4)Pjoint = hw4.joint_distribution_of_word_counts(texts, "mr", "company")print("Problem1. Joint distribution:")print(Pjoint)print("---------------------------------------------")P0 = hw4.marginal_distribution_of_word_counts(Pjoint, 0)P1 = hw4.marginal_distribution_of_word_counts(Pjoint, 1)print("Problem2. Marginal distribution:")print("P0:", P0)print("P1:", P1)print("---------------------------------------------")Pcond = hw4.conditional_distribution_of_word_counts(Pjoint, P0)print("Problem3. Conditional distribution:")print(Pcond)print("---------------------------------------------")Pathe = hw4.joint_distribution_of_word_counts(texts, "a", "the")Pthe = hw4.marginal_distribution_of_word_counts(Pathe, 1)mu_the = hw4.mean_from_distribution(Pthe)print("Problem4-1. Mean from distribution:")print(mu_the)var_the = hw4.variance_from_distribution(Pthe)print("Problem4-2. Variance from distribution:")print(var_the)covar_a_the = hw4.covariance_from_distribution(Pathe)print("Problem4-3. Covariance from distribution:")print(covar_a_the)print("---------------------------------------------")def f(x0, x1):return np.log(x0 + 1) + np.log(x1 + 1)expected = hw4.expectation_of_a_function(Pathe, f)print("Problem5. Expectation of a function:")print(expected)

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.11.15
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

比特科技. C++[EB/OL]. 2021[2021.8.31]. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/193500.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DNS正向解析和主从复制

目录 概念 DNS解析 例:www.baidu.com. 解析过程 DNS查询方式 DNS的查询过程 DNS软件bind 正向解析(根据域名查找ip地址) 1.先安装bind软件 2.打开网卡配置文件 将DNS1改为自己本机 (更改完配置重启服务) 3.打…

最长上升子序列模型 笔记

首先附上模板&#xff1a; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll;const int N 100010;int n; int a[N], q[N];int main()…

MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建数据库2.数据库中的编码问题2.1.字符集与校验集2.3.支持的字符…

DNS域名解析服务

1.概述 1.1.产生原因 IP 地址:是互联网上计算机唯一的逻辑地址&#xff0c;通过IP 地址实现不同计算机之间的相互通信&#xff0c;每台联网计算机都需要通过I 地址来互相联系和分别&#xff0c;但由于P 地址是由一串容易混淆的数字串构成&#xff0c;人们很难记忆所有计算机的…

python 实验7

姓名&#xff1a;轨迹 学号&#xff1a;6666 专业年级&#xff1a;2021级软件工程 班级&#xff1a; 66 实验的准备阶段 (指导教师填写) 课程名称 Python开发与应用 实验名称 文件异常应用 实验目的 &#xff08;1&#xff09;掌握基本文件读写的方式&#xff1b; …

【仿真动画】ABB IRB 8700 机器人搬运(ruckig在线轨迹生成)动画欣赏

场景 动画 一、IRB 8700简介 二、动画脚本重点分析 2.1 sim.moveToPose 通过在两个 poses 之间执行插值&#xff0c;使用 Ruckig 在线轨迹生成器生成对象运动数据。该函数可以通过处理 4 个运动变量&#xff08;x、y、z 和两个姿势之间的角度&#xff09;或单个运动变量&#…

linux 网络 cat /proc/net/dev 查看测试网络丢包情况

可以通过 cat /proc/net/dev 查看测试网络丢包情况&#xff0c;drop关键字&#xff0c;查看所有网卡的丢包情况 还可以看其他数据&#xff0c; /proc/net/下面有如下文件

计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Linux C 进程间通信

进程间通信 概述进程间通信方式管道概述管道函数无名管道 pipe有名管道 makefifo删除有名管道 rmove 有名管道实现 双人无序聊天 例子 信号信号概述信号处理过程信号函数传送信号给指定的进程 kill注册信号 signal查询或设置信号处理方式 sigaction设置信号传送闹钟 alarm 有名…

web缓存-----squid代理服务

squid相关知识 1 squid的概念 Squid服务器缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容。 Squid代理服务器&#xff08;Squid proxy server&#xff09;一般和原始文件一起安装在单独服务器而不是网络服务器上。Squid通过追踪网络中的对象运用起作用。…

【C语言 | 指针】指针和数关系——剪不断,理还乱

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

算法学习打卡day45|动态规划:股票问题总结

Leetcode股票问题总结篇 动态规划的股票问题一共六道题&#xff0c;买卖股票最佳时机和买卖股票手续费都是一个类型的问题&#xff0c;维护好买入和卖出两个状态即可&#xff0c;方法一摸一样。而冷冻期也差不多就是状态多了点&#xff0c;买入、保持卖出、当日卖出、以及冷冻期…

Android10 手势导航

种类 Android10 默认的系统导航有三种&#xff1a; 1.两个按钮的 2.三个按钮的 3.手势 它们分别对应三个包名 frameworks/base/packages/overlays/NavigationBarMode2ButtonOverlay frameworks/base/packages/overlays/NavigationBarMode3ButtonOverlay frameworks/base/packa…

基于安卓android微信小程序的快递取件及上门服务系统

项目介绍 本文从管理员、用户的功能要求出发&#xff0c;快递取件及上门服务中的功能模块主要是实现管理员服务端&#xff1b;首页、个人中心、用户管理、快递下单管理、预约管理、管理员管理、系统管理、订单管理&#xff0c;用户客户端&#xff1b;首页、快递下单、预约管理…

笔记51:循环神经网络入门

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\循环神经网络 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a

VS2017新建.hpp文件

目录 1、新建h文件的方法&#xff1a;2、新建对用的cpp文件&#xff1a;3、在main.cpp中调用 1、新建h文件的方法&#xff1a; 2、新建对用的cpp文件&#xff1a; 3、在main.cpp中调用 参见大佬博客

【flink实战】动态表:关系查询处理流的思路:连续查询、状态维护;表转换为流需要编码编码

文章目录 一. 使用关系查询处理流的讨论二. 动态表 & 连续查询(Continuous Query)三. 在流上定义表1. 连续查询2. 查询限制2.1. 维护状态2.2. 计算更新 四. 表到流的转换1. Append-only 流2. Retract 流3. Upsert 流 本文主要讨论了&#xff1a; 讨论通过关系查询处理无界流…

天津专升本新版报名系统网上报名、填志愿、缴费、审核等操作步骤

天津高职升本网上报名、填报志愿新版专升本报名系统 ▏报名入口&#xff1a;www.zhaokao.net▏注意&#xff1a;一定要在截止时间内完成报名、填报志愿、缴费、审核、下载《报名信息表》等4步骤▏可报考院校及专业请参考招生院校发布的通知&#xff08;招生简章、报考须知&…

YOLOv7独家原创改进:最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv7独家原创改进:独家首发最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度。 💡对自己数据集改进有效…

EMNLP 2023 | 用于开放域多跳推理的大语言模型的自我提示思想链

©PaperWeekly 原创 作者 | 王金元 单位 | 上海交通大学 研究方向 | 大模型微调及应用 论文标题&#xff1a; Self-prompted Chain-of-Thought on Large Language Models for Open-domain Multi-hop Reasoning 模型&代码地址&#xff1a; https://github.com/noewangj…