异常检测从入门到应用

2023-05-16

作者:成森@知乎

来源:https://zhuanlan.zhihu.com/p/116235115

异常检测(Anomaly Detection), 作为机器学习的一个重要分支,实际应用领域广泛,本文作者通过一些有趣的卡通形象作为例子讲解了异常检测的基本概念及分类,并介绍了带标签与不代表标签的异常检测方法和计算过程。

01

什么是 Anomaly(异常)?

虽然说是异常,但其实是以训练集为核心,判断输入数据是否与训练集中的数据 “类似”。在不同的领域可以有不同的叫法,比如:outlier Detection,novelty Detection,exceptions Detection。

至于什么才是“类似”,它的定义取决于你所用的方法。如下图所示,如果你给的训练集只有雷丘,那么比卡丘就是“异常”;相反,如果你给的训练集是比卡丘,那雷丘就是“异常”。

bc58f04524fa39b5d446d28c22aea8bd.jpeg

什么是异常取决于你所给的训练集

1.1 问题定义 Problem Formulation

  • 给定一个训练集 

  • 我们要找到一个函数来检测 输入 x 是不是属于训练集(是否和训练集的数据属于同一类)

7c2a7b54bcc497fcb9aa6924bb637961.jpeg

用来判断是否和训练集属于一类

1.2 为什么不能用二分类来解决这个问题?

如上面所说的,所谓“异常”,其实就是看是否和训练集“相似”,虽然我们很容易获得正训练集(如上面的雷丘),但是负训练集我们无法来决定,如果我们用 宝可梦 来作为负训练集来训练二分类,那下次输入一个 亚古兽 呢?这时候二分类模型就无法识别这个没见过的 负样本,而这样的负样本实在是太多了,我们没法穷举。如下图所示。

3512788c80a8ee6f623cd0745c1988a8.jpeg

负样本的种类太多反而无法用来训练二分类器

更坏的情况就是,很多情景下,我们没法收集到负样本。比如说刷卡行为,大多数情况都只是正常的交易行为,而盗刷这一类情况就少之又少,甚至(目前)没有。

所以异常检测无法简化成二分类来实现,这是一个独立的研究主题。

1.3 异常检测模型分类

根据给出的训练集,我们可以大致将其分成两大类三小类:

  • (labeled)训练集中每个样本都有标签,用这些样本来训练一个分类器,这个分类器除了能够识别训练集中已有样本标签外,还能输出 “unknown” 标签,用来表示该输入是“没见过的”、不在训练集中的。我们把它叫做 “open-set recognition(开放式识别)”

  • (unlabeled)另一种情况是,我的训练集是没有标签的

    • (clean)但这个训练集是“干净”的,我们可以将这个训练集里所有的样本都视为“正样本“;

    • (polluted)然而干净的数据集在现实应用中很少,大多数都是或多或少参杂着”异常样本“,而且你无法知道,比如说银行给你大量刷卡数据进行训练,而这些数据里有可能有盗刷的数据且没有标注出来。

095992148b164979a8509db6b6762bf5.jpeg

异常检测的两大类三小类


02

Labeled(带标签)

在这里就用 辛普森家族 来举例子。这里有一堆辛普森家族的人物形象及其对应的人物名称(视为标签),这样我们就能训练一个“辛普森角色分类器”,输入一个人物的形象,输出该人物的名称(标签)。

d985209073a456e306e50e8edc1957ff.jpeg

辛普森家族的人物形象及其名称标签,训练一个分类器

那我们训练好“辛普森角色分类器”后,这个分类器会输出两类数据:类别(预测的名字)、信心值;然后给定一个阈值  ,当信心度大于这个阈值,就视为“正常值(属于辛普森家族)”,低于则视为“异常值(不属于辛普森家族)”

5a8f971eab7fee2045d5f5ffd9f4c0d5.jpeg

分类器的使用

分类器的输出其实是一个概率分布(distribution),输出前经过一个 softmax,使得这个分布中的值之和为1,其输出每一项 表示 每一个类别及其对应的信心值;我们将其中的最大值,视为分类器对该输入的信心值.

除了最高值,我们还可以用 熵(entropy)来决定分类器最后的信心值。

