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

【机器学习13】异常检测优化、推荐系统、协同过滤

文章目录

  • 一 异常检测的高级主题
    • 1.1 异常检测与监督学习的对比
    • 1.2 异常检测的错误分析与特征工程
  • 二 推荐系统入门
    • 2.1 问题定义:电影评分预测
    • 2.2 基于内容的推荐算法
    • 2.3 基于内容的代价函数
  • 三 协同过滤 (Collaborative Filtering)
    • 3.1 问题的另一视角:学习电影特征
    • 3.2 协同过滤算法:同时学习
  • 四 协同过滤的扩展与实践
    • 4.1 二元标签推荐
    • 4.2 冷启动问题与均值归一化
  • 五 算法实现:TensorFlow中的梯度下降
    • 5.1 梯度下降回顾
    • 5.2 TensorFlow中的自定义训练循环
    • 5.3 协同过滤的TensorFlow实现


视频链接
吴恩达机器学习p112-119


一 异常检测的高级主题

在上一篇文章中,我们学习了异常检测的基本算法。现在,我们将探讨其适用场景,以及如何通过错误分析和特征工程来优化算法性能。

1.1 异常检测与监督学习的对比

[在此处插入图片1]

异常检测和监督学习(具体指二元分类)在某些场景下似乎都可以使用,但它们的核心适用条件有本质区别。

何时使用异常检测 (Anomaly Detection):

  • 正样本(异常样本)数量极少:通常只有0-20个异常样本,但有大量的负样本(正常样本)。
  • 异常类型多样:异常的种类繁多,模型很难从少数的正样本中学到异常的普遍规律。未来的异常可能与已知的完全不同。
  • 应用案例
    • 欺诈检测:欺诈手段层出不穷。
    • 制造业:寻找前所未见的新型产品缺陷。
    • 数据中心监控:任何导致服务器异常的原因都可能是独特的。

何时使用监督学习 (Supervised Learning):

  • 正负样本数量都比较充足:拥有足够多的正样本(y=1)和负样本(y=0)。
  • 正样本具有共性:有足够的正样本,可以让算法学习到它们的共同特征,从而能够泛化到新的、类似的正样本上。
  • 应用案例
    • 垃圾邮件分类:有大量的垃圾邮件和正常邮件样本。
    • 制造业:寻找已知的、以前见过的缺陷类型(例如划痕)。
    • 天气预测疾病分类等。

1.2 异常检测的错误分析与特征工程

[在此处插入图片2]

异常检测算法的目标是,对于正常样本x,模型输出的概率p(x)应该很大(>= ε);对于异常样本xp(x)应该很小(< ε)。

  • 最常见的问题:算法失效时,往往是因为对于某些异常样本,模型也给出了很高的概率p(x),导致无法将其与正常样本区分开。
  • 原因分析:这通常意味着我们选择的特征不足以区分这种特定的异常。例如,在欺诈检测中,一个异常用户的交易次数x₁可能与正常用户差不多,但他的打字速度x₂可能异常地高。如果我们的模型只使用了特征x₁,就无法检测出这个异常。

[在此处插入图片3]

解决方案:特征工程 (Feature Engineering)

  • 核心思想:创建新的、更能揭示异常行为的特征。
  • 案例:数据中心监控
    • 假设一个异常情况是:某个程序卡死,导致CPU负载x₃很高,但网络流量x₄却很低。
    • 单独看x₃(高CPU负载)或x₄(低网络流量)可能都不是异常的。
    • 我们可以创建一个新特征 x₅ = CPU load / network traffic。对于上述异常,x₅的值会变得异常大,从而很容易被模型检测出来。
  • 通过组合现有特征(如创建比例、多项式特征等),我们可以构造出在异常发生时,会呈现出异常大或异常小值的特征,从而显著提升模型的性能。

二 推荐系统入门

现在,我们转向一个全新的、在工业界应用极其广泛的领域:推荐系统(Recommender Systems)

2.1 问题定义:电影评分预测

[在此处插入图片4]

