【方差分析原理简介】

news2024/12/26 15:14:19

文章目录

  • 方差分析(Analysis of Variance,简称ANOVA)
    • 1 方差分析流程
    • 2 借助sklean进行基于方差分析的特征筛选
    • 3 总结

方差分析(Analysis of Variance,简称ANOVA)

卡方检验更多的会考虑在衡量两个离散变量是否独立时使用,如果是连续变量和离散变量之间的独立性,更常见的做法是进行方差分析。

1 方差分析流程

Step 1.提出假设
Step 2.采集数据
这里我们还是以鸢尾花数据集为例

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
import numpy as np

# 加载示例数据集
iris = load_iris()
X, y = iris.data, iris.target
X = pd.DataFrame(X,columns=iris.feature_names)

在这里插入图片描述
我们就petal length (cm)字段和标签进行分析
在这里插入图片描述

#根据标签快速分组
cat_0 = X["petal length (cm)"][y==0]
cat_1 = X["petal length (cm)"][y==1]
cat_2 = X["petal length (cm)"][y==2]

Step 3.设计统计量
  最关键的环节,肯定就是如何构造统计量来判断两类样本均值差异程度了。这里我们需要借助此前我们曾介绍的一组概念,这组概念曾在线性回归以及K-Means快速聚类中提及,是一组专门用来衡量整体误差、组内误差和组间误差的概念。这里我们再通过严谨的数学公式描述一遍。假设目前有n条数据被分成k组(即标签有k个类别),其中第j个类别中包含 n j n_j nj条样本,并且 x i , j x_{i,j} xi,j表示第j个类别的第i条样本,则有样本整体偏差计算公式如下:
S S T = ∑ j = 1 k ∑ i = 1 n j ( x i j − x ˉ ) 2 SST = \sum^k_{j=1}\sum^{n_j}_{i=1}(x_{ij}-\bar x)^2 SST=j=1ki=1nj(xijxˉ)2
及样本与均值的差值平方和,此处 x ˉ = ∑ j = 1 k ∑ i = 1 n j x i j n \bar x = \frac{\sum^k_{j=1}\sum^{n_j}_{i=1}x_{ij}}{n} xˉ=nj=1ki=1njxij
而如果我们更进一步,计算每个组内的样本与均值的差值的平方和,则可以算得如下结果:
S S E j = ∑ i = 1 n j ( x i j − x j ˉ ) 2 SSE_j = \sum^{n_j}_{i=1}(x_{ij}-\bar {x_j})^2 SSEj=i=1nj(xijxjˉ)2
即第j组的组内偏差平方和,其中 x j ˉ = ∑ i = 1 n j x i j n j \bar {x_j} = \frac{\sum_{i=1}^{n_j}x_{ij}}{n_j} xjˉ=nji=1njxij,为第j组数据的组内均值。而k个分组的组内偏差总和为:
S S E = ∑ j = 1 k S S E j = ∑ j = 1 k ∑ i = 1 n j ( x i j − x j ˉ ) 2 SSE = \sum_{j=1}^k SSE_j = \sum_{j=1}^k\sum^{n_j}_{i=1}(x_{ij}-\bar {x_j})^2 SSE=j=1kSSEj=j=1ki=1nj(xijxjˉ)2
SSE即为组内偏差平方和。此时(在欧式空间情况下)则可以通过数学公式推导得出,SST和SSE之间的差值如下:
S S B = S S T − S S E = ∑ j = 1 k n j ( x j ˉ − x ˉ ) 2 SSB=SST-SSE=\sum_{j=1}^k n_j (\bar{x_j}-\bar x)^2 SSB=SSTSSE=j=1knj(xjˉxˉ)2
即每个组的均值和总体均值的差值的平方加权求和的结果,其中权重就是每个组的样本数量。SSB也被称为组间偏差平方和。
我们就找到了如何衡量不同组均值差异的基础理论工具,接下来需要进一步的构造统计检验量,来更具体的量化的表示这种均值差异程度。此处构造的统计检验量就是F,F计算公式如下:
F = M S B M S E = S S B / d f B S S E / d f E = S S B / ( k − 1 ) S S E / ( n − k ) F=\frac{MSB}{MSE}=\frac{SSB/df_B}{SSE/df_E}=\frac{SSB/(k-1)}{SSE/(n-k)} F=MSEMSB=SSE/dfESSB/dfB=SSE/(nk)SSB/(k1)
此处 d f b df_b dfb就是统计量SSB的自由度,类似于卡方检验过程中(行数-1*列数-1)用于修正卡方值, d f b df_b dfb也是一个用于修正SSB计算量的值——为了防止分组的数量影响了SSB的计算结果;类似的 d f E df_E dfE就是SSE的自由度,用于修正样本数量对SSE计算结果的影响。目前来说我们并不用深究自由度的学术含义,只需要知道统计检验量会利用自由度对统计量进行数值上的修正,并且这些修正的值会在最一开始就确定,例如k(分成几类)、n(数据总量)等,并不会受到实际数据取值大小的影响。
Step 4-5.事件发生概率计算与统计推断