如下图所示,第一个分类器中,霸子的信心值很高(总体熵低),且其他很低,就说明分类器能够很好地把这个人物形象进行分类,故认为该形象是“正常值”;

而第二个分类器中,每一类的信心值都不高且均匀(最大值不高,总体熵高),说明分类器没见过该形象,信心不够,没法很好地区分,则可以认为该形象是“异常值”。

d518a65bf761dad840f4ad05b4c3e5c4.jpeg

辛普森家族分类器,输出了类别和信心度

除了用分类器与其输出的分布来 判断 该分类器的信心度,当然还有其他的方式,如下图所说的,不仅输出分布(用来分类),还教分类器直接输出其信心度(直接可以判断是否异常)。

1a2990db51963236a293da976542e392.jpeg

可以直接输出分类和信心值的分类器

关于上面模型训练部分,一般来说我们有个“验证集”来调节模型的超参数,在“训练集”中,所有的样本都是“正样本“且有各自的标签(如都是辛普森和他们的人物名字),而在”验证集“中就没必要每个样本都有其“人物标签”,只需要判断其“是否属于辛普森家族”就行了(两个标签:属于、不属于)。

2.1 评价标准

在上面的例子中,“辛普森家族异常检测模型“其实是一个普通分类器,那我们是否也可以用准确率(Accuracy)来评估这个模型的好坏呢?答案是:这不是一个好的选择。

正如我们前面所说的,异常检测的数据集的标签分布是不均匀的,也就是说我们很大概率能够找到“正样本”而缺少“负样本”;这种情况下,如果模型“无情地”把所有的样本都预测成正样本,那准确率也会很高,这样显然是不对的。

41198870a261f4865e9a31cc58a60f93.jpeg在这里,只有5张“异常图片”,模型准确率却很高

准确率对于不平衡数据没法很好地评估,其实也有很多方法来解决,比如说成本积分制:当正常数据没有检测出,则成本为100,异常数据没有检测出,成本为1(见Cost Table A),这时候左边模型的成本则会低于右边模型的成本(红色字体),则左边的模型更优秀; 而如果正常数据没检测出的成本为1,异常数据没检测出的成本为100,这时候右边的模型就更优秀(蓝色字体);

积分制的使用要取决于你对业务的理解:异常数据没检测出、正常数据没检测出,哪个更加重要?比如在医疗上,对于癌细胞的异常检测,宁愿检测错正常人,也不要漏过一个病人,这时候“异常数据没检测出的成本更高”。

除了积分制,还有很多方法,比如AUC、Macro-F1等等。

e903b64dd27b24eaf4d0e670e60b4e89.jpeg

积分制,左边模型和右边模型谁更优秀取决于Cost Table的定制

2.2 存在的问题

分类器也许可以能够对“一般异常”进行“识别”,比如下面猫狗的分类器,就能够把羊驼和马来貘识别为“异常”,然而有一些“异常数据”则没那么容易了,比如说老虎和狼,这就是模型泛化问题;

因为模型一般只会抽取出一类图片中的共同特征,而此时“异常数据”无意中也具备了这一共同特征,那么就会出现把狼识别成狗的情况了。

5a74634bda7a5a55b20444cced221bee.jpeg

下面的模型把老虎识别成猫,把狼识别成狗

另一个例子就是上面的“辛普森家族分类器”,将人物涂黄后,模型就会进一步识别成“丽莎”,这就说明了模型识别丽莎靠的是颜色,这显然是不正确的。

45ced2996a1d273c8f5956a9596b93dd.jpeg

图片涂改后,就会识别成其他人物

针对以上存在的问题,也有很多工作试图去解决,比如说收集一些“异常数据”,让分类器去学习给它们更低的信心值;然而我们一开始就说了,异常数据很难获取,那我们就想:能不能自动生成“异常数据”?

这时候我们就可以用GAN来尝试生成“有点像正常数据却又没那么像”的异常数据。

下面给出了相关文献,有兴趣的可以去了解一下。

cca524d1fe39b1c3bbfd356c22f91398.jpeg

解决该问题的相关文献


03

Without Labels(不带标签的)

