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

【小白学机器学习42】进行多次抽样,样本的分布参数和总体的分布参数的关系

目录

1 进行多次抽样,样本的分布参数和总体的分布参数的关系

2  样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系

2.1 如果进行多次抽样,样本的均值将趋向总体的均值

2.2 换句话说:样本的均值将趋向总体的均值就是,mean(样本均值) = 总体均值

2.3 下面的图能说明很多信息

2.4 下面是具体的代码

2.4.1 代码里发现的一个随机问题

3 随着样本容量增大,多次抽样de均值de→平均值和std的变化

3.1 直接看(样本容量变化时)多次取样de样本的均值趋向总体均值的过程

3. 2 有意义的多次取样时,标准差std随着样本规模的变化趋势

3.3 继续改进,全部都修改为,相同样本规模下多次试验,然后根据多次试验结果得出均值和均值的std

4 随着样本容量增大,多次抽样de标准差de→平均值和std的变化(也需要像第3部分一样改进)

4.1 也是趋向总体的std

4.2 一般情况下,样本的方差<=总体方差

4.3 用样本方差直接去估计总体方差是有偏估计


进行多次抽样,样本的分布参数和总体的分布参数的关系

1 进行多次抽样,样本的分布参数和总体的分布参数的关系

  • 每次抽样都会得到1个均值,1个方差
  • 多次抽样会得到多个均值,多个方差
  • 可以把多次抽样得到的均值,方差再进行平均,看下多次抽样的平均值和总体参数的关系

  • 多次抽样会得到多个均值→也就是均值数组,这个均值数组的平均值,接近总体的均值
  • 多次抽样会得到多个方差→也就是方差数组,这个方差数组的平均值,会远小于总体的均值,这就是样本方差对总体方差的有偏估计。
  •  std的情况类方差。

import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3population1=sp.stats.norm(loc=4,scale=0.8)  #不设置size,可以认为是一个无限的总体?
samples_mean_array1=np.zeros(1000)
np.random.seed(1)
for i in range(0,1000):sample1=population1.rvs(size=10)samples_mean_array1[i]=np.mean(sample1)#print(samples_mean_array1)
sns.distplot(samples_mean_array1)
#sns.histplot(samples_mean_array1)
#sns.kdeplot(samples_mean_array1, fill=True)
plt.show()print(f"设置的总体的均值 =4")
print(f"设置的总体的方差 ={0.8*0.8}")
print(f"设置的总体的标准差 =0.8")
print()print(f"多次抽样的样本均值的均值 = {np.mean(samples_mean_array1)}")
print(f"多次抽样的样本方差的均值 = {np.var(samples_mean_array1)}")
print(f"多次抽样的样本标准差的均值 = {np.std(samples_mean_array1)}")
print()print("多次抽样的样本的均值的均值,接近总体的均值")      
print("多次抽样的样本的方差的均值,远远小于总体的方差")   
print("多次抽样的样本的标准差的均值,远远小于总体的标准差")       
print()

2  样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系

2.1 如果进行多次抽样,样本的均值将趋向总体的均值

  • 首先,还是基于,多次抽样
  • 因为单次抽样的随机性比较大
  • 样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系会发现
  1. 样本容量越大,多次抽样的样本的平均值的均值,会收敛,越来越接近总体的平均值
  2. 样本容量越大,多次抽样的样本的方差的均值,会收敛,越来越接近总体的方差

2.2 换句话说:样本的均值将趋向总体的均值就是,mean(样本均值) = 总体均值

  • 样本的均值将趋向总体的均值
  • → 样本均值的均值 = 总体均值
  • → mean(样本均值) = 总体均值

2.3 下面的图能说明很多信息

  • 大数定律:简单理解,就是多次试验,样本的均值会接近总体的均值
  • 基本可以反应在下面的图里
  • 下面2张图
  • plot折线图,可以看出随着sample_size增加,样本均值向总体均值靠拢的趋势,过程
  • hist频度图更清晰的反应,样本均值的均值,集中靠近总体均值的程度。
  • hist图可以理解为,plot折线图,转过来,然后数据往下掉下来集中形成的!

hist图就像把plot给旋转竖过来了+ 下沉相同的归类后统计成次数!!

hist图就像把plot给旋转竖过来了+ 下沉相同的归类后统计成次数!!

hist图就像把plot给旋转竖过来了+ 下沉相同的归类后统计成次数!!

2.4 下面是具体的代码

2.4.1 代码里发现的一个随机问题

  • ramdon.seed(100) 计算出来的,均值的均值=4.34
  • 碰巧代码里整行用的是ramdon.seed(100),否则还发现不了这么奇怪的事情。。。
  • ramdon.seed(1)  或者ramdon.seed() 计算出来的,均值的均值=0.00099
  • 暂时不知道原因,很奇怪。。。。小心吧


 

