目录
1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本
1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population
1.2 从总体中取得样本,模拟抽样的过程
2 从正态分布抽样的方法1
3 从正态分布抽样的方法2
4 完整代码
5 如果从总体里多次取样,用不同的方法多次取样的差别
5.1 使用np.random.choice() 从一个总体数组里多次取样
5.2 直接在循环里,每次取样一次 sp.stats.norm.rvs(loc,scale,size)
5.3 循环里生成1个sp.stats.norm,循环里每次.rvs(size)
5.4 比较3个多次循环后,多次取样的均值的均值
1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本
import numpy as np
import pandas as pd
import scipy as sp
1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population
- 都需要先生成一个 符合正态分布的 “总体population”
- 我们设置的总体
- 可以是无限的,或者是有限但是数量较大
- 但是必须设置的是,总体的参数,mean=? std=?
- np.random.normal(loc=0, scale=1, size=1000)
- sp.stats.norm.rvs(loc=0,scale=1,size=10)
1.2 从总体中取得样本,模拟抽样的过程
- np.random.choice(array1,size=10,replace=False)
- sp.stats.norm.rvs(loc=0,scale=1,size=10)
2 从正态分布抽样的方法1
- # 先用np.random.normal一个正态分布的随机数组 ,然后再用np.random.choice()去抽样
- array1=np.random.normal(loc=0, scale=1, size=1000)
- array2=np.random.choice(array1,size=10,replace=False)
3 从正态分布抽样的方法2
- # 直接使用sp.stats.norm.rvs() 从正态分布的总体中去生成样本,抽样
- array3=sp.stats.norm.rvs(loc=0,scale=1,size=10)
4 完整代码
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3# 从正态分布抽样的方法1
# 先用np.random.normal一个正态分布的随机数组 ,然后再用np.random.choice()去抽样
np.random.seed(100) #设置确定的随机种子,保证每次随机的结果都相同array1=np.random.normal(loc=0, scale=1, size=1000)
array2=np.random.choice(array1,size=10,replace=False)
print(array2)
print(np.mean(array2))
print()# 直接使用sp.stats.norm.rvs() 从正态分布的总体中去生成样本,抽样
array3=sp.stats.norm.rvs(loc=0,scale=1,size=10)
print(array3)
print(np.mean(array3))
print()
5 如果从总体里多次取样,用不同的方法多次取样的差别
5.1 使用np.random.choice() 从一个总体数组里多次取样
- 1>---生成一个总体的正态分布,且生成数量
- array1=sp.stats.norm.rvs(loc=0,scale=1,size=1000)
- 2>多次取样时,每次从之前的总体里,选择一定数量作为样本
- array2=np.random.choice(array1,size=10,replace=False)
- 最后,多次取样的均值 mean(array2)=-0.01827
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
#%precision 3np.random.seed(100)
count1=999
#生成一个总体的正态分布,且生成数量
array1=sp.stats.norm.rvs(loc=0,scale=1,size=1000)
#print(array1)sample_mean_array=np.zeros(count1)for i in range(0,count1,1):#每次从之前的总体里,选择一定数量作为样本array2=np.random.choice(array1,size=10,replace=False)sample_mean_array[i]=np.mean(array2)#print(sample_mean_array)
print(f"取样{count1}次的均值={np.mean(sample_mean_array)}")
5.2 直接在循环里,每次取样一次 sp.stats.norm.rvs(loc,scale,size)
- 在循环体内部
- 每次循环时,都取样一次
- array1=sp.stats.norm.rvs(loc=0,scale=1,size=10)
- 最后,多次取样的均值 mean(array2)=-0.00136
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3np.random.seed(100)
count1=999sample_mean_array=np.zeros(count1)
for i in range(0,count1,1):#直接每次循环时生存一个新的生态分布,作为样本array1=sp.stats.norm.rvs(loc=0,scale=1,size=10)sample_mean_array[i]=np.mean(array1)#print(sample_mean_array)
print(f"取样{count1}次的均值={np.mean(sample_mean_array)}")
5.3 循环里生成1个sp.stats.norm,循环里每次.rvs(size)
- 1>---#生成一个总体的正态分布,先不生成数量
- population1=sp.stats.norm(loc=0,scale=1)
- 2>---每次循环时,取1次数量,作为样本
- array1=population1.rvs(size=10)
- 最后,多次取样的均值 mean(array2)=-0.00136
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3np.random.seed(100)
count1=999#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array=np.zeros(count1)for i in range(0,count1,1):#每次循环时,取1次数量,作为样本array1=population1.rvs(size=10)sample_mean_array[i]=np.mean(array1)#print(sample_mean_array)
print(f"取样{count1}次的均值={np.mean(sample_mean_array)}")
5.4 比较3个多次循环后,多次取样的均值的均值
- 用random.choice在确定的总体里多次取样,其均值的均值 mean(array2)=-0.01827
- 另外两种方法,多次取样的均值 mean(array2)=-0.00136
- |-0.01827|>>|-0.00136|
- 数量级的差别,第一种方法的均值的均值 大了第2种10倍!
- 而总体的均值,是我们自己设计,都是0,sp.stats.norm(loc=0,scale=1)
- 说明第一种方法最差,后两种方法差不多
- 因此,以后注意,少用第一种方法从样本里取样!(除非总体确定了已经是固定的)
- 原因,怀疑,第一次random.choice() 取样是在一个确定数量/数量固定的 总体population里进行取样,因此其 多次样本的均值 偏离 总体均值比较远。
- 后两个方差,便宜总体均值不远,更合理。