这一部分,就是得到了没有标签的数据。该问题的定义和带标签的分类器一样,都是根据训练集训练模型,然后帮我分析输入数据相较于训练集是否属于异常数据。与分类器给出的信心值不同,这一类的模型给出的是一个概率,如果概率大于某个阈值,才认为是正常值;

在这一部分,用一个游戏举个例子:Twitch Plays Pokemon。这个游戏是一个多人同时“玩一个角色”的在线游戏,然而和我们平时玩的网游不一样,在这个游戏中,下一步动作取决于所有在线用户的操作(如下图的右边,是每一个用户按下的指令)。

583d9e34ac56070a5d10aff2da2302ff.jpeg众多用户的指令靠某种机制共同决定游戏角色下一步操作

然而玩这个游戏的人非常崩溃,因为这个游戏很难进行下去(因为要所有在线玩家都给一个角色发送指令,而每个玩家的指令又不相同,而游戏只会执行其中一个指令)。所以玩家们就在想:是不是有些“恶意玩家”在乱发送指令,阻止游戏进程?也就是说是不是有人不想让这个游戏结束。

这样我们就有需求——找出“恶意用户”。在这之前,我们先有个假设:大部分玩家都希望完成这个游戏(也就是说大部分都是正常数据),而这部分数据我们会用来训练。然后我们使用异常检测,找出其中的“恶意玩家”(异常数据)。

cb19cc64a0d983636070130495c7c363.jpeg

由该游戏产生的思考

接下来,我们就要对其进行建模。在这里,我们的需求是把一堆“无标签”玩家分为正常用户和异常用户,这时我们需要把用户表示成一个向量,这样才能输入进我们的模型;而向量中的每一项可以表示这个用户的一种行为。

如下图,  表示这个用户过去一段时间内说垃圾话的频率(垃圾话是指游戏指令之外的话,多余的,不影响游戏进程),  表示的是这个用户过去一段时间内,随机机制下的发言频率。

这个游戏有两种机制:投票机制和随机机制 投票机制:20秒内最多玩家输入的指令,则作为游戏下一步的指令;随机机制:随机选择在线玩家输入的指令,作为游戏下一步的指令。

32483e9b31cc40f52d6f90bacd1a04df.jpeg

用向量表示用户

输入定义好了,我们就可以看看输出:模型会输出一个概率  ,和分类器不一样,无标签训练模型没有对应的Y值(标签)和信心值,只会输出一个概率  ;而和分类器相似的是,我们一样有一个  ,当  时,视为正常数据;当  时,视为异常数据。如下图所示。

1c8ece401f079187cedb1f82154d14d0.jpeg

输出一个概率值,需要设定一个阈值

假设我们现在已经获取了大量用户的数据,下图是这些数据可视化展示。从可视化中可以获得一些信息:

  • 在随机机制下,用户就越喜欢发指令(左上图);

  • 大部分用户都会或多或少地乱输入指令(说垃圾话,右下图)。

这时候,我们就可以很直观地看到,但用户落在左上角的位置,则很大可能这就是一个“正常玩家”,而用户落在靠右或者靠下的位置,则很大可能是“异常玩家”。

b8efef348c782320db8aa86167177700.jpeg

已知用户行为数据的可视化图

然而,我们需要一个数值化的表示方法,给每一个玩家一个分数。

假设我们之前看到的图,图上面所有的点都是由一个概率密度函数  生成的(不懂也没关系,就当它是一个函数就行了),  是该函数的参数,决定了这个函数“长什么样”,是未知的,需要从数据中学习。

而我们的工作就变成了:  它究竟长什么样?这时候我们就需要一个“Likelihood”的概念,意思就是说,根据我们的概率密度函数  ,能够产生这样的已知数据的概率有多大。

如果严格来说,  输出的不是概率,而是概率密度,它的值也不是介于0~1之间,而是有可能大于1的。在这里,为了简化问题,我们简单地认为是概率就好。

而这个“Likelihood”要怎么算呢,它其实就等于每项已知数据根据  这个函数所产生出来的概率的乘积;于是我们就有下面这条公式,很显然,这个公式是由  来控制的,不同的  ,就会有不同的  ,就会算出不同的“Likelihood”

这时候,我们并不知道  是多少,但我们知道,这个  ,能够使我们的“Likelihood”最大化

328b9e0b00ba411acd9147b017beb92e.jpeg

