吴恩达机器学习作业十一:异常检测

数据集在作业一

异常检测

异常检测就是发现与大部分对象不同的对象,其实就是发现离群点。异常检测有时也称偏差检测。异常对象是相对罕见的。用数据集建立概率模型p ( x ),如果新的测试数据在这个模型上小于某个阈值,则说它极大可能为异常点

算法流程:

1.求出均值与方差

2.计算正态分布密度函数

3.找出合适的阈值

代码实现

读取数据及可视化

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio# 读取数据
data=sio.loadmat("ex8data1.mat")
X=data['X']
X_val=data['Xval']
y_val=data['yval']
# print(X.shape)(307, 2)# 可视化
# plt.scatter(X[:,0],X[:,1],marker='o',c='y',edgecolors='g')
# plt.show()

获取均值和方差

def estimate_gaussian(X,isCovariance):mu=np.mean(X,axis=0)if isCovariance:sigma = np.cov(X.T)else:sigma=np.var(X,axis=0)return mu,sigma

这里的方差有一个不同之处,因为X有多个特征,不能判断特征之间是否没有线性关系,若没有,则按照每列来计算各列的方差,反之,我们就要用协方差。

协方差矩阵

计算概率密度

def gaussian_prob(X,mu,sigma):p=np.zeros((X.shape[0],1))n=len(mu)if np.ndim(sigma) == 1:  # 返回sigma的维度是1sigma = np.diag(sigma)  # 将一维数组转化为方阵,非对角线元素为0for i in range(X.shape[0]):# 计算公式中的指数部分:-0.5*(x-μ)⊤Σ⁻¹(x-μ)exponent = -0.5 * (X[i, :] - mu).T @ np.linalg.inv(sigma) @ (X[i, :] - mu)# 计算概率密度值并赋值给p[i]p[i] = (2 * np.pi) ** (-n / 2)  # 公式中的(2π)^(-n/2)p[i] *= np.linalg.det(sigma) ** (-1 / 2)  # 乘以|Σ|^(-1/2)p[i] *= np.exp(exponent)  # 乘以指数部分return pp=gaussian_prob(X,mu,sigma)

绘制梯度密度等高线

def plot_gaussian(X,means,sigma):x=np.arange(0,30,0.5)y=np.arange(0,30,0.5)xx,yy=np.meshgrid(x,y)Z=gaussian_prob(np.c_[xx.ravel(),yy.ravel()],means,sigma)zz=Z.reshape(xx.shape)contour_levels = [10 ** h for h in range(-20, 0, 3)]plt.contour(xx, yy, zz, contour_levels)#生成了 [1e-20, 1e-17, 1e-14, 1e-11, 1e-8, 1e-5, 1e-2] 这 7 个值,# 表示只绘制密度等于这些值的等高线。plt.scatter(X[:, 0], X[:, 1], marker='x', c='b')plt.show()# plot_gaussian(X,mu,sigma)

这里是通过取足够多的点并计算它们的概率密度,从而实现等高线。

找出最佳阈值

#4.阈值epsilonz自取
def selecteps(yval,p):bestEpsilon = 0  # 最佳阈值,初始化为0bestF1 = 0  # 最佳F1分数,初始化为0# 生成1000个候选阈值,均匀分布在p的最小值和最大值之间epsilons = np.linspace(min(p), max(p), 1000)for e in epsilons:# 基于当前阈值e判断:p < e → 异常(1),否则正常(0)p_ = p < e# 计算混淆矩阵的四个指标tp = np.sum((yval == 1) & (p_ == 1))  # 真正例:实际异常,预测也异常fp = np.sum((yval == 0) & (p_ == 1))  # 假正例:实际正常,预测异常tn = np.sum((yval == 0) & (p_ == 0))  # 真负例:实际正常,预测正常fn = np.sum((yval == 1) & (p_ == 0))  # 假负例:实际异常,预测正常# 计算精确率(Precision):预测为异常的样本中,实际异常的比例prec = tp / (tp + fp) if (tp + fp) else 0  # 避免分母为0# 计算召回率(Recall):实际异常的样本中,被正确预测的比例rec = tp / (tp + fn) if (tp + fn) else 0  # 避免分母为0# 计算F1分数:精确率和召回率的调和平均,综合评价模型性能F1 = (2 * prec * rec) / (prec + rec) if (prec + rec) else 0# 更新最佳阈值和F1分数if F1 > bestF1:bestF1 = F1bestEpsilon = ereturn bestF1,bestEpsilonp_val=gaussian_prob(X_val,mu,sigma)
bestF1,bestEpsilon=selecteps(y_val,p_val)

