第一次用的Grubbs检验法剔除异常值,结果发现当n=3的时候,0.99,1,1.01按理来说没有异常值,但是算出来的G却是大于G(3)的,也就是说1.01要被剔除。这就很奇怪。上网查了一下竟然没人对这个方法产生一点质疑。暂且搁置,Grubbs检验法我感觉不靠谱。
后来我想可以利用条件限制去选择性剔除异常值。根据个人经验,选择用两个条件去限制(给x1,x2和x3从小到大排好顺序):(1)最大值和中间值距离与最小值和中间值距离的倍数比较(这里设定为绝对值不超过3倍):x3-x2>3(x2-x1)(2)单个最大值或者最小值与中间值的倍数限制(这里设定最大值不超过中间值的1.05倍,最小值不小于中间值的0.95倍):x3>1.05x2,x1<0.95x2。
这两个条件必须是“且”的关系,也就是两者缺一不可。
原始txt文件如下:
スクリプト如下:
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 14 00:35:11 2022
@author: Lily
"""
import numpy as np
# a=[1.2,1.6,1.1,2.3,2.5,2.1,2.01,2.30,0.45,4.56,1.21,1.23,100,100.01,100.63,-80,0,80]
filename=r"D:pythonlpracticethree samples.txt"
a=np.loadtxt(filename,skiprows=3,usecols=1,unpack=True,encoding='utf8')
b=np.reshape(a,(int(len(a)/3),3)) #何行三列にする
for i in range(int(len(a)/3)):
b[i]=np.sort(b[i]) #上昇順位で並べ替える
print(b) #並べ替えたデータ
Y=[]
Ystrange=[]
for i in range(int(len(a)/3)):
if np.fabs(b[i][0]-b[i][1])<=3*np.fabs(b[i][2]-b[i][1]) and np.fabs(b[i][2]-b[i][1])<=3*np.fabs(b[i][0]-b[i][1]):
Y.append(b[i])
Ystrange.append(0)
else:
for ii in range(3):
if np.fabs(b[i][ii]-b[i][1])>3*np.fabs(b[i][2-ii]-b[i][1]):
if ii==0 and b[i][ii]<0.95*b[i][1]:
Y.append(np.delete(b[i],ii,None))
Ystrange.append(b[i][ii])
elif ii==2 and b[i][ii]>1.05*b[i][1]:
Y.append(np.delete(b[i],ii,None))
Ystrange.append(b[i][ii])
else:
Y.append(b[i])
Ystrange.append(0)
#print(Y)
Yaverage=[np.mean(x) for x in Y]
print(Yaverage)
Y1=[]
Y2=[]
Y3=[]
for iii in Y:
if len(iii)==2:
Y1.append(iii[0])
Y2.append(iii[1])
Y3.append((iii[0]+iii[1])/2)
elif len(iii)==3:
Y1.append(iii[0])
Y2.append(iii[1])
Y3.append(iii[2])
headtext="three samples' average"
headtext+="nLily"
headtext+="nnn x1(g/kg) x2(g/kg) x3(g/kg) average strange data"
outputfilename=r"D:pythonlpracticethree samples results.txt"
np.savetxt(outputfilename,list(zip(Y1,Y2,Y3,Yaverage,Ystrange)),fmt="%8.3f",header=headtext,encoding="utf8",delimiter=" ",comments=" ")
注:x1,x2,x3分别是从小到大排列后应该留住的数据。不用剔除就strange data里放个0;如果需要剔除:异常值x3剔除后用剩下两个数的平均值补位x3,然后把异常值放在strange data里。
最后输出结果如下:
完美!
ps:两天下午的成果,第一天下午写的Grubbs全都浪费了,但是打算把部分代码写在下面以后可以再参考一些语法:
import numpy as np
a1=[0.99,1.,1.01]
a2=[-2,0.98,1.03]
a3=[1,1.05,2.6]
a4=[0.97,1.08,0.3]
A=np.array([a1,a2,a3,a4])
B=[[],[],[],[]]
for i in np.arange(4):
B[i]=[x for x in A[i] if (np.abs((x-A[i].mean())/A[i].std()))<= 1.135]
B=np.array(B)
print(B)
Ave=np.zeros(4)
for i in np.arange(4):
Ave[i]=np.mean(B[i])
print("外れ値を除いた平均値は",Ave)
配列の内包表記について参考する価値はあると思う!
python是跟着某日本老师的ppt学的,结果学完之后发现关于python的日语说法都知道,汉语说法却说不上来。。。最近看了很多日本那边的python经验分享,以后感觉有用的会翻译过来发上来!



