TowardsDataScience 2023 博客中文翻译(二百一十)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

利用 LLM 和 LangChain 实现供应链分析——一个由 GPT 提供支持的控制塔

原文:towardsdatascience.com/leveraging-llms-with-langchain-for-supply-chain-analytics-a-control-tower-powered-by-gpt-21e19b33b5f0?source=collection_archive---------2-----------------------#2023-11-17

使用 LangChain SQL 代理构建一个自动化的供应链控制塔,并连接到运输管理系统的数据库。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Samir Saci

·

关注 发表在 Towards Data Science ·14 分钟阅读·2023 年 11 月 17 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片来自作者)

供应链控制塔可以定义为一个集中式解决方案,提供可视化和监控功能,以高效管理端到端的供应链操作。

这个分析工具使供应链部门能够实时跟踪、理解和解决关键问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Python 构建的供应链控制塔 [Link] —(图像由作者提供)

在之前的文章中,我介绍了一种用于分析控制塔的解决方案(使用 Python 开发),能够自主生成事件报告。

然而,这种方法需要在提供的指标和报告范围上进行修订。

我们如何提升这个模型以提供更好的用户体验?

这一观察使我发现了像 OpenAI 的 GPT 这样的**大型语言模型(LLMs)**在根据每个用户请求提供量身定制分析方面的巨大潜力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决方案的高级概念 —(图像由作者提供)

在这篇文章中,我将分享我掌握Langchain 与 OpenAI 的 GPT 模型以及构建终极供应链控制塔的经历。

💌 免费新文章直接送到您的邮箱:Newsletter

📘 供应链分析的完整指南:Analytics Cheat Sheet

SUMMARY
**I. LLMs with LangChain for Supply Chain Analytics**
An exploration of how LangChain and LLMs can revolutionize analytics 
in supply chain management.
**1\. Scenario: Distribution Process of a Fashion Retailer**
The complex distribution operations in a global fashion retail setting.
**2\. Setting the Stage for Experimentation**
Introduce the experimental setup to test a LangChain SQL agent. 
**3\. Experimental Protocol: Starting Simple**
Start with a straightforward query to assess the agent's basic capabilities.
**II. Experiments and Key Insights**
**1\. Test 1**
Simple Prompt without Template
2\. Test 2
Prompt Template with a Context
**3\. Test 3**
Prompt Template with an Improved Context
**4\. Test 4**
Advanced Analysis with an Improved Context
**5\. Final Test**
Create a Chain to Write an Email Report
**III. LLMs Shaping the Future of Supply Chain**
**1\. What about GPTs? "The Supply Chain Analyst" Agent**
I tried the new feature "GPTs" of ChatGPT with "The Supply Chain Analyt" Agent
**2\. A Simple 'Proof-of-Concept'**
We can use an agent to track shipments with TMS data
**3\. Continuing the Prototype Development**
Challenge the agent with complex analyses and more tables.
**4\. Exploring Broader Applications in Supply Chain**
LLMs can boost the user experience for Digital Twins, Network Optimization,
Business Intelligence, ESG Reporting and many other applications

使用 LangChain 进行供应链分析的 LLMs

场景:时尚零售商的配送过程

想象一下你是一个拥有全球门店网络的国际服装集团的数据科学家。

你的项目涉及协助配送规划经理监控门店的补货过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

供应链网络 —(图像由作者提供)

她领导着一个管理全球门店库存的计划员团队。

这个过程很简单,当库存水平达到最低水平时。

关键绩效指标是按时交货的订单百分比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配送链过程通过时间戳跟踪 —(图像由作者提供)

从订单创建到商店交货,数据库中记录了多个时间戳和布尔标志。

  • 订单传输时间记录在**‘Transmission’** 如果这是在截止时间之后,‘Transmission_OnTime’会被设置为 0。

  • 卡车装载时间记录在**‘Loading’**中。

    如果这是在截止时间之后,‘Loading_OnTime’会被设置为 0。

  • 卡车到达机场的时间记录在**‘Airport_Arrival’**中。

    如果这是在截止时间之后,‘Airport_OnTime’会被设置为 0。

  • 飞机降落在机场时,记录在‘Airport_Arrival’中

    如果这是在截止时间之后,‘Airport_OnTime’将设置为 0。

  • 卡车抵达城市由‘City_Arrival’记录

    如果这是在商店开放时间之外,‘Store_Open’将设置为 0。

最重要的时间戳是‘Delivery_Time’。它与‘Expected_Delivery_Time’进行比较,以设置‘On_Time_Delivery’的值。

我在之前的文章中提出的初始解决方案是一套视觉和报告,用于回答操作性问题。

问题 1:有多少批次运输延误了?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(作者提供的图像)

问题 2:目前运输在哪里?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(作者提供的图像)

设计这种描述性分析解决方案的主要困难在于复杂性和完整性之间的平衡

  • 如果你想回答所有潜在的操作性问题,你的报告很快就会变得非常难以使用。

  • 为了保持报告简洁,您将不会涵盖全部操作范围。

我们正在接近传统商业智能(BI)工具的极限,这些工具依赖于视觉、表格和报告来回答操作性问题。

对我来说,报告的未来在于动态定制报告,根据每个用户的问题和上下文独特定制。

我们可以使用 GPT 模型来增强用户体验,通过为每个请求提供定制的输出吗?

这是我试图用 Python 开发的简单原型来弄清楚的事情。

为实验做准备

设置很简单:

  • 一个名为‘shipments.db’的本地数据库,其中包含一个名为‘shipments’的表

  • Langchain 版本 0.0.325

  • 一个用于查询 GPT 模型的 OpenAI 密钥

  • 一个带有 LangChain、SQLite 和 Pandas 库的 Python 本地环境

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决方案的高层概述 — (作者提供的图像)

数据库包括时间戳和布尔标志,以及运输 ID、目的地和订单金额。

因此,LangChain SQL 代理(由 OpenAI 的 GPT 模型提供支持)可以访问数据库,编写 SQL 查询,并使用输出来回答用户的问题。

实验协议:从简单开始

我从一个简单的问题开始,因为我想感受代理的效果。

“五月初七天内有多少批次的运输延误了?”

正确答案是 6,816 批次运输。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代理的目标行为 — (作者提供的图像)

我希望看到代理创建一个 SQL 查询,统计从‘2021-05-01’到‘2021-05-07’期间所有运输的数量,其中布尔标志为**‘On_Time_Delivery’ = False**。

在接下来的部分,我们将探索与代理的不同交互方法并寻找提供准确答案的最有效方法。

💡 关注我的 Medium,获取更多与🏭供应链分析、🌳可持续性和🕜生产力相关的文章。

实验与关键见解

现在一切准备就绪,我可以开始创建 LangChain 代理与数据库交互。

我使用的是AgentType.ZERO_SHOT_REACT_DESCRIPTION,这是一种设计用于“零-shot”学习环境的代理类型。

这个代理能够在没有任何特定训练的情况下回答查询。

测试 1:简单提示而不使用模板

最初的测试涉及向代理提出直接问题。

“五月前七天内有多少装运延迟?”

[块 1]: 代理从包含唯一表格‘shipments’的数据库开始探索。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[块 1]: 数据库的发现 — (作者提供的图片)

代理正在链接问题中的**“延迟装运”**与数据库中的‘shipments’表。

这个初始块对我们实验的所有其他迭代将完全相同。

[块 2]: 代理撰写查询并提供了错误答案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[块 2]: 查询数据库并提供答案 — (作者提供的图片)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试 1:目标结果(左)/ 测试输出(右) — (作者提供的图片)

👍 一个好处是代理使用了正确的日期(订单日期)来筛选所在范围内的装运。

👎 然而,他错误地选择了定义延迟装运的标志。

我们可以接受这一点,因为我们并未明确定义何为延迟装运。

测试 2:带有上下文的提示模板

我可以使用带有上下文的提示模板来改进答案。

我希望保持上下文的最小化,因为我们可能不总是知道用户会问什么。

context_explanation = """
As a supply chain control tower manager, my role involves overseeing the logistics network and ensuring that shipments are processed efficiently and delivered on time. 
The 'shipments' table in our database is crucial for monitoring these processes. It contains several columns that track the progress and timeliness of each shipment throughout various stages:
- 'Order_Date' and 'Expected_Loading_Date' provide timestamps for when an order was placed and when it was expected to be loaded for departure.
- 'Expected_Delivery_Time' is a timpestamp defining when the shipment is expected to be delivered
- 'Loading_OnTime', 'Airport_OnTime', 'Landing_OnTime', 'Transmission_OnTime' are boolean values indicating whether the shipment was processed on time at various stages. If any of these are False, it implies a delay occurred, potentially causing the shipment to miss its cut-off time and be postponed to the next day.
- 'Store_Open' indicates if the truck arrived at the store before closing time. A False value here means the delivery must wait until the next day.
- 'On_Time_Delivery' is a critical indicator of our service level, showing whether a shipment arrived by the requested delivery time.
Understanding the data in these columns helps us identify bottlenecks in the shipment process and take corrective actions to improve our delivery performance.
"""
input_question = "How many shipments were delayed in the first seven days of May?"

💡 观察: 上下文是控制塔经理角色的高层演示和数据库内容。

[块 2]: 代理撰写查询并提供了错误答案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[块 2]: 查询数据库并提供答案 — (作者提供的图片)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试 2:目标结果(左)/ 测试输出(右) — (作者提供的图片)

👎 代理更好地理解了中间标志,但仍然错过了要点。

这个延迟装运的定义虽然不是不合逻辑,但却与操作实际不相符。

💡 观察: 装运即使有一个或多个标志为零,也可以按时进行。只有‘On_Time_Delivery’标志可以确定装运是否延迟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与标志相关的截止时间定义 — (作者提供的图片)

🙋‍♀️ 为了公平起见,这不是一个容易猜测的定义。

因此,我可能应该在上下文中包含一个‘延迟发货’的明确定义。

测试 3: 具有改进上下文的提示模板

我通过增加一个额外的句子来改进了上下文。

‘如果‘On_Time_Delivery’为虚假,则视为延迟发货。’

正如预期的那样,结果很好

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[Block 2]: 查询数据库并提供答案 — (图片作者提供)

👋 代理选择了正确的标志来定义延迟发货。

如果我们要求进行高级分析会怎样?

延迟可能是由于数据集中包含的不同标志所捕捉到的各种原因。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

已交付的发货(上: 准时,下: 延迟)— (图片作者提供)

我们的控制塔团队希望获得每个未按时交付的发货的原因代码

在这家公司中,原因代码由所有虚假的中间标志列表定义。

例如,如果发货延迟:

  1. ‘On_Time_Delivery’ 为虚假

  2. ‘Transmission_OnTime’ 和 ‘Loading_OnTime’ 为虚假。

  3. 因素代码是**‘Transmission_OnTime, Loading_OnTime’**。

测试 4: 具有改进上下文的高级分析

让我们添加一个额外的声明

‘延迟发货的原因代码由所有对该发货为 0 的标志列表定义。’

因此,我可以向代理提出一个新问题:

提供 5 月前七天内延迟发货的总数及其按原因代码的拆分。

不幸的是,代理无法计算出正确的原因代码定义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[Block 2]: 查询数据库并提供答案 — (图片作者提供)

经过多次迭代,我发现代理需要一些指导

因此,我修订了问题

请根据定义创建‘Reason_Code’列。然后,提供 5 月前七天内延迟发货的总数及其按原因代码的拆分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[Block 2]: 查询数据库并提供答案 — (图片作者提供)

现在的输出符合原因的定义,并对延迟交付的根本原因进行了完整分析。

我们能否使用这个输出通过邮件发送报告?

作为最终练习,我想创建一个链条,让代理使用这个输出写一封邮件。

最终测试: 创建一个链条以编写邮件报告

使用 LangChain 创建链条涉及将多个代理组合在一起,以执行一系列任务,每个任务都使用前一个任务的输出。

  • 代理 1: SQL 查询代理 该代理解释用户的问题,制定 SQL 查询,并从数据库中检索数据。

  • 代理 2:电子邮件撰写代理 此代理从 SQL 查询代理获取处理后的数据,并撰写一封连贯且信息丰富的电子邮件。

我们要求代理 2 为我(控制塔经理 Samir Saci)向运营总监 Jay Pity 写一封电子邮件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[区块 3]:使用代理 1 的输出撰写电子邮件 —(作者提供的图像)

💡 观察: 由于未知原因,代理将延迟发货数量按天分割。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[区块 4] 电子邮件输出 —(作者提供的图像)

输出是一封总结查询结果的电子邮件。

  • 在结束电子邮件之前,代理会进行额外的分析。

  • 语调正式,并与物流运营管理的上下文相匹配。

输出可用于使用 Python 的 SMTP 库自动发送电子邮件。

这里是一个例子,

## 使用 Python 自动化 HTML 电子邮件中的运营报告分发

使用 Python 在 HTML 电子邮件中自动分发供应链运营报告。

towardsdatascience.com

我学到了什么?

这个简单的 LangChain SQL Agents 实验教会了我…

  • 代理并非无所不知。因此,必须在上下文中解释具体的业务定义。

  • 即使有很好的上下文,代理也可能需要指导才能提供正确的输出。

  • 可以链接多个代理以执行高级任务。

  • 因为代理有时需要指导,我们可能需要培训用户以提示工程工作。

主要挑战是提供正确的上下文,以确保代理能够回答用户生成的所有问题。

📝额外评论: 我对自己使用 Chat GPT-4 感到惊讶,这对我使用其‘小弟’ GPT-3.5 Turbo 改进提示模板的上下文非常有帮助。

LLMs 正在塑造供应链未来

GPTs 怎么样?

在掌握供应链分析产品的 LLMs 时,我还尝试了 ChatGPT 的新功能 GPTs。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“供应链分析师代理” —(作者提供的图像)

用户可以通过 ChatGPT 用户界面访问此代理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户界面 [测试 GPT: 链接]

主意是创建一个配备核心分析模型(Python 脚本)、上下文和一些提示指导的代理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT 简单架构 [测试这个 GPT:链接]

所以用户可以互动询问

  • 他们的销售进行帕累托或 ABC 分析

  • 一个报告产品组合销售分布的电子邮件模板

你可以在这篇文章中找到更多细节和示例,

