Numpy如何通过向量化的方式找到序列中的离群值

Numpy如何通过向量化的方式找到序列中的离群值

在统计学和数据分析中,离群值(outlier)是指在数据集中与其他样本有显著差异的数据点。这些差异可能由异常情况、数据收集错误或其他原因引起,因此,进一步分析排除离群值以及理解它们是非常重要的。本文将介绍如何使用Numpy通过向量化的方式找到离群值。

阅读更多:Numpy 教程

离群值的定义

假设我们有一个数值序列x={x_1, x_2, x_3, …, x_n}。则,如果一个样本x_i比整个序列的均值\bar{x}的距离大于某个倍数的标准差\sigma,我们就可以将其视为离群值。常用的是3倍标准差,即\lvert x_i-\bar{x} \rvert > 3\sigma

找到序列中的离群值

计算标准差和均值

首先,我们需要计算出序列中所有数据的标准差和均值。在Numpy中,可以使用numpy.std()numpy.mean()函数来计算标准差和均值。

import numpy as np

# 生成一个含有离群值的序列
x = np.concatenate([np.random.randn(10)*2, [10, -10]])

# 找到均值和标准差
mean = np.mean(x)
std = np.std(x)

print(mean, std)

在这个例子中,我们生成了一个长度为12的序列,其中包含两个离群值:10和-10。然后,我们使用numpy.mean()numpy.std()函数计算序列的均值和标准差。

找到离群值

接下来,我们使用上述计算出的均值和标准差来找到离群值。在Numpy中,可以通过一个简单的公式来判断一个样本是否为离群值:

outliers = np.abs(x - mean) > 3*std

其中,np.abs(x - mean)计算每个样本与均值之间的距离,并使用3*std将其与3倍标准差进行比较,即可得到一个布尔型数组。数组中为True的索引表示样本是一个离群值。

最后,我们可以使用数组的sum()函数计算出离群值的个数:

print(outliers.sum())

示例

import numpy as np

# 生成一个含有离群值的序列
x = np.concatenate([np.random.randn(10)*2, [10, -10]])

# 找到均值和标准差
mean = np.mean(x)
std = np.std(x)

# 找到离群值
outliers = np.abs(x - mean) > 3*std

# 打印离群值的数量
print(outliers.sum())

# 打印所有的样本以及是否为离群值
print(np.column_stack((x, outliers.astype(int))))

在上述示例中,我们生成了一个长度为12的序列,其中包含两个离群值:10和-10。然后计算了序列的均值和标准差,并使用这些值找到了离群值。最后,我们打印了离群值的数量,以及所有样本与其是否为离群值的状态。

输出:

2
[[ 0.16354674  0]
 [-0.58741446  0]
 [-2.54876978  0]
 [-1.08094093  0]
 [ 1.16701869  0]
 [-1.6911675   0]
 [-2.74906652  0]
 [-1.28166892  0]
 [ 3.68073477  0]
 [-2.95154767  0]
 [10.          1]
 [-10.          1]]

从输出可以看出,我们正确地找到了两个离群值,并将它们标记为1。

总结

离群值是统计学和数据分析中非常重要的概念。通过使用Numpy,我们可以快速地计算出序列的标准差和均值,进而找到其中的离群值。这种向量化的方法不仅高效,而且易于实现。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程