我运行了以下的编码,但是不论在data输入什么数据,最后print输出的都是空白。我是想用格拉布斯检验法检测数据异常值。我不会自己写代码,今天自己摸索着装上了Python和Pycharm以及一系列的第三方数据库,一开始使用from import这个命令完全不能运行,一直显示unresloved reference,然后我根据教材改了PATH还有虚拟环境啥的,也不知道弄对了没有,反正可以用了。但是后续就是只有在第一次输入数据串的时候运行出了结果,后面不论我怎么换数据,结果都是空的。
import numpy as np
from scipy.stats import t
def grubbs_test(data, alpha):
n = len(data)
mean = np.mean(data)
std_dev = np.std(data)
t_critical = t.ppf(1 - alpha / (2 * n), n - 2)
# Find the maximum absolute deviation from the mean
max_deviation = np.max(np.abs(data - mean))
# Calculate the test statistic
G = max_deviation / std_dev
# Calculate the critical value
critical_value = (n - 1) / np.sqrt(n) * np.sqrt(t_critical ** 2 / (n - 2 + t_critical ** 2))
# Determine if the maximum deviation is an outlier
is_outlier = G > critical_value
# Return the data without outliers
return data[~is_outlier]
# Example usage
data = np.array([73.15, 60.80, 85.39, 103.81, 110.92, 100.92, 109.63, 108.21])
alpha = 0.05
data_without_outliers = grubbs_test(data, alpha)
print("Data without outliers:", data_without_outliers)
运行结果如下:
D:\PYCharm\Scripts\python.exe "C:\Users\Administrator\PycharmProjects\pythonProject\Grubbs Test final.py"
Data without outliers: []
Process finished with exit code 0
如果你的代码可以正常运行,没有报错,但是仅仅是输出结果是
Data without outliers: []
的话,
那首先就已经排除了环境的问题。因为如果环境有问题,肯定会有报错信息,不会这么单纯的只有打印信息了,那么真相只有一个!!————数据问题!
也就 你说的“后面不论我怎么换数据,结果都是空的” ,你换的数据,正好根据算法算出来都是异常的,所以输出的就是空的。
因为我刚刚也试着随意换了换数据,我发现,很容易就空了,上面的那些朋友的回答里面有给出了具体解释这个算法的,我就不赘述了。
下面我给出一组可以让它输出结果为空的数据:
data = np.array([7.15, 6.80, 8.39, 10.81, 10.92, 11.92, 109.63, 18.21])
换了后,输出立马为空。
楼主要是不确定自己是否环境有问题的话,你可以把数据换回来,换成你最开始的
data = np.array([73.15, 60.80, 85.39, 103.81, 110.92, 100.92, 109.63, 108.21])
这个再运行,结果肯定就不是空的了!请尝试!! 如果OK,请采纳!
我手动运行了下,结果是正确的:
Data without outliers: [[ 73.15 60.8 85.39 103.81 110.92 100.92 109.63 108.21]]
可能是你的numpy或者scipy的依赖项出现了问题。建议用pip强制重新安装,会自动解决依赖项问题:
pip install numpy scipy
或者用一个虚拟环境:
python -m venv venv
call venv/scripts/activate
pip install numpy scipy
python main.py
手机上执行结果如下,环境有关?
应该是你的电脑上的python环境的问题,在我的电脑上运行结果有输出,如下图:
解决法是:打开电脑cmd,输入python,可以看到python版本,说明path环境变量配置的没有问题,滞后于检查下scipy库是否已经正确安装,如果你使用了虚拟环境,最好在开发工具如pycharm的终端中,输入pip show scipy 检查scipy是否已安装,如果没有则需要在这个终端中安装。
代码似乎没有问题,检查一下是不是numpy版本关系导致的。
结果是真的可以的。aconda删掉,重新下载(具体看你需求,每个数需要就最新的就行了)。
清华的源,https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
根据你提供的代码和运行结果,可能是因为在传入数据时,数据类型不是numpy数组或者传入的数据中没有异常值,导致函数返回空数组。你可以尝试以下几点来解决这个问题:
确保传入的数据类型为numpy数组。你可以使用type(data)来检查传入的数据类型是否正确。如果不是numpy数组类型,可以使用data = np.array(data)来将数据转换为numpy数组。
检查传入的数据是否包含异常值。你可以使用print(data)打印出传入的数据,然后手动计算是否存在异常值。如果数据中没有异常值,那么函数返回的就是空数组。
调整异常值检测的显著性水平alpha。在你的代码中,alpha默认为0.05,也就是显著性水平为5%。你可以尝试调整alpha的值,来查看是否能够检测到异常值。比如设置alpha为0.01,也就是显著性水平为1%。
你可能需要看看这个
py 环境问题
换一个python环境试一下
根据Grubbs检验的原理,如果没有找到任何异常值,则不会返回任何数据。在这个例子中,由于数据中没有异常值,因此返回的结果为空。如果数据中存在异常值,则会返回去除异常值后的数据。
可以运行啊,最好检查下依赖,如下图: