python寻找多维样本中k-sigma置信椭圆外的离群值
处理样本时常常需要寻找样本的离群值。离群值的判断方式有很多,最简单也是最常用的方法之一就是正态分布的k-sigma法。
函数输入:二维m x n 的array,n是样本的参数,比如样本的x,y,z轴坐标等。m是不同的样本数据,比如a点,b点,c点等。m和n顺序可调换。
根据样本的均值和协方差矩阵,计算样本的置信椭圆。
返回:在k-sigma外的的离群值索引。
数学基础参考https://www.jianshu.com/p/7ea61c9c2135
import numpy as np
def find_outlier(points, k):
"""
# 寻找样本中k-sigma置信椭圆外的离群值
# 样本可以为多维
"""
# 检查输入样本格式
if points.shape[1] > points.shape[0]:
points = points.T
# 计算均值,样本对中
points = points - np.mean(points, axis = 0)
# 计算样本协方差矩阵,并进行特征值、特征向量分解
# 特征向量指向椭圆半长轴,
# 特征值是对应椭圆半长轴的平方
cov_matrix = np.cov(points.T)
eig_value, eig_vector = np.linalg.eig(cov_matrix)
eig_value *= k*k
# 旋转数据点,使数据点与椭圆半长轴对齐
points_ellipse = np.dot(points, eig_vector)
# 构建置信椭圆
confidence_ellipse = np.diag(np.dot(np.dot(points_ellipse,np.linalg.inv(np.diag(eig_value))),points_ellipse.T))
# 置信椭圆大于1的点即为离群点
# 返回其索引
idx = np.array(range(points_ellipse.shape[0]))
idx = idx[confidence_ellipse > 1]
return idx
看看跑的结果。
创建一个样本矩阵。
a = np.array(range(200))
a = a.reshape(100,2)
创建一个离群值
a[50,1] = 9999
设置k=3,看看结果
outlier = find_outlier(a,k=3)
outlier
Out[1]: array([50])
完美