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

目录

[1 进行多次抽样,样本的分布参数和总体的分布参数的关系](#1 进行多次抽样,样本的分布参数和总体的分布参数的关系)

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

[2.1 如果进行多次抽样,样本的均值将趋向总体的均值](#2.1 如果进行多次抽样,样本的均值将趋向总体的均值)

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

[2.3 下面的图能说明很多信息](#2.3 下面的图能说明很多信息)

[2.4 下面是具体的代码](#2.4 下面是具体的代码)

[2.4.1 代码里发现的一个随机问题](#2.4.1 代码里发现的一个随机问题)

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

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

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

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

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

[4.1 也是趋向总体的std](#4.1 也是趋向总体的std)

[4.2 一般情况下,样本的方差<=总体方差](#4.2 一般情况下,样本的方差<=总体方差)

[4.3 用样本方差直接去估计总体方差是有偏估计](#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 3

    population1=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)

python 复制代码
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(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随着样本规模的变化趋势

  • 下图可见,
  • 在不同的抽样规模下,标准差,是明显随着取样规模的变大而变小的
python 复制代码
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(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
python 复制代码
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(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) 才是无偏估计
python 复制代码
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(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)}")
相关推荐
promising_xxx4 分钟前
大语言模型微调与 XTuner 微调实战
人工智能·语言模型·自然语言处理
大道随心8 分钟前
语言模型测试系列【11】
人工智能·语言模型·自然语言处理
withoutfeelings915 分钟前
实验13 使用预训练resnet18实现CIFAR-10分类
人工智能·深度学习·分类
禾风wyh21 分钟前
【深度学习】分类问题代码实战之初始手写数据集
人工智能·深度学习·分类
龙的爹233325 分钟前
论文 | LazyLLM: DYNAMIC TOKEN PRUNING FOR EFFICIENTLONG CONTEXT LLM INFERENCE
人工智能·深度学习·算法·机器学习·自然语言处理·prompt·剪枝
多吃轻食34 分钟前
大模型开发和微调工具Llama-Factory-->训练方法(SFT, RLHF, DPO, KTO)
人工智能·深度学习·算法·自然语言处理·llama
qgh122341 分钟前
VoCo-LLaMA: Towards Vision Compression with Large Language Models
人工智能·深度学习·语言模型·llama
云空1 小时前
《OpenCV:视觉世界的魔法钥匙》
人工智能·opencv·计算机视觉
纪怽ぅ1 小时前
深入傅里叶级数与傅里叶变换:从基础到应用
python·算法·机器学习·优化算法·傅里叶变化
用户2404817096211 小时前
我来助你:Coze帮你零代码生成智能体
前端·人工智能·coze