当前位置: 首页 > article >正文

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

目录

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


http://www.kler.cn/a/420187.html

相关文章:

  • C_字符串的一些函数
  • 蓝桥杯准备训练(lesson1,c++方向)
  • uniapp使用扩展组件uni-data-select出现的问题汇总
  • SpringBoot源码-Spring Boot启动时控制台为何会打印logo以及自定义banner.txt文件控制台打印
  • JavaScript根据数据生成柱形图
  • Springboot(四十九)SpringBoot3整合jetcache缓存
  • jvm-47-jvm GC 日志获取方式+可视分析化工具 GcViewer
  • 2024“蜀道山” RE 部分题解
  • Rust学习笔记_06——控制流(2)
  • Oj小记:关于二叉树题一二
  • css选择当前元素前面的一个元素
  • 永磁同步电机谐波抑制算法(11)——基于矢量比例积分调节器(vector PI controller,VPI controller)的谐波抑制策略
  • hadoop环境配置-vm安装+麒麟ubantu
  • 【C语言】结构体(一)
  • qt QToolBox详解
  • uart_pl011.c驱动API的zephyr测试
  • Android笔记【11】
  • 【k8s】监控metrics-server
  • MySQL如何区分幻读和不可重复读
  • 力扣第 74 题是 搜索二维矩阵
  • 38 基于单片机的宠物喂食(ESP8266、红外、电机)
  • 什么是六边形图?
  • 数据结构--二叉树删除树节点
  • Python酷库之旅-第三方库Pandas(251)
  • create-vue创建vue3项目
  • Vue 项目中如何解决组件之间的循环依赖