这里利用了混淆矩阵来更新最佳阈值。

圈出异常点

# 圈出异常点
p=gaussian_prob(X,mu,sigma)
anoms = np.array([X[i] for i in range(X.shape[0]) if p[i] < bestEpsilon])
plt.scatter(anoms[:,0], anoms[:,1], s=100, marker='o', facecolors='none', edgecolors='r', linewidths=2)
plot_gaussian(X, mu, sigma)

总结

读取数据——获取均值与方差——用概率密度函数构建模型——找出最佳阈值——找出异常点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920752.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2000w 的数据量,mysql要进行几次IO操作,为什么

在 MySQL 中&#xff0c;2000 万数据量的表在进行查询时所需的 ​​IO 操作次数​​主要取决于 ​​索引结构&#xff08;B树层级&#xff09;​​、​​查询类型​​和 ​​数据分布特征​​。以下是具体分析&#xff1a;一、B树层级与 IO 次数的关系InnoDB 引擎通过 B树索引管…

【代码随想录day 22】 力扣 39. 组合总和

视频讲解&#xff1a;https://www.bilibili.com/video/BV1KT4y1M7HJ/?vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解&#xff1a;https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html#%E6%80%9D%E8%B7%AF 力扣题目&#xff1a;https://leetcod…

DrissionPage 实战:动态 IP 代理与百度翻译 API 数据抓取

本文将详细介绍如何使用 DrissionPage 实现动态 IP 代理访问&#xff0c;并结合百度翻译 API 进行数据抓取与处理。一、技术选型与架构设计1.1 为什么选择 DrissionPage&#xff1f;DrissionPage 作为新一代网络自动化工具&#xff0c;相比传统 Selenium Requests 方案具有显著…

策略模式:灵活应对算法动态切换

引言 在软件开发中&#xff0c;我们常常会遇到需要在运行时动态选择和切换算法或行为的场景。例如&#xff0c;电商系统中的多种支付方式、游戏中的不同难度设置&#xff0c;或是计算器中的各种运算符。传统的方法可能会使用复杂的条件判断语句&#xff08;如if-else或switch-c…

【C++ 】string类:深拷贝与浅拷贝解析

【C 】string类操作全解析-CSDN博客 1.stirng类的模拟实现 1.1 经典的string类问题 上面已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢要求自己来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝…

Decoder 解码器

Decoder 解码器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h>#define WORD uint16_t #define DWORD ui…

globals() 小技巧

scheduler_class globals()[scheduler_class_name] Python 中一种 动态获取类对象 的常用技巧&#xff0c;属于 反射&#xff08;reflection&#xff09; 编程的范畴globals()Python 内置函数&#xff0c;返回一个 字典&#xff08;dict&#xff09;&#xff0c;包含当前模块&…

Android Studio 9.png制作

一、新建 二、把要做的图png导入进去 png图片建议 根据内容预留1像素可拉伸区域 eg:纯色或可渐变底色 三、右边创建.9.png 四、双击打开 1、绘制黑边 参考视频 2、缩放到800% ,移至右下 3、在下面和右边绘制整根黑线 4、根据png 位置左侧和上侧黑线 4.1 分析 红色方框为…

【百度】C++开发(25届提前批 一面)面经

文章目录1. 代码实现&#xff1a;说说LRU&#xff0c;并代码实现LRU为什么使用哈希表&#xff1f;&#xff08;有两个原因&#xff09;1. 仅用双向链表的缺陷2. 引入哈希表的作用1. 快速查找&#xff1a;2. 快速插入与删除&#xff1a;双向链表 哈希表的协作过程举例说明代码实…

Word文档怎么打印?Word打印技巧?【图文详解】单面/双面/指定页面/逆序等Word打印选项