3 随着样本容量增大,多次抽样de均值de→平均值和std的变化

3.1 直接看(样本容量变化时)多次取样de样本的均值趋向总体均值的过程

  • 多次抽样的样本均值的均值趋向总体的均值,我这因为总体loc=0, 样本均值的均值也接近0

  • 但是,这样求出的std 没意义
  • 错误:多次抽样的样本均值的 方差很小,说明很稳定
  • 因为,这个方差/ 标准差,是把不同取样规模的样本的均值,加一起再平均算的方差/ 标准差,本身没有意义
  • 有意义的方差/ 标准差,是在相同的 样本规模时,多次取样(循环里的循环),得出的多次取样的方差/ 标准差,才有比较的意义!这个一定要注意!

  • 为什么呢,因为我们必须再相同的标准下计算均值和方差
  • 相同的标准:取样的样本规模 sample_size
  • 相同的sample_size下,取样一次,均值基本比较稳定,勉强可用
  • 相同的sample_size下,取样一次,方差会相差很大,不能这么用

  • 其实严格的说
  • 无论,均值还是std,都需要再相同的sample_size下,多试验多次,计算这个相同条件:比如sample_size=50下的多次取样的均值和std
  • 相同的sample_size下,取样多次得到的mean,再计算np.mean(mean)
  • 相同的sample_size下,取样多次得到的mean,再计算np.std(mean)

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(1)
count1=999#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array1=np.zeros(count1)
sample_mean_std_array2=np.zeros(count1)for i in range(0,count1,1):#每次循环时,取1次数量,作为样本array1=population1.rvs(size=10+i*10)sample_mean_array1[i]=np.mean(array1)sample_mean_std_array2[i]=np.std(array1)#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
fig1=plt.figure(num=1,figsize=(5, 5))
plt.plot(sample_mean_array1)
plt.title("随着抽样规模的变大,多次抽样的样本均值的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_mean",fontsize=16)fig2=plt.figure(num=2,figsize=(5, 5))
plt.plot(sample_mean_std_array2)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化---这个std无意义!",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)#print(sample_mean_array1)
print(f"取样{count1}次的均值的均值={np.mean(sample_mean_array1)}")
print(f"取样{count1}次的均值的std={np.std(sample_mean_array2)}")

3. 2 有意义的多次取样时,标准差std随着样本规模的变化趋势

  • 下图可见,
  • 在不同的抽样规模下,标准差,是明显随着取样规模的变大而变小的

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(1)
count1=999#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array1=np.zeros(count1)
sample_mean_std_array2=np.zeros(count1)for i in range(0,count1,1):#每次循环时,取1次数量,作为样本array1=population1.rvs(size=10+i*10)sample_mean_array1[i]=np.mean(array1)sample_mean_std_array2[i]=np.std(array1)#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
fig1=plt.figure(num=1,figsize=(5, 5))
plt.plot(sample_mean_array1)
plt.title("随着抽样规模的变大,多次抽样的样本均值的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_mean",fontsize=16)fig2=plt.figure(num=2,figsize=(5, 5))
plt.plot(sample_mean_std_array2)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)#print(sample_mean_array1)
print(f"取样{count1}次的均值的均值={np.mean(sample_mean_array1)}")
print(f"取样{count1}次的均值的std={np.std(sample_mean_array2)}")#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
#这个 std是均值的std, 也就是在每个样本容量规模处,做多次试验(嵌套循环),所得到的std,
#而不是不同规模下的取样样本,得到的多个样本的均值的标准差,那个没啥意义!sample_mean_array11=np.zeros(count1)
sample_mean_std_array21=np.zeros(count1)for i in range(0,count1,1):#每次循环时,取1次数量,作为样本for j in range(0,10,1):array11=population1.rvs(size=10+i*10)sample_mean_array11[j]=np.mean(array11)#sample_mean11[i]=np.mean(sample_mean_array11)#sample_mean_std_array21[i]=np.std(sample_mean11)sample_mean_std_array21[i]=np.std(sample_mean_array11)fig3=plt.figure(num=3,figsize=(5, 5))
plt.plot(sample_mean_std_array21)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)

3.3 继续改进,全部都修改为,相同样本规模下多次试验,然后根据多次试验结果得出均值和均值的std

  • 都是需要先内部循环多次,
  • 得到平均值的数组
  • 然后再求这个数组  平均值和std
  •     sample_mean_std_array21[i]=np.std(sample_mean_array11)
  •     sample_mean_mean_array20[i]=np.mean(sample_mean_array11)

