【概率论】Python:实现求联合分布函数 | 求边缘分布函数 | Joint distribution | Marginal distribution

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

💭 写在前面:本章我们将通过 Python 手动实现联合分布函数和边缘分布函数,部署的测试代码放到文后了,运行所需环境 python version >= 3.6,numpy >= 1.15,nltk >= 3.4,tqdm >= 4.24.0,scikit-learn >= 0.22。


0x00 实现求联合分布的函数(Joint distribution)

请完成下面的代码,计算联合分布函数 (Joint distribution),使用的两个随机变量如下:

  • \color{}X_0 为 test 中 word0 的出现次数。
  • \color{}X_1 为 test 中 word1 的出现次数。

求出上述 \color{}X_0,X_1 的联合分布函数,实现 joint_distribution_of_word_counts 函数。

💭 提示:联合分布函数 (Joint distribution) 公式如下:

joint_distribution_of_word_counts 是用来计算提供的 test 中的两个 word 的函数。

输入 texts 和第一个单词 word0,第二个单词 word1 构成 <List>,要求返回 Pjoint:

def joint_distribution_of_word_counts(texts, word0, word1):
    """
    Parameters:
    texts (list of lists) - a list of texts; each text is a list of words
    word0 (str) - the first word to count
    word1 (str) - the second word to count

    Output:
    Pjoint (numpy array) - Pjoint[m,n] = P(X0=m,X1=n), where
      X0 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.
    """
    # TODO
    return PJoint

🚩 输出结果演示:

Problem1. Joint distribution
[[0.964 0.024 0.002 0.     0.002]
 [0.006 0.    0.    0.     0.   ]
 [0.    0.    0.    0.     0.   ]
 [0.    0.    0.    0.     0.   ]
 [0.002 0.    0.    0.     0.   ]]

💬 参考代码:joint_distribution_of_word_counts 的实现

from collections import Counter

def joint_distribution_of_word_counts(texts, word0, word1):
    # 统计 word0 和 word1 在每个文本中的出现次数
    word0_counts = [Counter(text)[word0] for text in texts]
    word1_counts = [Counter(text)[word1] for text in texts]

    # 获取 X0 和 X1 的最大计数
    max_x0 = max(word0_counts)
    max_x1 = max(word1_counts)

    # 初始化联合分布矩阵
    Pjoint = np.zeros((max_x0 + 1, max_x1 + 1))

    # 填充联合分布矩阵
    for x0, x1 in zip(word0_counts, word1_counts):
        Pjoint[x0, x1] += 1

    # 归一化以获得概率
    Pjoint /= Pjoint.sum()
    return Pjoint

0x01 实现求边缘分布的函数(Marginal distribution)

实现求边缘分布 (Marginal distrubution) 的函数 marginal_distribution_of_word_counts

使用 "问题1" 中求出 Pjoint 求边缘分布,函数形参为 Pjoint 和 index,其中:

  • index 指的是在联合分布中保留哪个随机变量,而对另一个进行边缘化。
  • 边缘分布是从联合分布中消除某些变量以获取其他变量的分布。

使用 Pjoint 中给出的 index 计算其边缘分布,并将结果储存到 Pmarginal 变量中并予以返回。

💭 提示:边缘分布 (Marginal distrubution) 的公式如下:

def marginal_distribution_of_word_counts(Pjoint, index):
    """
    Parameters:
    Pjoint (numpy array) - Pjoint[m,n] = P(X0=m,X1=n), where
      X0 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.
    index (0 or 1) - which variable to retain (marginalize the other)

    Output:
    Pmarginal (numpy array) - Pmarginal[x] = P(X=x), where
      if index==0, then X is X0
      if index==1, then X is X1
    """
    raise RuntimeError("You need to write this part!")
    return Pmarginal

🚩 输出结果演示:

Problem2. Marginal distrubution:
P0: [0.992 0.006 0.    0.    0.002]
P1: [0.972 0.024 0.002 0.    0.002]

💬 参考代码:joint_distribution_of_word_counts 的实现

def marginal_distribution_of_word_counts(Pjoint, index):
    Pmarginal = np.sum(Pjoint, axis = 1 - index)   # 沿指定轴 index 求和

    return Pmarginal

根据公式,我们可以使用 使用 np.sum 函数来计算边缘分布:

\color{}P_{marginal_{i}}(x_i)=\sum_{x_j}^{}P_{joint}(x_0,x_1)

通过 np.sum(Pjoint, axis = 1 - index) 在 Pjoint 数组中 对非 index 的轴进行求和。

就可以得到边缘分布,axis 表示沿着哪个轴进行操作,这里我们设置为 1 - index 是因为:

  • 如果 index=0,我们想要保留 \color{}X_0,那么我们需要对 \color{}X_1 进行边缘化,即沿着轴 1 进行求和。因此,axis = 1 - 0 = 1
  • 如果 index=1,我们想要保留 \color{}X_1,那么我们需要对 \color{}X_0 进行边缘化,即沿着轴 0 进行求和。因此,axis = 1 - 1 = 0

