本题使用 PCA 重建误差进行异常检测。
训练集全部由正常样本组成,因此可以利用训练集学习正常数据的主要特征结构。如果一个测试样本与正常数据差异较大,那么经过 PCA 降维并重建后,它的重建误差通常也会更大。
具体按照以下步骤处理:
1. 缺失值填充。
某设备在正常运行期间积累了一批传感器数据作为"基准样本"。现在设备产生了一批新的监测数据,希望基于基准样本蕴含的主要变化模式,判断新数据是否存在明显偏离。
请使用 PCA(主成分分析)重建误差方法实现异常检测,严格遵循以下步骤:
缺失值填补:对每一维特征,计算基准数据中该维所有非缺失值的均值,用该均值同时填补基准数据和待检测数据中的缺失值。
标准化:使用 StandardScaler 在基准数据上拟合,然后对基准数据和待检测数据分别进行变换。
PCA 投影与重建:使用 PCA(参数 n_components=0.95,svd_solver='full')在基准数据上拟合。将两个数据集分别投影到主成分空间后逆变换得到重建结果。
偏离分数:对每个样本,计算其标准化结果与 PCA 重建结果之间的平方误差之和作为偏离分数。
判定边界:取基准数据全部偏离分数的第 95 百分位数作为阈值 τ。待检测样本的偏离分数若大于 τ 则判定为异常(1),否则为正常(0)。
注意:标准化和 PCA 均只能在基准数据上拟合,不能使用待检测数据参与拟合。
约束条件:基准样本数 n 和待检测样本数 m 均不超过 20,特征维度 d 不超过 10。
输入为 JSON 格式,包含两个字段:
train:二维数组,大小为 (n,d),表示基准样本(均为正常样本);test:二维数组,大小为 (m,d),表示待检测样本。每个特征值可以是整数、浮点数或 null(表示缺失)。
输出一个 JSON 数组,依次存放每个待检测样本的判定标签:0 表示正常,1 表示异常。标签之间用空格分隔。
输入
{"train": [[1,3],[2,5],[3,7],[4,9],[5,11]],"test": [[2.5,6],[3,20],[4,9.1]]}
输出
[0, 1, 1]
说明
基准数据近似满足 y≈2x+1 的线性关系,PCA 可以很好地捕捉这一模式。
第一个待检测样本 (2.5,6) 恰好落在该线性趋势上,重建误差极小,判定为正常 0。
第二个样本 (3,20) 严重偏离线性趋势,重建误差远超阈值,判定为异常 1。
第三个样本 (4,9.1) 偏离线性趋势较明显(预期约 9),也被判定为异常 1。
输入
{"train": [[10,20],[20,30],[30,40],[40,50]],"test": [[15,null],[null,35],[35,45]]}
输出
[1, 0, 0]
说明
基准数据满足 y≈x+10 的线性关系。
第一个待检测样本 (15,null):缺失值用基准数据第二维均值 35 补全,得到 (15,35)。该点明显偏离线性趋势,判定为异常 1。
第二个样本 (null,35):缺失值用第一维均值 25 补全,得到 (25,35),符合趋势,判定为正常 0。
第三个样本 (35,45):符合 y=x+10 趋势,正常 0。
输入
{"train": [[1,2,3],[2,4,6],[3,6,9],[4,8,12]],"test": [[2.5,5,7.5],[3,6,20],[1.5,3,4.5]]}
输出
[0, 1, 0]
说明
基准数据三维特征之间具有明显的比例关系(1:2:3),PCA 能有效压缩维度。
第一个样本 (2.5,5,7.5) 符合比例关系,重建误差小,正常 0。
第二个样本 (3,6,20) 第三维严重偏离比例关系(应为 9 却是 20),重建误差大,异常 1。
第三个样本 (1.5,3,4.5) 符合比例,正常 0。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.