【数据处理】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), 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.
    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 mu


def 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 var


def 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.shape
    mu_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 two
       real-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 two
       real-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.shape
    E = 0.0

    for 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 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)

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   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]. 

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

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

相关文章

一加手机全球摄影展深圳开展 历年获奖作品齐登场

11 月 18 日至 12 月 3 日,一加手机将携手国际摄影奖(International Photography Awards,以下简称IPA),在深圳市南山区海岸城购物中心举办一加手机全球摄影展(OnePlus Global Photography Exhibition&#…

手机数据恢复应用程序有哪些?手机数据恢复免费软件排名TOP 9

一些免费的手机数据恢复应用程序和软件有付费版本。 如果您想要高功能,请选择付费版本,如果您不想要那么多功能,或者如果您目前不需要它,请选择免费版本。 手机数据恢复免费软件排名TOP 9 ​1. 奇客数据恢复 ​奇客数据恢复是一款…

PyTorch技术和深度学习——四、神经网络训练与优化

文章目录 1.神经网络迭代概念1)训练误差与泛化误差2)训练集、验证集和测试集划分3)偏差与方差 2.正则化方法1)提前终止2)L2正则化3)Dropout 3.优化算法1)梯度下降2)Momentum算法3)RM…

052-第三代软件开发-系统监测

第三代软件开发-系统监测 文章目录 第三代软件开发-系统监测项目介绍系统监测 关键字: Qt、 Qml、 cpu、 内存、memory 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C 的强大功…

asp.net core mvc 之 依赖注入

一、视图中使用依赖注入 1、core目录下添加 LogHelperService.cs 类 public class LogHelperService{public void Add(){}public string Read(){return "日志读取";}} 2、Startup.cs 文件中 注入依赖注入 3、Views目录中 _ViewImports.cshtml 添加引用 4、视图使用…

Go语言常用命令详解(一)

文章目录 前言常用命令go build示例参数说明 go test示例参数说明 go run示例参数说明 go clean示例参数介绍 总结写在最后 前言 Go语言是一种开源的编程语言,由Google开发并于2009年首次发布。它以其简洁、高效和并发性能而备受开发者的喜爱。作为一门相对年轻的语…

C进阶---自定义类型:结构体、枚举、联合

目录 一、前言 二、结构体 2.1结构体的声明 2.2特殊的声明 2.3结构体的自引用 2.4结构体变量的定义和初始化 2.5结构体内存对齐 2.6修改默认对齐数 2.7结构体传参 三、位段 3.1什么是位段 3.2位段的内存分配 3.3位段的跨平台问题 3.4位段的应用 四、枚…

【ML】欠拟合和过拟合的一些判别和优化方法(吴恩达机器学习笔记)

吴恩达老师的机器学习教程笔记 减少误差的一些方法 获得更多的训练实例——解决高方差尝试减少特征的数量——解决高方差尝试获得更多的特征——解决高偏差尝试增加多项式特征——解决高偏差尝试减少正则化程度 λ——解决高偏差尝试增加正则化程度 λ——解决高方差 什么是…

Spring-IoC与DI入门案例

IoC入门案例 IoC入门案例思路分析 管理什么?(Service与Dao)如何将被管理的对象告知IoC容器?(配置)被管理的对象交给IoC容器,如何获取到IoC容器?(接口)IoC容…

【Java 进阶篇】JQuery 动画:为页面添彩的魔法

在现代的Web开发中,用户体验的提升是至关重要的一环。而动画作为页面交互中的重要组成部分,更是为用户带来了全新的感官体验。本篇博客将深入探讨 JQuery 中动画的应用,带你进入一个充满活力的前端世界。 前言 动画是网页设计的一种重要手段…

基于电力需求侧能效管理平台的建设及应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:电力是国民经济和居民生活的命脉,为贯彻落实国家对于节能减排工作的总体部署,深入推进电力需求侧管理工作、本文从电力需求侧能效管理平台所要实现的功能与应用信息技术两个方面&#x…

磁盘阵列之RAID

一、RAID介绍 RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。RAID就是…

linux高级篇基础理论一(详细文档、Apache,网站,MySQL、MySQL备份工具)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

根据视频编码时间批量重命名视频文件

整理收藏的小视频的时候发现很多视频命名很随意,自己命名又太麻烦,看着乱糟糟的文件又心烦,所有写了这个程序,代码如下: import osfrom filetype import filetype from pymediainfo import MediaInfovideo_extension …

μC/OS-II---消息队列管理2(os_q.c)

目录 消息队列的主要优点消息队列和消息邮箱消息队列相关操作向消息队列发送消息(FIFO)向消息队列发送消息(LIFO)向消息队列发送消息(扩展)消息队列获取/无等待清空消息队列消息队列信息获取消息队列中断等待 消息队列的主要优点 消息队列的主要优点是解耦和异步通…

nginx启动命令

普通启动 切换到nginx安装目录的sbin目录下,执行:./nginx 通过配置文件启动 ./nginx -c /usr/local/nginx/conf/nginx.conf /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 其中-c是指定配置文件,而且配置文件路径必须指定绝对路…

YOLO改进系列之注意力机制(CoordAttention模型介绍)

简介 在轻量级网络上的研究表明,通道注意力会给模型带来比较显著的性能提升,但是通道注意力通常会忽略对生成空间选择性注意力图非常重要的位置信息。因此,新加坡国立大学的提出了一种为轻量级网络设计的新的注意力机制,该机制将…

RabbitMQ之死信队列

文章目录 一、死信的概念二、死信的来源三、实战1、消息 TTL 过期2、队列达到最大长度3、消息被拒 总结 一、死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说&#x…

转载:YOLOv8改进全新Inner-IoU损失函数:扩展到其他SIoU、CIoU等主流损失函数,带辅助边界框的损失

0、摘要 随着检测器的快速发展,边界框回归(BBR)损失函数不断进行更新和优化。然而,现有的 IoU 基于 BBR 仍然集中在通过添加新损失项来加速收敛,忽略了 IoU 损失项本身的局限性。尽管从理论上讲,IoU 损失可…

Android10 手势导航

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