当前位置: 首页 > news >正文

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

数据集在作业一

异常检测

异常检测就是发现与大部分对象不同的对象,其实就是发现离群点。异常检测有时也称偏差检测。异常对象是相对罕见的。用数据集建立概率模型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.xdnf.cn/news/1407205.html

相关文章:

  • 大模型——利用RAG构建智能问答平台实战
  • 在Ubuntu服务器上安装KingbaseES V009R002C012(Orable兼容版)数据库过程详细记录
  • Qwen3_moe模型代码解析
  • FreeRTOS实战:任务创建与调度详解
  • 【MySQL自学】SQL语法全解(上篇)
  • 【PS实战】逐步打造静物的艺术色调(大学作业)
  • 从零开始搭建使用 TDengine:新用户快速上手指南
  • windows docker 中的mysql 无法被外部浏览器访问如何解决
  • 自动驾驶中的传感器技术37——Lidar(12)
  • Ansible 临时命令与常用模块实操指南
  • 【人工智能99问】LLaMA中的RoPE是什么?(35/99)
  • Paimon——官网阅读:Spark 引擎
  • Spark内存管理
  • Nginx 502 Bad Gateway:从 upstream 日志到 FastCGI 超时复盘
  • 腾讯浑元最新技术:具有表征对齐的多模态扩散,用于高保真拟音音频生成
  • 【嵌入式DIY实例】-空中鼠标
  • LeetCode算法日记 - Day 27: 计算右侧小于当前元素的个数、翻转对
  • 高校心理教育辅导系统的设计与实现|基于SpringBoot高校心理教育辅导系统的设计与实现
  • USB虚拟化应用5:VirtualFIDO2 虚拟硬件安全密钥,智能卡,yubico,支持X,FB,GITHUB等各种网站双重认证,让你的账户登录绝对安全
  • 在集群级别应用 Pod 安全标准
  • opencv 梯度提取
  • 数据化管理是什么意思?企业该如何进行数据化管理
  • 《SVA断言系统学习之路》【01】即时断言概览
  • 北京博乐科技有限公司2025届程序技术类笔试题
  • 性能测试工具-SkyWalking
  • 元宇宙与旅游产业:虚实融合的文旅新体验
  • Python毕业设计推荐:基于Django+MySQL的养老社区服务管理系统
  • 从 WPF 到 Avalonia 的迁移系列实战篇4:控件模板与 TemplatedControl
  • UniApp 基础开发第一步:HBuilderX 安装与环境配置
  • 【AI智能体技术】如何学习多智能体系统知识并实现SOTA算法?