我们使用Likelihood来训练模型

上面是只是一个抽象的说法。在这里,我们为了让大家更好理解,我们就假设概率密度函数  为常用的高斯分布(Gaussian Distribution),这个概率密度函数并不简单,大家看不懂也没关系,就当它是一个普通函数就可以了,输入一个向量x,输出这个x被采样到的概率  ;而我们前面提到需要学习的  ,在这里就等于这里需要学习的均值  和协方差矩阵。

为什么这里选择高斯分布?其实这只是举例子,  甚至可以是一个神经网络,而此时  就是神经网络的参数,所以我们没必要在这里纠结,我们只需要清楚无标签时,异常检测是如何处理的,从而触类旁通。

213cecb42043cea55df3b2570cb402e5.jpeg

高斯分布,及其需要学习的参数

这时候,Likelihood方程就会置换成下图的形式,用来找出能使Likelihood最大化的  和  。

左图给了一个很好的示例,告诉我们,  的取值,如何影响Likelihood的取值;左上角时,数据落在这个区域的概率就很大,这时候Likelihood就很大,而右下角时,落在这个区域的概率就小,这是Likelihood就小。

 和  其实是有公式算出来的,  就是所有的训练数据的向量做一个平均(输入向量是二维的,所以  也是二维的),而  就看图的右下角这个公式,这里很简单。

9eda7bbd893df02bebeea2dab25ac851.jpeg

抽象的概念替换为具体的高斯分布时的计算方法

在这里,我们已经得到了  和  ,我们可以用来做异常检测,我们把测试数据代入我们的高斯分布方程,我们就能算出其概率,如果这个概率大于阈值  ,是认为是正常值,否则视为异常值。

如果我们用这个训练好的方程,大概就是下图右下角的样子,颜色越深代表这个方程输出的数值就越大,就越代表“正常玩家”,而颜色越浅越蓝的,就代表“异常玩家”;而这个阈值  ,其实其中一条等高线;右下图就给出了正常点和异常点的位置示意。

1e38d096794928278875ea6e3ceccd3b.jpeg

根据公式,可以获得其对应的概率,从而判断是否异常

以上的例子,我们只是使用了两个特征,也就是输入向量x只是二维;而机器学习的好处就是可以处理更多特征,只要你想到的,都可以加进去。下图就增加到5个特征,再训练一个Likelihood,从而获得“更准确的”异常检测效果。

5a76621de5637bc55d72ea9abfd850a5.jpeg

我们可以添加更多的特征

3.1 更多的方法

除了上面的方法,还有一种常用方法是:Auto-encoder(自动编码器),如下图所示,Encoder(编码器)先把辛普森的照片编码成一个code(隐含层),然后Decoder(解码器)把code解码回原来的的照片,训练时会同时训练编码器和解码器,尽量让解码后的照片和原照片尽可能相似(甚至相同)。这时候如果用Auto-encoder来识别一张“异常图片”,这时候的解码器是无法重构回原来的照片,通过计算重构后的照片和原照片的“距离”(或者说是相似度、还原度),就可以区分该照片是不是“异常值”。

在我看来,Auto-encoder比分类器多了一重保障(指Decoder解码器),在分类器上,找到对应的特征,就进行判断,比如颜色、轮廓等等,上面就有例子说明这样的情况并不可靠;而解码器就是一种利用特征的过程,我利用编码器提取的特征,看是否能够重构回原来照片,就能知道这是不是异常值;

0a5760063bb132a01e5a3b96d66d8a0c.jpeg

自动编码器的工作流程

下图是正常的图片,可以看到模型很容易就重构了回来,而且和原图非常接近。因为这个模型看过辛普森,所以非常“擅长”还原辛普森。

28d18d0ec23e1ec7dcaf504c602a3880.jpeg

辛普森家族的照片就能很好地复原

如下图的Testing阶段,对比原图和重构图,我们可以看到,编码器提取到的应该是“黄色”和“棕色”这两个特征,然而编码器用两个特征构建出来的图片,显然和原图相差甚远,这时候就可以识别为“异常值”。(从重构图可以隐约看到,这大概也是一个辛普森角色)

0c57da3266b3d2580c35997317e434bb.jpeg

