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
不科学上网的 ,下载下方压缩包




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