栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

三个平行样选择性剔除异常值后求平均值(python)Nekotaizi

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

三个平行样选择性剔除异常值后求平均值(python)Nekotaizi

第一次用的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经验分享,以后感觉有用的会翻译过来发上来!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739507.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号