其他图片就会复原到模型所“理解”到的辛普森角色形象

除了自动编码器,还有很多其他模型可以做这样的事,比如one-class SVM,Isolated Forest。有兴趣的可以自行进一步学习。

7d84a584d9be93a04003d4ba18c630c6.jpeg

更多的模型


04

应用

异常检测的应用非常广泛,下面几项是非常常见的:

  • Fraud Detection(欺诈识别)

    • 训练集:正常的刷卡行为;输入x:盗刷行为?

  • Network Intrusion Detection(网络入侵检测)

    • 训练集:正常的访问;输入x:攻击行为?

  • Cancer Detection(癌症检测)

    • 训练集:正常细胞;输入x:癌细胞

参考文献:

https://www.bilibili.com/video/BV1Gb411n7dE?p=8


  

daa2f9c47232fb691cf7ca1ea28debd7.jpeg


  

  

  

  
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常检测从入门到应用 的相关文章

  • Python -- argparse :命令行参数解析模块

    Python argparse xff1a 命令行参数解析模块 官网参考文档 文章目录 Python argparse xff1a 命令行参数解析模块1 总述2 96 add argument 96 2 1 name or flags2 2
  • PWM波控制舵机总结

    文章转载自 https www cnblogs com zhoubatuo p 6138033 html 一 关于舵机 xff1a 舵机 xff08 英文叫Servo xff09 xff1a 它由直流电机 减速齿轮组 传感器和控制电路组成的
  • PNP三极管和NPN三极管的开关电路

    一 三极管开关电路设计的可行性及必要性 可行性 xff1a 用过三极管的人都清楚 xff0c 三极管有一个特性 xff0c 就是有饱和状态与截止状态 xff0c 正是因为有了这两种状态 xff0c 使其应用于开关电路成为可能 必要性 xff
  • Clark变换与Park(派克)变换

    转载https blog csdn net chenjianbo88 article details 53027298 clark变换 xff1a 将abc 变换到 静止 的 坐标系下 Park变换 xff1a 将abc 变换到 旋转 的
  • 无感方波和FOC堵转检测策略参考

    http mcu eetrend com content 2017 100007230 html 基于S12ZVM的车用无传感器BLDC堵转检测方法探讨 judy 发布于 xff1a 周一 07 31 2017 11 05 xff0c 关键
  • kubernetes 快速入门

    文章目录 2 kubernetes 快速入门前言一 nameSpace1 简介2 常用命令查看 nameSpace创建 nameSpace删除 nameSpace 二 pod 与 deployment1 简介2 常用命令查看 pod创建 d
  • 事件处理的本质

    当在点击一个按钮执行某个操作时 xff0c 你有没有想过 xff0c 为什么点击了这个按钮就会执行某个操作 xff0c 这是为什么 xff1f 那么接下来就让我来解开这里面的秘密 用微软中定义的事件函数来说明这个问题是再简单不过的的事情了
  • 在Ubuntu系统中使用dd工具备份Jetson Xavier NX TF/SD卡

    Jetson Xavier NX TF SD卡系统镜像的备份与恢复 备份环境系统备份系统恢复 本次操作是通过 dd 命令完整克隆系统 这种方法是块设备的 bit 复制 xff0c 所以完全不需要了解上层文件系统的结构和内容 xff0c 只需
  • 深度相机使用对比:Gemini Pro与RealSense D435i

    文章目录 前言一 参数对比二 环境配置三 实际使用效果图像读取视觉slam效果对比 总结 前言 为了开展视觉slam相关项目 xff0c 最近找了几款不同的深度相机进行测试 xff0c 本次主要讲一下奥比中光的Gemini Pro相机与In
  • C++ STL——迭代器

    迭代器 无论是序列容器还是关联容器 xff0c 最常做的操作无疑是遍历容器中存储的元素 xff0c 而实现此操作 xff0c 多数情况会选用 迭代器 xff08 iterator xff09 来实现 我们知道 xff0c 尽管不同容器的内部
  • 理解大端(网络)字节序和小端(部分主机)字节序的区分和转换

    一 基本概念 xff1a 举例 xff1a Mac地址为 xff08 0x xff09 xff1a 00 0c 29 74 33 55 大端字节序就是 xff1a 00 0c 29 74 33 55 xff0c 和我们正常的读写习惯一致 x
  • [图像处理]-Opencv中数据类型CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F是什么?

    1 宏定义 首先来说CV 8U CV 16U CV 16S CV 32F 以及 CV 64F xff0c 都是opencv定义的数据类型 具体定义如下 define CV 8S 1 define CV 16U 2 define CV 16S
  • 基于卡尔曼滤波和PID调节的自平衡小车

    资源下载 xff1a 源代码 xff1a http download csdn net download feng3121 10262828 功能图与程序框图 xff1a http download csdn net download fe
  • SBUS调试助手 sbus解析,sbus协议

    最近在做一个无人机用的四路的开关 即航模遥控器PWM信号控制四路继电器 设计硬件的时候专门用了一路可以配置成串口输入的管脚 外部加了一路施密特反相器 其实主要是滤波防止信号抖动 当然私心就是后续可以接SBUS信号 接触航模遥控器时间挺长了
  • Android WebView 网页使用本地字体

    要求在网页里面调用android app中assets目录下的某个字体文件 网页加载通常有两种方式 xff1a 1 loadDataWithBaseURL 2 loadUrl 一 loadDataWithBaseURL 网页中直接使用fil
  • 若依前后端分离版,图片上传后无法显示问题

    若依前后端分离版 xff0c 部署时通常会采用Nginx做反向代理 访问图片出现404 Not Found问题 若依在文件上传成功后 xff0c 请求访问后台地址会根据profile进行匹配 xff0c 需要自己配置代理 配置方式一 xff
  • Vue项目使用history模式,打包部署到二级目录

    需求 xff1a Vue项目使用history模式 xff0c 打包部署到服务器上的二级目录 示例 xff1a your host name h5 index html 原理 xff1a 把页面地址所有含有 h5 的url重定向到 xff1
  • Springboot 服务jar的外部指定端口和文件方式

    在命令行中指定启动端口 java jar xxx jar server port 61 9000 在命令行中指定启动端口与配置文件 java jar xxx jar server port 61 8980 spring profiles a
  • 【Android】本地图片选择(打开媒体库,选择图片)

    在此调查中我要实现的是 xff1a 点击Pictures 按钮后 xff0c 获取手机内所有图片 xff0c 选择某一个图片 xff0c 并显示到ImageView中 应用范围 xff1a 图片上传时的图片选择 xff0c 类似 34 浏览
  • 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知 xff0c 通过PackageManager 可以获取手机端已安装的apk 文件的信息 xff0c 具体代码如下 PackageManager packageManager 61 this getPackageManager Li

