【小白学机器学习40】用各种方法去验证总体的数据

目录

[1 先生成一个符合正态分布的总体](#1 先生成一个符合正态分布的总体)

[2 用各种方法去验证总体的数据](#2 用各种方法去验证总体的数据)

[2.1 这个总体合适吗?是个正态分布吗?](#2.1 这个总体合适吗?是个正态分布吗?)

[2.2 用图形验证](#2.2 用图形验证)

[2.3 用假设检验验证是否符合正态分布](#2.3 用假设检验验证是否符合正态分布)

[2.3.1 使用.kstest来进行K-S检验](#2.3.1 使用.kstest来进行K-S检验)

[2.3.2 如何确定h0假设?](#2.3.2 如何确定h0假设?)

[2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比](#2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比)

[2.4.1 叠加2个图](#2.4.1 叠加2个图)

[2.4.2 可见pdf和hist 拟合的很好](#2.4.2 可见pdf和hist 拟合的很好)

[3 下面是全部的代码](#3 下面是全部的代码)


1 先生成一个符合正态分布的总体

  • 先用np.random.normal() 生成一个符合正态分布的数组array

  • 但是这个数组,是否符合正态分布呢?

    array1=np.random.normal(loc=0, scale=1, size=1000)

2 用各种方法去验证总体的数据

2.1 这个总体合适吗?是个正态分布吗?

  • 理论上是符合的,因为我们就是用np.random.normal() 生成的
  • 但是因为2个原因
  1. 因为我们是随机取的,有可能随机性比较大,取得有点偏
  2. 因为我们取得10个数据模拟正态数据,数据量也会比较少

array1=np.random.normal(loc=0, scale=1, size=1000)

2.2 用图形验证

  • 如果用 plt.plot() 看是否正态分布不那么直观,如果在均值附近波动则是
  • 如果用 plt.hist() 频度图更适合看出是否正态分布
  • 因为取了1000个数据,所以, plt.plot() plt.hist() 看起来都能看出来比较像正态分布

2.3 用假设检验验证是否符合正态分布

2.3.1 使用.kstest来进行K-S检验

  • 下面的代码中
  • array1=np.random.normal()
  • 可以使用scipy.stats.kstest来进行K-S检验,对data进行正态分布的验证
  • sp.stats.kstest(data, 'norm') 会返回2个结果:ks_statistic, p_value
  • 尤其是 p_value 就是检验的概率,需要和显著度进行α比较

判断标准

  • h0假设,这个数组符合正态分布
  • 如果p_value() 小于α,就认为是小概率事件,就拒绝h0假设,认为data 不符合正态分布。
  • 如果p_value() 大于α,就不是小概率事件,就接受h0假设,认为data 符合正态分布。
python 复制代码
# 假设data是你需要验证的数组
data =array1
# 使用scipy.stats.kstest来进行K-S检验,对data进行正态分布的验证
ks_statistic, p_value = sp.stats.kstest(data, 'norm')
# 设定显著性水平α,一般取0.05
alpha = 0.05
# 根据p值判断是否接受原假设(数据来自正态分布)
if p_value < alpha:
    print("数据不符合正态分布")
else:
    print("数据符合正态分布")  

array2=np.random.choice(array1,size=5,replace=False)
print(array2)
print()

2.3.2 如何确定h0假设?

sp.stats.kstest(data, 'norm')

关于分布的假设检验,H0的假设一定是服从这个分布,h1假设一定是不符合。

为什么呢?

  • 我感觉是因为h0假设属于这个分布才好往下推导和计算,
  • 因为假设检验本身就是h1不好验证(h1=不是正态,有可能是各种分布,更复杂)
  • 其否命题h0(是正态,就一种确定的分布,而且这种分布只需要知道均值和方差) 更好验证。
  • 因此,这种有关数学和分布的假设检验,
  1. h0假设:往往是那个好计算的假设,比如符合正态分布,两数相等等这种作为h0假设

  2. h1假设,往往是那些不好计算的,比如,不是XX分布但是什么分布呢?

为什么不是看弃真错误是否更严重呢

  • 因为第1类错误=弃真错误=第1类错误,也就是我们设置的显著度α=弃真概率
  • 因为我们是从 设置显著度α 为出发点,那么我们肯定认为 弃真错误概率要越小越好,只是因为第1类错误和2类错误有此消彼长关系,所以也不能追求 弃真概率α无限小,在一个可接受的范围内如5%,1%这以下就可以了。
  • 弃真错误也就是h0 是对的但是我们错误的判断h0是假的,为什么会这样呢?
  • 因为我们本次(假设h0为真时,往下推导)检验出来的概率很小,是个小概率事件,不太可能发生,小于显著度α,因为我们顶着α的弃真错误的可能性,认为h0为假。
  • 所以理论上即使我们这次检验出来的概率小于α,可以拒绝h0, 还是有α的理论上的可能性,我们犯了弃真错误。
  • 所以,包含社会价值的假设检验里h0 往往是那个 弃真错误需要尽量低的作为h0
  1. h0 假设是假币,
  2. h0 假设新药无效,
  3. h0 假设传染口罩是阳性

2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比

2.4.1 叠加2个图

  • 用一个正态分布的pdf图,去和总体的hist频度图去,叠加对比
  • 注意:sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)
  • pdf曲线的参数,x就是横轴范围,loc是均值,scale是标准差std

画出一个特殊的正态分布的pdf曲线,其均值,方差=总体的均值,方差

array6=np.arange(start=-5,stop=5,step=0.1)

array7=sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)

我们直接用sp.stats.norm.pdf,生成一个正态分布的pdf曲线

但是这个概率曲线,特点是均值,方差=总体的均值,方差

然后,我们看看,这个pdf和总体的hist是否比较拟合

#重新开启一个画布
fig2=plt.figure(num=2,figsize=(5, 5))
#plt.subplot(2,3,3)

# 画出一个特殊的正态分布的pdf曲线,其均值,方差=总体的均值,方差
array6=np.arange(start=-5,stop=5,step=0.1)
array7=sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)


#显示正态分布的pdf曲线
plt.plot(array6,array7)

#显示这个population整体的hist,叠一起看
#plt.hist(array1)
sns.distplot(array1,kde=False,norm_hist=True)
#sns.histplot(array1,kde=False)

2.4.2 可见pdf和hist 拟合的很好

3 下面是全部的代码

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)   #设置确定的随机种子,保证每次随机的结果都相同

# 先生成一个正态分布的随机数组
#fig1=plt.figure(num=1,figsize=(3,3))
plt.subplot(1,2,1)

array1=np.random.normal(loc=0, scale=1, size=1000)
plt.plot(array1)

#fig3=plt.figure(num=3,figsize=(3,3))
plt.subplot(1,2,2)
plt.hist(array1)


##
# 假设data是你需要验证的数组
data =array1
# 使用scipy.stats.kstest来进行K-S检验,对data进行正态分布的验证
ks_statistic, p_value = sp.stats.kstest(data, 'norm')
print(f"这次的检查的p值= {p_value}")
# 设定显著性水平α,一般取0.05
alpha = 0.05
# 根据p值判断是否接受原假设(数据来自正态分布)
if p_value < alpha:
    print("数据不符合正态分布")
else:
    print("数据符合正态分布")  

    
#重新开启一个画布
fig2=plt.figure(num=2,figsize=(5, 5))
#plt.subplot(2,3,3)

# 画出一个特殊的正态分布的pdf曲线,其均值,方差=总体的均值,方差
array6=np.arange(start=-5,stop=5,step=0.1)
array7=sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)


#显示正态分布的pdf曲线
plt.plot(array6,array7)

#显示这个population整体的hist,叠一起看
#plt.hist(array1)
sns.distplot(array1,kde=False,norm_hist=True)
#sns.histplot(array1,kde=False)
相关推荐
海棠AI实验室22 分钟前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself24 分钟前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
IT古董1 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee1 小时前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa1 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
四口鲸鱼爱吃盐1 小时前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
蓝天星空1 小时前
Python调用open ai接口
人工智能·python
睡觉狂魔er1 小时前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶
scan7242 小时前
LILAC采样算法
人工智能·算法·机器学习
leaf_leaves_leaf2 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python