0x03 提供测试用例

这是一个处理文本数据的项目,测试用例为 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 tqdm

porter_stemmer = PorterStemmer()
tokenizer = RegexpTokenizer(r"\w+")
bad_words = {"aed", "oed", "eed"}  # these words fail in nltk stemmer algorithm


def loadFile(filename, stemming, lower_case):
    """
    Load a file, and returns a list of words.

    Parameters:
    filename (str): the directory containing the data
    stemming (bool): if True, use NLTK's stemmer to remove suffixes
    lower_case (bool): if True, convert letters to lowercase

    Output:
    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:
                continue
            text[i] = porter_stemmer.stem(text[i])
    return text


def loadDir(dirname, stemming, lower_case, use_tqdm=True):
    """
    Loads the files in the folder and returns a
    list of lists of words from the text in each file.

    Parameters:
    name (str): the directory containing the data
    stemming (bool): if True, use NLTK's stemmer to remove suffixes
    lower_case (bool): if True, convert letters to lowercase
    use_tqdm (bool, default:True): if True, use tqdm to show status bar

    Output:
    texts (list of lists): texts[m][n] is the n'th word in the m'th email
    count (int): number of files loaded
    """
    texts = []
    count = 0
    if use_tqdm:
        for f in tqdm(sorted(os.listdir(dirname))):
            texts.append(loadFile(os.path.join(dirname, f), stemming, lower_case))
            count = count + 1
    else:
        for f in sorted(os.listdir(dirname)):
            texts.append(loadFile(os.path.join(dirname, f), stemming, lower_case))
            count = count + 1
    return texts, count

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

import data_load, hw4, importlib
import numpy as np

if __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)

 

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

📜 参考资料 

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023美亚杯个人赛复盘(一)火眼+取证大师

第一次参加美亚杯&#xff0c;手忙脚乱&#xff0c;不过也学到了很多东西&#xff0c;接下来会分篇介绍writeup&#xff0c;感兴趣的小伙伴可以持续关注。 案件基本情况&#xff1a; &#xff08;一&#xff09;案情 2023月8月的一天&#xff0c;香港警方在调查一起网络诈骗案…

Ubuntu20.04配置深度学习环境

默认你已经完成Ubuntu20.04的安装&#xff0c;如果没安装的话可以参考其他博客&#xff0c;我的显卡是GTX1660Ti 一、NVIDIA显卡驱动安装 大多数人在安装Ubutnu20.04系统的时候为了节约时间&#xff0c;通常不会勾选“图形或无线硬件&#xff0c;以及其他媒体格式安装第三方软…

Python小白之“没有名称为xlwings‘的模块”

题外话&#xff1a;学习和安装Python的第一个需求就是整理一个Excel&#xff0c;需要读取和写入Excel 背景&#xff1a;取到的模板代码&#xff0c;PyCharm本地运行报错&#xff1a;没有名称为xlwings的模块 解决办法&#xff1a;这类报模板找不到的错&#xff0c;即是模块缺…

爆款元服务!教你如何设计高使用率卡片

元服务的概念相信大家已经在 HDC 2023 上有了很详细的了解&#xff0c;更轻便的开发方式&#xff0c;让开发者跃跃欲试。目前也已经有很多开发者开发出了一些爆款元服务&#xff0c;那么如何让你的元服务拥有更高的传播范围、更高的用户使用率和更多的用户触点呢&#xff1f;设…

ACM练习——第三天

今天继续练习C和ACM模式 在写题之前先了解一些新的知识 1.#include <algorithm> #include <algorithm> 是 C 标准库中的头文件之一&#xff0c;其中包含了一系列用于处理各种容器&#xff08;如数组、向量、列表等&#xff09;和其他数据结构的算法。这个头文件提供…

分享 8 个 4k 壁纸站点

今天分享 8 个 4k 壁纸站点&#xff0c;换换心情&#xff01; bz.zzzmh 网址&#xff1a;https://bz.zzzmh.cn/ 一个免费的极简壁纸网站。 可以在这里找到所有极简壁纸&#xff0c;不需要注册登录就可以下载&#xff0c;它不限制分类、尺寸&#xff0c;想要什么样的壁纸直接搜…

2023最新版本 从零基础入门C++与QT(学习笔记) -4- C/C++混合编程

&#x1f38f;在C兼容C只需要调用C头文件 &#x1f384;格式 &#x1f388; -1- extern(关键字) “C”{ }(花括号) &#x1f388; -2- 花括号里面填写要包含的头文件 &#x1f384;代码段格式 extern "C" {#include “stdio.h”#include “string.h” }&#x…

【Beyond Compare】大小写对比的设置

1.点击会话设置 2.把大小写打勾 3.对比效果

Linux常用命令用法及实现方式有哪些?

接上一篇&#xff0c;它来啦&#xff01; 5.文本文件编辑命令 (1)touch命令&#xff1a;touch命令用于创建空白文件或设置文件的时间&#xff0c;语法格式为“touch [参数] 文件名称”。 (2)mkdir命令&#xff1a;mkdir命令用于创建空白的目录&#xff0c;英文全称为“make dir…

微同城生活圈小程序源码系统 专业搭建本地生活服务的平台 带完整搭建教程

在互联网的影响下&#xff0c;越来越多的用户开始依赖手机进行日常生活。为了满足本地居民的需求&#xff0c;源码小编来给大家分享一款全新的微同城生活圈小程序源码系统。该系统旨在为本地居民提供一站式的生活服务解决方案&#xff0c;让您的生活更加便捷、高效。 以下是部…

StableDiffusion(四)——高清修复与放大算法

目录 一、高清修复与放大算法 1.高清修复 ①文生图 ②图生图 2.SD放大&#xff08;SD Upscale&#xff09; 3.附加功能放大 4.总结 一、高清修复与放大算法 1.高清修复 概念&#xff1a;分两步&#xff0c;第一步生成低分辨率的图画&#xff0c;第二步使用它指定的高清…

内网Jenkins 部署.net(dotnet)项目

一、前置条件 内网部署Jenkins&#xff0c;并安装好所需插件 此篇内容需承接内网搭建Jenkins自动化远程部署项目到Windows服务器_jenkins内网安装-CSDN博客 &#xff0c;才更好操作与理解 二、在Jenkins中创建项目 三、配置项目 General Source Code Management Build Envi…

源码级JVS低代码功能新增:动态配置、逻辑多级循环嵌套等等

低代码更新功能 新增: 1.下拉组件选项新增动态配置&#xff1b; 选项的内容可以根据特定的条件或数据源进行动态变化的功能&#xff0c;通过动态配置&#xff0c;用户可以灵活地设置下拉组件的选项内容&#xff0c;例如从数据库或其他数据源中获取选项数据&#xff0c;或者根…

AdaBoost:提升机器学习的力量

一、介绍 机器学习已成为现代技术的基石&#xff0c;为从推荐系统到自动驾驶汽车的一切提供动力。在众多机器学习算法中&#xff0c;AdaBoost&#xff08;Adaptive Boosting的缩写&#xff09;作为一种强大的集成方法脱颖而出&#xff0c;为该领域的成功做出了重大贡献。AdaBoo…

docker 安装xxl-job

1.拉取镜像 docker pull xuxueli/xxl-job-admin:2.4.0 2.docker镜像创建并运行 docker run -e PARAMS"--spring.datasource.urljdbc:mysql://xxxxx:3306/xxl_job?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTimezoneAsia/Shanghai&…

全彩LED显示屏的质量怎样判断

判断全彩LED显示屏的质量需要考虑多个方面&#xff0c;包括平整度、白平衡、可视角度、分辨率、亮度、可靠性和稳定性等。以下是一些建议&#xff0c;供你参考&#xff1a; 平整度&#xff1a;LED显示屏的表面平整度应在1mm以内&#xff0c;以保证显示图像不发生扭曲。局部凸起…

使用 requests 2.11 版本时的 Site ID 类型问题及解决方案

在使用ebaysdk-python库时&#xff0c;一些用户可能会遇到一个特定问题&#xff0c;这个问题与requests库的版本有关。具体问题是&#xff0c;当使用requests库的2.11版本时&#xff0c;用户需要在请求头中传递的值必须为字符串或字节类型&#xff0c;但是传入的值却是整数类型…

文件包含漏洞

文章目录 文件包含漏洞php中文件包含的语句文件包含动态包含 相关配置本地文件包含远程文件包含 漏洞原理特点 利用方法包含图片木马读取敏感文件 读取php源码执行php代码包含图片马写 shell包含日志文件包含防御 文件包含漏洞 ​ 程序开发人员通常会把可重复使用函数或语句写…

从零到一:抖音小程序开发全指南及预算规划

在数字时代&#xff0c;抖音小程序的开发成为企业实现品牌推广、服务提供的重要途径。本文将为您提供从零到一的抖音小程序开发全指南&#xff0c;包括预算规划以及一些关键的技术代码示例。 1. 项目准备 在开始抖音小程序开发之前&#xff0c;需要进行一些项目准备工作。 …

【git】git本地仓库命令操作详解

这篇文章主要是针对git的命令行操作进行讲解&#xff0c;工具操作的基础也是命令行&#xff0c;如果基本命令操作都不理解&#xff0c;就算是会工具操作&#xff0c;真正遇到问题还是一脸懵逼 1.操作逻辑图 本地仓库的命令操作关系图 2.基本命令操作 1.1建立一个gittest01文…