深入浅出统计学 第四五章 离散概率的计算与分布

离散概率计算与分布的应用

在原书的这两章离散概率计算与分布的应用,重点在于概念的理解和公式的记忆.
而对于整本书而言,四五六章其实都作为第七章:三种离散概率分布,第八,九章,正态分布(连续概率分布之一)做铺垫.
主要包括以下内容:
1. 期望与方差的计算
2. 线性变换与独立观察值变换有关内容
3. 贝叶斯定理

其中特别要注意的1,2点,在之后的内容中都将频繁使用这些内容.
而贝叶斯定理虽然很重要,但是对于之后的内容影响不大,如果有需要的话.可以进行扩展阅读贝叶斯算法,贝叶斯优化等.
其中贝叶斯算法算是机器学习比较基本的内容,去年写过一个实现纯Python原生语言的的朴素贝叶斯法分类器的Python3 实现,如果有兴趣可以尝试用numpy和pandas改写一下.

本文的编码内容较少,包括生成随机离散概率分布与相应计算,以及一个简易的封装类两个部分.

用Python代码计算计算器

生成随机变量

# 首先使用numpy生成随机变量
import numpy as np
np.random.seed(1024)
data = np.random.randint(1,5,size = 301)

计算概率分布

假设我们的数据为所有可能结果的数据集,这里我们通过上面生成的数据,计算概率分布.
或者我们也可以直接生成一个格式一致的pandas.core.series.Series类型数据,然后再利用之后的代码进行计算

import pandas as pd
value_count = pd.Series(data).value_counts()
value_count = value_count/len(pd.Series(data))
value_count # 注意此时的value为(pandas.core.series.Series)
2    0.292359
1    0.242525
3    0.235880
4    0.229236
dtype: float64

计算期望与方差

exp= sum(value_count.index * value_count)
var =  sum(((value_count.index - exp) ** 2) * value_count)
print("exp: {0:.3f}, var: {1:.3f}".format(exp, var))

# 线性变换: aX+b
a = 2
b=0.5
exp , var = a * exp + b, a * a * var
print("exp: {0:.3f}, var: {1:.3f}".format(exp, var))
# 独立观察值 nX
n = 10
print("exp: {0:.3f}, var: {1:.3f}".format(n * exp, n * var))
exp: 2.452, var: 1.191
exp: 5.404, var: 4.765
exp: 54.037, var: 47.648

对代码进行封装

封装后的代码可以计算数据集期望方差,计算一个确定的离散概率分布的方差,或者计算其相关的线性变换.
而对于独立观察值没有封装,直接将与默认版本结果 * n 即可

class Discrete_probability_distribution:

    def fit(self, list, index=None):
        """
        :param list: type:list;  The set of all the results;
        :return: pandas.core.series.Series, Discrete probability distribution
        """
        import pandas as pd
        self.data = pd.Series(list).value_counts() / len(pd.Series(list))
        if index != None:
            self.data.index = index

        return self.data

    def transfrom(self, a=1.0, b=0.0):
        """
        Support the calculation of expectation and variance of itself and linear change
        :param a: int,Linear variation parameter:a;
        :param b: int,Linear variation parameter:b;
        :return:float,float;Expectation , variance ;
        """

        self.exp = sum(self.data.index * self.data)
        self.var = sum(((self.data.index - self.exp) ** 2) * self.data)

        return a * self.exp + b, a * a * self.var

    def fit_transfrom(self, list, a=1.0, b=0.0):
        """
        fit and transfrom data,running function fit and function transfrom in one function
        :param list: type:list;  The set of all the results;
        :param a: int,Linear variation parameter:a;
        :param b: int,Linear variation parameter:b;
        :return:pandas.core.series.Series,float,float; Discrete probability distribution,Expectation , variance ;
        """

        self.fit(list)
        exp, var = self.transfrom(a=a, b=b)

        return self.data, exp, var

使用封装代码

我们首先计算一下之前的数据集,然后在利用封装的函数计算《深入浅出统计学》第227页的例题

discrete = Discrete_probability_distribution()
data_transfrom, exp, var = discrete.fit_transfrom(data)
print("data: \n", data_transfrom)
print("exp: {0:.3f}, var: {1:.3f}".format(exp, var))
data: 
 2    0.292359
1    0.242525
3    0.235880
4    0.229236
dtype: float64
exp: 2.452, var: 1.191
# 计算 P225 页例题
import pandas as pd
Ser = pd.Series([0.8, 0.1, 0.07, 0.03])
Ser.index = [-0.5, 1.5, 4.5, 9.5]
discrete.data = Ser
exp2, var2 = discrete.transfrom()
print("exp: {0:.3f}, var: {1:.3f}".format(exp2, var2))
exp3, var3 = discrete.transfrom(b = -0.5)
print("exp: {0:.3f}, var: {1:.3f}".format(exp3, var3))
exp: 0.350, var: 4.428
exp: -0.150, var: 4.428
posted @ 2018-07-02 20:31  FontTian  阅读(620)  评论(0编辑  收藏  举报