一、问题背景 在日常办公、学习场景中&#xff0c;Word文档作为常用的文字处理载体&#xff0c;经常需要将电子内容转化为纸质版本&#xff0c;比如提交报告、打印学习资料、整理文档存档等。 但不少用户在尝试打印Word文档时&#xff0c;常会遇到各种阻碍&#xff1a;有的不清…

漫谈《数字图像处理》之基函数与基图像

在数字图像处理领域&#xff0c;基函数与基图像是贯穿理论分析与实际应用的核心概念 —— 它们如同 “乐高积木”&#xff0c;将复杂的图像信号拆解为可解释、可操作的基本单元&#xff0c;支撑起压缩、去噪、特征提取等一系列关键任务。从传统的傅里叶变换到前沿的因子场理论&…

打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用

打开多个Excel文件后如果要快速关闭所有的文档&#xff0c;并且退出Excel应用&#xff0c;可以按住Shift键右上角的号&#xff08;关闭按钮&#xff09;。Word和PowerPoint也是一样的操作。如果有文档修改后没有保存&#xff0c;会提示是否保存。作为补充&#xff0c;先来看看两…

基于 PyTorch 构建 Dataset 与 DataLoader:从 TXT 文件读取到新增类别全流程指南

基于 PyTorch 构建 Dataset 与 DataLoader&#xff1a;从 TXT 文件读取到新增类别全流程指南在深度学习计算机视觉任务中&#xff0c;数据加载与预处理是模型训练的基础环节&#xff0c;直接影响模型的训练效率与最终性能。PyTorch 作为主流深度学习框架&#xff0c;提供了Data…

hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算

如果是2个大表union会写几次临时文件到hdfs目录&#xff0c;数据量如何计算 在Hive on Tez中&#xff0c;两个大表执行UNION操作时&#xff0c;临时文件的写入次数和数据量&#xff0c;取决于UNION的类型&#xff08;UNION ALL还是UNION去重&#xff09;以及执行计划的Stage划分…

Web+js转uni-app+ts

一、入手uni-app 官方文档&#xff1a;uni-app官网 1.创建uni-app项目 1.1通过HBuilderX进行创建 官方地址&#xff1a;HBuilderX-高效极客技巧 1.2通过命令行创建 // js 版本的 npx degit dcloudio/uni-preset-vue#vite 项目名 npx degit dcloudio/uni-preset-vue#vite-…

IO_hw_8.29

1.使用fgets和fputs完成两个文件的拷贝&#xff0c;要求文件名使用外部传承2.注册登录代码3.思维导图4.牛客网刷题记录

数据结构(04)—— 栈和队列

Hi&#xff01;探索者们&#x1f609;&#xff0c;欢迎踏入 408 数据结构的奇妙秘境&#x1f33f;&#xff01;​ 我是 ankleless&#x1f4da;&#xff0c;和你并肩的寻宝人&#xff5e; 这是我的探险手札&#x1f5fa;️&#xff0c;里面记着链表森林的岔路陷阱&#x1f578;…

Java多线程基础:进程、线程与线程安全实战

Java多线程基础&#xff1a;进程、线程与线程安全实战 &#x1f680; 极客小贴士 &#x1f4a1; 你知道吗&#xff1f; 在Java中&#xff0c;每个线程都有自己的栈空间&#xff0c;但共享堆内存。这就像每个员工都有自己的办公桌&#xff0c;但共享公司的会议室和打印机&#…

2025 实测有效!手把手教你如何用实例代码(Python、JavaScript 、JAVA) 等实战代码,免费股票数据接口大全

​ 近年来&#xff0c;股票量化分析凭借其科学性与系统性&#xff0c;逐渐走进大众视野并受到广泛关注。对于这一领域的初学者而言&#xff0c;入门路上的第一道关卡便是如何获取全面且精准的股票数据。要知道&#xff0c;实时交易数据、历史交易记录、财务数据以及基本面信息等…

KMP 算法相关练习题

大家好&#xff0c;今天是2025年8月31日&#xff0c;上一期我给大家分享了 KMP 算法的相关知识&#xff0c;今天我来带领大家学习4道 KMP 相关的算法题。 在学习算法题之前&#xff0c;还是希望大家能够要先学会 KMP 算法&#xff08;可以参考这篇文章&#xff1a;KMP 算法&am…