PAC在异常检测中的应用
注:资料均来源于网络,本文只做知识分享,如侵立删,谢谢。
PAC算法背景简述:
在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。
因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。
来源:https://blog.csdn.net/program_developer/article/details/80632779
类似方法包括:奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)
Principle Component Analysis是主成分分析,简称PCA。它的应用场景是对数据集进行降维。降维后的数据能够最大程度地保留原始数据的特征(以数据协方差为衡量标准)。
PCA的原理是通过构造一个新的特征空间,把原数据映射到这个新的低维空间里。PCA可以提高数据的计算性能,并且缓解"高维灾难"。高维灾难详见https://www.leiphone.com/news/201706/Vy3sQDFlI82dAGFF.html
福利: 这里需要注意的一点是:经常有人把特征选择和特征抽取弄混。特征选择是直接对原始数据特征选择子集,具体的实现方法会在另一篇里写。而特征抽取会对原始数据特征进行变型,我们一般借助PCA方法来做特征抽取。
关于PCA的数学公式隆重推荐这篇https://blog.csdn.net/aspirinvagrant/article/details/39737669
用PCA进行异常检测的原理是:PCA在做特征值分解之后得到的特征向量反应了原始数据方差变化程度的不同方向,特征值为数据在对应方向上的方差大小。所以,最大特征值对应的特征向量为数据方差最大的方向,最小特征值对应的特征向量为数据方差最小的方向。原始数据在不同方向上的方差变化反应了其内在特点。如果单个数据样本跟整体数据样本表现出的特点不太一致,比如在某些方向上跟其它数据样本偏离较大,可能就表示该数据样本是一个异常点。
具体实现步骤:
- 对于非异常label的数据取样,进行标准化处理,即scalar
standard_scalar = StandardScaler()
centered_training_data = standard_scalar.fit_transform(training_data[all_features])
- 初始化一个pca对象,用默认参数对所有成分进行保留。对标准化后的数据进行训练,得到基本的PCA模型。注意这里是无监督训练。
pca = PCA()
pca.fit(centered_training_data)
- 用pca()对步骤1中取样的数据(训练集)进行降维,计算数据样本在该方向上的偏离程度。
transformed_data = pca.transform(training_data)
y = transformed_data
lambdas = pca.singular_values_
M = ((y*y)/lambdas)
这里,y是降维后的数据集。虽说是降维,但因为我们在初始化PCA的时候是对所有参数进行了保留,所以这里的y可以理解为将原始的数据X映射到了一个新的空间:y=X转换矩阵。转换矩阵就是把特征向量按大小顺序从左往右排好组成的过渡矩阵。
这里,lambdas是训练集(training_data)的特征值集合。
M是数据样本的偏离程度矩阵。如果原始数据是500034,M还是5000*34。只不过M里的每一行数值代表了每个样本在重构空间里离每个特征向量的距离。
注意:这里的lambdas主要起归一化的作用,这样可以使得不同方向上的偏离程度具有可比性。在计算了数据样本在所有方向上的偏离程度之后,为了给出一个综合的异常得分,最自然的做法是将样本在所有方向上的偏离程度加起来。
- 计算主成分和次成分的阈值。
'q' 设为可以让前q个成分解释数据集50%的方差
q = 5
print "Explained variance by first q terms: ", sum(pca.explained_variance_ratio_[:q])
r设为可以让r以后的成分对应的特征值小于0.2.
q_values = list(pca.singular_values_ < .2)
r = q_values.index(True)
根据r和q,对M进行切片,再对每个样本点进行距离的计算。np.sum(major_components, axis=1)就是在算每一行(样本)的距离加总。
major_components = M[:,range(q)]
minor_components = M[:,range(r, len(features))]
major_components = np.sum(major_components, axis=1)
minor_components = np.sum(minor_components, axis=1)
对切片后的数据集进行阈值计算
components = pd.DataFrame({'major_components': major_components,
'minor_components': minor_components})
c1 = components.quantile(0.99)['major_components']
c2 = components.quantile(0.99)['minor_components']
这里的c1, c2是人为设定的两个阈值,如果得分大于阈值则判断为异常。
那么问题来了,我们不仅选了前50%最重要的成分,还选取了后面特征值小于0.2的最不重要的成分。为什么要这样做呢?原因如下:
一般而言,前几个特征向量往往直接对应原始数据里的某几个特征,在前几个特征向量方向上偏差比较大的数据样本,往往就是在原始数据中那几个特征上的极值点。而后几个特征向量有些不同,它们通常表示某几个原始特征的线性组合,线性组合之后的方差比较小反应了这几个特征之间的某种关系。在后几个特征方向上偏差比较大的数据样本,表示它在原始数据里对应的那几个特征上出现了与预计不太一致的情况。到底是考虑全部特征方向上的偏差,前几个特征向量上的偏差,还是后几个特征向量上的偏差,在具体使用时可以根据具体数据灵活处理。
当然,根据数据的情况,也可以只考虑数据在前 k 个特征向量方向上的偏差,或者只考虑后 r 个特征向量方向上的偏差。
计算出训练数据的阈值c1, c2,即上面得到的。
对于新的数据(测试集),用已经训练好的pca模型和standard_scalar模型进行transform。注意这里是用训练集的标准去tranform新的数据。
data = standard_scalar.transform(df_full[all_features])
transformed_data_test = pca.transform(data)
y_test = transformed_data
lambdas_test = pca.singular_values_
M_test = ((y*y)/lambdas)
然后r和q保持不变,还是用在训练集上算出来的r, q来对M_test进行切片
major_components_test = M_test[:,range(q)]
minor_components_test = M_test[:,range(r, len(features))]
major_components_test = np.sum(major_components, axis=1)
minor_components_test = np.sum(minor_components, axis=1)
- 制作分类器
def classifier(major_components, minor_components):
major = major_components > c1
minor = minor_components > c2
return np.logical_or(major,minor)
- 计算结果
results = classifier(major_components=major_components, minor_components=minor_components)
来源:CC思SS https://www.jianshu.com/p/e35a47913457
PAC在异常检测中的应用的更多相关文章
- Abnormal Detection(异常检测)和 Supervised Learning(有监督训练)在异常检测上的应用初探
1. 异常检测 VS 监督学习 0x1:异常检测算法和监督学习算法的对比 总结来讲: . 在异常检测中,异常点是少之又少,大部分是正常样本,异常只是相对小概率事件 . 异常点的特征表现非常不集中,即异 ...
- 异常检测(anomaly detection)
版权声明:本文为博主原创文章,转载或者引用请务必注明作者和出处,尊重原创,谢谢合作 https://blog.csdn.net/u012328159/article/details/51462942 ...
- 离群点检测与序列数据异常检测以及异常检测大杀器-iForest
1. 异常检测简介 异常检测,它的任务是发现与大部分其他对象不同的对象,我们称为异常对象.异常检测算法已经广泛应用于电信.互联网和信用卡的诈骗检测.贷款审批.电子商务.网络入侵和天气预报等领域.这些异 ...
- 异常检测-基于孤立森林算法Isolation-based Anomaly Detection-1-论文学习
论文http://202.119.32.195/cache/10/03/cs.nju.edu.cn/da2d9bef3c4fd7d2d8c33947231d9708/tkdd11.pdf 1. INT ...
- 利用KD树进行异常检测
软件安全课程的一次实验,整理之后发出来共享. 什么是KD树 要说KD树,我们得先说一下什么是KNN算法. KNN是k-NearestNeighbor的简称,原理很简单:当你有一堆已经标注好的数据时,你 ...
- 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测
据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...
- 异常检测算法--Isolation Forest
南大周志华老师在2010年提出一个异常检测算法Isolation Forest,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,这里对这个算法进行简要总结. iTree 提到森林 ...
- 基于机器学习的web异常检测
基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线.随着网络技术的快速更新,新的黑客技术也层出不穷,为传统规则防火墙带来了挑战.传统web入侵检测技术通过维护规则集对入侵访问进行拦截.一 ...
- Andrew Ng机器学习课程笔记--week9(上)(异常检测&推荐系统)
本周内容较多,故分为上下两篇文章. 一.内容概要 1. Anomaly Detection Density Estimation Problem Motivation Gaussian Distrib ...
随机推荐
- office 2016 下载链接
[安装环境]:win7/win8/win10 [64位下载] 百度网盘链接:pan.baidu.com/s/1AkiLQtjhayGdx6mw1DQyqw 提取码:qyx9
- 【Eureka篇三】Eureka自我保护机制(3)
1. 自我保护机制演示 eureka在频繁修改微服务名称的时候,可以会出现如下现象: 2. 什么是自我保护模式? 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,E ...
- LG4979 矿洞:坍塌 珂朵莉树
问题描述 LG4979 题解 珂朵莉树+O2简直就是绝配 对于操作 A ,直接 \(\mathrm{assign}\) 推平就完事了. 对于操作 B ,如果它左右端点有在边界上的,直接把区间 \([l ...
- mq代替db
系统有个很严重的性能问题,法国人浪费了半年多都没有解决,他们试图从sql的角度分析哪里能有改善,大方向错了,再努力也没用. 我接手以后,也走了点弯路,一上手觉得肯定能用cache解决问题,结果cach ...
- x2
#include<stdio.h> int main () { int days; printf("输入一个整数:\n"); scanf("%d", ...
- 深挖计算机基础:MySQL实战45讲学习笔记
参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...
- 绿联Type-C千兆网卡AX88179芯片驱动(苹果Mac OSX系统)CM141丨CM179
绿联Type-C千兆网卡AX88179芯片驱动(苹果Mac OSX系统)CM141丨CM179 下载地址:https://www.lulian.cn/download/6-cn.html AX8817 ...
- eclipse查看一个方法被谁调用的快捷键
我们知道,在idea中是可以通过[ctrl+鼠标左键单击]去跳到方法调用方去的,但是在eclipse中却是不行的. 三种快捷键方式 这里列出在eclipse中查看一个方法被谁调用的三种方式(快捷键). ...
- NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
我在springboot 集成 elasticsearch,启动springboot测试创建索引,建立索引的时候报 : NoNodeAvailableException[None of the con ...
- 关于 BenchmarkDotNet
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Order; using System.Reflection; namespace Be ...