[## 创建 GPTs 以自动化供应链分析

“供应链分析师”是一个自定义 ChatGPT 的“GPT”,利用销售数据执行帕累托和 ABC 分析。

s-saci95.medium.com

一个简单的“概念验证”

正如我刚刚开始这个激动人心的旅程,我积极寻求您对我在本文中分享的方法的评论和观察。

最初的结果承诺通过 LLMs 能力增强的“自助式”数据库迎来一个变革性未来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

LangChain 代理连接到多个数据产品 — (作者提供的图片)

这种解决方案,特别适用于实施数据网格的公司,可以通过响应式界面直接连接用户到数据产品,这些产品利用生成式人工智能的强大功能进行增强。

用户没有使用我们的仪表板。为什么?

它使用户能够通过自然语言进行复杂分析,打破我们当前基于仪表板的数据交互方式。

继续原型开发

这些初步测试的结论非常积极。

但在正式完成这个概念验证之前,我还有一些测试要进行。

  • 丰富数据集,包括在途运输和取消订单

  • 测试模型如何处理缺失数据

  • 将代理连接到多个数据库,并测试它如何管理多个数据源以回答问题。

我只会在生产中部署它,进行用户验收测试,以了解用户可能会问什么问题 (并监控代理的行为)

我将在未来的文章中分享我的未来实验。如果你感兴趣,欢迎在 Medium 上关注我。

探索供应链中更广泛的应用

作为供应链数据科学家,我的实验并不止步于此。

我迫切希望探索 LLMs 在供应链分析领域内的其他应用。

这些包括将 LLMs 与优化模型集成:

  • 👬📈 供应链数字孪生

    应用:这个代理将帮助用户使用自然语言场景触发模拟。 (用户可以问:“如果我们把中央仓库移到意大利会怎样?”)

## 什么是供应链数字孪生?

使用 Python 探索数字双胞胎:建模供应链网络、增强决策能力并优化操作。

towardsdatascience.com

  • 🔗🍃 可持续供应链网络设计

    应用:用户可以通过使用自然语言来制定目标和约束,从而创建优化模型。 (用户可以询问:“我希望创建一个满足法国市场需求并最小化 CO2 排放的工厂网络。”)

## 创建可持续供应链优化 Web 应用程序

帮助你的组织结合可持续采购和供应链优化,以减少成本和环境影响…

towardsdatascience.com

  • 🏭🍃 可持续采购:选择最佳供应商

    应用:采购团队可以使用自然语言制定他们的绿色倡议,并查看对成本的影响。

    (用户可以询问:“我们希望估算仅选择碳中和工厂来采购此 SKU 的成本。”)

[## 什么是可持续采购?

你如何利用数据科学来选择最佳供应商,同时考虑可持续性和社会指标…

s-saci95.medium.com](https://s-saci95.medium.com/what-is-sustainable-sourcing-46ad1fade14f?source=post_page-----21e19b33b5f0--------------------------------)

我们还可以使用我们的代理来提高数据质量或支持用于战略报告的数据审核:

  • 📉📄 ESG 报告:环境、社会和治理报告

    应用:自动化审核用于编制报告的数据。

    (审计员可以询问:“你能检索用于计算工厂 XYZ 能源消耗的公用事业账单吗?”)

## 什么是 ESG 报告?

利用数据分析进行全面有效的公司环境、社会和治理报告

towardsdatascience.com

  • 📉✅ 数据质量是什么?

    应用:使用我们的代理来挑战或支持确保数据准确性、一致性和完整性的方法。

    (用户可以问:去年送达但状态丢失的货物数量能分析吗?)

## 什么是数据质量?

探索确保供应链数据的准确性、一致性和完整性的方法论。

towardsdatascience.com

每个领域都有巨大潜力,可以利用生成式 AI 在公司中部署“分析即服务”解决方案。

例如,你能通过智能代理改进这个网页应用的用户界面吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ABC 分析与帕累托图应用程序 — [链接]

如果你分享这种热情,请在评论区提供建议!

关于我

让我们在LinkedinTwitter上互相关注,我是一名供应链工程师,利用数据分析来改善物流运营并降低成本。

如果你对数据分析和供应链感兴趣,请访问我的网站。

[## Samir Saci | 数据科学与生产力

一个专注于数据科学、个人生产力、自动化、运筹学和可持续发展的技术博客。

samirsaci.com](http://samirsaci.com/?source=post_page-----21e19b33b5f0--------------------------------)

💡 关注我的 Medium获取更多与 🏭 供应链分析、🌳 可持续发展和 🕜 生产力相关的文章。

利用机器学习开发有效的营销策略

原文:towardsdatascience.com/leveraging-machine-learning-for-effective-marketing-strategy-development-99b1b887f2f5?source=collection_archive---------9-----------------------#2023-08-01

使用机器学习成功构建营销策略的技巧与窍门

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Elena K.

·

关注 发表在 Towards Data Science · 8 分钟阅读 · 2023 年 8 月 1 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源于 unsplash.com

营销归因模型今天被广泛应用于构建营销策略。这些策略基于将信用分配给客户旅程中的每一个接触点。虽然有很多不同类型的模型,但它们可以分为两组:单触点归因模型多触点归因模型。通常,你可以轻松解释和实施这些模型。它们在少数情况下可能甚至很有用。然而,大多数模型本身无法构建一个稳健的营销策略。问题在于所有这些模型要么基于不适用于某些数据/行业的规则,要么依赖有限的数据量,从而导致有价值的见解丧失。要了解更多关于营销归因模型的类型,可以查看我的上一篇文章

今天,我想讨论我们如何利用机器学习开发营销策略,我们使用的数据,以及我们取得的成果。在本文中,我们将讨论以下问题:

  1. 从哪里获取数据比较好?

  2. 如何为模型训练准备数据?

  3. 如何有效利用模型预测并得出有意义的结论?

我将使用我们一个客户的数据来展示所有这些内容,部分内容经过修改。这些修改不会影响整体结果。我们将这个公司称为XYZ。这些数据的发布已获得客户许可。

数据

有几种方法可以从网站获得流量日志。这些方法并不总是提供你分析所需的全面信息。然而,有时可以将一个来源集成到另一个来源中,而其他时候,你可以手动积累和结合多个来源的数据。你也可以自己编写脚本来收集必要的信息。现在,让我们稍微讨论一下当前最热门的来源以及你可以从中获得的数据:

Google Analytics

Google Analytics (GA4)是一个强大的平台,提供各种网站分析工具,并允许你测量应用程序和网站的参与度和流量。它通常使用最后点击归因,不过,你可以通过收集以下GA4数据来构建你的自定义机器学习归因模型

  • 自动事件(例如ad_click, ad_impression, app_exception, file_download, first_visit, page_view 等);

  • 增强测量scroll, click, video_start, video_progress 等);

  • 推荐事件 (add_to_cart, begin_checkout, add_payment_info, purchase, add_to_wishlist 等)

  • 自定义事件

Google Analytics 为不同的行业提供了不同的事件。

Meta Pixel

Meta Pixel 是一个可以跟踪广告推广和访客在网站上活动的工具。它为你提供了观众如何与 Facebook 和 Instagram 广告互动的见解,以及这些用户点击广告后在你的网站上的行为数据。一般来说,你将获得与使用 Google Analytics 时相同的数据。然而,Meta Pixel 更专注于再营销,因此相比于 Google Analytics,你将获得更多的再营销工具。

Yandex Metrika

Yandex Metrika 具有与上述服务类似的功能。然而,它有其优缺点。缺点是 Yandex Metrika 对一个账户的处理请求有限制(每天 5,000 个请求)。与此同时,Google Analytics 的限制是每天 200,000 个请求。优势是 Yandex Metrika 具有 Webvisor,它可以帮助你获取所有的鼠标移动。

并不是所有可用的服务都可以用来获取用户数据。尽管每个数据源中都表示了许多类型的数据,但在选择数据源时,你可以关注报告配置的便捷性以及与其他产品的集成。我们选择了 Google Analytics (GA4),因为它提供了全面的数据和便捷的工具。此外,数据可以轻松与 BigQuery 集成,我们利用 Google Cloud 基础设施。因此,原始数据如下:

数据准备

回到主要任务,我们的目标是确定哪些 广告活动 更具投资吸引力,以便在保持或增加收入水平的同时减少预算分配的开支。因此,GA4 数据的表示对我们来说很方便,因为它包含有关每个用户操作/接触点的信息,例如:

  • 按钮点击

  • 滚动

  • 照片查看

  • 搜索等

反过来,所有这些行为可以进一步转化为微转化,这正是我们需要的。我们将使用这一组微转化来预测用户在每次会话中进行购买的可能性。

在解决此类任务时,以下微转化可能会引起兴趣:

  • 访问促销页面

  • 查看热门或关键产品

  • 搜索特定尺寸

  • 查看产品照片

  • 查看所有产品照片

  • 查看产品护理信息

  • 将产品添加到购物车等

实际上,你可以自行设定任何数量的微转化。微转化的选择很大程度上取决于你店铺/业务的具体特点。

最终,我们确定了以下特征和微转换用于我们的模型。我们所有特征的总数是 97。这是我们特征的子集:

你可以看到很多与 UTM 相关的特征,它们的含义如下:

  • utm_source 是用于创建媒介的平台或工具的名称;

  • utm_medium 确定流量的类型或高级渠道;

  • utm_campaign 是营销活动的名称;

  • 其他 utm 特征指的是用户旅程或会话中的第一次接触点。

让我们回到其他特征的讨论。一些列在原始数据中可用,因此你无需对它们做任何处理。然而,有些列尚未准备好,你需要先进行一些操作。以下是我们如何获得一个微转换的示例,例如将产品添加到购物车:

模型

我想提醒你,使用这个模型,我们希望获取每个接触点的用户购买概率。然后,我们将其转换为会话中的购买概率。因此,我们使用了一个分类模型,在其中我们利用 predict_proba 获取每次用户交互的购买概率。在尝试了从线性到增强的多个模型后,我们决定使用 CatBoostClassifier。在部署和每天重新训练模型之前,进行了超参数调优。我们不会深入探讨模型创建的细节,因为我们遵循了经典的超参数调优、随后的模型训练和相关指标计算的方法。

现在模型正在使用一个月的数据进行训练,因为将这一时长更改为更长或更短的期间并没有显示出显著的改进。此外,我们使用 0.1 作为确定购买的阈值。我们特别使用这个值,因为它比我们客户的基准购买概率高 10 倍。这作为我们考虑这些事件并调查是否已发生购买的触发器,如果没有发生,则查明原因。换句话说,任何模型概率 > 0.1 的动作都被归类为购买。因此,我们获得了以下 召回率准确率 指标的值:

Recall on the TEST: 0.947
Accuracy on the TEST: 0.999

根据获得的指标,我们可以看到我们仍然遗漏了一些购买。可能这些购买的路径与典型用户旅程有所不同。

所以,我们有了所有特征和模型概率,现在我们想要建立一个报告,并了解哪些 广告活动 被低估,哪些被高估。为了获得 ad_campaign,我们将 utm_sourceutm_mediumutm_campaign 特征结合起来。然后,我们将每个用户会话中的最大概率取出,并将其乘以与测试数据集相同时间框架内的平均订单值。随后,我们通过计算每个广告活动的总和生成报告。

它给我们带来了以下报告:

现在我们必须转向营销指标。由于我们希望衡量营销活动的成功,我们可以考虑以下指标,这些是营销人员经常使用的:

  • ROAS(广告支出回报)是衡量数字广告活动效果的营销指标;

  • CRR(成本收入比)衡量运营费用与企业产生的收入之间的比例。

我们将使用我们的数据进行计算,并与营销人员通常通过last-click attribution获得的ROASCRR值进行比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于我们在分析的期间内只看到三个付费活动,我们将找到这些活动在GA4中的指标,并基于last-click attribution添加实际ROASCRR。我们在上一篇文章中讨论了为什么last-click attribution不是评估广告活动贡献的准确方法。

使用上述公式,我们将计算包含预测ROASCRR的最终报告:

现在我们有了所有数据来得出关于广告活动的结论:

  • 我们可以看到活动***“google/cpc/mg_ga_brand_all_categories_every_usa_0_rem_s_bas”被高估了,因为其预测ROAS比基于last-click attributionROAS*低2 倍。很可能,用户在点击这个广告活动后经常进行购买,但他们已经是潜在客户。

  • 广告活动***“instagram / cpc / 010323_main”被低估了,因为其预测ROAS比实际ROAS*高4 倍

  • 并且活动***“google / cpc / mg_ga_brand_all_categories_every_latvia_0_rem_s_bas”的预测和实际ROAS*相似。

通过这些数据,你可以独立制定下一个周期的营销策略。同时,你也不应忘记营销策略需要测试。然而,这超出了我们文章的范围。

在本文中,我们讨论了机器学习如何用于构建营销策略。我们涉及了数据选择、建模的数据预处理、建模过程本身,以及从获得的结果中提取见解。如果你也在进行类似的任务,你使用的方法也会引起我的兴趣。

感谢阅读!

我希望今天分享的见解对你有价值。如果你想联系我,请随时在我的LinkedIn上加我。

利用管理仪表板进行故事讲述:这是一个可行的途径吗?

原文:towardsdatascience.com/leveraging-management-dashboards-for-storytelling-a-viable-pathway-4bdeeed1fa59

释放叙事力量:数据讲述与仪表板可以共存吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Michal Szudejko

·发布于 Towards Data Science ·阅读时间 8 分钟·2023 年 8 月 2 日

用数据讲故事”这个短语最近受到越来越多的关注。我在自己文章的观众数量增长以及我主持的相关研讨会的参与人数增加中感受到了这一趋势。同时,这一领域的有价值资源也有所增加。这与 2018 年或 2019 年我首次深入研究这一主题时的情况形成了鲜明对比,当时除了 Cole Nussbaumer KnafflicBrent Dykes 出版的优秀书籍和其他内容外,几乎找不到有用的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Campaign Creators 提供,来源于 Unsplash

在他的一个帖子中,Brent Dykes[1]将编写引人入胜的故事过程分为三个步骤:

  1. 故事框架: 这个阶段涉及对数据的深入探索,特别关注独特的维度和指标。

  2. 故事形成: 在这个阶段,任何之前检测到的异常或趋势都会经过彻底的调查。本质上,这是我们培养洞察力的阶段。 在这个阶段评估我们的发现对业务的重要性、理解其来源以及识别发生原因是至关重要的。通常,这个过程需要多轮发现、分析和结论的制定,这进一步细化了研究范围,并要求对数据进行更为专注的分析。

  3. 讲故事: 在这个阶段,我们决定如何使用我们挖掘出的洞察。如果我们决定将这些发现分享给更广泛的受众,讲故事的行为变得至关重要。在这一步,我们润色叙事,设计支持性的视觉效果,并准备适当的评论。**

根据戴克斯的说法,管理仪表板主要在初始阶段展示其价值。它们通过有效的过滤技术促进多维数据分析,并允许用户通过下钻或上钻功能深入细节或从更广泛的视角查看数据。因此,它们有助于识别数据中的模式或异常。

戴克斯说:

… 曾经存在一个重大问题 —— 我从未相信仪表板能讲述数据故事。我在这个 BI 平台(或其他任何平台)中看到的都没有让我改变看法。因为自动化仪表板中的数据不断刷新,潜在的故事点变成了移动的目标——时隐时现,变化不断。

一方面,很难不同意他的观点,不是吗?然而,另一方面,情况真的是这样吗?我提出管理仪表板可能在讲故事过程中扮演更重要的角色。让我们深入探讨它们的功能,并探索如何增强它们在这一过程中的作用。

什么是管理仪表板?

从本质上讲,管理仪表板作为信息管理工具,使用户能够跟踪对任何业务至关重要的关键绩效指标(KPIs)和/或关键结果指标(KRIs),无论是财务还是非财务的。通常,这些仪表板用于呈现当前或历史数据,但越来越多地,它们也在融入预测或情景规划功能。管理仪表板有三种关键类型:

操作性: 这些通常用于回答“当前情况是什么?”这个问题。它们通常包含实时或非常近期的数据。

战略性: 主要由高级管理人员用来监控 KRIs 和 KPIs,这些仪表板通常展示历史数据以提供更广泛的视角,并且经常包括财务数据。

分析性: 这些仪表板数据丰富,用于分析基于历史或预测数据的趋势、关系或异常。

每种仪表板类型在本质上都是独特的,服务于不同的用户,满足不同的需求,因此需要不同的设计方法。

这意味着它们也可以按照讲故事的原则进行设计,特别是操作性和战略性仪表板。

如何按照数据讲故事原则设计管理仪表板?

这可以通过以下方式实现:

  1. 应用叙事结构

  2. 应用视觉层次结构

  3. 使用正确的视觉效果

  4. 使用交互性

  5. 与接收者沟通。

1. 应用叙事结构

在这里,我们可以使用 Brent Dykes 提倡的“讲故事弧”概念 [2] 用于静态叙事练习(如 PowerPoint 演示文稿)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

讲故事弧概念。来源:作者提供的图像,基于 [2]

以下是我如何将这一概念翻译到管理仪表板上的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者提供的图像

这一概念的指导原则集中在仪表板内信息的组织上。最顶部应该展示最重要、综合的高层信息。根据当前的问题,用户可以决定是否深入浏览仪表板的其他部分。随着报告页面的深入,分析可以变得越来越复杂,涵盖更多维度或提供更详细的信息。报告或关键视觉效果的末尾(或侧边)应包括一个专门的推荐区域。这应帮助用户理解观察到的变化是积极的还是消极的,以及这些变化对业务的含义。例如,这可以表现为仪表板内直接生成的预测。

2. 应用视觉层次结构

仪表板设计的另一个关键方面是创建视觉层次结构。目标是确保所有重要元素都易于查看和访问。这可以通过调整颜色、大小或空间位置来实现。

下面,我展示了两个例子来说明视觉层次结构的应用。顶部图像展示了在选择度量值(“当前年份”)时图表如何变化。底部图像则提供了应用于报告级别的视觉层次结构的视角。这两种可视化均使用 Power BI 制作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用视觉层次结构。来源:作者提供的图像

对齐在建立视觉层次结构中也扮演了至关重要的角色。必须正确对齐所有视觉元素,以避免无意中暗示某些元素比其他元素更重要或更不重要。大多数现代仪表板工具提供对齐功能,其中指南特别有用。下图展示了在 Power BI 中使用这些指南的效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者提供的图片

另一个关键建议是尽可能多地加入“留白”:让你的仪表板有呼吸的空间。在设计报告时记住这一点,将有助于更友好的布局,防止信息过载,增强有效传达意图的可能性。这是我对一个平衡良好的仪表板可能样子的演绎(白色实际上是灰色)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平衡仪表板。来源:作者提供的图片

3. 使用正确的视觉元素

什么是正确的视觉元素?

让我澄清一下,什么不是这样。只需在 Google 搜索引擎中输入“最佳讲故事互动可视化”,你将被无数的例子淹没。不要误解我,大多数这些都是非常有效且视觉上令人愉悦的。然而,它们也需要大量的时间和资源来创建,使得它们在现实世界中不那么可行。那么,哪些视觉元素确实会被使用?毫无疑问,以下三个图表脱颖而出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三个总是有效的图表。来源:作者提供的图片

是否总是只有这三种图表?

幸运的是,不一定。根据具体目的,其他几种图表类型也可能有效。例如,你可以考虑将子弹图或摘要图表纳入“问题”区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要图表。来源:作者提供的图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

子弹图。来源:作者提供的图片

我特别喜欢使用微型图表,因为它们有两个功能。首先,它们提供信息。用户可以对当前趋势有一个总体了解。其次,它们有导航的作用。用户可以点击感兴趣的图表或突出显示的重要干扰。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

微型图表。来源:作者提供的图片

4. 使用互动性

互动性是管理仪表板应该真正突出的领域。依我看来,互动性涵盖了两个维度——一个是在工具或过程层面,另一个是在数据或报告层面。

从工具或过程层面来看,互动性可以从三个方面进行评估:

  1. 每个仪表板的数据更新频率。

  2. 数据访问和协作的便利性。例如,用户能否在内部和外部共享仪表板(注意安全问题)?访问报告是否需要 IT 干预,还是用户可以独立管理?

  3. 仪表板的速度。相信我,在这个时代,没有人会有耐心等待性能缓慢的仪表板。

在数据或报告层面,可以通过以下工具引入互动性:

1. 过滤器和滑块:这些通常被使用。高层管理人员在单个仪表板页面上的过滤器应尽量少。这些过滤器也应在选项卡之间功能齐全,并允许全局重置(即,从特定选项卡或整个仪表板中删除所有过滤器)。

2. 警报:电子邮件或推送通知帮助激励用户在新数据可用时访问仪表板。它们必须在内容和频率上保持平衡,以防止它们被标记为垃圾邮件。

3. 放大功能:这对于有多个可视化的拥挤报告页面特别有用。

4. 链接:页面或可视化之间的连接可以改善用户导航。

5. 深入分析和下钻选项(有时也包括上钻):允许深入数据或根据需要获取更广泛的视角。

最后,应考虑创建一个移动优化的报告视图,以提高可访问性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Power BI 中准备移动视图。来源:作者提供的图像

5. 与接收者沟通

许多设计师常常忽视的一个方面是与接收者的对话。这可以以各种形式表现出来。其中一种形式是记录所有必要的定义、计算假设,或甚至报告的作者或拥有者的名字,使个人更容易寻求对报告的澄清。

Power BI 中提供的一种新形式是“智能叙事”。虽然它并不完美(尤其是在波兰语等语言中),但它可以提供有关特定页面上显示的可视化的一些基本信息。

最后,工具提示代表了另一种沟通方式,通常可以根据用户偏好进行自定义。通过工具提示,用户可以获得特定数据点的精确信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Power BI 中的工具提示。来源:作者提供的图像

结论

总之,我希望这篇文章清楚地描绘了通过一点努力,仪表板如何成为讲故事过程中的强大工具。通过专注于周到的报告设计和视觉层次结构,选择合适的视觉元素,融入互动性,并积极与仪表板用户互动,你可以将数据展示提升到一个全新的水平。让我们利用仪表板的力量,从数据中打造引人入胜的叙事!

关注我在 medium.com 上的动态。

在 LinkedIn 上与我联系。

访问我的博客(波兰语).

访问我的 YouTube 频道(波兰语,提供英文字幕的影片)。

参考文献:

[1] Dykes, Brent, 故事框架与故事形成:数据讲故事前的两个关键步骤,2023 年 2 月 22 日。

[2] Dykes, Brent, 有效的数据讲故事:如何通过数据、叙事和视觉驱动变革,2019 年 12 月 17 日。

利用运筹学提升呼叫中心效率

原文:towardsdatascience.com/leveraging-operations-research-for-call-center-efficiency-c625f062c34d?source=collection_archive---------5-----------------------#2023-05-25

利用高效的劳动力优化来推动组织卓越

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Saif Ali Kheraj

·

查看 发表在 数据科学前沿 ·11 分钟阅读·2023 年 5 月 25 日

在当今的数据驱动世界中,组织可以通过利用数据的力量和应用先进的优化模型,高效配置资源、降低成本并提供卓越的客户体验。

当预测分析与处方分析相结合时,它使得管理者能够在公司内做出关键决策。我们将通过利用预测分析的输出 —— 每小时呼叫中心服务代表的需求 —— 来观察这一点,以通过优化来有效分配客户服务代表,最终将导致客户满意度的提高和整体业务费用的降低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:分析金字塔及处方分析的重要性(图由作者提供)

概述

呼叫中心公司面临的关键挑战之一是低接听率,这可能导致客户不满,并可能导致客户流失。例如,如果呼叫中心公司的接听率仅为 70%,这意味着 30%的客户无法联系到公司,这可能会导致挫败感和不满。

在这篇文章中,我们将通过使用带有方程和问题解决的示例场景,解决一个优化问题,以便更好地安排呼叫中心的排班。这将帮助你详细理解一切。我们将在优化过程中施加一些约束,最小化每天和每小时呼叫中心服务代表的短缺。然后你可以更深入地提出一些有趣的软约束,例如几周后的可能休假等,以提高代理的积极性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:Freepik

示例场景:

我们有十名呼叫中心代理必须每天分配到特定的班次。

班次和排班类型

一天中可能有几个班次,中间有休息时间。让我们看看公司管理层如何设计各种可能的班次。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3 — 概念模型 1:带有预定义休息时间和工作时间的班次矩阵(由作者提供)

所以我们有公司管理层设定的总共 16 个班次。例如,如果一名呼叫中心代理被分配到班次 5,则该代理将基本上从 4 点到 12 点工作,中间有一个定义好的休息时间。因此,代理在总共 9 小时的工作时间中,有一个休息时间。

在这种情况下,我们用变量 K 定义班次,用变量 T 定义小时。

设 A 为班次矩阵,如果班次 k 覆盖了时间段 t,则 Akt 为 1,否则为 0。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 1:班次矩阵分配(由作者提供)

我们希望将一个客户服务代表(CSR)分配到每天的一个班次。这些班次将本质上告诉员工在优化后应何时到岗、离岗以及休息。这本质上是我们模型的第一个组成部分。

轮班分配矩阵(决策变量)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4— 概念模型 2:轮班分配矩阵 — CSR 是否被分配到特定轮班(由作者提供)

然后是轮班分配矩阵,我们可以用 I 和 J 来表示客户服务代表和日期。K 已经定义为轮班,我们在前面的部分中定义了总共 16 个轮班。

这个矩阵简单地指示客户代表 I 是否在特定的轮班 K 被分配到日期 J。这基本上是我们的决策变量,我们感兴趣的是将 CSR 分配到正确的轮班,以便在每小时最小化短缺。

决策变量(数学符号)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 2:轮班矩阵分配(由作者提供)

短缺

现在让我们来研究短缺的概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5— 概念模型 3:获取总分配、需求和短缺(由作者提供)

需求已经通过预测模型提供给我们,一旦我们知道每小时分配的客户服务代表总数,我们就可以计算总分配代表数。一旦我们定义了轮班分配矩阵(图 4 — 概念模型 2) 和轮班时间表矩阵(图 3 — 概念模型 1),我们就可以快速构建此表格。我们可以简单地对 10 x 16(概念模型 2)和 16 x 24(概念模型 1)进行点积,得到 10 x 24,其中 10 是呼叫中心服务代表的总数,24 是小时数。因此,通过将每个 CSR 分配到每小时,我们可以轻松实现上述目标(*图 5 — * 概念模型 3)。这使我们能够轻松计算每一天和每小时的总分配 CSR。为了简便起见,我们假设需求为三,但在现实世界中,这将来自基于历史数据的预测模型。

预测模型将基于不同的因素和变量,如历史呼叫量、客户人口统计、季节性、产品/服务趋势。

一旦我们有了总分配和需求,我们可以轻松计算短缺,这正是我们需要最小化的,并将作为我们的目标函数的基础。这就是我们的第三个概念表的总结。

目标函数

现在我们来定义短缺的概念,因为我们需要最小化它。让 y[j,t] 代表第 j 天的时间段 t 中 CSR 的短缺。目标是最小化所有时间段和日期中的 CSR 总短缺,如下面的方程 3 所示。

y[j,t] 是一个派生的决策变量,因为它是基于轮班调度优化模型中的其他决策变量和参数计算得出的。

你可以简单地将短缺视为在概念模型表格 3(上述)中对所有天数进行红色突出显示的总和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 3:目标函数以最小化短缺(图由作者提供)

我们将在约束部分进一步探讨短缺的概念。

约束条件

硬性约束:

  1. 对于每一天和每个时间段,短缺应大于或等于零。短缺是需求和分配的 CSR(供应)之间的差值。如果分配的 CSR 超过了需求,短缺被视为零。我们必须能够表达需求和供应,以便定义短缺。Djt(第 j 天 t 时段所需 CSR 的需求)。让我们将 D[j,t] 定义为第 j 天 t 时段的 CSR 需求。

我们可以简单地使用班次安排矩阵(图 3 — 概念模型 1 图)和班次分配矩阵(图 4 — 概念模型 2 图)来计算每一天特定小时的供应或总分配 CSR。让我通过计算第 0 小时分配的 CSR 数量来演示。

让我们选择我们的班次矩阵(图 3 — 概念模型 1)的第一列(第 0 小时)和班次分配矩阵(图 4 — 概念模型 2)的第一行(CSR 1)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6— 点积运算以计算第 0 小时分配的总 CSR(作者提供)

这是一个直接的点积运算。我们选择了特定一天(星期一)的第 0 小时作为示例。我们对班次矩阵(第 0 小时的图 3)和班次分配(CSR 1 的图 4)进行点积运算。由于 CSR 1 被分配到班次 # 5,该班次没有第 0 小时作为工作时间,因此结果将为零。我们将计算第 0 小时的班次矩阵与所有 CSR 1–16 的乘积,并将其相加以获得第 0 小时的总分配 CSR。我们可以简单地对每个 CSR(I)的所有班次 K 进行求和,并对所有 I 和 J 进行此操作。这是直观的理解,下面的方程与我描述的内容相对应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 4:定义短缺—非线性函数(图由作者提供)

为计算短缺,只需取需求和供应之间的差值(需求 — 供应),如果值为负,表示过剩,我们将其视为 0。通过使用 max 函数来实现这一点。然而,这将不再是线性程序。我们希望能够将此方程转换为线性形式,以便使用线性规划来解决。让我们现在为此定义线性方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 5:定义短缺—线性函数(图由作者提供)

因此,我们已经成功将非线性方程转换为线性方程。

2. 每天仅一班次约束:每位 CSR 每天只能被分配到一个班次,以防工作负荷过重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 6:每个人每天应只参加一个班次(图由作者提供)

对于每个 CSR I 在每一天 J,人员应该正好选择一个班次,所以这里我们只是对该 CSR 在第 J 天的班次 K 进行求和。直观地,你可以把它看作是在班次分配矩阵中对特定 CSR 的求和,并确保它小于等于 1。换句话说,班次分配矩阵中某一天的某行(CSR)必须小于等于 1。

如果人员休假,他应该选择班次 0,你可以自己定义。

软约束

  1. 最大额外 CSR 约束通过设定最大限制来控制额外在岗 CSRs 的数量。这是为了减轻负担并确保积极的积压。我们不会实现这一部分,但让我们讨论一下方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 7:在岗额外 CSRs 的最大数量 — 可选(作者提供的图示)

软约束涉及到额外在岗 CSRs 的最大数量,这意味着超过满足客户需求所需的最低数量的额外 CSRs。我们希望尽量减少额外的 CSRs 数量,但确保目标函数值,记作 W1,至少等于每一天每个时间段的额外 CSRs 总数。

为了实现这一点,我们引入了一个软约束,规定了额外 CSRs 的上限。这个约束确保通过从供应中减去对 CSRs 的需求得到的额外 CSRs 数量不超过指定的最大值。

为了包括这个软约束,我们需要通过添加加权组件 q 来稍微修改我们的目标函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 8:修改后的目标函数 — 可选(作者提供的图示)

目前这超出了范围,但这是为了理解。

实施前的最终方程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终方程 9(作者提供的图示)

在 Python 中的实现(Pyomo 包)

让我们选择之前讨论的相同场景:10 个 CSRs,每天 16 个班次,24 小时,1 天。

 shift_matrix_array = np.array(
    # Shift 1
    [[1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1],
    ])

num_csrs=10
num_days=1
num_shifts=16
num_times=24
shift_matrix_array.shape
shift_matrix_dict=dict()

for row in range(shift_matrix_array.shape[0]):
    #print(row)
    for column in range(shift_matrix_array.shape[1]):
        shift_matrix_dict[row,column]=shift_matrix_array[row,column]

model = ConcreteModel()

# Define the sets
model.I = Set(initialize=range(num_csrs))
model.J = Set(initialize=range(num_days))
model.K = Set(initialize=range(num_shifts))
model.T = Set(initialize=range(num_times))

model.shift_matrix = Param(model.K, model.T, initialize=lambda model, k, t: shift_matrix_array[k][t])

demand = {(j, t): 3 for j in range(num_days) for t in range(num_times)}

model.shift_demand = Param(model.J, model.T, initialize=demand)

# decision variables
model.x = Var(model.I, model.J, model.K, domain=Binary)
model.y = Var(model.J, model.T, within=NonNegativeReals)

model.demand_constraint = ConstraintList()
for j in model.J:
    for t in model.T:
        model.demand_constraint.add(
            model.y[j, t] >= model.shift_demand[j, t] - sum(model.x[i, j, k] * model.shift_matrix[k,t] for k in model.K for i in model.I)
        )

model.one_shift_per_day = ConstraintList()
for i in model.I:
    for j in model.J:
        model.one_shift_per_day.add(sum(model.x[i,j,k] for k in model.K) <= 1)

model.obj = Objective(
    expr=sum(model.y[j, t] for j in model.J for t in model.T) ,
    sense=minimize
)

solver = SolverFactory('glpk')
solver.solve(model)

输出:

print("Day | Hour | Assigned CSRs")
for j in model.J:
    for t in model.T:
        assigned_csrs = []
        for i in model.I:
            for k in model.K:
                if model.x[i, j, k].value == 1 and model.shift_matrix[k, t] == 1:
                    assigned_csrs.append(i)
        print(f"{j}   | {t:02}  | {assigned_csrs}")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7— 每小时在特定日期分配的 CSRs(作者提供的输出)

print("CSR | Assigned Shift")
for i in model.I:
    assigned_shift = []
    for j in model.J:
        for k in model.K:
            if model.x[i, j, k].value == 1:
                assigned_shift.append(k)
                #break
        if assigned_shift is not None:
            break
    print(f"{i}   | {assigned_shift}")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9— 分配给每个 CSR 的班次(作者提供的输出)

total_shortage = sum(max(model.shift_demand[j, t] - sum(model.x[i, j, k].value * model.shift_matrix[k, t] for i in range(num_csrs) for k in range(num_shifts)), 0) for j in range(num_days) for t in range(num_times))

print("Total shortage:", total_shortage)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10— 优化后的总短缺(作者提供的输出)

如我们所见,尽管仍然缺少 4 个 CSRs,但这是经过优化的结果,我们可能需要招聘额外的 CSRs。因此,这也指导了招聘决策过程,并且我们可能节省招聘额外 CSRs 的成本。

结论:

总之,尽管呼叫中心排班的代码看起来很简单,但在实施优化模型之前,必须有一个扎实的概念模型,并对各种因素进行深思熟虑。通过结合软约束,如考虑额外值班客服代表的最大数量以及解决短缺问题,我们可以有效应对呼叫中心排班相关的挑战。

无论是医疗保健人员配置、零售劳动力管理,还是物流规划,数据科学和优化的应用都能帮助解决资源分配和短缺的类似挑战。通过利用这些方法,组织可以优化运营、提高效率,并增强客户满意度。COVID-19 大流行突显了跨行业高效资源管理的重要性。服务需求和有效排班的需求比以往任何时候都更加突出。

参考文献

[1] 市场研究 — www.reportlinker.com/p087286/World-Call-Centers-Markets.html

[2] 一种混合人员排班模型用于员工排班问题 — www.mdpi.com/2227-7390/8/10/1702

[3] 人员排班: www.coursera.org/learn/operations-research-modeling

利用 qLoRA 对任务精调模型进行精调而不产生灾难性遗忘:以 LLaMA2(-chat)为例

原文:towardsdatascience.com/leveraging-qlora-for-fine-tuning-of-task-fine-tuned-models-without-catastrophic-forgetting-d9bcd594cff4?source=collection_archive---------1-----------------------#2023-09-07

了解如何在保持任务特定性质的同时,将知识注入目的精调模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Aris Tsakpinis

·

关注 发表在 Towards Data Science · 11 分钟阅读 · 2023 年 9 月 7 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 StableDiffusionXL 提供,托管在 Amazon Web Services

这篇文章讲了什么,为什么重要?

像 Anthropic 的 Claude 或 Meta 的 LLaMA2 这样的语言大模型(LLMs)在各种自然语言任务中展示了令人印象深刻的能力。然而,它们的知识和任务特定技能仍然相对通用——如果你想执行需要明确知识的更专业的领域特定任务,你需要找到方法将知识注入模型并教它们任务特定的行为。LLM 驱动的应用需要在其目标领域中正常工作,提供准确的答案而不是产生幻觉,并确保安全、隐私和适当的内容。

这些挑战通常被称为“有用性、诚实性和无害性”的“三个 H”。克服这些挑战在设计企业级应用时被证明特别重要。

将领域知识传递到基础模型中有几种选择:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者插图

  • 源知识: 你可以通过提示工程和基于示例或上下文注入生成动态提供知识。这种选项以相对简单的方式呈现,如零样本或少样本提示。然而,还有更复杂的方法来整合外部知识源。通过动态提示组合注入知识,从各种外部“工具”(检索增强生成、数据库检索器、数据湖检索器、通过 REST-ful API 的实时系统等)获取信息的源知识正在变得越来越受欢迎。

  • 参数知识: 你可以通过微调直接更新模型参数。这样,预训练的权重将调整到一个比预训练时更小的、领域特定的数据集,从而接近于领域特定的知识库或任务。

正如 Heiko Hotz 在他的 博客文章 中解释的那样,选择正确的方法(或两者的组合)存在权衡。在这篇博客中,我们将重点介绍参数方法,并演示如何在 Amazon SageMaker 上使用 PEFT(参数高效微调)对 LLaMA2 模型进行微调。

我们的目标是将 LLaMA2 适应于特定领域,获取最新的知识以克服“知识截止”问题,即模型缺乏对未纳入其训练数据的最新信息的意识。与任务特定的微调不同,这对于许多从业者来说是一个更可实现的任务,因为他们可以简单地使用包含领域特定信息的文本语料库作为训练数据集,而不是像对话或指令数据集那样手动制作或收集任务特定的数据集。

由于许多相关的 LLM 驱动的使用场景中,任务特定模型是有益的,我们还将展示所提议的设置如何同样适用于像 LLaMA2-chat 这样的模型,这些模型已经进行了任务特定的微调而不失去其任务特定特性(例如指令跟随、对话行为等)。

通过详细介绍这一端到端的知识注入工作流程,我们提供了一个将基础模型调优以满足特定需求的实用指南。

模型

LLaMA2 模型于 2023 年 7 月发布,并附有一篇研究论文。在论文中,Touvron 等人表示,LLaMA2 是“一个预训练和微调的大型语言模型(LLMs)集合,规模从 70 亿到 700 亿个参数不等。我们的微调 LLMs,称为 Llama 2-Chat,专门针对对话使用场景进行了优化。我们的模型在我们测试的多数基准上超过了开源聊天模型,并且根据我们对有用性和安全性的人工评估,可能是闭源模型的合适替代品。”

如前所述,LLaMA2 模型有三种尺寸:7B、13B 和 70B。它们既有纯完成模型,也有针对对话使用场景优化的版本。预训练时使用了大约 2 万亿个标记,它们支持最长 4096 个标记的上下文长度。针对对话使用场景的微调使用了超过 10 万个示例,并通过超过 100 万个代表人类偏好的训练样本进一步优化。

在 AWS 中,LLaMA2 模型可以通过SageMaker JumpStart一键部署,也可以通过AWSxHuggingFace LLM DLC从 HuggingFace 模型库中获取。

微调

微调利用迁移学习高效地将特定领域的专业知识注入到像 LLaMA2 这样的基础模型中。该过程涉及通过在特定领域的数据上继续预训练来更新模型的权重,同时保持整体网络结构不变。与需要大量数据集和计算的全面预训练不同,微调在样本和计算方面非常高效。参数高效的微调(PEFT)技术,例如(q)LoRA 方法,使得在像 LLaMA2 这样的通用语言模型中轻量化地注入专业知识成为可能,且开销最小。

在谈到微调时,有两种不同的方法可以选择:

  1. 通过在领域特定语料库上微调 LLaMA2 的仅解码器架构,利用其原生的自回归因果语言建模(CLM)方法,我们可以将专业知识或特定语言或词汇(例如医疗研究术语/语言)注入到 LLM 中,同时保留其通用语言能力。

  2. 另一方面,通过使用特定任务的语料库,可以将模型微调为特定任务,例如指令跟随或对话行为。

这些模型利用自监督训练方法,优化特定于语言建模(LM)的损失函数。像 LLaMA2 这样的仅解码器模型采用了因果语言建模(CLM)方法,具有单向上下文。简单来说,这意味着它们是通过根据之前的词语作为语义上下文,预测后续标记的自回归方式进行训练的。

如上所述,PEFT 技术使得将专业知识轻量级地注入到 LLM 中成为可能,因为仅更新模型参数的子集。低秩适配方法(LoRA)或量化低秩适配方法(QLoRA)冻结预训练模型权重,并将可训练的秩分解矩阵注入 Transformer 架构的每一层,大大减少了下游任务的可训练参数数量。如果你想深入了解 LoRA,建议查看 Mariano Kamp 的 博客文章

场景

7 月 26 日,AWS 在纽约市 AWS 峰会上宣布了生成式 AI 领域的多项新功能。为了分享更多细节,发布了几篇公告博客:

· Amazon Bedrock 的代理

· AWS 实体解析匹配

· 向量存储在生成式 AI 应用中的作用

· Amazon OpenSearch Serverless 的向量引擎

· AWS Glue Studio 笔记本,由 Amazon CodeWhisperer 提供支持

· Amazon EC2 P5

考虑到 LLaMA2 的知识截止日期,不幸的是,该模型的纯形式将无法提供有关这些公告的信息。我们希望通过利用微调将这些知识注入到基础模型(FM)中,并提升其知识水平以实现这一点。

由于我们不打算将模型微调到特定任务上,而是希望摄取领域特定的知识,我们可以使用经典的 CLM 基础方法(前面章节中的选项 1)。Philipp Schmid 在他非常全面的博客中描述了如何使用 QLoRA 对 LLaMA2 模型进行微调,但重点是任务特定(指令)微调。我们将以他的博客中分享的代码样本为起点,并相应地调整代码。

为了负责任地使用资源,我们将对 LLaMA2–13b 和 LLaMA2–13b-chat 模型进行微调。微调 7b 及 70b 版本将使用调整后的训练集群配置(参见 Philipp 的博客)。在微调完成后,我们将部署基础模型和微调后的模型,并进行高层次的性能比较。

随后,我们将逐步讲解微调模型的每个步骤。如果您想访问完整的代码仓库,可以在这里找到。

数据加载

对于数据加载,我们使用 LangChain 的 WebBaseLoader 加载由其 URL 标识的网站数组。

许可协议与 HuggingFace 登录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接受 LLaMA2 模型的许可协议

在我们开始数据准备和训练之前,我们需要接受 LLaMA2 模型的许可协议。这包括在 Meta 网站上的注册,所用的电子邮件地址需与您的 HuggingFace 账户邮箱匹配。

然后我们从运行时对 HuggingFace hub 进行身份验证。

数据准备

首先,我们对原始网站进行一些预处理。在实际应用中,可能会更重视这一步骤。为了演示的目的,我们仅仅去除了较大的空格拼接,以获得一个连贯流畅的文本语料库。然后我们将文档列表加载到 HuggingFace 数据集中。

在下一步中,我们对文本语料库进行分词处理,使其适合 LLM。为此,我们使用从 HuggingFace hub 加载的 LLaMA2 分词器。加载后的分词器可以用于对根据模型的上下文窗口(2048 个 tokens)批量处理后的数据进行分词。

然后我们将数据集保存到 S3 中,以便在训练作业中使用。

培训

现在我们可以触发一个 Amazon SageMaker 训练作业,执行基于预处理数据的 CLM 绑定 QLoRA 微调脚本。

超参数和训练脚本参考了 Philipp 的博客文章。唯一的例外是执行的训练轮次数量,我们选择了相对较高的 20 轮。这是为了考虑到我们的训练数据集相对较小(约 32k 个标记)。在实际应用中,建议使用更大的数据集进行微调。训练脚本本身可以在 这里 找到。

请注意:由于接受的模型许可证协议与您的 HuggingFace 帐户绑定,我们需要指定 HuggingFace 访问令牌。

训练作业配置,例如训练集群配置,也参考了 Philipp 的博客文章。

然后我们可以执行训练作业,这将进行微调并将模型工件保存到 S3 中。

部署

基础模型 LLaMA2–13b 和 LLaMA2–13b-chat 可以通过 SageMaker JumpStart 方便地部署。这个 博客文章 提供了详细的说明。

经过微调的两个模型可以通过使用 AWSxHuggingFace LLM DLC 进行部署。因此,我们将 HuggingFaceModel 类的 model_data 参数指向模型工件的 S3 路径。然后,我们可以将托管容器中设置的环境变量 HF_MODEL_ID 指向 DLC 内的默认模型路径(“/opt/ml/model”)。

测试

部署所有四个模型后,我们希望在示例问题上测试性能。关于 Amazon EC2 P5 实例的公告 博客文章 说明:“P5 实例提供 8 个 NVIDIA H100 Tensor Core GPU,配有 640 GB 的高带宽 GPU 内存,第三代 AMD EPYC 处理器,2 TB 系统内存,以及 30 TB 本地 NVMe 存储。P5 实例还提供 3200 Gbps 的汇总网络带宽,支持 GPUDirect RDMA,通过绕过 CPU 实现更低延迟和高效的扩展性能。”

我们提出以下问题:“什么是 Amazon EC2 P5 实例?它们配备了什么类型的 GPU?”聊天模型在推理配置 max_new_tokens = 200, top_p = 0.9, temperature = 0.01 下的回答如下:

  • LLaMA2–13b-chat: “Amazon Elastic Compute Cloud (EC2) P5 实例是一种提供高性能计算资源的实例,适用于需要强大计算能力的应用程序。这些实例配备了 NVIDIA Tesla V100 GPU,专为机器学习、科学模拟和其他高性能计算工作负载设计。\n\nAmazon EC2 P5 实例的 NVIDIA Tesla V100 GPU 基于 Volta 架构,并提供多种功能,使其非常适合需求严格的工作负载,包括:\n\n 5120 个 CUDA 核心,用于高性能计算\n* 640 个张量核心,用于加速深度学习和其他基于矩阵的工作负载\n* 16 GB 的 GDDR6 内存,用于快速数据传输和处理\n* 支持 NVIDIA 的 GPU 加速库和框架,如 CU…*”

  • LLaMA2–13b-chat-nyc-finetuned: “Amazon EC2 P5 实例是一种通用实例,为需要大量图形处理和复杂机器学习(ML)模型的应用程序提供极端性能。它们由 NVIDIA H100 Tensor Core GPU 和第三代 AMD EPYC 处理器驱动。H100 GPU 提供 640 GB 高带宽 GPU 内存,使您能够在实时运行大规模数据集的最具挑战性应用程序。P5 实例还提供 2000 GB 高速 CPU 内存,允许您在内存中处理大量数据,而无需访问磁盘存储。这减少了处理时间并改善了响应时间。您可以将这些实例用于计算机视觉、视频编码、基因组分析和语言模型训练等应用程序.

我们可以清楚地看到,尽管基础模型幻想了 GPU 类型(V100),但经过精调的模型为我们提供了正确的答案(H100)。我们还看到,通过 qLoRA 我们可以保留基础模型的聊天精调特性,从而减轻灾难性遗忘。这意味着我们可以向 LLM 注入知识,而不必在之后进行完全的指令/聊天精调,只需使用相应的任务精调模型作为基础模型即可。这种方法有效的原因在于 LoRA 的性质,其中神经网络的每一层的大部分部分保持不变,而层级则被扩展。

对于模型的纯完成版本,我们需要重新提出问题,因为这些模型无法理解指令或以对话方式行事。相反,它们只是通过自回归的下一个 token 预测来完成标记序列。

我们提出以下问题:“Amazon EC2 P5 实例配备了类型的 GPU” 完成模型通过推断配置为 max_new_tokens = 200,top_p = 0.9,temperature = 0.01 回答如下:

  • LLaMA2–13b:“NVIDIA Tesla V100。\nNVIDIA Tesla V100 是一种旨在进行高性能计算的 GPU。它基于 NVIDIA Volta 架构,并配备了 32GB 的 HBM2 内存。V100 能够提供高达 100 teraflops 的性能,并设计用于数据中心和超级计算机。\nNVIDIA Tesla V100 是一种强大的 GPU,旨在进行高性能计算。它基于 NVIDIA Volta 架构,并配备了 32GB 的 HBM2 内存。V100 能够提供高达 100 teraflops 的性能,并设计用于数据中心和超级计算机。\nNVIDIA Tesla V1…

  • LLaMA2–13b-nyc-finetuned:“NVIDIA A100 用于计算密集型工作负载,例如生成 AI、高性能计算(HPC)和数据分析。P5 实例非常适合训练和运行具有万亿参数的模型以及在庞大数据集上进行数据分析。与 P4 实例相比,它们提供了 8 倍的 GPU 内存和 64 倍的浮点运算(FLOPs)计算性能。\n 您可以在 Amazon Elastic Container Service(ECS)中使用 P5 实例,支持最常见的容器工具和框架,如 Docker、PyTorch、TensorFlow、Jupyter Notebook、R Studio 和 Venv,或通过 Amazon Elastic MapReduce(EMR)或 Amazon DeepSense 使用 Amazon 或其他公司提供的 ML 和 AI 框架和工具来使用 P5 实例。为了便于在 P5 实例上构建生成 AI 应用程序,…

尽管用少量数据微调聊天微调模型已导致消除了基于 LLaMA2 模型的幻觉,但在我们的设置中似乎不起作用。这可能是因为我们微调数据集的大小有限。此外,更复杂的提示工程和优化推理配置参数设置可能会有所帮助。

结论

总之,这篇博客文章深入探讨了将领域特定知识融入大型语言模型(LLMs)如 LLaMA2 的关键过程,强调了在设计 LLM 驱动的企业级应用时,解决有用性、诚实性和无害性等挑战的重要性。这里的主要关注点是参数化微调方法,它可以有效地将专业知识注入基础模型而不影响其通用语言能力。

博客文章重点介绍了使用参数高效微调技术(如 qLoRA 方法)微调 LLaMA2 的步骤,以及如何在 Amazon SageMaker 上进行这一过程。通过采用这种方法,实践者可以将 LLaMA2 适应于特定领域,确保模型即使在超出原始训练数据的情况下也能保持最新的知识。

文章还强调了这种方法的多功能性,显示它可以应用于像 LLaMA2-chat 这样的模型,这些模型已经经过了特定任务的微调。这为将知识注入到 LLM 中提供了机会,而无需进行广泛的指令或基于对话的微调,从而保持了其特定任务的特性。

10 分钟理解 Lineage 和 Hamilton

原文:towardsdatascience.com/lineage-hamilton-in-10-minutes-c2b8a944e2e6?source=collection_archive---------8-----------------------#2023-05-26

通过使用 Hamilton 的开箱即用的 Lineage 功能,减少调试管道的时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Stefan Krawczyk

·

关注 发表在 数据科学前沿 · 11 分钟阅读 · 2023 年 5 月 26 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hamilton + Lineage:使您能够可视化和理解事物之间的联系。这是通过 driver.visualize_path_between()创建的。图像由作者提供。

Hamilton 是一个通用的开源微框架,用于描述数据流。它非常适用于数据和机器学习(ML)工作。在这篇文章中,我们将引导你了解 Hamilton 的血缘关系功能,这些功能可以帮助你快速回答在数据和机器学习工作中常见的问题,从而提高工作效率,更有效地与同事合作。如果你不熟悉 Hamilton,我们邀请你浏览以下内容:

血缘关系

你可能会问,我所说的血缘关系是什么意思?在机器学习和数据工作中,“血缘关系”指的是数据在转化和处理成表格、统计模型等形式时的历史记录或可追溯性。血缘关系帮助确定“数据”的来源、质量和可靠性,因为它有助于理解数据如何被转化。

你为什么应该关注血缘关系?

如果你是你必须管理的内容的作者,你可能对你写的所有内容如何连接有一个大致的了解。,对于继承你工作的其他人,或引入一个合作者,或者调试你六个月前写的东西,迅速了解情况可能会是一个挑战!我听说过有团队花费超过四分之一的时间来理解同事留下的工作(他们显然没有使用 Hamilton)!在这种情况下,血缘关系可以提供很大的帮助。为了提供更多背景,以下是一些导致生产力损失、普遍不满甚至中断的常见情况:

(a) 调试你的训练集/模型中的数据问题(结果发现是上游数据问题)。

(b) 尝试确定他人的管道如何工作(因为你继承了它,或必须与他们合作)。

© 需要满足某些数据如何到达某处的审计要求(例如 GDPR、数据使用政策等)。

(d) 想要对一个功能/列进行更改,但没有好的方法来评估潜在影响(例如,业务发生了变化,收集的数据也发生了变化)。

从实际角度来看,大多数从事数据和机器学习的人不会遇到或理解“血统”的价值,因为往往做到这一点很麻烦。通常需要一个外部系统(如 open lineageAmundsenDatahub 等),然后用户需要额外工作以填充信息。好消息是,如果你使用 Hamilton,不需要另一个系统来获取血统;使用血统也很直接!

血统即代码

使用 Hamilton,你不需要添加任何其他内容,你就可以获得血统。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写代码。获取类似这样的血统。这是使用 Hamilton Driver 的 visualize_execution() 函数创建的。图片由作者提供。

通过以 Hamilton 方式编写代码,你在函数中定义了计算,然后通过函数输入参数指定事物如何连接,编码血统。将此代码与例如版本控制系统(如 git)连接起来,也为你提供了在时间点快照血统的手段!因为你必须更新代码以更改计算操作方式,因此,按定义,你也更新了血统,而无需做任何额外的操作 😎。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hamilton 范式概述。你编写的函数定义了计算应如何进行,而不是编写过程性代码。以这种方式定义函数完全映射到血统!

高层次的“血统即代码”及其后续访问的步骤是:

  1. 编写 Hamilton 代码并进行版本控制。

  2. 实例化一个 Hamilton Driver,它将会有一个表示数据和计算流动的方式,正如你的 Hamilton 代码所定义的。Driver 对象可以发出/提供关于血统的信息!

  3. 使用你的版本控制系统,你可以回溯到过去,以理解血统如何随着时间的推移而变化,因为它被编码在代码中!

添加元数据以使血统更加有用!

当你还可以将元数据附加到血统上时,血统会变得更加有用。Hamilton 默认使你能够表达事物如何连接,但通过附加额外的元数据,我们现在可以通过 Hamilton 编码的血统连接业务和公司概念。

例如,你可以为提取数据的函数添加关切点,如PII、所有权、重要性等,并为创建重要文物的函数(如模型、数据集)添加类似信息。现在这些函数已被注解,能够回答的问题集就大大增加了!相比之下,其他系统要求你将这些元数据放在其他地方;例如一个 YAML 文件、代码库的不同部分,或在其他地方单独整理这些信息。在 Hamilton 的哲学中,我们认为直接注解实际代码最为合理,因为这样可以确保代码和元数据的真实来源始终保持最新。使用 Hamilton 更容易维护,因为只需在一个地方进行更改。

在 Hamilton 中,添加额外元数据的方法是通过使用 [@tag](https://hamilton.dagworks.io/en/latest/reference/decorators/tag/#hamilton.function_modifiers.tag)[@tag_outputs](https://hamilton.dagworks.io/en/latest/reference/decorators/tag/#hamilton.function_modifiers.tag) 装饰器。它们允许指定任意的字符串键值对。这提供了灵活性,使你和你的组织能够定义适合你们上下文的标签和值。

例如,以下代码为:

titanic_data 函数指定了其 sourceownerimportance,包含 PII,并链接到一些内部维基。

agesex 列添加了大量元数据,指定它们是 PII。

注意:我展示了一个稍微复杂的示例,使用了多个装饰器,只是为了说明情况不会比这更复杂——代码仍然相当易读!

@tag_outputs(age={"PII": "true"}, sex={"PII": "true"})
@extract_columns(*columns_to_extract)
@tag(
   source="prod.titantic",
   owner="data-engineering",
   importance="production",
   info="https://internal.wikipage.net/",
   contains_PII="True", 
   target_="titanic_data",
)
def titanic_data(index_col: str, location: str) -> pd.DataFrame:
    """Returns a dataframe, that then has its columns extracted."""
    # ... contents of function not important ... code skipped for brevity

以下代码从业务角度提供有关正在创建的模型的更多上下文:

@tag(owner="data-science", importance="production", artifact="model")
def fit_random_forest(
    prefit_random_forest: base.ClassifierMixin,
    X_train: pd.DataFrame,
    y_train: pd.Series,
) -> base.ClassifierMixin:
  """Returns a fit RF model."""
  # ... contents of function not important ... code skipped for brevity

现在这些额外的元数据附加到函数和血缘上,我们可以将其作为上下文来提出更有用的问题。更多内容见下文。

如何使用 Hamilton 回答血缘问题

回答血缘问题的基本机制依赖于实例化一个 Hamilton Driver,该 Driver 在底层创建一个有向无环图 (DAG) 来表示其世界观,然后使用 Driver 拥有的函数。让我们列出相关的 Driver 函数及其功能。

可视化血缘(即显示 DAG):

  • display_*() 有三个 display_* 函数。一个帮助你显示定义的所有连接关系。然后一个函数用于仅可视化上游内容,最后一个函数可视化给定函数/节点的下游内容。

  • visualize_execution() 帮助可视化生成某些输出所需的一切。用于展示 .execute() 的作用。

  • visualize_path_between() 帮助可视化两个节点之间的路径。

获取谱系需求的元数据访问权限:

使用 Hamilton 和上述函数,你可以对谱系进行编程访问以及可视化,这意味着你可以在 CI 系统中、在运行生产代码的笔记本中,或在任何 Python 运行的地方提出这些问题!

回顾一下到目前为止讨论的内容,回答谱系问题的一般方法如下:

  1. 编写 Hamilton 代码。

  2. 使用 @tag 来注释函数。

  3. 实例化一个 Driver 来创建你的 DAG。

  4. 使用 Driver 函数来提问/回答问题。

为了简短起见,我们不会深入探讨它们的使用,我们将简单展示一些你可以用 Hamilton 直接回答的一般问题,并结合上面提到的函数举例。我们将使用的示例问题是一个 Hamilton 中的端到端模型管道,用于预测泰坦尼克号的生存率;代码和更多信息可以在 Hamilton 仓库的谱系示例 中找到。术语说明:我们将 functionnode 互换使用,因为在 Hamilton 中,function 在我们的可视化中会变成 node

(1) 生成这个数据/模型的操作序列是什么?

这是一个常见的问题,如何从A->B,其中A可以是某些数据,**->** 对我们来说是不透明的,B 可以是某个工件(可以是更多数据或模型/对象)。

借助 Hamilton,通过以 Hamilton 规定的风格编写代码,您可以清晰而轻松地定义操作的顺序以及它们之间的关系!所以如果您不能通过查看代码本身来回答这个问题,可以请 Hamilton 提供帮助。在我们的示例中,为了了解feature_encoders是如何创建的,即使对它们知之甚少,我们也可以请求 Hamilton Driver 为我们可视化它们的创建过程:

...
# create the driver
dr = driver.Driver(config, data_loading, features, sets, model_pipeline, adapter=adapter)
# visualize how it's created
dr.visualize_execution(
    [features.encoders], "encoder_lineage", {"format": "png"}, inputs=inputs
)

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示例血缘可视化。图像由作者提供。

然后,您可以将其与浏览代码库相结合,以更轻松地导航和理解发生了什么。

(2) 谁/哪些数据源导致了这个工件/模型?

这对于调试数据问题以及理解一个工件/模型依赖于哪些团队和数据源非常有用。以我们的泰坦尼克号示例为例,假设我们的随机森林模型出现了一些异常,我们想要重新检查当前生产模型的数据源是什么以及它们的所有者,以便我们可以联系他们。为此,我们可以编写以下代码:

# create the driver
dr = driver.Driver(config, data_loading, features, sets, model_pipeline, adapter=adapter)
# Gives us all the operations that are upstream of creating the output.
upstream_nodes = dr.what_is_upstream_of("fit_random_forest")

上述两行创建了一个 Driver,然后提取fit_random_forest的所有上游节点。然后我们可以遍历这些节点并提取我们想要的信息:

teams = []
# iterate through 
for node in upstream_nodes:
  # filter to nodes that we're interested in getting information about
  if node.tags.get("source"):
    # append for output
    teams.append({
      "team": node.tags.get("owner"),
      "function": node.name,
      "source": node.tags.get("source"),
    })
print(teams)
# [{'team': 'data-engineering', 
#   'function': 'titanic_data', 
#   'source': 'prod.titanic'}] 

(3) 谁/什么在这个变换的下游?

回答这个问题实际上是(2)的补充。当有人想要更改特征或数据源时,您通常会遇到这个问题。以我们的泰坦尼克号示例为例,假设我们在数据工程部门,想要更改源数据。我们如何确定使用这些数据的工件是什么以及谁拥有它们?

我们使用what_is_downstream_of() Driver 函数来获取下游的节点:

# create the driver
dr = driver.Driver(config, data_loading, features, sets, model_pipeline, adapter=adapter)
# Gives us all the operations that are upstream of creating the output.
downstream_nodes = dr.what_is_downstream_of("titanic_data")

然后类似于(2),我们只需遍历并提取我们想要的信息:

artifacts = []
for node in downstream_nodes:
  # if it's an artifact function
  if node.tags.get("artifact"):
      # pull out the information we want
      artifacts.append({
          "team": node.tags.get("owner", "FIX_ME"),
          "function": node.name,
          "artifact": node.tags.get("artifact"),
      })
print(artifacts)
# [{'team': 'data-science', 'function': 'training_set_v1', 'artifact': 'training_set'}, 
#  {'team': 'data-science', 'function': 'fit_random_forest', 'artifact': 'model'}, 
#  {'team': 'data-science', 'function': 'encoders', 'artifact': 'encoders'}]

(4) 什么被定义为 PII 数据,它最终会出现在哪些内容中?

随着目前的法规,这成为了一个越来越常见的问题。基于上述内容,我们可以结合几个 Driver 函数来回答这类问题。

在我们的泰坦尼克号示例中,假设我们的合规团队来找我们了解我们如何使用 PII 数据,即它最终会出现在哪些工件中?他们希望每个月都能收到这份报告。好吧,借助 Hamilton,我们可以编写脚本以程序化地获取与 PII 数据相关的血缘信息。首先,我们需要获取所有标记为 PII 的内容:

# create the driver
dr = driver.Driver(config, data_loading, features, sets, model_pipeline, adapter=adapter)
# using a list comprehension to get all things marked PII
pii_nodes = [n for n in dr.list_available_variables() 
             if n.tags.get("PII") == "true"]

然后,要获取所有下游的工件,我们只需请求所有下游的节点,然后筛选出带有“artifact”标签的节点:

pii_to_artifacts = {}
# loop through each PII node
for node in pii_nodes:
  pii_to_artifacts[node.name] = []
  # ask what is downstream
  downstream_nodes = dr.what_is_downstream_of(node.name)
  for dwn_node in downstream_nodes:
    # Filter to nodes of interest
    if dwn_node.tags.get("artifact"):
      # pull out information
      pii_to_artifacts[node.name].append({
          "team": dwn_node.tags.get("owner"),
          "function": dwn_node.name,
          "artifact": dwn_node.tags.get("artifact"),
      })
print(pii_to_artifacts)
# {'age': [{'artifact': 'training_set',
#         'function': 'training_set_v1',
#         'team': 'data-science'},
#        {'artifact': 'model',
#         'function': 'fit_random_forest',
#         'team': 'data-science'}],
# 'sex': [{'artifact': 'training_set',
#         'function': 'training_set_v1',
#         'team': 'data-science'},
#        {'artifact': 'encoders', 'function': 'encoders', 'team': None},
#        {'artifact': 'model',
#         'function': 'fit_random_forest',
#         'team': 'data-science'}]} 

我可以在我的笔记本/IDE 中获得这个吗?

你们中的一些人可能在想,为什么在开发时不使用这种 lineage 视图?好主意!由于我们是一个开源项目,我们很乐意在这方面获得一些帮助;如果你有兴趣进行测试/贡献,我们有一个由 Thierry Jean 发起的 alphaVSCode 扩展,可以帮助你在输入时可视化 lineage。我们欢迎贡献。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Alpha Hamilton VSCode 扩展由 Thierry Jean 发起。图片作者提供。

最后

使用 Hamilton,你的代码定义 lineage。这意味着你可以开箱即用地获得 lineage,而无需另一个系统,并且当结合版本控制系统和额外的 metadata 时,是一种非常简单轻便的方式来理解数据与代码的连接。

Hamilton 允许对你编码的 lineage 和 metadata 进行程序化访问,这使你可以将其放置在 CI 作业、脚本或任何 Python 运行的地方。

希望你喜欢这个快速概述,如果你对其中任何内容感到兴奋或想要更多资源,这里有一些链接:

你可能感兴趣的其他 Hamilton 文章:

线性代数 1:线性方程和系统

原文:towardsdatascience.com/linear-algebra-1-1-15b70e48bab9?source=collection_archive---------2-----------------------#2023-09-16

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Städel Museum

线性方程组

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 tenzin migmar (t9nz)

·

关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 9 月 16 日

前言

这是关于线性代数基础的系列文章的首次更新,线性代数是机器学习的基础数学。这篇文章将与 David C. Lay、Steven R. Lay 和 Judi J. McDonald 合著的《线性代数及其应用》一起阅读效果最佳。请将本系列视作一个外部补充资源。

通过这些文章,我希望巩固对这些基础概念的理解,同时如果可能的话,以我希望的直观学习方法向他人提供额外的清晰度。如果有任何错误或需要进一步阐述的地方,请分享,我会做必要的修改。

背景

线性方程和线性方程组在金融、工程、化学、计算机科学、统计学、物理学等领域具有多种实际应用。在化学中,线性方程用于平衡化学反应并计算反应物和产品的数量。这一线性代数的基石也出现在物理学中,其中线性方程用于运动学和热力学中描述物体的运动,帮助计算距离、速度和加速度,以及模拟物理系统中的热传递和能量流动。金融领域依赖于线性方程和方程组进行预算和投资组合分析,而工程师则可能使用相同的工具进行结构分析,以建模建筑物中的力和应力。线性代数无处不在,每个人都可以在某种程度上欣赏它。

线性方程

线性方程 是一个包含一个或多个变量的方程,对于每个变量,该变量的指数必须为一。它可以写成以下形式:a₁x₁ + a₂x₂ + … + 2ᵣxᵣ = b。这些值 [a₁a₂,…,aᵣ] 和 b 被称为 线性方程系数

线性方程的例子包括:2x + 5y = 10,6x = 18,7v + 8w + 0x + 2y + 3z = 15,以及 3x₁ + 4x₂ + 5x₃+9x₄ + 10x₇ = 3

一个线性方程的反例是 2 + 6x + 5 = 2;这是一个二次方程的例子。另一个这样的反例可以是 7x₁* + 3x₂ = x₁* y₁;当你绘制这个方程的图形时,原因就会变得明显,它可以被重新排列成有理函数 y = 7x / x - 3,这样的图形是曲线而非直线。

考虑线性方程 2x + 5y = 10。下图展示了线性方程的图形表示,你会注意到它是一条直线。当回忆直线方程 y = mx + b 时,这一点会更加明显,其中 m = 斜率,b = y 截距。该线性方程可以如下所示重新排列成这种形式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以得出以下结论:所有落在直线上的 (x, y) 点都是方程 2x + 5y = 10 的解。例如,假设我们选择 x 轴截距点 (5, 0),并将 xy 值代入方程中的相应位置。2(5) + 5(0) = 10。任何在直线上的 (x, y) 点都可以代入方程中,等式将成立。我们可以将这一发现概括为一个规则:

对于具有两个变量的线性方程 ax + by = c,ℝ²* 中的解集可以表示为一条直线。

请注意,这个单一的方程有无限多个解,这些解在 ℝ² 中展开;稍后我们将详细查看解的数量。

这个相同的基本概念可以转移到更高维度的坐标空间,如ℝⁿ,例如ℝ³,其中直线变成平面,因为增加了第三个变量。

线性方程组

线性方程组是一组一个或多个线性方程,这些方程共享类似的变量。一个例子:

6x + 2y = 4

2x + 4y = 8

线性方程组定义为使每个方程在其各自变量中替换后都成立的值(s₁, s₂, …, sᵣ)。在上述系统中,解为(0, 2),因为将(0, 2)代入系统后,两个方程都成立。

线性系统的解

解决线性系统的图形意义是什么?线性系统的解的不同情况有哪些?本节将更详细地研究这三种可能性。它们如下:

  1. 唯一解

  2. 无解

  3. 无限解

唯一解:在像上述这样的两个变量的线性系统中,解是交点。为什么?解是必须满足两个方程的有序对,如果不存在这样的有序对,那就意味着这些直线不会相交。这是唯一解的一个例子。只有一个解满足线性系统中的所有方程。

无解:考虑无解的情况。在两个变量的线性系统中,这意味着什么?在什么情况下直线集合永远不会相交?一种情况是它们是平行的。在所有直线平行的线性系统中,该系统将没有解。另一种情况是虽然某些直线可能与其他直线相交,但没有一个共同的交点是所有直线共享的。

无限解:线性系统的最终情况是存在无限解。什么时候两个变量的线性系统可能有无限解?如果这些直线是相同的,那么因为它们重合,就有无限个交点,从而存在无限解。考虑以下线性系统:

6x + 3y = 18

2x + y = 6

尽管系数可能不同,但这些直线实际上是相同的!如果你将第一个方程的每个系数除以 3,得到的方程将是 2x + y = 6。

线性系统的解的可视化会随着变量数量的增加而变化。下图展示了三变量线性系统所有三种解的可能图示。超过三维的情况对人脑的可视化会变得困难,但规则仍然适用!无论变量有多少,所有线性系统都只有无解、唯一解或无限解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此图表改编自 src

矩阵记号

随着线性方程变得更加复杂,记号可能变得笨重。将线性系统的信息压缩成易于操作和处理的形式是很重要的,因此通常使用矩阵记号来代替一组方程。系数矩阵是一种排除了每个方程中的b系数的矩阵。增广矩阵包括b系数,因此比系数矩阵多一列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

矩阵的大小,也称为阶数,告诉我们一个矩阵有多少行和列。一个 m x n 矩阵是一个有 m 行和 n 列的矩阵。行数对应于系统中有多少个线性方程,而列数则告诉我们有多少个变量。请确保行数在列数之前,因为阶数不可互换。

解决线性系统

有一种系统的方法来确定线性系统是否有解,如果有解,则是否有唯一解或无限解,并从中获得解。解决线性系统可以使用原始形式的线性方程或矩阵,尽管推荐使用矩阵,因为记号更简洁。熟悉这两种方法是有益的,因为它们提供了对彼此机制的额外见解。

以下是逐步处理方程组的过程,没有使用矩阵。基本思想是通过乘以现有方程创建新的方程,从而获得相同的方程,然后可以将其加或减去另一个方程以消除一个变量。然后重复这一过程,直到我们消除足够的未知数以便能够解出一个变量,然后再向上追溯解决其余的变量。最后,需要检查以确保解实际上满足方程组。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

行操作

之前概述的步骤可以转移到以矩阵为中心的线性系统求解程序中。请注意在每次变换后被消除的变量在矩阵中的标记。不过在我们深入之前,让我们定义一些行操作。实际上有两个操作与我们之前应用的操作平行。

  1. 替换:“用一行与另一行的和替换一行。”*

  2. 交换:“交换两行。”*

  3. 缩放:“将一行中的所有条目乘以一个非零常数。”*

让我们重新处理相同的线性系统,这次使用矩阵并应用行操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意,我使用了与线性方程法相同的操作和比例因子。毫不奇怪,我们最终得到了之前的相同方程式。另一个需要注意的是最终矩阵左下角的三角形形成。这种模式出现是有道理的,因为 0 是已消除变量的标记,每个消除的变量都使我们更接近识别可以轻松解决的方程式;这反过来又推动了整个系统的解决进展。我们将在下一章重新讨论这种现象,并提供更正式的定义。

总结

在本章中,我们学到了:

  • 线性方程:一个或多个变量的方程,其中方程的次数必须等于 1。

  • 线性方程组:一组线性方程。

  • 一个或多个线性方程的解:线性系统既可以没有解,也可以有唯一解或无穷多解。

  • 矩阵表示法:用作线性系统紧凑表示的矩形数组。

  • 行操作:替换、交换和缩放操作允许我们将一个矩阵转换为一个已消除足够未知变量以解决系统的矩阵。

  • 解线性系统:找出 a)给定线性系统是否存在解以及 b)如果存在解,它们的确切值是什么的系统化方法。

注释

*除非另有说明,所有图片由文章作者提供。

*作为一个小插曲:二次方程的词源自拉丁文 quadratus,是 quadrare 的过去分词,意为“使方形”;这也体现了它的次数![src]

*ℝ²是所有可能有序对(x, y)在实数线上的空间,它由一个二维平面表示。ℝ²包含了整个实数集合,而实数集合是不可数无穷的,这意味着ℝ²空间也是无穷的。

*行操作引用[src]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性代数 2:梯形矩阵形式

原文:towardsdatascience.com/linear-algebra-2-echelon-matrix-forms-ce8a19c71a7d?source=collection_archive---------3-----------------------#2023-09-29

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自欧洲数字档案馆Unsplash上的图像

行梯形式和简化行梯形式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 tenzin migmar (t9nz)

·

关注 发表在向数据科学进发 ·8 分钟阅读·2023 年 9 月 29 日

前言

欢迎回到我关于线性代数基础的系列文章的第二篇,这也是机器学习背后的基础数学。在我之前的 文章 中,我介绍了线性方程和系统、矩阵符号以及行简化操作。本文将讨论阶梯矩阵形式:行阶梯形式和行简化阶梯形式,以及如何利用这两种形式来解线性系统。若配合 David C. Lay, Steven R. Lay 和 Judi J. McDonald 的《线性代数及其应用》一书阅读,将会更好地服务于读者。请将此系列视为一个外部辅助资源。

随时分享你的想法、问题和批评。

行阶梯形式

高斯消元方法是一种通过行操作将矩阵转化为可以通过回代得到解的形式的过程。

作为复习,行简化操作包括:

  1. 替换:“将一行替换为其自身与另一行的和。”*

  2. 交换:“交换两行。”*

  3. 缩放:“将一行中的所有条目乘以一个非零常数。”*

上述操作可以应用于矩阵,以将该矩阵转换为其行阶梯形式。给定一个 m x n 的矩阵,其中 m 是行数,n 是列数,当且仅当:

  1. 所有条目均为零的行位于至少有一个条目非零的行下方。

  2. 一行的所有主元(从左侧开始的第一个非零条目)位于上面行的右侧列中。

  3. 一列中所有主元下方的条目均为零。

以下是行阶梯形式(REF)的矩阵示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请花点时间欣赏一下,虽然矩阵的大小和条目有所不同,但所有矩阵都被认为符合上述标准的行阶梯形式。注意一下高亮的主元下方的楼梯状图案?这就是执行高斯消元将矩阵转换为行阶梯形式时自然出现的形式。这个形式的名字非常恰当:单词 echelon 来源于法语中的 eschelon,意为梯子的一步,后来也有了“台阶”的意思。*

高斯消元法的基本思想是将矩阵转换为行简化形式,即选择一个主元("主元"一词用来指代主元素:在其行中的第一个非零元素),然后消除所有主元下方的元素,将主元下列的所有元素变为零。为了理解这一步骤为何能推动矩阵变为简化行阶梯形式,请回顾简化行阶梯形式的定义:在行阶梯形式中,所有主元素下方的列元素均为零。这一步骤然后会在每一行中重复,但要小心!我们必须确保在每次选择主元时,都不会违反行阶梯形式的核心特征;每一行的主元素都位于其上方行的右侧列中。考虑到这一规则,通常建议从第一行的第一个元素开始选择主元,然后从右向左逐步处理剩余行。

让我们再次思考之前提到的行阶梯形式的目的:将表示线性系统的矩阵转化为一种形式,以便解决方案变得易于辨认。为了更好地理解行阶梯形式的实用性,请参见示例 1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们执行高斯消元法时,我们是在操作矩阵,使其呈现对称而更易解读的形式。通过示例 1 获得的行阶梯形式,我们现在可以使用回代法逐步获得每个解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你从上面看到的,这并不理想。它需要额外的繁琐工作。虽然简化行阶梯形式也需要额外的工作,但其表示方式更为简洁,减少了出错的可能性。一旦我们将矩阵简化为简化行阶梯形式,我们可以轻松读出解,并且线性系统也就解决了。

简化行阶梯形式

当将矩阵简化为简化行阶梯形式时,使用的是高斯-约旦消元法。该算法通过一系列行变换操作,将表示线性系统的矩阵转换为简化行阶梯形式,从而使解变得易于辨认。无需额外的回代步骤。

给定的m x n 矩阵被称为简化行阶梯形式,如果它满足行阶梯形式的所有先决条件,并且还符合以下标准:

  1. 每一行的主元素都是 1。

  2. 主元素下方和上方的所有列元素均为零。(主元素是该列中唯一的非零元素)

让我们通过一个示例来演示如何将矩阵简化为简化行阶梯形式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阅读我们得到的简化行阶梯形式矩阵,现在立刻可以看出我们的解是 x₁ = -3, x₂ = -12, x₃ = -3。

经济形式的独特性

直到现在,我们已经分别计算了行最简形式和简化行最简形式的一个例子。你可能想尝试独立地对行最简形式进行行化简练习,结果得到一个不同的行最简形式矩阵。不必担心,这完全可能,并且只要计算正确且所有三个规则都涵盖了,两者版本都是正确的。这是一个很棒的情况!它引导我们迈向一个重要的定理:

定理 (1)

矩阵可以有多于一个的行最简形式;行最简形式不是唯一的。通过行操作应用的顺序变化,可以得到不同但同样有效的最简形式。

这并不适用于简化行最简形式,对于简化行最简形式则正好相反。

定理 (2)

矩阵只能有一个简化行最简形式;简化行最简形式是唯一的。

我们看到这两种形式在唯一性上的差异的根源在于我们对简化行最简形式施加的额外限制,即主元条目的要求为一。当我们将矩阵化简为行最简形式时,我们可以将每一行乘以任何非零常数,矩阵仍将保持在行最简形式,因为缩放矩阵并没有违反行最简形式的任何规则。简化的最简形式则不同,因为主元条目必须为一。下面我将通过一个具体的例子进一步说明这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解的数量

从解决线性系统中自然产生的一个基本问题是存在多少解?对于任何线性系统,解将始终是三种情况之一。线性系统将要么有一个唯一解,要么有无限解,或者无解。如果你有兴趣思考为什么必须是这三种情况之一,(重新)阅读我的上一篇文章

让我们更详细地查看每种情况,以了解我们如何识别给定矩阵的解情况,并轻轻探讨和探索每种情况如何及为何会出现的直觉。

唯一解: 当线性系统的矩阵的简化行最简形式的每一列都有一个主元时,该系统具有唯一解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们将矩阵形式重新写成一系列线性方程时,这一点变得更加明显。我们可以看到,因为每一列都有一个主元(上方和下方没有条目),所以可以从方程中逐一读出每个变量的明确解。

无解: 当线性系统的矩阵的简化行最简形式具有代数不一致性时,该系统无解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,没有任何* x₁*、* x₂*、* x₃* 和* x₄* 的值可以使得方程四成立。左边将始终为 0,而不是 9,因此该系统没有解。一般而言,任何增广矩阵中如果有一行[0, 0, … 0 | b] 其中 b 不为零,则没有解,因为 0 ≠ b。

无限解: 当线性系统至少有一个自由变量时,它有无限解。自由变量出现时,相应的列没有主元。另一方面,基本变量是指相应列有主元的变量。让我们深入了解为什么自由变量的存在暗示了无限解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

名副其实,自由变量意味着你可以随意赋值给它们。所有基本变量相对于自由变量被定义,因此基本变量的值将取决于自由变量被赋予的值。这是无限解存在的本质;只要基本变量与自由变量选择的值一致,无限多的解都是有效的。

在将矩阵转换为化简行阶梯形矩阵后,系统是否有一个解、没有解或无限多解将立即显现出来。

总结

在本章中,我们学到了:

  • 高斯消元法用于将矩阵化简为行阶梯形矩阵以求解线性系统。

  • 高斯-乔丹消元法用于将矩阵化简为化简行阶梯形矩阵以求解线性系统。

  • 阶梯形矩阵的唯一性:行阶梯形矩阵不是唯一的,而化简行阶梯形矩阵是唯一的。

  • 线性系统可能的解的数量:唯一解、无限解或无解,以及它们何时和为什么会出现。

备注

除非另有说明,所有图片均由文章作者提供。

行操作的引用 [src]

“阶梯形”这个词的词源 [src]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性代数 3:向量方程

原文:towardsdatascience.com/linear-algebra-3-vector-equations-ec1e01ccaa05?source=collection_archive---------1-----------------------#2023-10-14

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

向量方程和跨度

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 tenzin migmar (t9nz)

·

关注 发表在 数据科学前沿 ·9 分钟阅读·2023 年 10 月 14 日

前言

欢迎回到我关于线性代数基础的系列文章的第三篇,这些基础数学是机器学习的根基。在我之前的 文章 中,我介绍了阶梯矩阵的形式。这篇文章将探讨向量、跨度和线性组合,并将这些新概念与我们已经学习的内容联系起来。如果与 David C. Lay、Steven R. Lay 和 Judi J. McDonald 编写的《线性代数及其应用》一书一起阅读,这篇文章将更能服务于读者。请将本系列视为一个辅助资源。

随时分享你的想法、问题和意见。

ℝ²、ℝ³ 和 ℝⁿ 中的向量

到目前为止,我们已经了解了矩阵,即数字的数组,那么如果我们只有一个数字数组(单数形式)呢?瞧,向量:一种特殊类型的矩阵,大小为m x 1,其中 m 表示向量中的行数或条目数。请回忆,矩阵的大小表示为m x n,其中m等于行数,而n对应列数。向量总是只有一列,但可以有任意数量的行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有具有两个条目的向量集合是ℝ²。ℝ包含了所有实数集合,因此ℝ²是所有可能的实数点(x, y)的二维空间,这也是合理的。

向量可以位于ℝ²、ℝ³、ℝ⁴ … ℝⁿ中,注意向量空间的维度对应于向量中的条目数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可能最终会遇到特殊的零向量(简单地写作 0),这是一个所有条目都是零的向量。虽然这可能看起来是一个小细节,但我们稍后会发现它对线性代数中一些最重要的概念有着重要的影响。

几何可视化

到目前为止,矩阵和向量已经以数学方式描述、解释和表示,而物理中的向量被描述为具有大小和方向的量。两者都是正确的;下面的ℝ²中向量的图示结合了这两种定义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重要的是要记住,ℝ²中的向量是有序对,而更高维向量空间中的向量是有序元组(具有定义顺序的数字列表)。两个向量可能具有相同的条目数字,但如果条目的顺序不同,那么这些向量也不相同,如上图所示。

ℝ³中的向量也可以被可视化,我们只需添加第三个轴,因为我们有一个额外的条目。在ℝ³之外,图示化向量变得更加复杂,因为很难想象更高维空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

向量的代数性质

对于任何给定向量空间中的所有向量uvw以及标量cd:以下代数性质¹适用:

(i) 交换律*: u + v = v + u

(ii) 结合律*: (u + v) + w = w + (v + w)

(iii) 加法恒等元:u + 0 = 0 + u = u

(iv) 加法逆元:u + (-u) = -u + u = 0

(v) 与向量的分配律:c(u + v) = cu + cv

(vi) 与标量的分配律:(c + d)u = cu + du

(vii) 与标量的结合律:c(du) = (cd)u

这些性质与向量加法和标量乘法的操作有关。

要添加两个向量,相应的条目被相加以产生向量和。这意味着不同大小的两个向量的加法是未定义的。为了加法,两个向量必须具有相同数量的条目!这个条件源自向量加法的执行方式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在标量乘法中,对于给定的标量c和向量u,标量倍数是cu,其中u中的每个条目都被标量c所乘。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这两种操作可以一起使用;正如你在下一节中会发现的,它们结合形成了线性代数的核心概念:线性组合。

线性组合

假设我们有向量 v₁, v₂, … vₐ在ℝⁿ中,并且我们有标量(也称为权重)c₁, c₂, … cₐ,它们可以是任何实数,包括零。线性组合是由标量倍数组成的向量,c₁v₁ + c₂v₂ + … + cₐvₐ。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之前,我们探讨了线性代数中的存在性概念,给定一个矩阵,是否存在至少一个解?换句话说,矩阵的简化/行最简形式是否存在不一致?如果存在,则没有解。如果不存在,则至少有一个解。这个基本的存在性问题与线性代数中的许多思想相关,线性组合也不例外。

我们说向量b是 Rⁿ中一组向量 v₁, v₂, … vₐₚ的线性组合,如果存在一组权重 c₁, c₂, … cₐ(一个解),使得 c₁v₁ + c₂v₂ + … + cₐvₐ = b

要确定b是否是线性组合,我们可以使用向量加法和标量乘法的操作,将我们的线性组合方程:c₁v₁ + c₂v₂ + … + cₐvₐₚ = b重新排列成我们非常熟悉的符号。这种重新排列的过程也阐明了为什么确定向量b是否是某组向量的线性组合是一个存在性问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述解释旨在强调为什么存在性问题和矩阵行简化与线性组合有关,并以一般性方式展示这一概念。让我们来看一个更具体的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的例子中,将增广矩阵行简化为简化行最简形式后,我们发现确实存在解!

但让我们考虑一个行简化形式的增广矩阵,行[0, 0, … | b]中b ≠ 0,这意味着向量b不能作为一组向量的线性组合。换句话说,向量b超出了我们向量组的范围,或者(这是进入下一节的一个良好过渡)向量b不在这组向量的跨度内。

向量集合的跨度

所有可能的线性组合集合,对于 ℝⁿ 中的向量 v₁, v₂, … vₐ,称为由 v₁, v₂, … vₐ 张成的 ℝⁿ 的子集。向量 v₁, v₂, … vₐ 的跨度记作 Span{v₁, v₂, … vₐ},这是可以表示为 c₁v₁ + c₂v₂ + … + cₐvₐ 的向量集合。另一种思考方式是,跨度包含所有可以表示为向量 v₁, v₂, … vₐ 的线性组合的向量。

我们可以找到任何数量向量的跨度。假设我们有一个单一的向量 v₁。则 Span{v₁} 将是 v₁ 的所有标量倍,因为在这种情况下唯一可以应用的操作是标量乘法(至少需要两个向量才能进行向量加法)。Span{v₁} 包含所有可以通过 v₁ 达到的向量。

如果我们要可视化跨度,它将是经过 v₁ 和原点的直线,因为只有一个向量时,线性组合(向量倍数)不能改变方向。这个观点在下面的图示中进一步说明。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

考虑 ℝ² 中两个不同方向的向量的跨度,这两个向量可以形成什么可能的线性组合?换句话说,ℝ² 中哪些向量可以表示为这两个向量的线性组合?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于上述情况,经过进一步调查,似乎uv 张成了整个 ℝ²!这意味着 ℝ² 中的任何向量都可以表示为 uv 的线性组合。在未来的文章中,我们将探讨线性独立性的概念,这将用于具体证明 uv 张成了 ℝ²。

结论

向量、线性组合和跨度让我们进一步深入到线性代数的丰富领域。这些基本概念帮助我们理解向量空间的结构以及不同向量集合之间的关系。随着我们进一步的学习,你会发现这些思想不断出现,因为它们与其他核心概念相关联。类似地,我希望你能花些时间思考我们迄今为止所学的内容(解的存在、行最简形式)如何与这些新概念深刻相关。

总结

在这一章中,我们学习了:

  • ℝ²、ℝ³ 和 ℝⁿ 中的向量:向量是一种特殊的矩阵,大小为 m x 1。一个向量可以有任意数量的条目,但只有一列。我们发现也可以有零向量,即所有条目均为零的向量。

  • 向量的几何可视化:向量可以通过图形表示,这有助于理解大小和方向的概念来源。

  • 向量的代数性质:以下代数性质对所有向量和标量均适用;交换律、结合律、加法单位元、加法逆元、与向量的分配律、与标量的分配律,以及与标量的结合律。

  • 线性组合:线性组合是由标量倍数 c₁v₁ + c₂v₂ + … + cₐvₐ 的和定义的向量。权重 c₁, c₂, … cₐ 可以是包括零在内的任何标量。

  • 向量跨度:向量 v₁, v₂, … vₐ 的跨度记作 Span{v₁, v₂, … vₐ},是可以表示为 c₁v₁ + c₂v₂ + … + cₐvₐ 的向量集合。

备注

¹向量的代数性质参考自 cs.brown.edu/stc/summer/94GeoTrans/94GeoTrans_17.html

²线性组合的定义参考自 David C. Lay、Steven R. Lay 和 Judi J. McDonald 编著的《线性代数及其应用》第六版

³有关跨度的定义参考自 David C. Lay、Steven R. Lay 和 Judi J. McDonald 编著的《线性代数及其应用》第六版。

*所有图片由作者创建,除非另有说明。

*结合律意味着对于加法和乘法操作,数字可以以任何方式分组,结果保持不变。例如,(5 + 2)+ 3 = 5 + (2 + 3)= 10 和 (5 x 2)x 3 = 5 x (2 x 3)= 30。

*交换律意味着对于加法和乘法操作,数字可以按照任意顺序相加或相乘,结果保持不变。例如,5 + 2 = 2 + 5 = 7 和 5 x 2 = 2 x 5 = 10。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性代数 4: 矩阵方程

原文:towardsdatascience.com/linear-algebra-4-matrix-equations-914ebb371950?source=collection_archive---------5-----------------------#2023-11-10

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

求解矩阵方程 Ax= b

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 tenzin migmar (t9nz)

·

关注 发表在 Towards Data Science ·7 分钟阅读·2023 年 11 月 10 日

前言

欢迎回到我持续进行的线性代数基础系列的第四篇。在我之前的文章中,我介绍了向量、线性组合和向量跨度。这篇文章将探讨矩阵方程 Ax = b,并将展示如何通过矩阵方程解决线性方程组的原理。

这篇文章若与 David C. Lay、Steven R. Lay 和 Judi J. McDonald 的《线性代数及其应用》一书一同阅读,将更具价值。请将这个系列作为辅导资源来参考。

随时分享您的想法、问题和批评。

直观理解

我们上次讲述了线性组合的概念,我承诺这会有重要的意义。请回忆一下,给定向量 v₁, v₂, … vₐ在ℝⁿ中,以及标量(也称为权重)c₁, c₂, … cₐ,线性组合是由标量倍数的和定义的向量,c₁v₁ + c₂v₂ + … + cₐvₐ。¹

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果向量b是向量空间 Rⁿ中一组向量 v₁, v₂, … vₐₚ的线性组合,那么存在一组权重 c₁, c₂, … cₐ(一种解决方案),使得 c₁v₁ + c₂v₂ + … + cₐvₐ = b

要确定b是否是给定向量 v₁, v₂, … vₐ的线性组合,我们将我们的向量排列成一组线性方程,然后创建一个增广矩阵,并使用行简化运算将矩阵化简为简化阶梯形式。如果简化阶梯形式有不一致性,也就是一行看起来像这样:[0, 0, … | m]其中m ≠ 0,那意味着我们的向量b不是向量组的线性组合,因为没有一组权重能使等式 c₁v₁ + c₂v₂ + … + cₐvₐ = b成立。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果没有这样的不一致,那意味着我们可以将向量b写成一组向量的线性组合,比如上面的例子。你还记得我们如何在最后验证答案吗?我们会将每个向量乘以它的对应标量,然后找到向量和。如果向量和等于b,我们知道我们计算正确,并且b确实是一个线性组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个验证过程就是矩阵方程Ax = b的变形!

Ax = b

如果A是一个m x n矩阵,而x属于 Rⁿ(你将会在下一节看到为什么x属于 Rⁿ很重要),那么乘积Ax 就是矩阵A中向量(列)的线性组合,使用x中对应的标量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意这一切都不是新材料,我们在前一篇文章中不知不觉地计算了Ax 来验证我们的线性组合。然而,矩阵方程Ax = b仍然很重要,因为它将所有这些内容形式化为紧凑的符号,并且将在后续以新的方式重新出现。

现在我们知道,如果给定一个m x n矩阵A和向量x,并且我们计算矩阵乘积Ax 等于b,那么b可以写成矩阵A中向量(列)和向量x中的标量/条目的线性组合。所以总结一下:方程Ax = b只有一个解(x),如果 b 可以写成 A 的列向量的线性组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

矩阵乘法

我已经将Ax = b介绍为一个矩阵乘积,但我还没有解释矩阵乘法(这就是Ax 的内容)!

矩阵乘法 是将两个矩阵相乘得到它们的乘积的操作。我们已经见过矩阵加法,即两个矩阵相加得到它们的和。为了使矩阵加法有定义,被加的两个矩阵,矩阵 A 和矩阵 B 必须具有相同的大小。类似地,矩阵乘法也有一个要求。要将矩阵 A 和矩阵 B 相乘得到 AB,矩阵 A 的列数必须等于矩阵 B 的行数。矩阵 AB 的乘积,我们称为矩阵 C,其大小取决于矩阵 A 的行数和矩阵 B 的列数。矩阵 C 将有 m(矩阵 A 的行数)行和 p(矩阵 B 的列数)列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么,矩阵乘法是如何工作的呢?如果我们要计算矩阵 A 和 B 的乘积,那么乘积矩阵中第 i 行、第 j 列的每个元素是矩阵 A 第 i 行和矩阵 B 第 j 列的点积

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目前,你只需知道点积是两个向量对应元素的乘积之和,并且仅当两个向量具有相同数量的元素时才有定义。这个解释远不能充分说明点积的几何直觉,但我会在稍后详细说明。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简洁起见,我已计算了两个 2 x 2 矩阵的乘积,但同样的过程适用于任何大小的矩阵,只要矩阵符合矩阵乘法的条件,否则它们的乘积将未定义。

矩阵乘法的性质

如果 ABCn x n 矩阵,cd 是标量,那么以下性质成立。³

  1. AB BA(一般情况下不可交换)

  2. (AB)C = A(BC)(结合律)

  3. A(B+C) = AB + AC 和 (B+C)A = BA + CA(分配律)

  4. 0A = 0(零的乘法性质)

注意矩阵乘法不是可交换的,这个性质可能需要一段时间才能理解,因为我们通常对实数的可交换性有直观的认知。

这些性质对于计算矩阵乘积非常有用,这将是线性代数中的一个重要主题。

结论

矩阵乘法是支持神经网络核心功能的基础数学操作,特别是在它们的前向传播和反向传播阶段。

在神经网络的前向传播阶段,数据通过其各个层进行处理,而矩阵乘法是这一操作的核心。神经网络中的每一层由神经元组成,它们表示为输入的加权和,接着是激活函数。这些加权和通过矩阵乘法计算得出。

在反向传播过程中,神经网络从其错误中学习。它调整神经元的权重以最小化预测输出与实际输出之间的误差。矩阵乘法再次成为此过程的关键组成部分,特别是在计算梯度时,梯度指示了每个权重应该如何调整以最小化误差。

学习数学本身就是一次令人兴奋的冒险,但是学习线性代数理论及其应用,可以使这段充满挑战的学习旅程更加鼓舞人心。

总结

在这一章中,我们学习了以下内容:

  • 线性组合和矩阵乘积 Ax = b 背后的直觉:矩阵乘积并非一个全新的概念,而是形式化了我们已经在使用的一个过程!

  • Ax = b:如果b是矩阵A中向量(列)集合的线性组合,则矩阵乘积有解 x。

  • 矩阵乘法:Ax = b 的操作,在机器学习应用中广泛使用,特别是在神经网络中的具体例子。

  • 矩阵乘法的属性:非交换性、结合律、分配律和零的乘法性质。

笔记

*除非另有说明,所有图片均由作者创建。

*抱歉让你久等了,我正在参加期中考试(包括线性代数哈哈!)。

¹线性组合的定义参考自《线性代数及其应用》第六版,作者为 David C. Lay、Steven R. Lay 和 Judi J. McDonald。

²矩阵乘积属性的定义参考自《线性代数及其应用》第六版,作者为 David C. Lay、Steven R. Lay 和 Judi J. McDonald。

³矩阵属性参考自src

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性代数:欧几里得向量空间

原文:towardsdatascience.com/linear-algebra-euclidean-vector-space-9f88f69cf240

第五部分:欧几里得向量空间的温和介绍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Chao De-Yu

·发布于 Towards Data Science ·4 分钟阅读·2023 年 3 月 6 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:Karsten WürthUnsplash

介绍

在机器学习和深度学习中,我们大多数时候都在处理向量。而向量空间模型可以将数据之间的关系表示为向量。此外,从几何角度来看,它还能够比较两个向量的相似性,无论是使用两个向量之间的距离(欧几里得距离)还是两个向量之间的角度(余弦相似度)。

向量

让我们从二维空间中的向量几何开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 1. 二维空间中向量的示例。 (图片来源:作者)

  • 如果 u = (u₁, u₂) 和 v = (v₁, v₂) 满足 u₁ = v₁ 且 u₂ = v₂,则这两个向量相等。

  • 向量 u 和 v 的和定义为 u + v = (u₁ + v₁, u₂ + v₂)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 2. 向量和的示例。 (图片来源:作者)

  • 标量 k 与向量 u 的乘积定义为 ku = (ku₁, ku₂)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 3. 向量与标量相乘的示例。 图片来源:作者。

  • 向量的负向量 -v 被定义为与 v 具有相同大小但方向相反的向量。

  • 向量的差定义为 u-v = u + (-v)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 4. 向量差的示例。 (图片来源:作者)

范数和距离

  • 向量的长度通常称为范数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 5. 向量的长度,范数。 (图片来源:作者)

  • 两点之间的距离定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 6. 两点之间的距离。 (图片来源:作者)

欧几里得 n 空间

  • 如果 n 是正整数,存在一系列 n 个实数 v₁, v₂, …, vₙ,则我们写作:v = (v₁, v₂, …, vₙ)

  • 所有具有 n 个分量的向量的集合称为欧几里得 n 空间,记作 Rⁿ。

Rⁿ 中向量的属性

  1. u + v = v + u

  2. u + (v + w) = (u + v) + w

  3. k(u + v) = ku + kv

  4. (k + m)u = ku + mu

  5. u + 0 = 0 + u = u

  6. u + (-u) = 0

  7. 1u = u

    其中 u, v, w 是向量,k, m 是常数

欧几里得内积

  • 如果 u 和 v 是 Rⁿ 中的向量,则欧几里得内积定义为

    u . v = u₁v₁ + u₂v₂ + … + uₙvₙ

由此得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 7. 柯西-施瓦茨不等式的证明。(作者提供的图片)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 8. 证明 u.v=1/4||u+v||² -1/4||u-v||²

  • 属性:

    u.v = v.u

    (u + v).w = u.w + v.w

    (ku).v = k(u.v)

    v.v ≥ 0,v.v = 0 当且仅当 v = 0

    其中 u, v, w 是向量,k 是常数

Rⁿ 中的范数和距离

  • Rⁿ 中的范数定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 9. Rⁿ 中的范数。(作者提供的图片)

  • Rⁿ 中两点之间的欧几里得距离定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 10. Rⁿ 中两点之间的欧几里得距离。(作者提供的图片)

  • 属性:

    ||u|| ≥ 0,||u|| = 0 当且仅当 u = 0

    ||ku|| = |k| ||u||

    ||u + v|| ≤ ||u|| + ||v||

    d(u, v) ≥ 0,d(u, v) = 0 当且仅当 u = v

    d(u, v) = d(v, u)

    d(u, v) ≤ d(u, w) + d(w, v)

    其中 u, v, w 是向量,k 是常数

Rⁿ 中的角度

如果 u 和 v 是欧几里得 n 空间中的向量,则 u 和 v 之间的角度 (θ) 定义为:

cosθ 的推导可以参考 图片 7

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 11. Rⁿ 中两向量之间的角度。(作者提供的图片)

推荐阅读

## 线性代数:线性方程组和矩阵,使用 Python

第一部分:讲解线性代数的基础:线性方程组和矩阵

[towardsdatascience.com ## 线性代数:矩阵运算及其性质,使用 Python

第二部分:讲解线性代数的基础:矩阵运算及其性质

[towardsdatascience.com ## 线性代数:使用 Python 计算逆矩阵

第三部分:全面逐步指导如何使用基本行变换找到逆矩阵并…

towardsdatascience.com ## 线性代数:LU 分解与 Python

第四部分:全面逐步指导如何使用 LU 分解解决线性系统

towardsdatascience.com ## 线性代数:正交向量

第六部分:正交向量的温和介绍

towardsdatascience.com [## 线性代数:一般向量空间

第七部分:全面介绍一般向量空间;子空间、基、秩和零度概念

medium.com](https://medium.com/analytics-vidhya/linear-algebra-general-vector-space-0dd3d74e9070?source=post_page-----9f88f69cf240--------------------------------) [## 线性代数:发现特征值和特征向量以实现对角化

第八部分:系统化深入讲解特征值和特征向量的识别,以便于对角化…

medium.com](https://medium.com/analytics-vidhya/linear-algebra-discovering-eigenvalues-and-eigenvectors-for-diagonalization-2c3090f9be44?source=post_page-----9f88f69cf240--------------------------------)

参考文献

[1] 向量空间 — 维基百科

[2] 欧几里得空间 — 维基百科

[3] 国防医学院讲座 — 朱伟达,欧几里得向量空间,2008

线性代数:使用 Python 寻找逆矩阵

原文:towardsdatascience.com/linear-algebra-finding-inverse-matrix-with-python-18dd988f4df

第三部分:使用基本行操作和矩阵的行列式来寻找逆矩阵的全面逐步指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Chao De-Yu

·发表于 Towards Data Science ·5 分钟阅读·2023 年 1 月 19 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片来源:Raimond KlavinsUnsplash

上一篇文章解释了不同的矩阵操作及其相应的操作。本文将深入探讨使用基本行操作和矩阵的行列式来获得逆矩阵的两种不同方法。

逆矩阵

逆矩阵类似于数的倒数,因为一个数与其倒数的乘积等于1,而一个矩阵与其逆矩阵的乘积则得到一个单位矩阵。然而,要找到矩阵的逆矩阵,矩阵必须是一个方阵,即行数和列数相同。找到矩阵的逆矩阵主要有两种方法:

方法 1:使用基本行操作

回顾用于解决线性系统的3 种行操作:交换、重新缩放和主元操作。这些操作可以写成初等矩阵。左乘增广线性系统矩阵表示初等行操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性系统的示例增广矩阵。(作者提供的图片)

交换矩阵:交换单位矩阵的第 i 行和第 j 行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交换矩阵 A 的第 1 行和第 2 行。(作者提供的图片)

重新缩放矩阵:如果操作是 k 倍方程 i,则在单位矩阵的位置 (row=i, col=i) 放置数字 k。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

行 1 乘以常数 3。(图片来源:作者)

主元矩阵:如果将方程 i 的倍数加到方程 j 中,则在单位矩阵的 (行=j, 列=i) 位置上填入数字 k。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5 倍行 2 加到行 1。(图片来源:作者)

我们现在可以使用初等矩阵找到逆矩阵

  • 如果 A 是可逆的,那么 Eₖ…E₂E₁A = I

  • 两边都乘以 A 的逆矩阵得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 一系列初等行操作可以将 A 化简为 I,相同的初等行操作将 I 转换为矩阵 A 的逆矩阵。

  • 如果A 是一个可逆矩阵,那么对于每个列向量 b,方程组Ax = b 有且仅有一个解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用行操作求逆矩阵 A 的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用行操作求 A 的逆。(图片来源:作者)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用初等矩阵求 A 的逆。(图片来源:作者)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方法 2:使用矩阵的行列式

2 x 2 矩阵的行列式和逆矩阵

矩阵的行列式,det(A) 或 |A|,是对方阵有用的值。对于下面的 2x2 矩阵 A,det(A) = ad — bc,如果 det(A) ≠ 0,则 A 可逆。对于 2 x 2 矩阵,逆矩阵为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,要计算大于 2 x 2 的矩阵的行列式,我们需要获取它的余子式和伴随矩阵。

余子式和伴随矩阵

对于方阵 A,aᵢⱼ 元素的余子式 Mᵢⱼ 被定义为通过删除矩阵 A 的第 i 行和第 j 列所形成的子矩阵的行列式,aᵢⱼ 元素的伴随矩阵 Cᵢⱼ 如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从小行列式得到的伴随矩阵方程。(图片来源:作者)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说明如何从方阵 A 中获得余子式和伴随矩阵。(图片来源:作者)

使用伴随矩阵展开得到矩阵的行列式

方阵的行列式可以通过将任何行或列的条目与对应的伴随矩阵相乘并加总结果来计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终,逆矩阵可以通过将伴随矩阵的转置1/行列式相乘来计算。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用行列式和伴随矩阵求 A 的逆。(图片来源:作者)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

逆矩阵是解决线性代数中各种问题的有用工具。本文展示的应用之一是解决线性方程组。在这篇文章中,你将学习如何使用两种不同的方法逐步得到逆矩阵,一种是使用初等行变换,另一种是使用矩阵的行列式。

推荐阅读

线性代数:线性方程组和矩阵,使用 Python

第一部分:解释线性代数的基础:线性方程组和矩阵

线性代数:矩阵运算及其性质,使用 Python

第二部分:解释线性代数的基础:矩阵运算及其性质

线性代数:LU 分解法,使用 Python

第四部分:LU 分解法解决线性系统的全面逐步指南

线性代数:欧几里得向量空间

第五部分:欧几里得向量空间的温和介绍

线性代数:正交向量

第六部分:正交向量的温和介绍

## 线性代数:一般向量空间

第七部分:一般向量空间的全面介绍;子空间、基、秩和零度的概念

medium.com](https://medium.com/analytics-vidhya/linear-algebra-general-vector-space-0dd3d74e9070?source=post_page-----18dd988f4df--------------------------------) [## 线性代数:发现特征值和特征向量以实现对角化

第八部分:深入系统地介绍识别特征值和特征向量以便于对角化…

medium.com](https://medium.com/analytics-vidhya/linear-algebra-discovering-eigenvalues-and-eigenvectors-for-diagonalization-2c3090f9be44?source=post_page-----18dd988f4df--------------------------------)

参考文献

[1] 基本矩阵 — 维基百科

[2] 余子式 / 代数余子式(线性代数) — 维基百科

[3] 行列式 — 维基百科

[4] 可逆矩阵 — 维基百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值