【小白学机器学习41】如何从正态分布的总体中去抽样?比较不同的取样方差的差别

发布于:2024-12-08 ⋅ 阅读:(101) ⋅ 点赞:(0)

目录

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 3

np.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 3

np.random.seed(100)
count1=999

sample_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 3

np.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里进行取样,因此其 多次样本的均值 偏离 总体均值比较远。
  • 后两个方差,便宜总体均值不远,更合理。


网站公告

今日签到

点亮在社区的每一天
去签到