关于协方差同质性检验,我也是一知半解,不过多讲解,自己也很懵。
本文讲述对于两分类问题的协方差矩阵检验,和多分类的协方差矩阵的检验

两分类的协方差矩阵齐性检验


Σ1是类别1的协方差,Σ2是类别2的协方差,Σ是两个协方差的联合协方差(即图中的Σ_hat,和S)。
式子中 tr 表示trace,即沿着对角线求和。
p是维数,即数据有几个特征

因为在贝叶斯判别的式子中如果两分类协方差相等,那么用的是他们的联合协方差做计算。

所以这个检验方法是检验Σ1 和联合协方差的差异性,和Σ2与联合协方差的差异性。
如果他们的差异性都不显著,则说明他们的协方差齐性,可以用联合协方差计算。

还是 用这个例子的数据。

x = np.array([[1.14,1.78],[1.18,1.96],[1.20,1.86],[1.26,2.00],[1.28,2.00],[1.30,1.96],[1.24,1.72],[1.36,1.74],[1.38,1.64],[1.38,1.82],[1.38,1.90],[1.40,1.70],[1.48,1.82],[1.54,1.82],[1.56,2.08]])y = np.array([1,1,1,1,1,1,2,2,2,2,2,2,2,2,2])
import numpy as np
import scipy.stats as stats
# 把数据分类分开
x1 = x[y==1]
x2 = x[y==2]
def cov_homogeneity_2(arr1,arr2):'''两个类别的协方差齐性检验,这里返回True和False,以及Q1,Q2,和拒绝阈arr1 ,arr2分别是两个类别的数据特征'''# p 是维数,数据有几维,也就是几个特征if (arr1.shape[1] == arr2.shape[1]):p = arr1.shape[1]else:raise(ValueError("数据维度不一样"))a1 = np.array(arr1,dtype=np.float64)a2 = np.array(arr2,dtype=np.float64)# 计算样本个数,和协方差,以及联合协方差n1,n2 = a1.shape[0],a2.shape[0]s1 = np.cov(a1,rowvar=False)s2 = np.cov(a2,rowvar=False)s = ((n1-1)*s1+(n2-1)*s2)/(n1+n2-2)# 按照公式计算Q的统计值Q1 = (n1-1)*(np.log(np.linalg.det(s)) - np.log(np.linalg.det(s1)) - p + np.matrix.trace(np.linalg.inv(s).dot(s1)))Q2 = (n2-1)*(np.log(np.linalg.det(s)) - np.log(np.linalg.det(s2)) - p + np.matrix.trace(np.linalg.inv(s).dot(s2)))df = p*(p+1)/2# 因为这是卡方分布,先计算临界值,也就是拒绝阈lingjie = stats.chi2.ppf(0.95,df)# 如果都比拒绝阈小,说明两个协方差无显著差异(H0:协方差无显著差异)if (Q1<lingjie) and (Q2 < lingjie):return True,Q1,Q2,lingjieelse:return False,Q1,Q2,lingjie
print(cov_homogeneity_2(x1,x2))
(True, 2.5784296441237355, 0.7417513518834973, 7.814727903251179)
# 返回True,所以这个数据的协方差通过同质性检验,可以认为协方差相等

多分类的协方差矩阵齐性检验

先讨论三个总体的情况,其实三个总体也可以用上面的方法两两比较,比较多次就可得出结论。同样的,四个五个也是一样,多比较几次总会有结果。
下面看图:

上图是三个类别,如果把他推广到k个类别,唯一不同的,就是联合协方差矩阵S
如果是k个类别,那么

其中 n1 一直加到 nk 就是总样本 n 个。
这里注意当n=k时,比如三个样本三个类别,那么这时候也无需分类,因为数据太少,判别不了。。所以每个类别至少有两个数据,才能进行判别。即n>k
直接给出推广到k个类别的判断函数

def cov_homogeneity_n(x,y):if x.shape[0]!=y.shape[0]:return "x和y数据不是相同的个数"n = x.shape[0] # 样本的总个数p = x.shape[1] # 维度k = np.unique(y).size # 样本的类别数if n=k:return "请检查数据"s1=0 # 联合协方差矩阵用的s2=0 # 这表示M后面减去部分的求和项,也在循环中求出df=p*(p+1)*(k-1)/2 # 自由度# 把d分成前面固定的数和后面求和项两部分的乘积,在循环内部算出求和项d2d1 = (2*p**2+3*p-1)/(6*(p+1)*(k-1))d2=0for y_i in np.unique(y):x_i = x[y==y_i]n_y_i = x_i.shape[0] # 属于这一类的样本个数d2+=(1/(n_y_i-1)-1/(n-k))s_i = np.cov(x_i,rowvar=False)s1+=(n_y_i-1)*s_i/(n-k) # 联合协方差矩阵,其实也是求和项,分母相同,分子是每一项的求和s2+=(n_y_i-1)*np.log(np.linalg.det(s_i))# 最终的公式:d = d1*d2S = s1M = (n-k)*np.log(np.linalg.det(S))-s2T = (1-d)*Mlingjie = stats.chi2.ppf(0.95,df)if T<lingjie:return True,T,lingjieelse:return False,T,lingjie

给出下列数据

x = np.array([[261.01,7.36],[185.39,5.99],[249.58,6.11],[137.13,4.35],[231.34,8.79],[231.38,8.53],[260.25,10.02],[259.51,9.79],[273.84,8.79],[303.59,8.53],[231.03,6.15],[308.90,8.49],[258.69,7.16],[355.54,9.43],[476.69,11.32],[316.12,8.17],[274.57,9.67],[409.42,10.49],[330.34,9.61],[331.47,13.72],[352.50,11.00],[347.31,11.19],[189.59,5.46]])y = np.array([1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3])
cov_homogeneity_n(x,y)

