python 寻找多维样本中k-sigma置信椭圆外的离群值

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])

完美

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值