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 ...
随机推荐
- ICCV2019《KPConv: Flexible and Deformable Convolution for Point Clouds》
针对semantic3D数据集: 1.数据集准备: Semantic3D dataset can be found <a href="http://www.semantic3d.net ...
- CF-579 D. "Or" Game
题意: 给一列数,任选一个数,乘x,最多操作k次,问最后a[1]|a[2]|...|a[n]的最大值是多少; 思路: 或运算是0|0=0,1|0=1,0|1=1,1|1=1,那么每次乘一个大于等于2的 ...
- JAVA基础系列:反射
1. 定义 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这 种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. ...
- [开源]OSharpNS 步步为营系列 - 4. 添加业务对外API
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- LeetCode 733: 图像渲染 flood-fill
题目: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. An image is represented by a 2-D array of int ...
- Java Exception 异常处理
一.定义 异常(Exception) : 是指程序运行时出现的非正常情况,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制. 二.两大常见的异常类型 • RuntimeException ...
- 二、Spring注解之@Conditional
Spring注解之@Conditional [1]@Conditional介绍 @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. ...
- kmp算法笔记(简单易懂)
一般字符串比较长串m短串为n,那么用暴力方法复杂度为O(m*n) 但是kmp却可以达到O(m+n)!!!!!! 对于这个神奇的算法,我也是似懂非懂, 下面介绍一个简单的方法求kmp 1.求next数组 ...
- C# 中的浅拷贝与深拷贝
Ø 简介 在 C# 中分为两种数据类型,值类型和引用类型.我们知道,值类型之间赋值是直接将值赋值给另一个变量,两个变量值的改变都互不影响:而引用类型赋值则是将引用赋值给另一个变量,其中一个变量中的成 ...
- vue中引入mintui、vux重构简单的APP项目
最近在学习vue时也了解到一些常用的UI组件,有用于PC的和用于移动端的.用于PC的有:Element(饿了么).iView等:用于移动端APP的有Vux.Mint UI(饿了么).Vant(有赞团队 ...