如何理解正态分布?

如何理解正态分布?

通过之前的那篇文章我们可以精确判断有那些单身狗,及其前任有多少,但是实际上的情况是我们很难采集到这么多数据信息,你以为这个东西是查户口啊,想问就能知道,但是,经常有人说,或者说有人老是说自己是单身狗,基于搞事情的目的,我们可以用统计分析,来判断一下到底有多少单身狗,到底有多少单身狗还在单身。

首先通过之前的文章我们得到一些普遍性的数据,这个普遍性的数据描述的是平均水平,就是统计的总体水平如下:

前任人数

发生的概率

1

12/24

2

5/24

3

3/24

4

2/24

5

1/24

6

1/24

平均每个人是2.03888个

也就是说我们现在不在基于属性进行判断,但是这样会不会不准,我想说只要采样足够多这个东西是准的,怎么证明?这里为了使这篇文章得出来的结论更加严格,我们采用严格的数学建模证明和计算机随机模拟(但是为了使文章更加容易看到这里证明过程可以自行网上搜索)。

首先我要摆出的一个公式是中心极限定理。

可以说这个定理占据了整个概率论的半壁江山(废话说多了),那么这个定理怎样运用了,我们可以假设,我们随机有放回的抽取n个人,这n个人对应的随机变量之和(也就是x1+x2+…xn)其中x1+x2+…xn随机变量表示的是有多少前任,随机变量之和的标准化变量是符合正态分布的。

我们用计算机随机模拟抽样一千次的随机变量之和如下:

先计算标准化分数的,将其直方图绘制出来,为了简化代码这里不做太多的花哨处理。

这个可以看到这样的分布,这分布表示什么意思了,这里解释一下,随机抽取1000*1000 个样本数据 1000个随机变量之和的标准化变量的随机分布直方图图为这个,由于其中出现(32.9525-0.05,32.9525+0.05)出现了23次(这里鼠标移动的原因造成的频数是整数的)所以分布为在个区间的概率为23/1000

好了当我们将区间收缩到无穷小的时候这个时候,这个时候可以用积分表示,也就是一个概率密度曲线分布图,经过数学证明概率分布是符合0-1正态分布的。

那我们还需要进行一次数学推导,便于我们更好的理解接下来要搞的事情,在浙大的数理统计书中证明以下公式:

我们逆向推导出来就可以知道如下公式(参考浙大概率论与数理统计):

我们可以通过计算机模拟一下随机抽取1000个样本的随机变量之和的平均值(这里的平均值不是概率中的数学期望)的概率密度分布。

同样的道理,这里就好解释多了,随便抽取n人平均出现前任的次数有:

(3.53098-0.001,3.53098+0.001)出现了12次(这里转换成了区间使其分布更加严格)所以分布为在个区间的概率为12/1000

同样分布出现在以下区间的概率为:

(3.53098-x,3.53098+x)x表示为大于0的数,出现n次 概率为n/1000

好啦我们现在可以判断总体有多少单身狗之前还需要一个理论依据,我们要知道哪些是基本上是不可能发生事件

我现在想把这个3Q的原则改一下,比如我选择3Q法则我就觉得这个人如果落在我认为的区间内,我相信他的话为99.7%,也就是我犯错误的概率为0.3%

我个人觉得0.3%的概率还是太小了,既然要相信爱情,有个人说过,爱一个人八分,留二分给自己,所以犯错误的概率20%好了。

那我们现在有了这理论依据就开始进行推导,我们通过程序得到犯错误概率为20%的概率区间有多大。

代码如下:

# -*- coding: UTF-8 -*-

import numpy as np

import matplotlib.pyplot as plt

import math

import random

import scipy.stats

'''

正态分布公式

x表示未知数 sigma σ 标准差 μ mu 表示均值

'''

# def fxNormal(x,sigma,mu):

# left=1/(math.sqrt(2*math.pi)*sigma)

# right=math.pow(math.e,(-math.pow((x-mu),2))/2*math.pow(sigma,2))

# result=left*right

# return result;

# def getNormalXY(xmin,xmax,step ,sigma,mu):

# x = np.arange(xmin, xmax, step);

# y = []

# for xi in x:

