马氏距离法剔除异常样本

马氏距离(Mahalanobis Distance)是一种有效的统计量,用于测量一个点与一个分布之间的距离。它考虑了数据的协方差结构,因此比欧氏距离更适合处理相关数据。在实际应用中,马氏距离常用于检测和剔除异常样本。

1. 马氏距离的定义

马氏距离定义为:

\(D^2 = (x - \mu)^T \Sigma^{-1} (x - \mu)\)

其中:

  • \(x\) 是样本点。
  • \(\mu\) 是样本均值。
  • \(\Sigma\) 是样本的协方差矩阵。

2. 计算马氏距离的步骤

  1. 计算样本均值

    \(\mu = \frac{1}{n} \sum_{i=1}^n x_i\)

  2. 计算样本协方差矩阵

    \(\Sigma = \frac{1}{n-1} \sum_{i=1}^n (x_i - \mu)(x_i - \mu)^T\)

  3. 计算每个样本的马氏距离

    \(D_i^2 = (x_i - \mu)^T \Sigma^{-1} (x_i - \mu)\)

3. 确定异常样本的阈值

通常,马氏距离的平方 \(D^2\) 服从卡方分布 \(\chi^2\)。对于 \(d\) 维数据,可以使用卡方分布的 \(\alpha\) 分位数作为阈值。例如,对于 \(\alpha = 0.01\),可以使用 \(\chi^2_{0.01, d}\) 作为阈值。

4. 剔除异常样本

将马氏距离大于阈值的样本视为异常样本并剔除。

实现 MATLAB

展示如何使用马氏距离法剔除异常样本。

% 清空环境
clc;
clear;
close all;

% 生成示例数据
rng(0); % 设置随机种子
data = mvnrnd([0, 0], [1, 0.5; 0.5, 1], 100); % 生成100个二维正态分布样本
data(1, :) = [10, 10]; % 添加一个异常样本

% 计算样本均值
mu = mean(data);

% 计算样本协方差矩阵
Sigma = cov(data);

% 计算每个样本的马氏距离
D2 = mahal(data, data);

% 确定阈值
d = size(data, 2); % 数据维度
alpha = 0.01; % 显著性水平
threshold = chi2inv(1 - alpha, d);

% 剔除异常样本
is_outlier = D2 > threshold;
clean_data = data(~is_outlier, :);

% 显示结果
figure;
scatter(data(:, 1), data(:, 2), 'filled');
hold on;
scatter(clean_data(:, 1), clean_data(:, 2), 'r', 'filled');
legend('原始数据', '剔除异常后的数据');
title('马氏距离法剔除异常样本');
xlabel('X1');
ylabel('X2');
grid on;

参考代码 马氏距离法剔除异常样本 youwenfan.com/contentcnc/83591.html

说明

  1. 生成示例数据

    • 使用 mvnrnd 生成二维正态分布样本。
    • 添加一个异常样本以模拟真实情况。
  2. 计算样本均值和协方差矩阵

    • 使用 meancov 函数计算样本的均值和协方差矩阵。
  3. 计算马氏距离

    • 使用 mahal 函数计算每个样本的马氏距离。
  4. 确定阈值

    • 使用 chi2inv 函数计算卡方分布的 ( \alpha ) 分位数作为阈值。
  5. 剔除异常样本

    • 将马氏距离大于阈值的样本视为异常样本并剔除。
  6. 显示结果

    • 使用 scatter 函数绘制原始数据和剔除异常后的数据,以便直观观察。

通过上述方法和代码,你可以使用马氏距离法检测并剔除异常样本,提高数据的质量和分析的准确性。

posted @ 2025-08-11 11:35  lingxingqi  阅读(63)  评论(0)    收藏  举报