结论

  • 随着取样规模变大,样本的均值的均值的绝对值趋向总体均值。图形上表现为,正负区间震荡着接近总体均值
  • 随着取样规模变大,样本的均值的的std越来越小,趋向总体均值。图形上表现为,都是正数,但是数值越来越小,趋向0

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(1)
count1=999#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array1=np.zeros(count1)
sample_mean_std_array2=np.zeros(count1)#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
#这个 std是均值的std, 也就是在每个样本容量规模处,做多次试验(嵌套循环),所得到的std,
#而不是不同规模下的取样样本,得到的多个样本的均值的标准差,那个没啥意义!sample_mean_array11=np.zeros(count1)
sample_mean_std_array21=np.zeros(count1)
sample_mean_mean_array20=np.zeros(count1)for i in range(0,count1,1):#每次循环时,取1次数量,作为样本for j in range(0,10,1):array11=population1.rvs(size=10+i*10)sample_mean_array11[j]=np.mean(array11)sample_mean_std_array21[i]=np.std(sample_mean_array11)sample_mean_mean_array20[i]=np.mean(sample_mean_array11)fig3=plt.figure(num=3,figsize=(5, 5))
plt.plot(sample_mean_mean_array20)
plt.title("随着抽样规模的变大,多次抽样的样本mean的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)fig4=plt.figure(num=4,figsize=(5, 5))
plt.plot(sample_mean_std_array21)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)

4 随着样本容量增大,多次抽样de标准差de→平均值和std的变化(也需要像第3部分一样改进)

4.1 也是趋向总体的std

  • 多次抽样的样本std的均值趋向总体的std,我这因为总体scale=1, 样本std的均值的也接近1
  • 多次抽样的样本均值的 方差很小,说明很稳定

4.2 一般情况下,样本的方差<=总体方差

  • 一般情况下,样本的方差<=总体方差
  • 因为,总体里包括各个极值,极大极小值,这些值对方差的贡献影响最大
  • 而样本里经常是部分数据,最大取值在极值范围内,所以样本方差<=总体方差

4.3 用样本方差直接去估计总体方差是有偏估计

  • 多次抽样的样本方差的均值,应该还是小于总体的方差,因为是有偏估计
  • 比如针对方差
  • Σ(xi-u)^2/n     用样本方差去直接估计总体方差
  • Σ(xi-u)^2/(n-1)  才是无偏估计
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(1)
count1=999#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_std_array1=np.zeros(count1)for i in range(0,count1,1):#每次循环时,取1次数量,作为样本array1=population1.rvs(size=10+i*10)sample_std_array1[i]=np.std(array1)   #只看std就够了,var不看了fig1=plt.figure(num=1,figsize=(5, 5))
plt.plot(sample_std_array1)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)"""
plt.hist(sample_mean_array1)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("频数",fontsize=16)
"""
#print(sample_mean_array1)
print(f"取样{count1}次的std的均值={np.mean(sample_mean_array1)}")
print(f"取样{count1}次的std的std={np.std(sample_mean_array2)}")


http://www.mrgr.cn/news/78941.html

相关文章:

  • 大模型安全科技发展仍处在起步阶段
  • Flutter 中实现WrapContent状态
  • 源码分析之Openlayers中的Collection类
  • 什么是TCP的三次握手
  • docker compose 快速搭建 Elasticsearch 单节点测试环境
  • 【GPT】代谢概念解读
  • Python办公——openpyxl处理Excel每个sheet每行 修改为软雅黑9号剧中+边框线
  • HCIA-openGauss_1
  • 华为HarmonyOS 让应用快速拥有账号能力 -- 3 获取用户手机号
  • 【0347】Postgres内核 startup XLOG 之 核实 pg_wal 、 pg_wal/archive_status (1)
  • 树莓派明明安装了opencv和numpy,却找不到
  • Linux:内存文件 基础io
  • ShardingSphere介绍
  • 密码学实验工具--Cryptool2
  • 利用Ubuntu批量下载modis图像(New)
  • nlp培训重点
  • 【实战】Oracle基础之控制文件内容的5种查询方法
  • CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)
  • (一)Linux下安装NVIDIA驱动(操作记录)
  • CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(没思路了)
  • linux - FTP(包含匿名、本地以及虚拟用户登录)详细操作⭐
  • Linux网络——传输层
  • 解决stable-diffusion-webui时的问题:No module ‘xformers‘. Proceeding without it
  • 数据结构与算法学习笔记----堆
  • 分享一款 Vue 图片编辑插件 (推荐)
  • Qt入门6——Qt窗口