前言:
目录
一 卡方分布
二 双边假设检验
三 单边假设检验
四 例子
一 卡方分布
n 个随机变量均符合标准正态分布,则其平方和符合自由度为n的卡方分布
重要性质
二 双边检验
2.1 假设
2.2 统计量
2.3 拒绝域
k1 =chi2.ppf(alpha/2) k2=chi2.ppf(1-alpha/2)
其中: k1 可以通过
P值法
由于是双边检验
P_= 2*min(p,1-p)
三 单边检验
小写的s是样本方差
1: 左边检验
1.1 假设
1.2 统计量
1.3 拒绝域
这里分位数代表下分位数,如果是上分位数写法为
1.4 P值法
2: 右边检验
2.1 假设
2.2 统计量
2.3 拒绝域
这里分位数代表下分位数,如果是上分位数写法为
2.4 P值法
四 例子:
解:
这是左边检验
step1
step2 :统计量
统计量 14.57
step3: 在置信度为0.05,自由度为 24 情况下
分位数 13.848
step4
原假设成立
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 31 10:26:06 2021
@author: chengxf2
"""
import numpy as np
from scipy.stats import chi2
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
'''
统计量
args
df: 自由度
s: 样本方差
sigma: 方差
'''
def GetZ(df,s,sigma):
z = df*s/sigma
return z
def GetQ(alpha, df):
q = chi2.ppf(alpha,df)# -*- coding: utf-8 -*-
"""
Created on Sat Jul 31 10:26:06 2021
@author: chengxf2
"""
import numpy as np
from scipy.stats import chi2
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
'''
统计量
args
df: 自由度
s: 样本方差
sigma: 方差
'''
def GetZ(df,s,sigma):
z = df*s/sigma
return z
def GetQ(alpha, df):
q = chi2.ppf(alpha,df)
return q
if __name__=="__main__":
n= 25
s= 4.25
df = n-1
sigma = 7
alpha = 0.05
z = GetZ(df,s,sigma)
q =GetQ(alpha, df)
print("\n 统计量 %5.2f"%z,"\t 分位数 %5.3f "%q)
if z>q:
print("\n 原假设成立 ")
else:
print("\n 拒绝原假设")
return q
if __name__=="__main__":
n= 25
s= 4.25
df = n-1
sigma = 7
alpha = 0.05
z = GetZ(df,s,sigma)
q =GetQ(alpha, df)
print("\n 统计量 %5.2f"%z,"\t 分位数 %5.3f "%q)
if z>q:
print("\n 原假设成立 ")
else:
print("\n 拒绝原假设")
4.2 鸢尾花 数据集种,每个维度归一化后,其平方和可以假设符合卡方分布
检验临界值法和P值法效果是否一样,找出分布异常的点。
解:
通过代码 ,其效果完全一致。
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 30 16:39:08 2021
@author: chengxf2
"""
import numpy as np
from scipy.stats import chi2
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
'''
检验:
args
x_std: 每一列的数据都是标准的正太分布
'''
def check(x_std, alpha=0.01):
if alpha > 0.5:
print("\n ========error=========")
return
m, n = np.shape(x_std)
df = n # 自由度
low = chi2.ppf(alpha/2, df) # 左边拒绝域
up = chi2.ppf(1-alpha/2, df) # 右边拒绝域
for i in range(m):
x = x_std[i] # 样本
a = np.power(x, 2) # 样本平方
b = np.sum(a) # 随机变量的平方和符合卡方分布
# p = 2*chi2.sf(b,df) #1-CDF 累计积分 ,双边分布的p值法
p = chi2.cdf(b, df)
p_ = 2 * min(p, 1.0-p)
bReject_p = False
bReject_N = False
if p_ < alpha:
bReject_p = True
if b < low or b > up:
bReject_N = True
if bReject_p != bReject_N:
print("\n P值法 %4.3f i: %d " % (p, i))
'''
标准化
Args
data: 数据集
return
x_std: 样本标准化后的情况
u: 每个维度的均值
std: 每个维度的无偏标准差ddof = 0(n无偏);1(n-1)
'''
def standardization(data):
#x_std = StandardScaler().fit_transform(data)
scaler = StandardScaler().fit(data)
x_std = scaler.transform(data)
print("\n data ", np.shape(x_std))
u = scaler.mean_
sig = scaler.scale_
#print("\n 维度均值: ", u, "\t 维度方差 ", sig)
'''
m, n = np.shape(data)
for i in range(n):
x = data[:, i]
u = np.mean(x)
sigma = np.std(x,ddof=0)
print("\n i %d u: %5.2f sigma %5.3f" % (i, u, sigma))
'''
return x_std, u, sig
'''
均值方差归一化 Standardization
加载数据集
Args
None
iris: ['target_names', 'data', 'target', 'DESCR', 'feature_names']
return
'''
def LoadData():
data = load_iris()
feature = data['data']
m, n = np.shape(feature)
return feature
if __name__ == "__main__":
data = LoadData()
x_std = standardization(data)
check(x_std[0], 0.01)