Python filter()函数检测异常值,前面定义了几个统计函数,用于计算平均值、标准差以及对数据进行归一化。利用这些函数查找数据中的异常值时,首先把mean()
函数和stdev()
函数应用于旅行数据中路径段里的距离值,计算总体平均值和标准差。
然后利用z()
函数计算每个路径段的归一值。如果归一值大于3,说明该样本远离平均值。去掉这些值可以提高数据的一致性,降低因测量误差引起的计算偏差。
体实现方法如下:
from ch04_ex4 import mean, stdev, z
dist_data = list(map(dist, trip))
μ_d = mean(dist_data)
σ_d = stdev(dist_data)
outlier = lambda leg: z(dist(leg), μ_d, σ_d) > 3
print("Outliers", list(filter(outlier, trip)))
首先把距离计算函数映射到旅行数据的每个路径段上,由于后面要多次用到这个计算结果,所以必须把它实例化为一个列表对象。这里不能用迭代器,因为第一个使用它的函数会把它包含的数据消耗掉。然后基于上面的计算结果求总体统计值μ_d
和σ_d
,即平均值和标准差。
基于这些统计值,就可以用检查异常的匿名函数过滤数据,太大的归一值就是我们要找的异常值。
list(filter(outlier, trip))
的计算结果是由两个路径段组成的列表,这两段比其他路径段大得多。路径段的平均长度是34海里,标准差是24海里,归一化距离没有小于-1.407的。
应把复杂的问题拆解为一系列独立函数,每个函数都可以单独测试,以保证整个处理过程是由一系列简单函数构成的,这才是简洁明了的函数式编程。