# y.append(fxNormal(xi,sigma,mu))

# return x,y

# x,y=getNormalXY(-100,100,0.01,8,1)

# plt.plot(x,y);

#6

data=np.array([1,2,3,4,5,6])

#6种出现的概率

data_p=np.array([12/24,5/24,3/24,2/24,1/24,1/24])

#取得随机变量数学期望和方差

def getMeanAndVar(data,data_p):

# 均值

data_mean = np.dot(data, np.transpose(data_p))

# 方差

data_var = np.dot(np.multiply(data - data_mean, data - data_mean), np.transpose(data_p))

return data_mean,data_var

'''

随机放回抽样拿去数组n次

'''

def takeArrayValue(arr,n):

max=arr.__len__()-1;

resultArr=[]

while n>0:

index=random.randint(0,max)

resultArr.append(arr[index])

n=n-1

return resultArr

'''

得到标准化分数各个参数

'''

def getStdScoresArr(n,limit_distribution_n,data,data_p):

data_mean, data_var=getMeanAndVar(data,data_p)

limit_distribution = []

while limit_distribution_n > 0:

limit_distribution_n = limit_distribution_n - 1

#随机n个

x_sum = np.sum(takeArrayValue(data, n))

std_scores = (x_sum - n * data_mean) / (np.sqrt(data_var * n))

limit_distribution.append(std_scores)

return limit_distribution

'''

得到标准均值

'''

def getStdXmeanArr(n,limit_distribution_n,data):

limit_distribution = []

while limit_distribution_n > 0:

limit_distribution_n = limit_distribution_n - 1

#随机n个

x_mean = np.mean(takeArrayValue(data, n))

limit_distribution.append(x_mean)

return limit_distribution

'''

绘制标准化分数0-1正态分布区间数

'''

def draw_hist1(limit_distribution,data,data_p):

data_mean, data_var = getMeanAndVar(data, data_p)

bins = np.arange(data_mean - 100, data_mean + 100, 0.05) # 固定落区域

# 限制x轴范围

plt.xlim([min(limit_distribution) - 0.05, max(limit_distribution) + 0.05])

plt.hist(limit_distribution, bins=bins, alpha=0.5)

plt.show()

'''

'''

def draw_hist2(limit_distribution,data,data_p):

data_mean, data_var = getMeanAndVar(data, data_p)

bins = np.arange(data_mean - 5, data_mean + 5, 0.001) # 固定落区域

# 限制x轴范围

plt.xlim([min(limit_distribution) - 0.001, max(limit_distribution) + 0.001])

plt.hist(limit_distribution, bins=bins, alpha=0.5)

plt.show()

if __name__ == '__main__':

data_mean, data_var = getMeanAndVar(data, data_p)

print(data_mean)

#标准化分数分布

# limit_distribution = getStdScoresArr(1000, 1000, data, data_p)

# draw_hist1(limit_distribution, data, data_p)

#随机变量之和均值分布

# limit_distribution = getStdXmeanArr(1000, 1000, data)

# draw_hist2(limit_distribution,data,data_p)

#plt.scatter(x,y) #绘制散点图

print(data_mean-3*math.sqrt(data_var/1000),data_mean+3*math.sqrt(data_var/1000))

print(scipy.stats.norm(data_mean,data_var/1000).cdf(2.8))

print(scipy.stats.norm(data_mean,data_var/1000).ppf(0.8))

#1000*3-2085 915 915*2/2085 1000 129 129*1000/1000-129

于是乎我们开始进行猜测了假定每个人每次的时间是2年

假设在大学之前我们每个平均人数是2个

所以我们工作之后平均理想的状态是3个

取1000个人理想人数总和时1000*3

实际上我们通过正态分布得出来的结果是1000个人在这个概率下是2085.01073121人数

于是我们得到

(1000*3-2085)*2/(2085)=0.83752

所以平均每个人多增加谈恋爱的时间年限0.83752年

如果我们不想将就,于是要把平均个数调低一些,把那个犯错误概率调小一点,我计算过后发现一个问题,就是这个时间基本不再增加,所以啊,我们拉高总体平均的单身时间,

在作为单身狗的道路上发光发热。

原文来自: