本文作者:icy

Delphi-异常检测库,实时监控与机器学习

icy 昨天 46 抢沙发
Delphi-异常检测库,实时监控与机器学习摘要: Delphi异常检测库 什么是Delphi异常检测库?...

Delphi-异常检测库,实时监控与机器学习

Delphi异常检测库 


什么是Delphi异常检测库?

Delphi异常检测库是一款免费、开源、可直接用于生产环境的库,采用统计和机器学习方法检测业务数据中的异常。该库基于纯Object Pascal语言编写,无任何外部依赖,提供6种经过实际场景验证的算法,适用于多种实际应用场景:

  • 欺诈检测 - 信用卡交易、保险理赔、账户盗用

  • 系统监控 - 服务器指标、应用性能、网络流量

  • 质量控制 - 制造缺陷、流程偏差、统计过程控制(SPC)

  • 物联网与传感器 - 设备故障预测、环境监控

  • 财务分析 - 市场操纵、异常交易模式、风险评估

快速解答:如果您需要在Delphi中实现异常检测,该库提供了孤立森林(Isolation Forest)、三倍标准差法(Three Sigma)、指数移动平均(EMA)、滑动窗口(Sliding Window)、自适应(Adaptive)和异常确认系统(Confirmation System)6种算法——所有算法均支持生产环境使用、线程安全,且基于Apache 2.0许可证,可免费用于商业用途。

核心特性概览

特性描述
6种检测算法涵盖从简单统计方法到高级机器学习的全场景解决方案
零依赖纯Delphi实现,无需动态链接库(DLL)或外部库
支持生产环境线程安全、内存高效、经过全面测试
实时与批量兼容支持流数据处理和历史数据分析
超参数调优支持网格搜索和随机搜索,搭配交叉验证
工厂模式针对常见场景预配置检测器
跨平台支持Windows、macOS、Linux、iOS、Android
免费商业使用基于Apache 2.0许可证,无使用限制

算法对比:如何选择?

算法适用场景速度内存复杂度典型用例
Three Sigma(三倍标准差法)历史批量数据O(n)质量控制、基准分析
Sliding Window(滑动窗口)实时流数据O(window)系统指标监控、实时仪表盘
EMA(指数移动平均)快速变化数据极快O(1)财务数据、趋势模式分析
Adaptive(自适应)动态演化模式O(window)长期监控、季节性数据
Isolation Forest(孤立森林)多维机器学习场景O(trees)欺诈检测、网络安全
Confirmation System(异常确认系统)关键警报场景极快O(window)减少误报

快速决策指南

需要检测包含多个特征(金额、时间、位置)的欺诈行为?
  → 使用孤立森林(Isolation Forest)

需要对单个指标进行实时监控?
  → 使用滑动窗口(Sliding Window,稳定性优先)或EMA(响应速度优先)

拥有历史数据,需要进行批量分析?
  → 使用三倍标准差法(Three Sigma)

需要减少误报警报?
  → 叠加异常确认系统(Anomaly Confirmation System)

"正常"模式随时间变化?
  → 使用自适应检测器(Adaptive Detector)

快速入门:30秒搭建首个异常检测器

uses AnomalyDetection.Factory;
var
  Detector: IAnomalyDetector;
  Result: TAnomalyResult;
begin
  // 创建检测器(接口类型=自动内存管理)
  Detector := TAnomalyDetectorFactory.CreateDetector(adtThreeSigma, 'MyDetector');

  // 用正常数据训练
  Detector.AddValues([100, 105, 98, 102, 107, 99, 103, 101, 104, 106]);
  Detector.Build;

  // 检测异常
  Result := Detector.Detect(150);  // 测试可疑值
  if Result.IsAnomaly then
    WriteLn(Format('异常!数值:%.2f,Z分数:%.2f', [Result.Value, Result.ZScore]));
end;

就是这么简单!检测器会学习到100左右的数值为正常范围,而150则会被判定为异常。

详细算法文档

三倍标准差检测器(TThreeSigmaDetector)

功能:采用统计學中的"68-95-99.7法则",将偏离均值3个标准差以外的数值标记为异常。

适用场景

  • 拥有完整的历史数据集

  • 数据分布大致符合正态分布

  • 一次性批量分析

  • 为其他检测器建立基准

不适用场景

  • 流数据/实时数据(建议使用滑动窗口)

  • 非正态分布数据

  • 含季节性模式的数据

uses AnomalyDetection.ThreeSigma;
var
  Detector: TThreeSigmaDetector;
begin
  Detector := TThreeSigmaDetector.Create;
  try
    // 加载生产测量数据
    Detector.AddValues([100.2, 99.8, 100.5, 99.9, 100.1, 100.3, 99.7]);
    Detector.Build;

    WriteLn('均值:', Detector.Mean:0:2);           // ~100.07
    WriteLn('标准差:', Detector.StdDev:0:2);       // ~0.26
    WriteLn('下限:', Detector.LowerLimit:0:2);  // ~99.29
    WriteLn('上限:', Detector.UpperLimit:0:2);  // ~100.85

    // 测试新测量值
    if Detector.IsAnomaly(105.5) then
      WriteLn('检测到质量问题!');
  finally
    Detector.Free;
  end;
end;

滑动窗口检测器(TSlidingWindowDetector)

功能:维护一个固定大小的近期数值窗口,新数据到来时自动适配更新。

适用场景

  • 实时监控

  • 流数据处理

  • 内存受限环境

  • 需平衡响应速度与稳定性

核心参数WindowSize(窗口大小)- 数值越大越稳定,越小响应越快

uses AnomalyDetection.SlidingWindow;
var
  Detector: TSlidingWindowDetector;
begin
  Detector := TSlidingWindowDetector.Create(100);  // 100个数值的窗口大小
  try
    // 用基准数据初始化窗口
    Detector.InitializeWindow([95, 98, 102, 97, 101, 99, 103]);

    // 处理流数据
    while HasIncomingData do
    begin
      Value := GetNextReading;

      if Detector.IsAnomaly(Value) then
        TriggerAlert('异常:' + Value.ToString);

      Detector.AddValue(Value);  // 滑动窗口更新
    end;
  finally
    Detector.Free;
  end;
end;

EMA检测器(TEMAAnomalyDetector)

功能:指数移动平均法对近期数据赋予更高权重,实现极快的自适应能力。

适用场景

  • 金融/股票数据

  • 快速变化的指标

  • 需要对变化做出即时响应

  • 要求最小内存占用

核心参数Alpha(0.01-0.3)- 数值越大响应越快,越小越稳定

uses AnomalyDetection.EMA;
var
  Detector: TEMAAnomalyDetector;
begin
  Detector := TEMAAnomalyDetector.Create(0.1);  // Alpha = 0.1
  try
    Detector.WarmUp([50.2, 50.5, 49.8, 50.1, 50.3]);

    for var Price in StockPrices do
    begin
      if Detector.IsAnomaly(Price) then
      begin
        if Price > Detector.CurrentMean then
          WriteLn('价格飙升:', Price:0:2)
        else
          WriteLn('价格下跌:', Price:0:2);
      end;
      Detector.AddValue(Price);
    end;
  finally
    Detector.Free;
  end;
end;

自适应检测器(TAdaptiveAnomalyDetector)

功能:从已确认的正常数据中学习,持续适配概念漂移(数据分布变化)。

适用场景

  • "正常"行为随时间变化

  • 季节性模式数据

  • 用户行为分析

  • 带反馈的长期监控

uses AnomalyDetection.Adaptive;
var
  Detector: TAdaptiveAnomalyDetector;
begin
  Detector := TAdaptiveAnomalyDetector.Create(30, 0.05);  // 30天窗口,5%适配率
  try
    Detector.InitializeWithNormalData([45, 52, 48, 55, 50, 47, 53]);

    for var Day := 1 to 365 do
    begin
      CPUUsage := GetServerCPU;

      if Detector.IsAnomaly(CPUUsage) then
      begin
        if UserConfirmsNormal then
          Detector.UpdateNormal(CPUUsage)  // 标记:该数值实际为正常
        else
          InvestigateCPUSpike(CPUUsage);
      end
      else
        Detector.UpdateNormal(CPUUsage);   // 从正常数据中学习
    end;
  finally
    Detector.Free;
  end;
end;

孤立森林(TIsolationForestDetector)

功能:机器学习算法,通过随机划分特征空间来隔离异常值。异常值比正常数据点"更容易被隔离"。

适用场景

  • 多维数据(每个观测值含多个特征)

  • 欺诈检测(金额+时间+位置+用户行为)

  • 网络安全(网络流量分析)

  • 无标记训练数据(无监督学习场景)

这是欺诈检测的推荐算法。

uses AnomalyDetection.IsolationForest;

var
  Detector: TIsolationForestDetector;
  Transaction: TArray<Double>;
begin
  // 100棵树,256个样本,5个特征
  Detector := TIsolationForestDetector.Create(100, 256, 5);
  try
    // 用正常交易数据训练
    for i := 1 to 1000 do
    begin
      Transaction := [
        50 + Random(200),    // 金额(50-250美元)
        8 + Random(12),      // 时间(上午8点-晚上8点)
        1 + Random(5),       // 工作日(1-5)
        1 + Random(10),      // 商户类别
        25 + Random(40)      // 客户年龄
      ];
      Detector.AddTrainingData(Transaction);
    end;

    Detector.Train;  // 构建森林

    // 测试可疑交易:凌晨3点的5000美元交易
    Transaction := [5000, 3, 2, 5, 35];
    Result := Detector.DetectMultiDimensional(Transaction);

    if Result.IsAnomaly then
      FlagForReview('潜在欺诈!分数:' + Result.ZScore.ToString);
  finally
    Detector.Free;
  end;
end;

异常确认系统(TAnomalyConfirmationSystem)

功能:元检测器,需检测到多个相似异常后才确认警报。

适用场景

  • 误报成本高(警报疲劳)

  • 需高可信度的关键系统

  • 可容忍轻微检测延迟

uses AnomalyDetection.Confirmation;
var
  BaseDetector: TSlidingWindowDetector;
  Confirmation: TAnomalyConfirmationSystem;
begin
  BaseDetector := TSlidingWindowDetector.Create(100);
  Confirmation := TAnomalyConfirmationSystem.Create(
    10,    // 窗口大小
    3,     // 需检测到3个相似异常
    0.1    // "相似"的容差为10%
  );
  try
    while HasData do
    begin
      Value := GetNextValue;

      if BaseDetector.IsAnomaly(Value) then
      begin
        Confirmation.AddPotentialAnomaly(Value);

        // 仅当确认异常(窗口内出现3个相似异常)时触发警报
        if Confirmation.IsConfirmedAnomaly(Value) then
          SendCriticalAlert('确认异常:' + Value.ToString);
      end;

      BaseDetector.AddValue(Value);
    end;
  finally
    Confirmation.Free;
    BaseDetector.Free;
  end;
end;

数据预处理:清洗训练数据

如果历史数据包含异常值,训练前需进行清洗:

uses AnomalyDetection.Utils;
var
  RawData: TArray<Double>;
  CleanResult: TCleaningResult;
begin
  RawData := LoadHistoricalData;  // 可能包含异常值

  // 方法1:基于分位数(移除上下5%的数据)
  CleanResult := CleanDataWithPercentiles(RawData, 5, 95);

  // 方法2:基于四分位距(IQR,标准统计方法)
  CleanResult := CleanDataWithIQR(RawData, 1.5);

  WriteLn(Format('移除了 %d 个异常值(%.1f%%)',
    [CleanResult.RemovedCount, CleanResult.RemovalPercent]));

  // 用清洗后的数据训练检测器
  Detector.AddValues(CleanResult.CleanData);
  Detector.Build;
end;

何时需要清洗数据

  • 必需场景:三倍标准差法、滑动窗口、EMA(当数据可能受污染时)

  • 无需场景:孤立森林(设计上对异常值具有鲁棒性)

工厂模式:预配置检测器

通过领域优化配置快速上手:

uses AnomalyDetection.Factory;

// 用于网络流量/DDoS检测
WebDetector := TAnomalyDetectorFactory.CreateForWebTrafficMonitoring;

// 用于金融数据(更高精度)
FinanceDetector := TAnomalyDetectorFactory.CreateForFinancialData;

// 用于物联网传感器(可靠性平衡)
IoTDetector := TAnomalyDetectorFactory.CreateForIoTSensors;

// 用于多维欺诈检测
FraudDetector := TAnomalyDetectorFactory.CreateForHighDimensionalData;

性能评估与超参数调优

检测器准确性评估

uses AnomalyDetection.Evaluation;
var
  Dataset: TLabeledDataset;
  Evaluator: TAnomalyDetectorEvaluator;
  Result: TEvaluationResult;
begin
  // 加载带标签的测试数据
  Dataset := TLabeledDataset.Create('测试数据');
  Dataset.LoadFromCSV('labeled_data.csv', 0, 1, True);
  Evaluator := TAnomalyDetectorEvaluator.Create(Detector, Dataset);
  try
    Result := Evaluator.Evaluate;
    WriteLn('准确率:  ', Result.ConfusionMatrix.GetAccuracy:0:3);
    WriteLn('精确率: ', Result.ConfusionMatrix.GetPrecision:0:3);
    WriteLn('召回率:    ', Result.ConfusionMatrix.GetRecall:0:3);
    WriteLn('F1分数:  ', Result.ConfusionMatrix.GetF1Score:0:3);
  finally
    Evaluator.Free;
    Dataset.Free;
  end;
end;

通过网格搜索寻找最优参数

uses AnomalyDetection.Evaluation;
var
  Tuner: THyperparameterTuner;
  BestConfig: TTuningResult;
begin
  Tuner := THyperparameterTuner.Create(adtSlidingWindow, Dataset);
  try
    Tuner.OptimizationMetric := 'F1';   // 也可选择'Precision'(精确率)、'Recall'(召回率)、'Accuracy'(准确率)

    BestConfig := Tuner.GridSearch(
      [2.0, 2.5, 3.0, 3.5, 4.0],  // 待测试的Sigma值
      nil,
      [50, 100, 150, 200],        // 待测试的窗口大小
      nil
    );

    WriteLn('最优Sigma: ', BestConfig.Config.SigmaMultiplier:0:2);
    WriteLn('最优窗口大小: ', BestConfig.Config.WindowSize);
    WriteLn('F1分数: ', BestConfig.Score:0:3);
  finally
    Tuner.Free;
  end;
end;

应优化哪个指标?

指标优化场景权衡取舍
精确率(Precision)误报成本高(警报疲劳)可能遗漏部分异常
召回率(Recall)遗漏异常不可接受(欺诈、安全场景)误报增多
F1分数(F1-Score)需要平衡检测效果通用场景首选
准确率(Accuracy)数据集分布均衡(异常检测中罕见)可能具有误导性


项目原始地址: https://github.com/danieleteti/delphi-anomalies-detectors

不科学上网的 ,下载下方压缩包

delphi-anomalies-detectors-master.zip(26-02-01)
类型:压缩文件|已下载:4|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/2026/02/175.html发布于 昨天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,46人围观)参与讨论

还没有评论,来说两句吧...