RELATEED CONSULTING
相关咨询
欢迎选择下列在线客服咨询
微信客服
微信客服二维码
热线电话:13863516421
7x24小时,全年无休
我们服务器的承诺:
关闭右侧工具栏

境外国外服务器专题

如何确定马氏距离法的阈值?

  • 来源:本站
  • 编辑: 超级管理员
  • 时间:2025-05-21 11:28:46
  • 阅读1次


确定马氏距离法的阈值是异常值检测的关键步骤,其核心是定义 “距离多大视为异常”。阈值的选择需结合数据分布特征、业务需求和统计理论,以下是常见方法及适用场景:

一、基于多元正态分布假设的阈值(参数法)

若数据近似服从多元正态分布,马氏距离的平方 

M

2

 (x)

 服从自由度为 

p

(维度)的 卡方分布(

χ 

p

2

 

),可通过卡方分布的分位数确定阈值。

1. 理论分位数法

步骤:

计算所有样本的马氏距离平方 

M

2

 (x 

i

 )

i=1,2,...,n

)。

根据预设的显著性水平 

α

(如 

α=0.05

,表示允许 5% 的样本为异常值),查卡方分布表获取阈值:

阈值=χ 

p,1−α

2

 


其中,

χ 

p,1−α

2

 

 表示自由度为 

p

、右侧面积为 

1−α

 的卡方值。

示例:

若 

p=3

α=0.05

,则 

χ 

3,0.95

2

 =7.815

,即马氏距离平方大于 7.815 的点视为异常值。

适用场景:

数据严格服从多元正态分布(如物理测量误差、部分医学指标),且需要基于统计理论控制误检率。

2. 样本分位数近似法

背景:

当数据不完全符合正态分布时,直接使用卡方分布阈值可能不准确,可通过样本的马氏距离分位数近似。

步骤:

计算所有样本马氏距离的经验分位数作为阈值,如:

阈值=分位数(D 

M

 (x 

i

 ),q=1−α)


例如,取 

q=0.95

 表示前 5% 的最大距离点为异常值。

优势:

不依赖严格的分布假设,适用于近似正态或轻尾分布的数据。

二、非参数法(不依赖分布假设)

当数据分布未知或明显非正态(如肥尾、多峰分布)时,可采用非参数方法,直接基于样本距离的统计量设定阈值。

1. 稳健统计量法

核心思想:

用稳健的位置和散度估计替代均值和协方差矩阵,避免异常值对阈值的干扰。

步骤:

计算稳健位置估计(如中位数向量 

μ

~

 

)和稳健散度估计(如最小协方差行列式,MCD)。

计算基于稳健参数的马氏距离 

稳健

 (x)

阈值设定为稳健距离的分位数(如 95% 分位数)或通过经验公式确定。

示例:

在 R 语言中,可通过 MASS 包的 covMcd 函数估计稳健协方差矩阵,再计算距离和阈值。

2. 交叉验证法

步骤:

将数据划分为训练集和测试集。

在训练集上通过不同阈值(如卡方分位数、样本分位数)检测异常值,计算测试集的误检率(False Positive Rate, FPR)和漏检率(False Negative Rate, FNR)。

选择使 FPR 和 FNR 平衡的阈值(如通过 ROC 曲线确定最优阈值)。

适用场景:

有标签数据(已知部分异常值),需通过模型评估优化阈值。

三、基于领域知识的经验阈值

在工业、金融等领域,可结合业务逻辑和历史数据设定阈值,而非完全依赖统计理论。

1. 历史数据法

步骤:

分析历史正常数据的马氏距离分布,将阈值设为正常数据的最大距离加上安全裕度。

例如:历史正常数据的最大马氏距离为 10,阈值设为 12,以容忍轻微波动。

适用场景:

实时监控系统(如设备传感器数据),需快速区分正常波动与异常状态。

2. 专家规则法

步骤:

与领域专家合作,根据业务经验定义 “异常” 的距离标准。

例如:在医疗诊断中,专家认为某指标组合的马氏距离超过 8 时提示异常。

优势:

贴合实际需求,可处理统计方法难以捕捉的复杂异常模式。

四、阈值选择的注意事项

数据分布的影响:

正态分布数据优先用卡方分位数;非正态数据用样本分位数或稳健方法。

肥尾分布中,异常值可能比预期更多,需适当降低阈值(如用 90% 分位数)。

维度的影响:

高维数据中,马氏距离易受噪声干扰,阈值需结合降维(如 PCA)或正则化协方差矩阵后再确定。

误检与漏检的权衡:

低阈值(如 99% 分位数)会减少漏检但增加误报,适用于风险敏感场景(如医疗);

高阈值(如 99.9% 分位数)降低误报但可能漏检,适用于成本敏感场景(如工业运维)。

动态阈值调整:

对于随时间变化的数据(如时序数据),需定期更新均值、协方差矩阵和阈值,避免模型过时。

五、案例:用 Python 实现阈值确定

python

运行

import numpy as np

from scipy.stats import chi2

from sklearn.covariance import EmpiricalCovariance, MinCovDet


# 示例数据(假设3维正态分布)

np.random.seed(0)

mu = np.array([0, 0, 0])

cov = np.array([[1, 0.5, 0], [0.5, 2, 0], [0, 0, 3]])

X = np.random.multivariate_normal(mu, cov, size=1000)


# 1. 基于正态假设的卡方阈值(α=0.05)

p = X.shape[1]  # 维度

emp_cov = EmpiricalCovariance().fit(X)

mahalanobis = emp_cov.mahalanobis(X)

threshold_chi2 = chi2.ppf(q=0.95, df=p)  # 卡方分位数

outliers_chi2 = np.where(mahalanobis > threshold_chi2)[0]


# 2. 基于样本分位数的阈值(95%分位数)

threshold_quantile = np.quantile(mahalanobis, q=0.95)

outliers_quantile = np.where(mahalanobis > threshold_quantile)[0]


# 3. 稳健方法(最小协方差行列式)

mcd = MinCovDet().fit(X)

mahalanobis_robust = mcd.mahalanobis(X)

threshold_robust = np.quantile(mahalanobis_robust, q=0.95)

outliers_robust = np.where(mahalanobis_robust > threshold_robust)[0]

总结:阈值选择流程图





数据是否服从多元正态分布?


卡方分位数阈值


是否有领域知识?


经验阈值或专家规则


样本分位数/稳健方法


交叉验证优化阈值



我们提供7X24小时售后服务,了解更多机房产品和服务,敬请联系
购买咨询 售后服务