推荐系统的核心任务之一是预测用户对物品的评分。以电影评分为例:

  • 我们有一个矩阵,行代表电影,列代表用户。
  • 符号定义
    • n_u = 用户数量 (number of users),例如 n_u = 4
    • n_m = 电影数量 (number of movies),例如 n_m = 5
    • r(i, j) = 1 如果用户 j 对电影 i 进行了评分,否则为0。
    • y(i, j) = 用户 j 对电影 i 的评分值(只有当 r(i, j) = 1 时才被定义)。
  • 目标:对于那些用户还未评分的项(在矩阵中标为“?”),预测出用户可能会给出的评分。

2.2 基于内容的推荐算法

[在此处插入图片5]

基于内容的推荐(Content-based recommendation)是一种构建推荐系统的方法,它依赖于我们拥有物品(电影)的特征

  • 假设每部电影 i 都有一个特征向量 x^(i)。例如,x₁代表电影的浪漫程度,x₂代表动作程度。
  • 核心思想:为每一个用户 j 单独学习一个线性回归模型。
    • 该模型使用电影的特征 x^(i) 作为输入,来预测该用户 j 对电影 i 的评分。
    • 模型参数为 w^(j)b^(j),它们代表了用户 j 的个人偏好。例如,如果用户Alice喜欢浪漫电影,她的 w^(1) 中对应浪漫特征的权重就会很高。
  • 预测公式:用户 j 对电影 i 的预测评分为 (w^(j)) • x^(i) + b^(j)
  • 如图中计算所示,基于Alice的参数 w^(1)b^(1),以及电影“Cute puppies of love”的特征 x^(3),可以预测出她对该电影的评分约为4.95。

2.3 基于内容的代价函数

[在此处插入图片6]

为了学习每个用户的参数 w^(j)b^(j),我们需要定义一个代价函数。这本质上就是我们熟悉的带正则化的线性回归的代价函数。

  • 对单个用户 j 的代价函数
    • min J(w^(j), b^(j)) = (1 / 2m^(j)) * Σ [ (w^(j)•x^(i) + b^(j) - y(i,j))² ] + (λ / 2m^(j)) * Σ (w_k^(j))²
    • 其中,第一个求和 Σ 只对那些用户 j 已经评过分的电影 i(即 r(i,j)=1)进行计算。m^(j) 是用户 j 评过分的电影数量。
    • 第二个求和是L2正则化项,用于防止过拟合。

[在此处插入图片7]

  • 对所有用户的总代价函数
    • 为了学习所有用户的参数,我们只需将每个用户的代价函数相加即可。
    • min J(w^(1)...w^(n_u), b^(1)...b^(n_u)) = (1/2) * Σ [ Σ [ (w^(j)•x^(i) + b^(j) - y(i,j))² ] ] + (λ/2) * Σ [ Σ (w_k^(j))² ]
    • 这个总代价函数是对所有用户的所有已知评分的误差平方和,加上对所有用户的所有参数的正则化。通过最小化这个总代价函数,我们就可以用梯度下降等算法,为所有用户找到最佳的参数 wb

三 协同过滤 (Collaborative Filtering)

基于内容的推荐有一个前提:我们需要拥有物品的特征。但在很多情况下,这些特征是难以获取的。协同过滤算法解决了这个问题。

3.1 问题的另一视角:学习电影特征

[在此处插入图片8]

让我们换一个角度思考问题:

  • 假设我们不知道电影的特征 x^(i),但是我们通过某种方式已经知道了每个用户的偏好参数 w^(j)b^(j)
  • 在这种情况下,我们能否推断出电影的特征 x^(i) 呢?
  • 例如,已知Alice和Bob都喜欢浪漫电影(w^(1)w^(2)的第一个元素很大),并且他们都给电影“Love at last”打了5分高分,而Carol和Dave(不喜欢浪漫电影)都给了0分。我们可以据此推断,电影“Love at last”的特征 x^(1) 应该是一个接近 [1, 0] 的向量,即它是一部纯粹的浪漫电影。

[在此处插入图片9]

  • 学习电影特征的代价函数
    • 我们可以固定用户的参数 wb,将电影特征 x 视为需要学习的变量。
    • 代价函数的形式与之前类似,但这次的优化目标是 min J(x^(1)...x^(n_m))
    • 它衡量的是,在给定用户偏好的情况下,我们学习到的电影特征能够多好地预测已有的评分。