随机推荐

  • 【Android】状态栏通知Notification、NotificationManager详解

    在Android系统中 xff0c 发一个状态栏通知还是很方便的 下面我们就来看一下 xff0c 怎么发送状态栏通知 xff0c 状态栏通知又有哪些参数可以设置 xff1f 首先 xff0c 发送一个状态栏通知必须用到两个类 xff1a N
  • 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画 一类是Tween动画 xff0c 就是对场景里的对象不断的进行图像变化来产生动画效果 xff08 旋转 平移 放缩和渐变 xff09 第二类就是 Frame动画 xff0c 即顺序的播放事先做好的图像 x
  • 面试题之Linux58个面试常问【附带答案】

    面试题之Linux58问 目录 1 Linux常用的发行版 2 在Linux里面查看指定时间段的日志文件 3 将文件中所有的old字符以new代替 4 修改文件中第n行到第m行以new代替old 5 统计字符串在文件中出现的次数 6 查看文
  • 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性

    在进行UI布局的时候 xff0c 可能经常会用到 android gravity 和 android layout Gravity 这两个属性 关于这两个属性的区别 xff0c 网上已经有很多人进行了说明 xff0c 这边再简单说一下 资料
  • 我的2011年终总结(流水账篇)

    2011即将过去 xff0c 2012即将到来 2013应该还会如期而来吧 xff1f 2011回顾 xff1a 去日本出差很幸运的遇上了大地震 xff08 还好不在福岛 xff09 和老婆谈了7年了 xff08 认识十年了 xff09 儿
  • poll函数详解及原理

    poll函数实现和select极为相似 xff0c 但是它们的接口并不相同 xff1a int poll struct pollfd fdarray nfds t nfds int timeout int select int maxfdp
  • 深度学习中的优化算法之SGD

    之前在https blog csdn net fengbingchun article details 75351323 介绍过梯度下降 xff0c 常见的梯度下降有三种形式 xff1a BGD SGD MBGD xff0c 它们的不同之处
  • CMake中include_directories的使用

    CMake中include directories命令用于在构建 build 中添加包含目录 其格式如下 include directories AFTER BEFORE SYSTEM dir1 dir2 将给定的目录添加到编译器 comp
  • CMake中target_link_libraries的使用

    CMake中的target link libraries命令用于指定链接给定目标和 或其依赖项时要使用的库或标志 来自链接库目标的使用要求将被传播 propagated 目标依赖项的使用要求会影响其自身源代码的编译 其格式如下 xff1a
  • CMake中install的使用

    CMake中的install命令用于指定安装时要运行的规则 xff0c 其格式如下 xff1a install TARGETS targets EXPORT lt export name gt RUNTIME DEPENDENCIES ar
  • 相机的内参和外参介绍

    注 xff1a 以下相机内参与外参介绍除来自网络整理外全部来自于 视觉SLAM十四讲从理论到实践 第2版 中的第5讲 xff1a 相机与图像 xff0c 为了方便查看 xff0c 我将每节合并到了一幅图像中 相机与摄像机区别 xff1a 相
  • Linux下常用的C/C++开源Socket库

    1 Linux Socket Programming In C 43 43 http tldp org LDP LG issue74 tougher html 2 ACE http www cs wustl edu schmidt ACE
  • C++11中unique_ptr的使用

    在C 43 43 中 xff0c 动态内存的管理是通过一对运算符来完成的 xff1a new xff0c 在动态内存中为对象分配空间并返回一个指向该对象的指针 xff0c 可以选择对对象进行初始化 xff1b delete xff0c 接受
  • 2021年校招软件测试工程师经典面试题,月薪15K你需要掌握哪些知识点?

    软件测试工程师 xff0c 和开发工程师相比起来 xff0c 前期可能不会涉及太深奥的内容 xff0c 但是涉及的面还是比较广的 面试实习生或者一年左右的岗位 xff0c 问的也主要是一些基础性的问题比较多 涉及的知识主要有MySQL数据库
  • 矩阵特征分解介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)

    对角矩阵 diagonal matrix xff1a 只在主对角线上含有非零元素 xff0c 其它位置都是零 xff0c 对角线上的元素可以为0或其它值 形式上 xff0c 矩阵D是对角矩阵 xff0c 当且仅当对于所有的i j Di j
  • HTTP解析库http-parser简介及使用

    http parser是一个用C编写的HTTP消息解析器 xff0c 可以解析请求和响应 xff0c 被设计用于高性能HTTP应用程序 它不会进行任何系统调用及内存分配 xff0c 它不会缓冲数据 xff0c 它可以被随时中断 根据你的体系
  • k8s之multus cni

    通常情况下在k8s中 xff0c 一个pod只有一个接口 xff0c 用于集群网络中pod和pod通信 xff0c 而multus定义了一种crd Kubernetes Network Custom Resource Definition
  • 【机器学习】浅析机器学习各大算法的适用场景

    最近在参加一个分类算法竞赛 xff0c 也正好整理各个分类机器学习算法的简单介绍 xff0c 应用场景和优缺点 资源来自网上和自己个人理解 一 逻辑回归模型 1 理解逻辑回归模型 xff08 LR xff09 逻辑回归是一种分类算法 xff
  • 【机器学习】异常检测算法之(KNN)-K Nearest Neighbors

    sklearn库里的KNN并没有直接用于异常检测 xff0c 但是包含了距离计算的函数 xff0c 所以我们应用PyOD中KNN库进行异常检测 xff0c 里面基本上也是调用sklearn的函数进行计算 xff0c 并进行了一些加工 一 图
  • 异常检测从入门到应用

    作者 xff1a 成森 64 知乎 来源 xff1a https zhuanlan zhihu com p 116235115 异常检测 Anomaly Detection 作为机器学习的一个重要分支 xff0c 实际应用领域广泛 xff0