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,我们可以快速地计算出序列的标准差和均值,进而找到其中的离群值。这种向量化的方法不仅高效,而且易于实现。