3.2 协同过滤算法:同时学习

[在此处插入图片10]

协同过滤的精妙之处在于,它将上述两个问题结合了起来:

  • 我们既没有电影特征 x,也没有用户参数 wb
  • 算法的目标是同时学习这两者。
  • 协同过滤代价函数
    • min J(w, b, x) = (1/2) * Σ [ (w^(j)•x^(i) + b^(j) - y(i,j))² ] + (λ/2) * Σ (w_k^(j))² + (λ/2) * Σ (x_k^(i))²
    • 这个代价函数将 w, b, x 全部视为需要优化的参数
    • 它包含了三部分:对已知评分的预测误差、对用户参数的正则化、以及对电影特征的正则化。

[在此处插入图片11]

  • 协同过滤的梯度下降
    • 由于 w, b, x 都是参数,我们在梯度下降的每一步中,需要同时更新它们:
      • w_k^(j) := w_k^(j) - α * (∂/∂w_k^(j))J
      • b^(j) := b^(j) - α * (∂/∂b^(j))J
      • x_k^(i) := x_k^(i) - α * (∂/∂x_k^(i))J
    • 这个算法之所以被称为“协同”,是因为用户对电影的评分数据,帮助算法协同地学习了用户的偏好和电影的特征。

四 协同过滤的扩展与实践

4.1 二元标签推荐

[在此处插入图片12]

[在此处插入图片13]

在很多推荐场景中,我们没有明确的1-5星评分,而是只有二元标签(Binary labels),代表用户是否与物品发生了某种交互。

  • y=1:用户进行了交互(例如,购买、喜欢、点击、观看超过30秒)。
  • y=0:用户被展示了物品但没有交互。
  • ?:物品还未被展示给用户。

[在此处插入图片14]

从回归到分类

  • 对于二元标签,问题从一个回归问题(预测评分)转变为一个二元分类问题(预测交互的概率)。
  • 我们的预测模型需要做出改变:不再直接输出 w•x + b,而是将其输入到一个Sigmoid函数 g(z) 中,来预测 y=1 的概率。
  • P(y=1) = g(w^(j)•x^(i) + b^(j))

[在此处插入图片15]

  • 二元协同过滤的代价函数
    • 相应地,代价函数也需要从线性回归的均方误差,改为我们熟悉的逻辑回归的对数损失函数(log loss)
    • 总代价函数 J(w, b, x) 是对所有已知交互(r(i,j)=1)的对数损失之和。正则化项保持不变。

4.2 冷启动问题与均值归一化

[在此处插入图片16]

冷启动问题(Cold start problem)

  • 当一个新用户(如Eve)加入系统,他/她没有任何评分历史。
  • 在使用协同过滤算法时,由于没有y^(i,5)的数据,代价函数中与用户Eve相关的预测误差项为0。
  • 为了最小化总代价,正则化项会迫使Eve的参数 w^(5)b^(5) 都变为0。
  • 这导致对Eve的所有电影评分预测都为0,这是一个没有意义的推荐结果。

[在此处插入图片17]

解决方案:均值归一化(Mean Normalization)

  1. 计算均值:对评分矩阵的每一行(每一部电影),计算所有已有评分的平均值 μ
  2. 归一化:从每个电影的所有已有评分中,减去该电影的平均分,得到一个均值为0的归一化评分矩阵。
  3. 训练:在归一化的评分矩阵上运行协同过滤算法,学习参数 w, b 和特征 x
  4. 预测:对于用户 j 和电影 i,进行预测时,在模型输出的基础上,必须将该电影的平均分加回来
    • 预测公式:(w^(j)) • x^(i) + b^(j) + μ_i
  5. 对新用户的预测:对于新用户Eve,其参数 w^(5)b^(5)仍然会是0。但现在的预测结果是 0 + μ_i,即该电影的平均分。这是一个远比预测0分更合理、更有意义的初始推荐。

五 算法实现:TensorFlow中的梯度下降

5.1 梯度下降回顾