k = len(np.unique(y))
n = len(y)
k, n

在这里插入图片描述

cat_0_mean = cat_0.mean()
cat_1_mean = cat_1.mean()
cat_2_mean = cat_2.mean()

SSE0 = np.power(cat_0 - cat_0_mean, 2).sum()
SSE1 = np.power(cat_1 - cat_1_mean, 2).sum()
SSE2 = np.power(cat_2 - cat_2_mean, 2).sum()

SSE = SSE0 + SSE1+ SSE2
SSE

在这里插入图片描述

n0 = len(cat_0)
n1 = len(cat_1)
n2 = len(cat_2)

cat_mean = X["petal length (cm)"].mean()

SSB = n0 * np.power(cat_0_mean-cat_mean, 2) + n1 * np.power(cat_1_mean-cat_mean, 2) + n2 * np.power(cat_2_mean-cat_mean, 2)

SSB

在这里插入图片描述

SST = np.power( X["petal length (cm)"] - cat_mean, 2).sum()
SST

在这里插入图片描述

#可以很简单检验SSE和SSB之和是否会等于SST
SSB + SSE

在这里插入图片描述

MSB = SSB/(k-1)
MSE = SSE/(n-k)

F_score = MSB/MSE
F_score

在这里插入图片描述

import scipy
scipy.special.fdtrc(k-1, n-k, F_score)#scipy.special.fdtrc进行p值计算

在这里插入图片描述
概率几乎为零,也就是说零假设成立的概率几乎为零,我们可以推翻零假设,即petal length (cm)和标签存在显著差异。进一步应用到特征筛选环节,得到的结论就是petal length (cm)和标签存在显著的关联关系。
我们也可以借助scipy中的stats.f_oneway函数直接进行方差分析计算,此处仅需带入两类不同的样本即可:

scipy.stats.f_oneway(cat_0, cat_1,cat_2)

在这里插入图片描述
能够发现计算结果和手动计算结果一致。

尽管我们在方差分析中用到了F检验,但方差分析不同于F检验。F检验泛指一切借助F值进行检验的过程,而方差分析只是其中一种。换而言之,只要假设检验中的检验统计量满足F分布,则该过程就用到了F检验。另外需要拓展了解的一点是,除了方差分析以外,还有一种检验也能判断两个样本的均值是否一致,也就是t检验。所不同的是,方差分析能够同时检验多个样本,也就是如果是三分类标签、则对应三个不同的样本,卡方检验能够同时判断三个样本是否取自同一总体,进而判断该特征是否可用(从特征筛选的角度来看)。而t检验只能两两比较,很明显应如果是用于特征筛选环节,t检验并不够高效。而t检验、卡方检验和方差分析,被称作统计学三大检验。

2 借助sklean进行基于方差分析的特征筛选

我们来看在sklearn如何借助方差分析来完成特征筛选。这里需要借助f_classif评估函数来实现方差分析的过程:

from sklearn.feature_selection import f_classif
f_classif(X["petal length (cm)"].values.reshape(-1, 1),y.ravel())

在这里插入图片描述
sklearn中的f_classif也就是调用f_oneway函数进行的计算,因此最终输出结果和此前实验结果完全一致。同时f_classif本身也是评分函数,输出的F值就是评分。很明显F值越大、p值越小、我们就越有理由相信两列存在关联关系,反之F值越小则说明两列没有关系,可以考虑剔除。

接下来我们借助SelectKBest来进行基于方差分析评分的特征筛选,注意仅针对两个连续变量进行方差分析检验特征筛选(其中定义的SelectName函数在卡方检验中有)
在这里插入图片描述

3 总结

如果是针对分类问题,f_classif与chi2两个评分函数搭配使用,就能够完成一次完整的特征筛选,其中chi2用于筛选离散特征、f_classif用于筛选连续特征。而如果是回归问题,sklearn提供了一种基于F检验的线性相关性检验方法f_regression,该检验方法并不常见。需要注意,该方法只能用于回归问题中,并且只能筛选出与标签呈现线性相关关系的连续变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1378261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list: lpush letter a lpush le…

FPN网络的实现原理详解

1 前言 FPN网络是一种常见的特征融合模块,在很多模型中都有运用,今天我们就结合代码和论文详细的搞清楚它到底是怎么一回事。 2 原理 原理直接看这一张图就可以了,很直观主要就是把对不同层的特征进行融合,重点还是在于代码的理…

SpringBoot项目如何防止反编译?

SpringBoot项目如何防止反编译? 场景方案项目操作启动方式反编译效果绑定机器启动 场景 最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出…

【服务器】服务器管理 - cockpit开启

开启cockpit #!/bin/bashsed -i s/is():where()/is(*):where(*)/ /usr/share/cockpit/static/login.jssystemctl enable --now cockpit.socket #开启cockpit服务systemctl start cockpit.socket 登录 https://ip:9090

Java--Spring项目生成雪花算法数字(Twitter SnowFlake)