out:
(True, 8.138112152750503, 12.591587243743977)

这组数据三个类别中协方差矩阵齐性,即无显著性差异。

SPSS中判断协方差的方法

在spss中也提供了判断协方差齐性的假设检验。
还是上面的数据,三个类别,spss中在分析-分类-判别式,点进去就是spss的判别分析,这里只针对说明协方差的假设检验。


在上图统计按钮点开后得到下面:

box’M检验,就是协方差的假设性检验,H0为协方差相等。

这里用到的是F检验,具体的检验方法我没搞明白,网上资料有限,知道的可以留言给我,谢谢了。

结果也是这三个类别的协方差相等,没有理由拒绝原假设。


另外,顺嘴一提,上图统计的对话框里,函数系数列表中有Fisher和未标准化两种选择,

其中注意Fisher选项,为贝叶斯判别,是用概率来计算属于哪一个类别
他给出的系数:

有几个类别就会有几组函数的系数,
要判断一个数据时,把数据分别带入三个方程,计算得到的结果为y1,y2,y3
那么属于第一类的概率为

以此计算属于其他类的概率,哪个概率大就判给谁

而未标准化则给出Fisher判别的未标准化系数,因为默认给出标准化的
由Fisher判别公式计算离质心的距离来判断属于哪一类别。
这里容易混淆,所以记一下!

协方差矩阵的齐性检验(接上一篇文章)相关推荐

  1. 【队列】 象棋中的马 BFS C++ (接上一篇文章)

    队列 象棋中的马 BFS C++ (接上一篇文章) 不同于迷宫,迷宫中有通道和障碍:而象棋中的马则没有明显标记的通道和障碍. 因此要标记该点是否入过队 inq[x][y]={false}; 默认没有入 ...

  2. PHP获取上一篇文章和下一篇文章数据

    很多框架都可以完成,同理. Laravel的Eloquent ORM 获取当前记录的上一篇下一篇 然后,当时在答案里面简单写了一下解决方案.不过由于这个取得下一条和取得上一条的记录其实在日常的开发当中 ...

  3. 收藏CSDN上一篇文章--勉励自己

    这是发到我邮箱里面的一封信,信很长,从字面看,这位程序员朋友内心有点焦虑和沮丧,但他毕竟还没有放弃希望.所以来信求教与我. 这点,我心有戚戚焉,其实,我自己定位,也仅仅是一个普通程序员,这位朋友谈到的 ...

  4. 网络编程(基于socket接口技术的进程间通信)接上一篇文章补充

    目录 一.网络编程(基于socket接口技术) 1.基于TCP协议的网络通信 编程模型: 2.基于UDP通信协议的网络通信 编程模型: 3.新增函数: 大小端数据转换函数: ip地址转换函数: TCP ...

  5. 以判断西瓜好坏为例,生成的决策树(源码)-- 上一篇文章--(决策树)的下文

    from random import choice from collections import Counter import math# ========== # 定义数据集 # ======== ...

  6. 上一篇文章、下一篇文章实现

    上一篇代码 select top 1 Id from [table] where Id < @当前ID order by Id desc 下一篇代码 select top 1 Id from [ ...

  7. Pinyin4j的基本用法,以及给城市名称选择排序,侧边栏字母排序,内有Pinyin4j的下载链接,这是对我发表的上一篇文章进行修改以及更新bug,上一篇文章排序有点bug,现在将bug修改好了

    1.需要下载Pinyin4j的jar包.下载地址为https://sourceforge.net/projects/pinyin4j/files/ 下载后需要放到安卓项目目录下的libs文件夹.如下图 ...

  8. UML科普文,一篇文章掌握14种UML图

    前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...

  9. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

最新文章

  1. ubuntu 18.04 添加快快捷方式
  2. python编程基础语法-Python编程基础语法快速入门
  3. Auto_ml与TPOT的区别
  4. 阿里巴巴后台的使用体验
  5. 2021抖音电商生态发展报告
  6. rnn按时间展开_一文搞懂RNN(循环神经网络)基础篇
  7. 第八章应用安全工程备考要点及真题分布
  8. SSM山东医院-1-登录(对象条件查询)-未加密版本
  9. sw工程图导出bom_solidworks怎么导出带缩略图的BOM材料明细表?
  10. 在取证过程中,常见的一些注册表键值整理
  11. 蓝桥杯 算法提高 7-2求arccos值
  12. PS4常用DNS一览 PSN下载速度慢登录失败解决办法
  13. 设备报废鉴定怎么做?
  14. 论文阅读:Securely Outsourcing Neural Network Inferenceto the Cloud with Lightweight Techniques
  15. 我的世界电脑版服务器区块怎么显示,我的世界区块显示指令 | 手游网游页游攻略大全...
  16. redhat linux 历史版本,redhat-linux操作系统版本发展史
  17. Java中的锁大全(底层源码分析)
  18. 自主存取控制方法中-----------用户权限的“授权”与“收回”
  19. Matlab中爱心的四种画法(附代码)
  20. 硬件路由转发原理浅析-清晨补充

热门文章

  1. docker_mysql
  2. 科普|一文读懂NFT.Storage 创建过程
  3. 什么是RDD?RDD的特点?RDD与Dataframe的关系?
  4. 聊聊并发编程的12种业务场景
  5. AD封装与原件的一一对应(+封装管理器的使用)
  6. 关于校园霸凌,刚刚发生(第四天的进展)
  7. vue项目中使用百度地图api完成自定义搜索功能(包含搜索详细地理位置)
  8. 顶部提示数据信息~echarts奇奇怪怪系列
  9. 面试专家陈建军出二十一组面试题(转)
  10. mysql的dll文件_qsqlmysql.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家