[在此处插入图片18]

梯度下降是优化代价函数 J(w,b) 的核心算法。它通过在每一步迭代中,沿着代价函数梯度的反方向更新参数 wb,来逐步找到使 J 最小化的参数值。更新规则的核心是偏导数 ∂J/∂w

5.2 TensorFlow中的自定义训练循环

[在此处插入图片19]

在TensorFlow中实现梯度下降,尤其是对于像协同过滤这样自定义的代价函数,我们需要构建一个自定义训练循环

  • tf.Variable: 用于定义我们想要优化的参数(如w)。
  • tf.GradientTape: 这是TensorFlow实现**自动微分(Auto Diff)**的核心工具。
    1. 在一个 with tf.GradientTape() as tape: 的代码块中,执行所有计算代价函数 J 的前向传播步骤(例如 costJ = (f(w,x) - y)²)。
    2. GradientTape会像磁带一样“记录”下所有这些操作。
    3. 然后,调用 tape.gradient(costJ, [w]),TensorFlow会自动计算出 costJ 相对于参数 w 的梯度 ∂J/∂w
    4. 最后,我们手动执行梯度下降的更新步骤,例如 w.assign_add(-alpha * dJdw)

5.3 协同过滤的TensorFlow实现

[在此处插入图片20]

将上述概念应用到协同过滤算法中:

  1. 初始化:将 w, b, x 都定义为 tf.Variable
  2. 创建优化器:例如 optimizer = keras.optimizers.Adam()
  3. 训练循环
    • with tf.GradientTape() as tape: 块内,编写计算协同过滤总代价 J(w,b,x) 的函数。
    • 调用 tape.gradient(cost_value, [X, W, b]) 来自动获取代价函数相对于所有参数(电影特征 X,用户权重 W,用户偏置 b)的梯度。
    • 调用 optimizer.apply_gradients(zip(grads, [X, W, b])),优化器会自动执行梯度下降的更新步骤,同时更新 X, W, b

通过这种方式,我们可以高效地实现并训练复杂的协同过滤模型。

http://www.dtcms.com/a/564512.html

相关文章:

  • can‘t read /etc/apt/sources.list: No such file or directory
  • 深入理解 DNS 与 ICMP:网络世界的地址解析与连通性探测
  • MCU中的RC电路(Resistor-Capacitor Circuit)
  • Flink SQL 调优
  • CISP-PTE认证考试靶场
  • RDPWD!MCSAttachUserRequest函数分析之RDPWD!Domain结构中的ChannelList和UserAttachmentList
  • 细数Java中List的10个坑
  • 泉州手机网站开发怎么看一个网站是什么程序做的
  • PyTorch图像分割训练全流程解析
  • 无人机 - 关于无人机电池
  • 音视频播放的核心处理流程
  • 基于EasyExcel实现Excel导出功能
  • 【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了
  • kafka问题解决
  • Parasoft C/C++test如何在CCS3环境下进行F2812项目的单元测试
  • CCID工具,Jenkins、GitLab CICD、Arbess一文全方位对比分析
  • 公司网页设计的设计过程南昌网站排名优化报价
  • 如何查询网站空间寻甸马铃薯建设网站
  • Node.js 中的中间件机制与 Express 应用
  • 【保姆级教程】在AutoDL容器中部署EGO-Planner,实现无人机动态避障规划
  • 仿生机器鹰无人机技术解析
  • 2025无人机在电力交通中的应用实践
  • Qt实时绘制飞行轨迹/移动轨迹实时显示/带旋转角度/平滑移动/效果一级棒/地面站软件开发/无人机管理平台
  • 八股已死、场景当立(场景篇-负载均衡篇)
  • Go语言设计模式:备忘录模式详解
  • 基于YOLOv10的无人机智能巡检系统:电力线路悬挂物检测实战
  • 定制开发开源AI智能名片S2B2C商城小程序中的羊群效应应用研究
  • seo搜索引擎优化网站店铺位置怎么免费注册定位
  • 一个专门做恐怖片的网站做化工行业网站
  • 物联网 “神经” 之以太网:温湿度传感器的工业级 “高速干道”​