1. 统计学入门级:常见概率分布+python绘制分布图
如果随机变量X的所有取值都可以逐个列举出来,则称X为离散型随机变量。相应的概率分布有二项分布,泊松分布。
如果随机变量X的所有取值无法逐个列举出来,而是取数轴上某一区间内的任一点,则称X为连续型随机变量。相应的概率分布有正态分布,均匀分布,指数分布,伽马分布,偏态分布,卡方分布,beta分布等。(真多分布,好恐怖~~)
在离散型随机变量X的一切可能值中,各可能值与其对应概率的乘积之和称为该随机变量X的期望值,记作E(X) 。比如有随机变量,取值依次为:2,2,2,4,5。求其平均值:(2+2+2+4+5)/5 = 3。
期望值也就是该随机变量总体的均值。 推导过程如下:
= (2+2+2+4+5)/5
= 1/5 2 3 + 4/5 + 5/5
= 3/5 2 + 1/5 4 + 1/5 5
= 0.6 2 + 0.2 4 + 0.2 5
= 60% 2 + 20% 4 + 20%*5
= 1.2 + 0.8 + 1
= 3
倒数第三步可以解释为值为2的数字出现的概率为60%,4的概率为20%,5的概率为20%。 所以E(X) = 60% 2 + 20% 4 + 20%*5 = μ = 3。
0-1分布(两点分布),它的随机变量的取值为1或0。即离散型随机变量X的概率分布为:P{X=0} = 1-p, P{X=1} = p,即:
则称随机变量X服从参数为p的0-1分布,记作X~B(1,p)。
在生活中有很多例子服从两点分布,比如投资是否中标,新生婴儿是男孩还是女孩,检查产品是否合格等等。
大家非常熟悉的抛硬币试验对应的分布就是二项分布。抛硬币试验要么出现正面,要么就是反面,只包含这两个结果。出现正面的次数是一个随机变量,这种随机变量所服从的概率分布通常称为 二项分布 。
像抛硬币这类试验所具有的共同性质总结如下:(以抛硬币为例)
通常称具有上述特征的n次重复独立试验为n重伯努利试验。简称伯努利试验或伯努利试验概型。特别地,当试验次数为1时,二项分布服从0-1分布(两点分布)。
举个栗子:抛3次均匀的硬币,求结果出现有2个正面的概率 。
已知p = 0.5 (出现正面的概率) ,n = 3 ,k = 2
所以抛3次均匀的硬币,求结果出现有2个正面的概率为3/8。
二项分布的期望值和方差 分别为:
泊松分布是用来描述在一 指定时间范围内或在指定的面积或体积之内某一事件出现的次数的分布 。生活中服从泊松分布的例子比如有每天房产中介接待的客户数,某微博每月出现服务器瘫痪的次数等等。 泊松分布的公式为 :
其中 λ 为给定的时间间隔内事件的平均数,λ = np。e为一个数学常数,一个无限不循环小数,其值约为2.71828。
泊松分布的期望值和方差 分别为:
使用Python绘制泊松分布的概率分布图:
因为连续型随机变量可以取某一区间或整个实数轴上的任意一个值,所以通常用一个函数f(x)来表示连续型随机变量,而f(x)就称为 概率密度函数 。
概率密度函数f(x)具有如下性质 :
需要注意的是,f(x)不是一个概率,即f(x) ≠ P(X = x) 。在连续分布的情况下,随机变量X在a与b之间的概率可以写成:
正态分布(或高斯分布)是连续型随机变量的最重要也是最常见的分布,比如学生的考试成绩就呈现出正态分布的特征,大部分成绩集中在某个范围(比如60-80分),很小一部分往两端倾斜(比如50分以下和90多分以上)。还有人的身高等等。
正态分布的定义 :
如果随机变量X的概率密度为( -∞<x<+∞):
则称X服从正态分布,记作X~N(μ,σ²)。其中-∞<μ<+∞,σ>0, μ为随机变量X的均值,σ为随机变量X的标准差。 正态分布的分布函数
正态分布的图形特点 :
使用Python绘制正态分布的概率分布图:
正态分布有一个3σ准则,即数值分布在(μ-σ,μ+σ)中的概率为0.6827,分布在(μ-2σ,μ+2σ)中的概率为0.9545,分布在(μ-3σ,μ+3σ)中的概率为0.9973,也就是说大部分数值是分布在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性很小很小,仅占不到0.3%,属于极个别的小概率事件,所以3σ准则可以用来检测异常值。
当μ=0,σ=1时,有
此时的正态分布N(0,1) 称为标准正态分布。因为μ,σ都是确定的取值,所以其对应的概率密度曲线是一条 形态固定 的曲线。
对标准正态分布,通常用φ(x)表示概率密度函数,用Φ(x)表示分布函数:
假设有一次物理考试特别难,满分100分,全班只有大概20个人及格。与此同时语文考试很简单,全班绝大部分都考了90分以上。小明的物理和语文分别考了60分和80分,他回家后告诉家长,这时家长能仅仅从两科科目的分值直接判断出这次小明的语文成绩要比物理好很多吗?如果不能,应该如何判断呢?此时Z-score就派上用场了。 Z-Score的计算定义 :
即 将随机变量X先减去总体样本均值,再除以总体样本标准差就得到标准分数啦。如果X低于平均值,则Z为负数,反之为正数 。通过计算标准分数,可以将任何一个一般的正态分布转化为标准正态分布。
小明家长从老师那得知物理的全班平均成绩为40分,标准差为10,而语文的平均成绩为92分,标准差为4。分别计算两科成绩的标准分数:
物理:标准分数 = (60-40)/10 = 2
语文:标准分数 = (85-95)/4 = -2.5
从计算结果来看,说明这次考试小明的物理成绩在全部同学中算是考得很不错的,而语文考得很差。
指数分布可能容易和前面的泊松分布混淆,泊松分布强调的是某段时间内随机事件发生的次数的概率分布,而指数分布说的是 随机事件发生的时间间隔 的概率分布。比如一班地铁进站的间隔时间。如果随机变量X的概率密度为:
则称X服从指数分布,其中的参数λ>0。 对应的分布函数 为:
均匀分布的期望值和方差 分别为:
使用Python绘制指数分布的概率分布图:
均匀分布有两种,分为 离散型均匀分布和连续型均匀分布 。其中离散型均匀分布最常见的例子就是抛掷骰子啦。抛掷骰子出现的点数就是一个离散型随机变量,点数可能有1,2,3,4,5,6。每个数出现的概率都是1/6。
设连续型随机变量X具有概率密度函数:
则称X服从区间(a,b)上的均匀分布。X在等长度的子区间内取值的概率相同。对应的分布函数为:
f(x)和F(x)的图形分别如下图所示:
均匀分布的期望值和方差 分别为:
2. 用python做一个程序:扔100次硬币,然后分别显示出掷出正面和反面的次数
7行代码即可写出程序,详细步骤:
1、首先打开python自带的IDLE,打开IDLE并ctrl+n新建如图界面。
3. Python之动态规划算法
动态规划算法中是将复杂问题递归分解为子问题,通过解决这些子问题来解决复杂问题。与递归算法相比,动态编程减少了堆栈的使用,避免了重复的计算,效率得到显着提升。
先来看一个简单的例子,斐波那契数列.
斐波那契数列的定义如下。
斐波那契数列可以很容易地用递归算法实现:
上述代码,随着n的增加,计算量呈指数级增长,算法的时间复杂度是 。
采用动态规划算法,通过自下而上的计算数列的值,可以使算法复杂度减小到 ,代码如下。
下面我们再看一个复杂一些的例子。
这是小学奥数常见的硬币问题: 已知有1分,2分,5分三种硬币数量不限,用这些硬币凑成为n分钱,那么一共有多少种组合方法。
我们将硬币的种类用列表 coins 定义;
将问题定义为一个二维数组 dp,dp[amt][j] 是使用 coins 中前 j+1 种硬币( coins[0:j+1] )凑成总价amt的组合数。
例如: coins = [1,2,5]
dp[5][1] 就是使用前两种硬币 [1,2] 凑成总和为5的组合数。
对于所有的 dp[0][j] 来说,凑成总价为0的情况只有一种,就是所有的硬币数量都为0。所以对于在有效范围内任意的j,都有 dp[0][j] 为1。
对于 dp[amt][j] 的计算,也就是使用 coins[0:j+1] 硬币总价amt的组合数,包含两种情况计算:
1.当使用第j个硬币时,有 dp[amt-coins[j]][j] 种情况,即amt减去第j个硬币币值,使用前j+1种硬币的组合数;
2.当不使用第j个硬币时,有 dp[amt][j-1] 种情况,即使用前j种硬币凑成amt的组合数;
所以: dp[amt][j] = dp[amt - coins[j]][j]+dp[amt][j-1]
我们最终得到的结果是:dp[amount][-1]
上述分析省略了一些边界情况。
有了上述的分析,代码实现就比较简单了。
动态规划算法代码简洁,执行效率高。但是与递归算法相比,需要仔细考虑如何分解问题,动态规划代码与递归调用相比,较难理解。
我把递归算法实现的代码也附在下面。有兴趣的朋友可以比较一下两种算法的时间复杂度有多大差别。
上述代码在Python 3.7运行通过。
4. 如何在Python中实现这五类强大的概率分布
R编程语言已经成为统计分析中的事实标准。但在这篇文章中,我将告诉你在Python中实现统计学概念会是如此容易。我要使用Python实现一些离散和连续的概率分布。虽然我不会讨论这些分布的数学细节,但我会以链接的方式给你一些学习这些统计学概念的好资料。在讨论这些概率分布之前,我想简单说说什么是随机变量(random variable)。随机变量是对一次试验结果的量化。
举个例子,一个表示抛硬币结果的随机变量可以表示成
Python
1
2
X = {1 如果正面朝上,
2 如果反面朝上}
随机变量是一个变量,它取值于一组可能的值(离散或连续的),并服从某种随机性。随机变量的每个可能取值的都与一个概率相关联。随机变量的所有可能取值和与之相关联的概率就被称为概率分布(probability distributrion)。
我鼓励大家仔细研究一下scipy.stats模块。
概率分布有两种类型:离散(discrete)概率分布和连续(continuous)概率分布。
离散概率分布也称为概率质量函数(probability mass function)。离散概率分布的例子有伯努利分布(Bernoulli distribution)、二项分布(binomial distribution)、泊松分布(Poisson distribution)和几何分布(geometric distribution)等。
连续概率分布也称为概率密度函数(probability density function),它们是具有连续取值(例如一条实线上的值)的函数。正态分布(normal distribution)、指数分布(exponential distribution)和β分布(beta distribution)等都属于连续概率分布。
若想了解更多关于离散和连续随机变量的知识,你可以观看可汗学院关于概率分布的视频。
二项分布(Binomial Distribution)
服从二项分布的随机变量X表示在n个独立的是/非试验中成功的次数,其中每次试验的成功概率为p。
E(X) =np, Var(X) =np(1−p)
如果你想知道每个函数的原理,你可以在IPython笔记本中使用help file命令。E(X)表示分布的期望或平均值。
键入stats.binom?了解二项分布函数binom的更多信息。
二项分布的例子:抛掷10次硬币,恰好两次正面朝上的概率是多少?
假设在该试验中正面朝上的概率为0.3,这意味着平均来说,我们可以期待有3次是硬币正面朝上的。我定义掷硬币的所有可能结果为k = np.arange(0,11):你可能观测到0次正面朝上、1次正面朝上,一直到10次正面朝上。我使用stats.binom.pmf计算每次观测的概率质量函数。它返回一个含有11个元素的列表(list),这些元素表示与每个观测相关联的概率值。
结语(Conclusion)
概率分布就像盖房子的蓝图,而随机变量是对试验事件的总结。我建议你去看看哈佛大学数据科学课程的讲座,Joe Blitzstein教授给了一份摘要,包含了你所需要了解的关于统计模型和分布的全部。
5. python n个硬币中找一个假币,且已知假币较轻,怎么用递归和非递归两种方法求
思路:假设有数组arr,里面的int值代表银币重量,下标代表第几个银币。
循环(非递归):把数组第一个值赋值给变量tmp,从第二个变量循环到最后一个,比较循环里的变量和tmp值,如果不等,就返回小数下标。
递归:用二分思想,银币分2堆(不能均分时把中间那个留出来),取重量小的那堆继续二分。最后只剩下一个时就是所求
下面这种写法是返回下标的。也可以把硬币假设成一种数据类型,然后返回那个类型
#!/usr/bin/python
#-*-coding:utf-8-*-
#返回最小值下标
defgetMin(arr1):
iflen(arr1)==0:return-1
tmp=arr1[0]
index=0
forcurinarr1:
iftmp!=cur:
return0iftmp<curelseindex
index+=1
return-1
real_index=0
#返回最小值下标递归
defgetMinRecursion(arr1):
globalreal_index
n=len(arr1)
ifn==0:return-1
ifn==1:returnreal_index
ifn==2:returnreal_indexifarr1[0]<arr1[1]elsereal_index+1
sum1=sum(arr1[0:int(n/3)])
sum2=sum(arr1[int(n/3):int(n/3)*2])
ifsum1==sum2:
real_index+=int(n/3)*2
returngetMinRecursion(arr1[int(n/3)*2:n+1])
ifsum1<sum2:
returngetMinRecursion(arr1[0:int(n/3)])
else:
real_index+=int(n/3)
returngetMinRecursion(arr1[int(n/3):int(n/3)*2])
arr=[1,1,1,1,1,1,0,1,1]
print("%d"%getMin(arr))
print("%d"%getMinRecursion(arr))
6. python统计抛硬币连续出现6次相同面的概率
假设抛硬币的结果是随机的,并且正反两面出现的概率相等。那么,抛一枚硬币连续出现6次相同面的概率为:
cssCopy codeP = (1/2)^6 = 1/64 ≈ 0.0156
即每次抛硬币连续出现6次相同面的概率大约为0.0156。
下面是一个简单的Python程序,可以模拟抛硬币并计算连续出现6次相同面的概率:
pythonCopy codeimport random
n = 1000000 # 抛硬币的次数count = 0 # 记录连续出现6次相同面的次数for i in range(n):
result = [random.randint(0, 1) for j in range(6)] # 抛6次硬币
if result.count(0) == 6 or result.count(1) == 6: # 判断是否连续出现6次相同面
count += 1print("连续出现6次相同面的概率为:", count/n)
在这个程序中,我们抛了100万次硬币,并记录了连续出现6次相同面的次数。最后,我们通过除以总次数来计算概率,并输出结果。
需要注孝碰意的是,这个程序中的结果是基于随机抽样的统计,因此和理论值略有偏差。但是,当抛硬币的次数足巧衡谈够大时,实验结果会趋近于理拦汪论值。
7. 求翻译,是编程的,python,我不要什么谷歌翻译
随机漫步是如分子的布朗运动一样的某种统计系统模型的一种特殊的仿真。你可以想象一个用抛硬币方法完成的一维随机漫步。假设你站在一个长直的人行道上,你的前后都无限延伸。你抛起一枚硬币,如果它的正面朝上,你则向前走一步,如果背面朝上,你则退后一步。假设你完成了一个n步的随机漫步。那么从起点到你结束的位置平均有多少步远?编写一个程序来帮助你研究这个问题。
8. 编写一个Python程序, 模拟抛硬币一百万次,显示出现正面和反面的次数.
import random
count = 0 # 1 正面 0 反面 记录1的次数
for i in range(10000000):
n = random.randint(0,1)
if n == 1:
count += 1
print(u'正面{0}次,反面{1}次'.format(count,1000000-count))