文章目录 前言步骤查看结果 前言 分布式系统常需要全局唯一的数字作为id,且该id要求有序,twitter的SnowFlake解决了这种需求,生成了符合条件的这种数字,本文将提供一个接口获取雪花算法数字。以下为代码。 步骤 SnowFlakeUtils …

一步步指南:从指定时长中提取需求的帧图片,高效剪辑视频

在现代多媒体时代,视频已经成生活中不可或缺的一部分。从视频中提取某一帧图片,或者对视频进行剪辑,都是常见的需求。下面一起来看云炫AI智剪如何从指定时长中提取需求的帧图片,如何高效地剪辑视频。 按指定时长提取视频某帧图片的…

航天民芯一级代理-技术支持-一站式配单 MT9284-28J LED驱动芯片

描述 MT9284是一个升压转换器,设计用于从单电池锂离子电池中驱动多达7个系列的白色led。MT9284使用电流模式,固定频率结构来调节LED电流,它通过外部电流感应电阻来测量。MT9284包括低电压锁定、限流和热过载保护,以防止在输出过载…

探秘Pytest插件pytest-xdist —— 提升测试效率,轻松并行运行测试

在软件开发中,测试是确保代码质量的重要一环。然而,随着项目规模的增大,测试用例的数量也随之增多,测试的执行时间可能成为一个瓶颈。为了解决这个问题,Pytest提供了丰富的插件生态系统,其中 pytest-xdist …

opencv拉流出现missing picture in access unit with size 4错误解决

0、应用场景问题 我们使用opencv作为拉流客户端,获取画面后进行图像处理并推流(使用ffmpeg库)。 opencv解码同样使用ffmpeg库。 我们要求opencv能根据业务不断进行拉流操作,等效的逻辑代码如下: while(1) {printf(&…

【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM? 大语言模型发展史预训练 微调的模式用 HuggingFace 跑开源模型申请使用 Meta 的 Llama2 模型通过 HuggingFace 调用 LlamaLangChain 和 Hugging…

1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程

本篇文章主要讲解1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程,适合sftpgo webadmin和1panel系统用户配置时使用。 作者:任聪聪 rccblogs.com 日期:2024年1月8日 sftpgo是无法直接直接更改容器内部的网站目录的,但…

QT上位机开发(利用tcp/ip访问plc)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制,但是复杂的plc,还可以控制电机、变频器,在工业…

Postman进行Soap webservice接口测试

许多人认为Postman是高级REST客户端,Postman是处理通过HTTP发送的请求的工具。其实Postman也可以测试与协议无关的SOAP webservice api接口。 要使用Postman发出SOAP请求,请执行以下操作: 1、提供SOAP端点作为URL,可以使用SOAP的W…

自动化测试和人工测试分别有什么优缺点?

自动化测试 优点 效率高:自动化测试可以快速执行大量测试用例,这对于大型项目或需要频繁进行回归测试的项目非常有用。 一致性强:自动化测试每次执行都会产生相同的结果,这有助于确保测试结果的可靠性和可重复性。 可重复性&am…

Flowable可视化流程设计器Flowable BPMN visualizer

1.安装IDEA插件Flowable BPMN visualizer IDEA插件市场中搜索Flowable BPMN visualizer安装该插件 2.创建流程图 2.1.创建流程图文件 在resources下创建myProcess.bpmn20.xml流程图。 创建时名称只用输入myProcess 2.2.创建流程图 选中myProcess.bpmn20.xml,右…

Openwrite帮我们实现一文多发

Openwrite 一文多发 当你想进入这个搞自媒体的圈子,学着人家一样去搞流量、做IP的时候,就会发现,卖铲子的和卖教程的都赚钱了。而对于商业一无所知的人,只能是接盘侠。可是,接盘侠又如何呢?高客单付不起&a…

【Web】forward 和 redirect 的区别

🍎个人博客:个人主页 🏆个人专栏:Web ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 Forward(转发): Redirect(重定向): 区别总结: …

多模态大模型

一、图文匹配 二、Stable-Diffusion(稳定扩散) 图片生成器 Stable-Diffusion(稳定扩散)组成模块: CrossAttention模块:将文本的语义信息与图像的语义信息进行Attention机制,增强输入文本Prompt对生成图片的控制。SelfAttention模块:SelfAttention模块的整体结构与C…

人工智能任务4-读懂YOLOv5模型的几个灵魂拷问问题,深度理解 YOLOv5模型架构

大家好,我是微学AI,今天给大家介绍一下人工智能任务4-读懂YOLOv5模型的几个灵魂拷问问题,深度理解 YOLOv5模型架构。YOLOv5是一种高效且精确的目标检测模型,由ultralytics团队开发。它采用了轻量级的网络结构,能够在保…

给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?

题目 思路&#xff1a; 对于字符串a&#xff0c;b, (a.size() < b.size()), 考虑对字符串b满足什么条件&#xff1a; 由1、3可知a是b的前后缀&#xff0c;由2知b有一个周期是3&#xff0c;即a.size()&#xff0c;所以b是用多个a拼接而成的&#xff0c;有因为a是b的前后缀&…