将 Apache Hive 连接到 Microsoft Power BI
逐步连接法。
埃德加·恰帕罗在 Unsplash 上拍摄的照片
在这篇博文中,我们提到了执行所需连接的步骤。Hive 数据库基于 cloud era & Power BI 桌面安装在 Windows 上。这种连接也可以通过其他 BI 工具实现,如 Tableau &等。因为 Hive 可以与许多 BI 工具集成,但这个过程可能很有挑战性。让我们期待采取连接所需的步骤。
1.下载和安装 ODBC 驱动程序
最初,我们需要从 Cloudera 社区下载 ODBC 驱动程序。有两个版本一个是 64 位另一个是 32 位版本。这取决于您使用的 PC/笔记本电脑的版本。您可以通过点击窗口按钮和暂停/中断按钮来检查您的 PC 版本。将打开一个面板,显示系统的技术特征。然后,您可以根据您的系统安装 Hive ODBC 驱动程序。另外,下面给出了 Power BI 桌面下载的链接!
2.在 Cloudera 上启动 Hive Thrift 服务器
拉胡尔·帕塔克
- 这里,我们使用命令启动了 Hive Thrift 服务器
hive --service hiveserver2
- 键入 ifconfig 以获取 inet 地址,该地址将成为您的连接的主机。
ifconfig
3.ODBC 驱动程序的配置
- 首先同时按下 Windows + R 并键入 odbcad32。一个窗口会出现。
拉胡尔·帕塔克
- 在用户 DSN 选项卡中点击添加按钮
拉胡尔·帕塔克
- 点击用于 Apache Hive 的 Cloudera ODBC 驱动并点击完成
- 一扇新的窗户将会打开
拉胡尔·帕塔克
- 键入所需的数据源名称(DSN)。在这种情况下它的蜂巢 _ 连接。
- 描述是可选的
- 选择 Hive Server 2 作为您的服务器类型
- 使用 ifconfig 输入您从 Cloudera 终端获得的主机地址
- 端口是 10000
- 数据库部分是可选的
- 选择机制为用户名
- 这个连接的用户名是 Cloudera
- 选择 SASL 在节俭运
- 点击测试
- 检查测试是否成功。成功完成后,点击确定
4.电源 BI 的配置
- 点击获取数据= >更多
- 在搜索栏中键入 ODBC 并点击连接
- 选择 Cloudera Hive DSN 并点击确定
- 在 Power BI 的导航器栏中,可以看到来自 Hive 数据库的表格
5.可视化数据
一旦连接,我们可以将从配置单元表导入的数据可视化到 Power BI。
感谢您从头到尾阅读本文。我希望我们能够帮助您连接这些工具。快乐学习🤗。
连接到 AWS 上私有子网中的 ec2 实例
这篇文章是关于如何连接到 AWS 上私有子网中的实例的“指南”。它包括一个在 Terraform 中所需的基础设施的例子,并对您的 SSH 配置文件进行修改。
弗洛里安·范·杜恩在 Unsplash 上拍摄的照片
如果你想跳过,这篇文章中讨论的所有代码都可以在我的 GitHub 这里找到。
亚马逊虚拟私有云(亚马逊 VPC)使您能够将 AWS 资源启动到您定义的虚拟网络中。子网是 VPC 内的一系列 IP 地址。子网可以是带有 internet 网关的公共子网,也可以是私有子网。在公共子网中启动的实例可以向互联网发送出站流量,而在私有子网中启动的实例只能通过公共子网中的网络地址转换(NAT)网关来这样做。自然,私有子网更安全,因为管理端口不会暴露在互联网上。通常,在模块化 web 应用程序中,前端 web 服务器将位于公共子网内,而后端数据库位于私有子网内。
连接到私有子网中的实例是必要的,原因有很多:
- 应用程序的后端数据库位于专用子网内,工程师需要访问该数据库来执行专门的分析。
- 私有子网被列入另一个第三方服务的白名单,并且需要与该服务进行交互。
连接到专用子网
同一个 VPC 中的实例可以通过它们的私有 IP 地址相互连接,因此可以从公共子网中的实例连接到私有子网中的实例;也称为堡垒主机。
Amazon 实例使用 SSH 密钥进行认证。因此,连接到私有实例将需要 bastion 主机上的私钥;同样,连接到 public 实例需要您的主机上有一个私钥,但是这是非常糟糕的做法。不要把你的私人密钥暴露给堡垒主机!
另一种解决方案是使用 SSH 代理转发,它允许用户从堡垒连接到另一个实例,而无需在堡垒上存储私钥。SSH 代理是一个跟踪用户身份密钥及其密码短语的程序,可以使用以下命令进行配置:
# Generate SSH keys
ssh-keygen -k mykeypair# Add the keys to your keychain
ssh-add -K mykeypair
一旦生成了密钥并将其添加到 keychain 中,就可以使用-A 选项通过 SSH 连接到 bastion 实例。这将启用转发,并让本地代理在从您的堡垒连接到实例时响应公钥质询。
# Connect to the bastion host:
ssh -A <bastion-ip-address>
下一步是使用 Terraform 部署所需的基础设施。
基础设施
以下基础设施已使用 Terraform 部署;作为代码软件的开源基础设施(也是自切片面包以来最好的东西!).
使用https://creately.com创建的图表
VPC: 亚马逊 VPC(虚拟私有云)是 AWS 云的一个独立部分,您可以在其中配置基础设施。您的组织很可能已经有了 VPC,如果是这种情况,您可以跳过这一步。
**子网:**子网本质上是 VPC 中可用地址的子集,为您环境中的资源增加了一层额外的控制和安全性。如上所述,您的组织可能已经设置了子网,但如果没有,请参见下文。
私有子网和公共子网之间的主要区别是map_public_ip_on_launch
标志,如果这是真的,那么在这个子网中启动的实例将有一个公共 IP 地址,并且可以通过互联网网关访问。
辅助 CIDR: 如果您的组织在其 VPC 中的所有 IP 地址都被私有子网占用,一种解决方法是创建一个辅助 CIDR 块,并在其中启动一个公共子网。
**互联网网关:**要使子网能够访问互联网,需要 AWS 互联网网关。互联网网关允许互联网流量进出您的 VPC。
**路由表:**路由表指定哪些外部 IP 地址可以从子网或互联网网关联系到。
**Nat 网关:**Nat 网关使私有子网中的实例能够连接到互联网。Nat 网关必须部署在具有弹性 IP 的公共子网中。创建资源后,与专用子网相关联的路由表需要将互联网流量指向 NAT 网关。
**安全组:**安全组充当您的实例的虚拟防火墙,控制传入和传出流量。下面的安全组启用端口 22 (SSH)上的所有流量。私有和公共子网中的两个实例都需要该安全组。
**Ec2 实例和键:**在定义了所有必要的基础设施之后,我们可以设置我们的 Ec2 实例了。这些实例需要一个 AWS 密钥对来验证访问,该密钥对是使用 aws_key_pair 资源和前面创建的现有 ssh 密钥创建的。
现在基础架构已经完成,下一步是部署。这可以通过 Terraform 目录中的以下 terraform 命令来实现:
terraform initterraform apply
如果部署成功,您将能够在 AWS 控制台中看到两个新的 EC-2 实例。
SSH 配置文件
SSH 配置文件是存储您所连接的远程机器的所有配置的一个很好的资源。它位于您的主目录下:.ssh/config
。配置文件不是自动创建的,所以如果它不存在,您必须创建它。
Host bastion-instance
HostName <Bastion Public IP>
User ubuntuHost private-instance
HostName <Private IP>
User ubuntu
ProxyCommand ssh -q -W %h:%p bastion-instance
private-instance 中的ProxyCommand
告诉 SSH 建立到 bastion-instance 的连接,然后建立到 private-instance 的 TCP 转发。
最后,您可以使用下面的命令通过 SSH 连接到私有实例:
ssh private-instance
瞧,你成功了!
我希望你喜欢这篇文章;如果你有任何问题或建议,甚至是对未来帖子的想法,请在评论区告诉我,我会尽最大努力回复你。
请查看我的其他帖子:
- https://towards data science . com/Apache-air flow-automating-the-collection-of-daily-email-attachments-213 BC 7128 d3a
- https://towards data science . com/selenium-on-air flow-automate-a-daily-online-task-60 AFC 05 afaae
通过 SSH 隧道连接到 AWS 远程 MySQL 服务器
图片来自 un flash
这是一个瓶颈,我觉得我碰到了路障。特别是因为我想在不支持 SSH 连接的 Microsoft PowerBI 上访问数据库。我正在想办法解决这个问题,但是找到了其他的解决方案,中途就放弃了。
什么是宋承宪?SSH 协议(也称为安全 Shell)是一种从一台计算机安全远程登录到另一台计算机的方法。
顾名思义,隧道是通过 SSH 的隧道,我们将在其上转发特定的端口。该端口在您的本地机器上是可访问的,但是会被自动转发到远程机器,所以看起来好像您的远程服务(在本例中是 MySQL)实际上是本地的。SSH 端口转发是 SSH 中的一种机制,用于将应用程序端口从客户端机器隧道传输到服务器机器,反之亦然。
你需要什么:
怎么做
- 打开 PuTTY 并输入服务器主机名或 IP 地址。—这里需要注意的一件重要事情是,主机名(或 IP 地址)是 SSH 主机+端口
主机名、端口和连接类型
2.如果您有用户名(如果没有,可以跳过这一步)
2.如果您有用户名(如果没有,可以跳过这一步)
3.接下来,我们需要 Putty 来定位您的私钥文件。
找到您的 PPK 文件
4.接下来,我们需要设置隧道。在类别页面上,选择连接-> SSH ->隧道。**输入源端口为 3306。**输入目的地作为您的 AWS 主机名,如下所示。单击添加。
建立隧道
单击 Open,您应该会看到这个终端指示连接成功。
连接成功
好处:将 SSH 隧道连接到 PowerBI
- 选择您的数据源,我将使用 MySQL 数据库进行说明
1.选择您的数据源,我将使用 MySQL 数据库进行说明
2.输入服务器和数据库。如果愿意,您还可以选择传递一个查询。
2.输入服务器和数据库。如果愿意,您还可以选择传递一个查询。
3.选择数据库,输入你的用户名和密码。
3.选择数据库,输入你的用户名和密码。
4.您应该可以看到所有的表(如果没有指定查询的话)或者数据库中的表
让我知道它是如何工作的!
连接你的思想
皮质
第 1 部分:大脑-计算机接口之旅的开始
图片来自 FreePikCompany
理论物理学家加来道雄曾经说过,人脑有 1000 亿个神经元,每个神经元连接到 10000 个其他神经元,是已知宇宙中最复杂的物体。虽然大脑已经困扰了我们许多世纪,但我们现在终于开始了解它是如何工作的,但更重要的是,我们如何从根本上提取信号,并找到修复神经退行性异常的模式,并实现高级生理功能。现在,随着机器智能、深度学习和电极硬件的进步,我们可以分离和分析大脑信号,让科学家和研究人员在基础层面上理解思想和感知,这为使用计算机进行神经调节开辟了可能性。
这个系列试图让一个在脑机接口(BCI)领域没有专业知识的人了解他们是什么,以及我们如何使用机器学习以独特的方式分析脑电波。本系列探索的项目是与阿拉巴马大学人类技术交互实验室的克里斯·克劳福德博士合作的。这也证明了业余科学家可以使用基本的脑电图(EEG)设备来提取和分析脑电波,进而可以部署大规模的开源平台,以便公众可以用自己的大脑数据进行实验。
这个系列讲的是什么?
本系列旨在通过下述项目提供脑机接口的综合指南。这个系列将有四个部分:第一部分是对 Muse 和数据存储的介绍,第二部分建立了实验所需的机器学习,第三部分讲述了用于提高准确性的复杂机器学习算法,第四部分是对该领域的总体评估,并对 BCI 的未来进行了评论。
是什么项目?
HTIL 开发的项目是一个脑电图分析平台,使用 Muse 消费级脑电图耳机和基于网络的应用程序来运行简单快速的运动想象和情绪分类实验。它包含实时数据流、提供高精度分类的强大集成机器学习算法,以及用户友好界面中的交互式可视化。
在这里,我们将介绍项目和本系列背后的基础知识,从以下内容开始:
- BCI 简介:我们将过一遍什么是脑机接口,电极放置的重要性,以及电信号的不同频率。
- Muse、蓝牙和架构:MuseEEG 是一种非常有用的设备,用于通过电极收集大脑信号。我们将介绍它是如何工作的,以及它如何连接到 React web 应用程序和 Chrome 的 web 蓝牙系统。
- 数据管理:管理跨多个通道和试验的数据是困难的,因此我们将探索如何使用 React 状态和上下文来做到这一点。
为了实现本文中描述的项目部分,您将需要以下内容:
- 对 JavaScript/React 以及如何使用 React 组件创建组件树的工作理解。这是 React 文档。
- Chrome 浏览器,了解并访问网络蓝牙 API,以及 Muse EEG 版本 2。
什么是脑机接口?
脑机接口(BCI)是直接与大脑活动连接的设备,由一种能够读取大脑活动的设备测量,称为脑电图(EEG)。EEG 设备通过有创或无创的电极放置来记录电活动。侵袭性 BCI 通常需要手术,这带来了感染或脑损伤的风险;然而,收集到的信号要强得多。无创 BCI 侵入性较小,允许更大范围的大脑活动,但收集的信号有噪声,模式不容易找到。虽然侵入式 BCI 设备是许多有趣的研究论文和突破性技术的主题,但本系列的重点将放在非侵入式 BCI 设备上,因为它对业余研究人员和公众来说更实用。
如前所述,电极的放置对于从大脑的特定区域获得不间断、清晰的信号非常重要。国际上进行了大量研究来确定电极放置的通用系统,最终产生了国际 10–20 系统。10–20 系统是国际公认的用于脑电图数据收集的头皮电极放置系统。
图 1:国际 10-20 系统(维基百科)
“10”和“20”指的是相邻电极之间的实际距离,其为相对于鼻根和枕骨突(分别为头部的前部和后部)的纵向和横向头骨距离的 10%或 20%。许多非侵入性 BCI 设备采用这种电极放置系统来收集脑数据流。例如,InteraXon 公司在 2014 年设计的 Muse ,是一款消费级可穿戴脑电图头带,旨在收集脑电波数据,用于冥想。研究人员已经研究了将 Muse 设备重新用于其他用例,因为研究结果表明,其电极的放置提供了运动想象和情绪分类功能。例如, Munawar Riyadi 等人使用支持向量机(SVM)算法和 Muse 设备开发了一个运动想象分类模型,在识别运动状态方面达到了 86.6%的训练准确度和 100%的测试准确度。此外,、、和朱等人利用公共空间模式(CSP)和算法,利用 Muse 设备开发了一个运动想象分类模型,达到了 95.1%的准确率。这些进步允许研究人员在运动想象中使用来自 Muse 的脑波数据,而无需直接或侵入性的运动皮层交互。
图 2: InteraXon Muse 脑电图
虽然 BCI 设备使用电极来收集数据,但收集的究竟是什么类型的数据呢?当人们执行任何认知功能时,无论是身体的还是精神的,大脑都会产生电信号(数据),这些电信号可以被电极检测到。脑电波不是这些大脑状态的来源或原因,而是这些复杂过程的可观察的反映。脑电波是根据它们的振幅和频率来分类的。例如,低活动度脑电波具有低频率和高振幅,而高活动度脑电波具有高频率和低振幅。在这两个范围内,研究人员根据其特定的认知相关性确定了这些电信号的五个不同频率范围: *delta、theta、alpha、beta、*和 gamma 如下所示。
图 3: 脑波分类
与运动想象和情绪分类相关的认知功能通过α和β波进行检测,并通过一种被称为事件相关去同步化(ERD)和同步化(ERS)的现象进行最佳表达。我们可以使用像 Muse 这样的设备来检测这种感觉运动活动。
缪斯、蓝牙和建筑
当你第一次使用 Muse 设备时,你会注意到该公司已经为 iOS 平台开发了一个内置的连接系统,允许用户将数据从他们的 Muse 传输到他们各自的 Muse 移动应用程序。在 HTIL 的一个项目中,我注意到 Muse 没有提供流数据的 web 界面解决方案,但是我的实验室已经开发出了一种在 Chrome 浏览器中从 Muse 中提取数据的方法。在我们进入如何与 Muse 建立蓝牙连接的细节之前,了解 Chrome 的网络蓝牙 API 是很重要的。
图 4: Chrome 的网络蓝牙 API
上图显示了 Chrome 的网络蓝牙 API 的基本接口,它允许用户在本地应用程序和网络浏览器中连接蓝牙设备。它利用 Chrome 远程接口将 Muse 蓝牙系统与 Chrome 的蓝牙系统连接起来。
HTIL 已经为这个问题开发了一个解决方案,但是代码是专有信息,如果您的应用程序是公开部署的,就必须和它的源代码一起使用。联系我获取有关访问这些文件的更多信息。
当使用该桥运行 web 应用程序时,Chrome 中的蓝牙系统将寻找准备配对的 Muse 设备,主机将显示它识别的设备。这个蓝牙桥系统有很多功能,但最主要的是,你现在可以将 Muse EEG 与网络浏览器配对,并开始使用网络应用程序传输数据。
图 5:应用程序架构图
现在我们的蓝牙系统已经就绪,让我们来看看应用程序的整体架构。在图 5 中,图的第一部分显示了 Muse 和 Chrome 的蓝牙系统之间的连接。在 React web 应用程序中可视化结果之前,会发生多个步骤:数据从 Muse 设备直接传输到应用程序,并存储在 React 上下文中,数据通过数据带通滤波器进行预处理, BCI.js 用于实现基于机器学习的分析和分类,结果通过 web 应用程序实验仪表板中的 web 组件进行可视化。这看起来很多,本文只关注数据存储和蓝牙,但是在以后的文章中,我们将会详细介绍这个过程的每一步。请随意使用这个架构图作为本系列和您自己项目的指南。
电极和反应状态管理
一旦你的 Muse EEG 连接到 Chrome 的蓝牙系统,该设备就会自动开始将数据从四个电极直接传输到 React web 应用程序。然而,如果没有合适的存储系统,代表来自这些电极的信号的数据点就会被丢弃。为了建立电极管理的行话,我将用国际 10–20 系统中的电极名称来指代电极:AF7、AF8、TP9 和 TP10。在 BCIDevice.build.js 中建立的 MuseClient 系统已经有了一个仅用于 AF7 的连接和数据提取系统,但它可以很容易地推断出覆盖所有四个。下面的代码显示了 startMuse 函数,它利用了所有四个电极的 map 数据类型。
图 6: Muse 连接功能
你可以在图 6 的中看到,我们将采样率设置为 256,这是每秒收集的数据点的数量,将缓冲区大小设置为 2000,这是包含大脑数据的数组中任何时候存储的数据点的最大数量。我们对每次存储的数据点数量设置了限制,以便我们的机器学习模型不需要超过几秒钟的时间来训练,从而实现更实时的体验。该函数遍历电极图中的每个电极,并对其运行过程更新函数,该函数包含两个参数,来自电极图的电极和数据有效载荷本身;该功能对于存储极其关键,因为它管理数据流,以允许机器学习模型正确地训练和测试。
在我们进入 processUpdate 函数实际做什么之前,必须先了解一下 React 状态。React 使用两种类型的普通 JavaScript 对象在组件之间和组件内部进行通信:props 和 state。Prop 是 properties 的缩写,它被传递给组件(从父组件传递给子组件),而 state 包含私有信息,只能由初始化它的组件编辑和使用。本质上,状态是组件类在所有后续函数和渲染中使用的全局变量。因为我们不需要跨多个组件的通信,所以 states 非常适合存储在这个组件中。有两种能力我们希望被状态控制:正在运行和计数器。
图 7:数据存储功能
isRunning 是一个布尔值,它告诉我们 Muse 是否正在为训练或测试集传输重要数据,而计数器则让我们知道我们正处于实验的哪个阶段。例如,在图 7 中的 switch 语句中,如果正在运行为真,并且计数器为 1,则正在进行第一次训练。更多的内容将会在下一篇关于机器学习的文章中介绍。 processUpdate 函数检查 Muse 是否正在将数据传输到重要的数据集,如果是,它将决定将其分配给哪个试验,如果不是,数据将被转移到存储阵列并被转储。然后,该函数使用 FIFO(先进先出)存储技术将数组的最大大小保持在 2000 个数据点;机器学习模型不能很好地处理数据量不同的数据集,因此每个电极的同时更新功能可以保持所有电极阵列的数据点数量标准化。总之,这个函数检查正在进行的实验,并将数据点放入适当的数据集中。启动和停止实验的特性调用了 processUpdate 函数,这将在下一篇文章的实验流程部分进一步探讨。在 processUpdate 中,状态系统与电极图和数据管理系统的使用相结合,实现了端到端的存储系统,可以使用 React 上下文在多个实验中复制。
反应上下文存储
前面,我们讨论了道具和状态的区别;如果我们希望组件树能够访问某些变量,每个组件都必须将 props 传递给下一个组件。然而,React 有一个名为 Contexts 的内置 API,它提供了一种通过组件树传递数据的方式,而无需手动通过每个组件传递属性。最后一节建立了用于存储 AF7、AF8、TP9 和 TP10 电极的单独会话数据的系统,但是上下文将用于管理多个会话和数据集,以用作机器学习模型的训练和测试数据。
图 8:多个试验存储的反应上下文
React 上下文文档提供了一种设置上下文的简单方法,但我们需要添加两个主要功能:设置函数和组件返回值(如图图 8 )。对于我们的实验流程,正确分类需要两个训练集和一个测试集;因此,我们必须为所有三个数据集设置带有存储的上下文。上下文本身也包含状态,但是它们允许我们通过上下文提供者在不同的组件之间传递状态。在代码中,您可以看到状态包含用于训练 1、训练 2 和测试数据集的数组。下一步是建立我们的集合函数,这些函数将状态设置为参数中定义的属性。例如,如果我们有一个包含第一个训练集数据的数组,我们可以使用 set 函数将第一个训练集数据存储在特定的上下文位置。在这个项目的环境中,有三组函数用于训练和测试数据集;这些功能现在需要在所有组件中都可用。这就是上下文提供者的用武之地。在 render 部分,有一个称为 Provider 的包装器,它向组件“提供”值和函数;在这里,我们将状态和设置功能传递给子组件。上下文架构看起来很简单,但是对于跨组件存储来说,React 实现它的方式非常强大。
图 9:上下文建立和数据访问
既然已经建立了上下文,我们如何跨组件访问这些数据呢?有两个简单的步骤:在子组件中建立上下文和使用集合函数。为了在组件中使用上下文数据,您必须使用下面显示的命令,该命令允许组件访问使用和更改上下文中的数据。此外,在组件中,有一个 updateData 函数,它使用 set 函数将训练或测试集存储到上下文中的适当位置,允许机器学习组件访问它。例如,对于 updateData 函数中的情况 3,下面显示的命令将数组(该期间来自四个电极的数据)设置为上下文中训练集 2 的特定点(如图图 9 所示)。该数据然后被用于机器学习组件,并且在绘图组件中创建视觉效果。从使用状态存储单个电极阵列到为多次试验创建环境,整个系统允许对运动和情绪分类进行端到端的实验。
结论
在本文中,我们介绍了脑机接口的基础知识,如何将 Muse EEG 连接到 Chrome 的网络蓝牙系统,以及如何管理不同电极和多次试验的数据。现在,您可以实现上述解决方案,开始提取和存储多个参与者的大脑数据。以下是一些有用的提示:
- 记得检查你的 Muse 上的版本,并充满电以获得最佳性能。有时不同版本的 Muse 需要修改源代码中的 MuseClient 配置。
- 尝试创建一个计时器,以确保在进入机器学习之前存储阵列已满,以便数据集保持一致。
在本系列的第 2 部分中,将建立一个机器学习基础,以允许开发人员在我们继续开发该平台的过程中从脑电波中提取模式。
如前所述, HTIL 开发的代码是实验室的专有信息,只有在确认来源的情况下才能使用。请联系我了解更多详情,以便您可以使用这些文件将 Muse 连接到网络应用程序。
请继续关注第 2 部分!
具有 NP 完全性的连接艺术
玩数学艺术可能会上瘾
原始图像:神奈川外的巨浪,由 Hokusai 拍摄(约 1829 年),TSP 图像由 Tumas Rackaitis 拍摄(2020 年)
我们总是着迷于将点点滴滴联系起来。纵观整个世界,各种文化都观察过天空,发现过星座。数学家们长期以来一直试图形式化在任意一组位置中寻找最短路径的最佳方式。这导致了旅行推销员问题(TSP)。
你以前遇到过这个问题,例如,通过问:我应该按什么顺序做我的差事,这样他们能最快地完成?我们可以把这个问题简化成一个图:每个任务是一个点,一个顶点,完成这个任务需要多长时间,这个点到另一个点的距离就是它们之间的距离。寻找最短的路径将是最快的差事序列。
点画是一种艺术技巧,它用一组点来表现一幅画,给人以色调的印象。我们可以用它来连接点状图像,其中的点根据图像的暗程度聚集在一起。这样做,我们可以创建一个 TSP 问题和一些数学上有趣的艺术。
原始的,点画的,TSP 的我的狗狗的图像。您可以在这里单独查看图片
如果你想自己尝试一下,我在 Github 上做了一个简单易用的 python 库!自己试试。
这种艺术的算法在高层次上看似简单:
- 从图像中生成点。(点画)
- 连接这些点来解决 TSP 问题。(求解)
为了演示如何制作 TSP 艺术,让我们首先选择一个图像。我将改变这个企鹅形象。
企鹅被点画和茶匙
让我们从生成一些点开始。在我的回购中使用的技术被称为加权 Vornoi 点画,由 Adrian Secord 首先介绍,在此为 。
您可以复制我的 repo,并按照自述文件中的设置说明进行操作。
要生成点画图像,需要在调用 python 文件后指定图像的路径。
python3 stippler.py <image path> --n_point 20000 --force --save --display
企鹅点画后加权 Voronoi 点画。
这将绘制一个 20k 点的图像,强制重新计算,保存输出,并显示在屏幕上。
在一小段时间后,文件将被生成,它将输出 3 个文件:一个 PDF,一个 PNG 和一个 NPY 文件。PNG 很有趣,但是 stippler.py 文件中真正重要的是它创建的。npy 文件,它包含图像中每个点的 X 和 Y 坐标。我们可以把它直接输入 TSP 求解器。
为此,我们指定。TSP 求解器脚本中的 npy 文件:
python3 tsp.py <.npy_file_path> #produces TSP solution.
这将产生一个 TSP 图像!
企鹅的 TSP 表示
您可以配置这些,并在下面的存储库中找到更多配置。
我从我的数学专业导师博施博士那里学到了这种艺术。他写了一本关于优化艺术领域的书。这本书通俗易懂,读起来很有意思,有很多漂亮的图片。
你可以在这里查阅他的书:
罗伯特·博施。 Opt Art:从数学优化到视觉设计。普林斯顿大学出版社,2019。
以下是我做过的一些我最喜欢的 TSP 图片:
我在这里使用的 Psyduck 作为我的缩放背景。我试图将它转换成 TSP 表示,结果好坏参半。我对它的点画非常满意,但作为 TSP 它看起来非常奇怪。
Psyduck,原始图像
Psyduck 在加权 Voronoi 点画后点画
Psyduck TSP:模糊。我喜欢眼睛的表现方式。前景中细节的缺乏使得点稀疏分布,这意味着 TSP 表示看起来很怪异。
另一个我最喜欢的是北斋的《女性浪潮》(约 1830)。日本木刻画往往点画得非常好,这是由于如何通过媒介处理色调,这是我越来越欣赏的东西。
《女性的浪潮》,作者北斋(~1829)
女性波,由北斋,点画加权 Voronoi 点画。两万个点。
20,000 点 TSP 代表女性波由 Hokusai。
如果你想看更多我的作品,你可以看看我的作品集网站。
下面这篇文章的代码就在这里的这个库中。
试试吧,在下面的评论里分享你的作品吧!
将模型误认为软件的后果(第二部分)
数据科学家来自火星,软件工程师来自金星(下)
构建和部署模型时要避免的十二个陷阱
在数据系列的第一部分中,科学家来自火星,软件工程师来自金星,我们研究了软件和模型之间差异的五个关键维度。接下来自然要问的问题是— 那又怎样?如果模型与软件混为一谈,数据科学家被视为软件工程师,这真的有关系吗?毕竟,对于大多数人来说,更重要的是对于商业世界来说,他们之间的相似之处要比不同之处明显得多。事实上,Andrej Karpathy 将这种使用模型解决问题的新方法称为软件 2.0 。如果它们真的是软件的下一个迭代,那么这些差异真的重要吗?
当我们将模型和软件融合在一起时,构建模型的挑战就变得更加严峻了。在这篇博客中,我们描述了当我们将两者合并时所面临的 12 个“陷阱”,并认为我们需要认识到它们的差异并相应地解决它们。
数据陷阱
正如我们在之前的博客中所讨论的,模型是正式的数学表示,可以应用于或校准以适应数据。因此,数据是构建模型的起点。虽然测试数据对于构建软件至关重要,但是在收集或准备测试数据之前,可以从给定的规范开始构建算法。
然而,当涉及到构建模型时,数据必须是高质量的(即,垃圾输入,垃圾输出),足够数量的可用数据,并且对于监督学习模型也是有标签的(即,标签是模型预测的响应变量)。数据也需要符合目的。这方面的一个例子是,当模型被部署到生产中时,数据应该代表我们将使用的人群。最近面部识别模型的皮肤类型和性别偏见的例子强调了拥有一个有代表性的(和有统计学意义的)数据集对于建立模型的重要性。这种数据偏差在实践中出奇的普遍。
我们已经看到,未能解决收集、管理和标记构建模型所需的必要数据的挑战,是将模型误认为类似于软件的重要陷阱之一。许多渴望推出人工智能或人工智能项目的公司很少关注这一方面,并开始用很少的数据建立模型。例如,一家公司最近想要构建一个 NLP(自然语言处理)模型,从只有八个 PDF 文档的文档中提取结构化信息。所需的成本和时间(尤其是来自领域专家(例如法律专家或临床医生)的成本和时间)使得标记成为一项重大挑战。虽然技术正在发展,以从更少的数据中学习,并帮助专家将标记数据作为他们正常工作的一部分,但拥有足够的、良好的标记数据仍然与构建模型的方式和传统的软件开发方式有很大的不同。
综上所述,数据陷阱可以进一步分为数据量陷阱、数据质量陷阱、数据偏差陷阱和数据标签陷阱。一家公司可能会遭遇一个或多个这样的陷阱。对数据陷阱有一个现实的感觉是至关重要的,以确保您不会走上错误的道路,在建模工作上花费数百万,而没有实现预期的回报。此外,了解这些陷阱还可以改变您处理建模工作的方式,首先收集更多的标记数据或寻找基于规则的替代方法来解决问题。
范围陷阱
有了三四十年的软件工程实践和方法,软件开发人员和系统分析人员在估计构建和测试软件所需的时间方面已经变得相当不错(或者至少比模型开发人员好得多)。使用敏捷软件开发方法,软件可以在固定的时间周期内增量和迭代地开发——通常在两周或四周的冲刺阶段。
假设我们希望我们的模型满足某些性能标准(例如,准确度、精确度、召回率等),那么很难估计实现这些结果所需要的努力和持续时间。更糟糕的是,我们可能无法先验地告诉我们实际上是否能够成功地满足性能标准。此外,满足性能标准的难度可能是非线性的。例如,在我们最近的一个客户项目中,我们能够在几周内用决策树模型达到 90%的准确率。然而,客户的目标是 99%的准确率。经过几个月的时间,神经网络模型的准确率不会超过 93%。
Lukas Biewald 给出了另一个经典的例子,在 Kaggle 的一次比赛中,全球数千人参加了一场比赛,旨在在短短一周内将模型的准确性从基线的 35%提高到 65%。然而,随后,即使在几个月和几千人试图改善这一结果后,他们所能做到的最好结果是 68%的准确率——仅仅提高了 3%。
我们称之为范围陷阱,在这种情况下,数据科学家无法确定实现特定性能标准(例如,准确性)所需的工作量和持续时间(或时间)、所需的数据以及所需的计算资源。这个范围陷阱可能发生在模型的不同阶段。在构建模型之前,可能很难确定模型的范围以实现某种性能——我们称之为预构建范围陷阱。训练范围陷阱是指数据科学家无法判断他们应该继续训练模型多长时间——使用新数据、新技术、额外资源等——以便在训练阶段达到性能标准*。*
当谈到在传统软件中嵌入模型或交付数据科学项目时,这两个陷阱会让产品经理、scrum master 或项目经理抓狂。在大型软件开发工作中,我们经常看到数据科学家的“声音”被忽略,由于紧张和固定的截止日期,迫使数据科学家执行简单的描述性分析,并且不能从模型中产生任何见解。或者,他们可能开发基于规则的模型,而不是脆弱的真正的 ML 模型。我们认为,这是许多 AI/ML 项目无法实现其声明的 ROI(投资回报)的重要问题之一。
当一个人构建能够持续学习的模型时,我们面临着一个额外的挑战。假设业务部门为模型部署确定的目标准确度是 90%,而经过训练的模型已经达到了 86%。业务和数据科学家可以一起做出部署模型的决定,让模型不断学习,并希望准确性超过 90%的阈值。同样,数据科学家将无法确定模型是否、何时以及在什么条件下会跨越这个阈值。我们将这种变体称为部署范围陷阱。
最后,模型可能遭受模型漂移,因为底层条件的改变,生产模型的性能下降。这种模型漂移可能突然发生,也可能连续发生。同样,数据科学家将无法确定模型准确性的性质、时间和恶化程度。我们称之为漂移范围陷阱。因此,需要建立模型监控实践来测量和处理这种模型漂移。
总之,作用域陷阱可以进一步分为预构建作用域、培训作用域、部署作用域和漂移作用域陷阱。下图通过一个示例强调了这些不同类型的作用域陷阱。
范围陷阱及其在构建前、培训期间和部署后的表现
回收凝汽阀
在着手构建任何大型软件之前,业务发起人和项目经理通常必须展示预期的 ROI。随着数据科学项目在企业中变得越来越普遍,企业领导者在进行投资或确定投资优先级之前,自然希望了解预期的投资回报。虽然估计一个新软件的回报并不容易,但当涉及到模型的预期 ROI 时,这项任务变得更加复杂。
从概念上讲,ROI 是一个相对简单的计算方法——它是相对于成本的净收益
ROI =(模型收益-模型成本)/模型成本
AI/ML 模型在公司中的好处通常分为两大类——效率和效率。当公司自动执行重复性的手动或认知任务时,他们可以提高流程的效率,减少执行这些任务所需的时间,并提高劳动力的生产率。当公司使用模型来制定更好的决策,以增强人类的决策能力时,他们就提高了决策的有效性。换句话说,好处来自于更快的和更好的。我们需要问的问题是——相对于什么基准更快更好?正是在估算这一基线时,公司常常做不到。****
当自动化一项任务时,我们需要有一个基线人类完成这项任务需要多长时间?不幸的是,估计一个人完成一项任务需要多长时间——尤其是当它是一项认知任务(例如评估客户的风险)或非重复性任务(例如处理费用审批中的异常)时,并不容易。具有不同技能、背景和任期的人可能需要不同的时间来完成任务。对所有这些因素进行适当的分析以确定一项任务的真实持续时间是一项重要的工作,而且在一个服务组织或知识型组织中也是不切实际的,因为这些组织的任务种类繁多,复杂程度各异。
在推导效率基线时的另一个常见问题是,可能很难将给定任务的评估与所有其他任务区分开来。以采购经理为例,她在一天的不同活动中检查系统中的采购订单,与包装单和供应商发票进行交叉检查,以确定交易是否准确。假设我们已经构建了一个 NLP 模型来从发票中提取关键字段,以便它们可以与采购订单相一致。即使对于这一个人来说,估计他们在发票处理上花费的总时间也可能是难以计算的,因为这项任务与其他任务相结合,例如参加会议、检查货物等。并且取决于采购订单、发票和包装单的复杂性(例如,如果装运是跨多个采购订单或多个发票的交付,则复杂性和时间会增加)。
当谈到获得有效性的基线时,我们进入了一个更具挑战性的努力。效率是针对任务计算的,这些离散的活动可以用持续时间来衡量。然而,说到有效性,我们正在评估的决策和的行动。我们如何确定一个动作是否比另一个动作更好?一个行动的结果是多维的,可能是不确定的,并且在效果上是滞后的。假设你正在驾驶你的汽车,当你接近一个信号灯时,绿灯变成了琥珀色。你会利用刹车来阻止后面紧跟的车有可能撞上你的危险吗?或者你会闯红灯(仍然合法)?哪种行动更好,以什么方式——对你后面的车辆更好,在油耗方面更好,在更严格地遵守法律方面更好。虽然这是一个简单的操作,但是估计决策的基线甚至更加复杂。**
到目前为止,我们刚刚检查了效率和有效性基线的估计。这必须在我们开始构建模型之前发生,以便我们对我们的模型需要什么性能有一个好的想法。我们称此为 收益估计陷阱 。还有另一种类型的回报陷阱,当我们已经构建并部署了我们的模型,现在正试图实现其好处时,就会出现这种情况。我们称之为 返回实现陷阱 。
在计算回报时,我们再次遇到问题。在效率收益的情况下,我们可以明确地表明自动化能够减少完成任务所需的时间。假设您的自动化发票处理模型将处理发票的平均时间从 30 分钟减少到了 15 分钟。如果这个人一天处理四张发票,他一天可以节省一个小时,一周可以节省五个小时。现在让我们假设这个人一天工作十个小时或者一周工作五十个小时。时间上的节约是 10%。然而,这可能不会给公司带来切实的经济利益。这可能是由多种原因造成的。员工已经每周工作 50 小时,节省了 5 小时,他们可能只是减少了工作时间。就员工满意度和保留率而言,这可能仍然是组织的总体收益——但我们可能没有将这一点纳入我们的收益估算。即使他们每周只工作所需的 40 个小时,而我们由于自动化节省了他们 5 个小时,他们可能会找到其他事情来填补这一缺口,而不是让组织能够将节省的时间转化为金钱。这是 RPA(机器人流程自动化)和 IPA(智能流程自动化)面临的最大挑战之一,在 RPA 和 IPA 中,为个人节省了时间,因此 FTE(相当于全职)有所减少,但这种节省并没有转化为员工数量的减少,在这种情况下,您可以清楚地展示自动化带来的回报。
当谈到实现决策或行动有效性的好处时,我们也会遇到类似的问题。在这些案例中,最大的挑战是归属的挑战。当一个行动可以被证明比一个备选方案好得多时,并不总是有可能隔离出执行这个行动的整个环境。例如,在停止车辆或穿过琥珀色的十字路口的情况下,当天气干燥和晴朗时,突然停止的行为可能更好,而在潮湿、湿滑、下雪天,这可能是错误的选择。在这种情况下,你不能把在干燥晴朗的日子停下来的好处完全归功于你的行动*——部分功劳归于大自然母亲为你的行动提供了合适的环境。在评估决策和行动时,这种归因挑战太常见了,因为竞争对手、客户、供应商、法规和许多其他利益相关者可能会参与将行动或决策变得“更好”或“更坏”。*
与软件相比,模型的回报陷阱更严重的原因是因为我们将这些模型的表现与人的表现进行比较。如果人类无法以自动化模型的速度执行某些任务(例如,算法交易),或者模型可以评估人类无法做出的选择并做出正确的决定(例如,玩围棋或象棋),模型的价值将相当明显。然而,在大多数情况下,当模型自动化任务或增加人类决策或行动时,价值陷阱是一个需要应对的重大挑战。
综上所述,我们最终得到四种不同类型的回报陷阱 — 回报效率估算、回报效率估算、回报效率实现、回报效率 实现陷阱。
摘要
我们已经了解了陷阱的三大类别以及总共十二个不同的子类别,如下所示。
跨越三个不同类别的十二个模型陷阱
在随后的博客中,我们将会看到一些最佳实践来解决这些陷阱以及界定、构建和交付模型的挑战。
作者: Anand S. Rao 和 Joseph Voyles
考虑从事欺诈分析工作
Bermix 工作室在 Unsplash 拍摄的照片
为什么欺诈可能是数据和分析中最热门的领域
与我交谈的人越多,我就越相信欺诈是并将继续是数据和分析领域最热门的细分市场。
我的推理相对简单:
每个企业都遭受欺诈
从传统企业到最前沿的企业,没有一个企业不遭受欺诈。这项针对亚太地区企业的研究发现,欺诈平均会让企业损失 1.75%的销售额——这是最高销售额,而不是利润!
在美国,这个数字可能更少,但即使欺诈成本占所有收入的 1%,这也意味着欺诈是一个每年 2000 亿美元的问题(美国 2019 年的 GDP 是 21 万亿美元)。
欺诈的例子包括:
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片
- 信用卡诈骗。如果信用卡公司不能及时阻止欺诈交易,它将不得不买单。
- 卖家在亚马逊市场、Ebay 或 Etsy 等第三方卖家匹配买家的在线市场上敲诈买家(反之亦然)。在卖家方面,它可以是任何事情,从发送一个装满石头的盒子到建立一个虚假的在线商店来窃取姓名和信用卡号码。在买方方面,退款是一种常见的情况,即客户收到了购买的商品,但声称他们没有收到。
- 与在线市场类似,零工和共享经济尤其容易出现欺诈。它可以是复杂的计划,洗钱者可以预订幽灵车(在拼车平台上)或幽灵住宿(在度假租赁平台上),也可以是更简单的计划,如虚假评论以推高评级,并利用推荐算法。
- 不太明显的欺诈也比比皆是。例如,当合同规定送餐员有义务送货上门时,他可能会拒绝全程送餐(为了节省时间和多送几次)。或者,Instacart 购物者可能会超慢地购物(以增加每单位努力的报酬)。同一购物者也可能挑选出某一类别中最贵、利润最高的商品(作为对店主回扣的回报)。这些事情既会对公司造成财务损失,也会对用户体验产生负面影响。
- 促销和优惠券是骗子和普通人最喜欢的目标。数字业务通常急于扩大规模。因此,向潜在客户提供金钱、赠品和折扣的做法非常普遍。这些类型的促销活动会像蜜蜂吸引蜂蜜一样吸引骗子。
- 保险欺诈规模巨大,每年损失数百亿美元。
欺诈可以用数据来对抗
欺诈是可以预测的。许多公司对数据科学和机器学习的一个批评是,积极的影响很难观察到。部署机器学习模型来预测未来趋势或揭示令人眼花缭乱的前所未见的客户行为洞察的宏伟计划往往无法推动变革(因为预测未来很难)。
然而,利用正确的数据和模型,欺诈是最有可能被识别和预测的。这可能看起来没有预测下一个大的消费趋势或让汽车自动驾驶那么迷人,但你更有可能相对快速地产生真正的物质影响(对于快速增长的公司来说,欺诈可能会让他们付出比我上面提到的 1%—2%的收入更多的代价)。
如果你的模式能够帮助你的公司每年从快速扩张的收入中赚回 1%,那就是很大的增值。
好吧,那么我需要知道些什么来对抗诈骗呢?
数据科学在打击欺诈中的作用应该是显而易见的——创建一个流程或系统来标记很可能存在欺诈的用户、交易或交互。
你最有可能做到这一点的方法是将大量的数据输入到一个模型中,这个模型会显示出欺诈的可能性。然后你将不得不决定什么构成足够高的概率来拉响警报。
这里有一个非详尽的技能列表,我认为对帮助公司打击欺诈会有帮助。
- 大数据操作、提取和清理:在线支付公司、电子商务公司或在线市场公司的数据集非常庞大。为了运行实验,您需要能够访问、清理和组织这些数据(如果数据工程师很忙,您将不得不自己动手)。
- 处理不平衡的数据集:类别不平衡将是欺诈分析中的常见障碍。合法用户或交易的数量远远大于欺诈用户或交易的数量。因此,了解类不平衡如何可能使你的模型产生偏差,以及如何对抗它的一些负面影响(重采样、SMOTE 等)。)很关键。
- 【自然语言处理】 :所有的数据都要很好地结构化、量化,这是极不可能的。相反,很多数据很可能是文本格式的,如电子邮件、客户反馈等。您将需要能够将这些文本数据转换成您的模型能够接收和理解的东西。
- 建模:无论是逻辑回归还是神经网络,一旦数据准备就绪,你将需要知道如何正确地训练一个模型,评估它的性能(包括它如何对未经训练的数据进行归纳),并在新数据到来时更新它。
- 适应性(你和你的模型):欺诈者会不断调整他们的方法和算法(是的,他们也精通数据)以避免被发现——考虑到所涉及的金额,他们非常有动力快速行动。因此,你上个月运行良好的模型可能会突然被欺诈者的创新所淘汰。你对问题的理解和你的模型都需要高度灵活才能跟上。
- 大规模部署模型:欺诈模型需要快速、可靠。欺诈者不会等着你慢慢做出决定。您还需要能够在保持模型更新和保护客户免受模型失控之间走钢丝。考虑到显著的类不平衡,新数据可能会彻底改变您的模型的行为,您将需要有一个适当的过程来快速评估模型更新的影响,并确定模型何时看起来可能会脱离轨道。
- 商业直觉、产品知识和客户同理心:这很重要,有两个原因。你越了解产品,就越能发现潜在欺诈和滥用的漏洞和领域。但是同样重要的是要认识到,将一堆账户或交易标记为潜在欺诈会给业务带来摩擦,并降低被错误识别的用户的体验。知道如何以及在哪里划清界限将是至关重要的——否则你将面临减少欺诈的风险,但代价是超出平均水平的用户流失。
结论
如果我重新开始我的数据职业生涯,我会认真考虑欺诈分析。在这个领域,数据和模型可以对利润产生更直接和更重要的影响。而造假是每个行业都面临的问题。
随着当代科技公司不断发明新的市场和服务,我们日常涉及的交易数量将大幅增加。每一笔新交易都代表着欺诈者盗窃的机会,也代表着聪明的分析师化险为夷的机会。干杯!
是否在我的模型中考虑多重共线性?
机器学习
简要讨论是否有必要修复特征空间中的多重共线性。希望对你设计下一个计算实验有帮助。
马丁·桑切斯在 Unsplash 上的照片
作为一个超级篮球迷,我曾经写过一篇博客,讲述如何使用线性回归模型根据一名 NBA 球员的场均数据来预测他的工资。我被我的一个粉丝挑战了。
他坚持认为我的管道是错误的,因为独立变量之间的多重共线性在将它们汇集到回归模型之前没有得到解决。
我会说,他一定是一个好学生,记得统计课程中所教的内容。但是无论何时建模,我们真的应该关心我们的特征空间中的多重共线性吗?
看情况。
我想通过一个小而有趣的实验来讨论这个话题。在这个例子中,我不会从理论统计的角度来评论任何事情。让我们只阅读代码并检查结果。
问题。
谁是 NBA 2019-2020 赛季的年度最佳新秀(罗伊)?
特征空间。
NBA 新秀从 1990 年到 2019 年的基本数据,包括新秀赛季的比赛(’ G ‘)、场均上场时间(’ MP ‘)、场均得分(’ PTS ‘)、场均篮板总数(’ AST ‘)、场均助攻数(’ STL ‘)、场均盖帽数(’ BLK ‘)、投篮命中率(’ FG% ‘)、三分球命中率(’ 3P% ‘)和罚球命中率(’ FT% ')。
玩具数据的头
因变量。
我用罗伊投票份额作为因变量,范围从 0 到 1。投票份额越高,成为罗伊的几率就越高。我没有把它框架到一个分类问题上,为了避免一个不平衡的训练集。对如何从头到尾生成一个 ML 项目的细节感兴趣的可以参考我的另一个帖子。
回归模型。
我尝试了两个机器学习回归模型(弹性网和随机森林)和一个经典线性回归模型。
超参数调谐功能。
上面的函数显示了超参数调整函数,其中我可以使用交叉验证来确定每个模型的超参数。调整后的超参数将用于最终的模型训练。
基本线性回归在管道内定义如下。
基本线性回归模型
超参数调整和模型训练。
我使用分割数据集训练上述模型。数据分割和超参数调整代码如下所示。
数据分割代码。
调谐过程。
上面代码中调整过的超参数然后用于训练最终的模型。
最终模型训练函数。
训练最终模型。
我也训练了基本的线性回归模型如下。
拟合基本线性回归模型。
绩效评估。
我在测试数据上评估了三个模型的性能。我计算回归模型的 MSE。
具有所有特征的三个模型的 MSE。
我发现模型 2(随机森林回归)是所有三个模型中最好的,测试数据 MSE 等于 0.055。
整个建模过程已经完成。
从特征空间中移除相关变量。
现在,让我们处理数据,以便排除彼此相关的特征。我简单地检查了下面的相关性。
数据集相关性。
似乎每场比赛的得分(PTS)和上场时间(MP)与皮尔森的相关系数等于 82%高度相关。因此,我首先从数据集中删除 MP,然后再次重复整个建模过程。以下是测试数据 MSE:
从特征集中移除 MP 后三个模型的 MSE。
我还从整个特征空间中移除 PTS,并重复整个建模过程。这是测试数据的 MSE 结果:
从特征集中移除 PTS 后三个模型的 MSE。
如上图所示,在解决了特征集中的共线性后,三个模型的性能几乎与完整模型相同。
这些结果表明,从特征空间中移除共线性对我们数据集中的罗伊的预测没有帮助。
顺便说一句,所有的模型对我们的问题给出了相同的答案。预测 Ja 莫兰特 将是 NBA 2019–2020 赛季的罗伊。
何时考虑多重共线性?
然而,为什么人们强调解决回归模型中多重共线性的重要性,而它对预测没有影响呢?这与模型的解释有关。
假设我们感兴趣的是检测球员的哪些基本数据对预测贡献最大。然后,我们需要小心多重共线性。
高度相关的变量可以相互竞争来解释模型中因变量的方差。具体来说,这种竞争将体现在弹性净回归和线性回归中的系数上,或者体现在随机森林回归中的特征重要性上。
由于第二个模型(随机森林回归器)是我实验中最好的模型,我将用它作为例子来解释。
我分别画出了随机森林模型 1) 具有所有特征、 2) 具有除 MP 之外的所有特征和 3) 具有除 PTS 之外的所有特征的特征重要性。
所有变量的特征重要性。
当我使用所有特征时,我发现 PTS 是模型中最重要的变量,而 MP 看起来一点也不重要。
没有 MP 的特性重要性。
如果我从特征空间中移除 MP,模型仍然给出 PTS 作为最重要的变量。
不含 PTS 的特征重要性。
但是,如果我把 PTS 从特征空间中去掉,如上图所示,MP 就成了最重要的变量。
从这些结果中我们可以看出,MP 和 PTS 对于预测都是重要的,但是如果将它们作为独立变量一起放入模型中,它们在特征重要性上是相互竞争的。
结论
我们需要修复回归模型中的多重共线性吗?
看情况。
如果回归器的目的是纯粹的预测,数据集中存在的多重共线性根本没有害处。它的预测能力不受相关变量的影响。
如果回归变量的目的是了解自变量和因变量之间的关系,则需要解决多重共线性问题,因为相关变量会在解释因变量时相互竞争。
希望这篇文章能对你的机器学习项目有所帮助。如果你喜欢读这篇文章,请在媒体上 跟随我 。如果您对数据科学文章感兴趣,这些帖子可能会对您有所帮助:
一个关于如何在 r 中用 pheatmap 生成漂亮的热图的教程。
towardsdatascience.com](/pheatmap-draws-pretty-heatmaps-483dab9a3cc) [## 给出了随机森林分类器的特征重要性
如何建立一个随机森林分类器,提取特征重要性,并漂亮地呈现出来。
towardsdatascience.com](/present-the-feature-importance-of-the-random-forest-classifier-99bb042be4cc) [## 线性回归中的一个实用建议
从弹性网开始,记得调好定义 l1 范数之比的超参数。
towardsdatascience.com](/a-practical-suggestion-in-linear-regression-cb639fd5ccdb)
内森·杜姆劳在 Unsplash 上拍摄的照片
关于数据和科学在数据科学中重要性的思考
又一个新冠肺炎仪表板。这可能不是很有见地,但我喜欢它,因为它是我的
我必须承认:在封锁的这些天里,我一直在摆弄关于新冠肺炎疫情的仪表盘和信息图表,就像其他人一样。我已经制作了一个交互式仪表盘,有漂亮的图表,一些格式化的表格,甚至一些(基本的)地图。它闪亮而漂亮,你可以花一些时间玩它打开和关闭图层,悬停,缩放…而且,老实说,我必须承认,我为我取得的一些成果感到自豪。然而,它有缺陷。就像其他人的(或者差不多)。然而,我会继续改进它,即使我担心它会一直有缺陷,即使我承认它永远不会有助于提高这方面的知识。
那么,如果我知道我不能改变它的命运,为什么我还要坚持不懈地努力呢?诚然,在某些时候,我问过自己这个问题,我甚至考虑过辞职。我不仅不想浪费时间(即使在我们被锁在家里的这些日子里,我们也有很多事情可以做),而且我不想制造噪音、错误信息,甚至对一部已经很重要的戏剧进行更多的渲染。因为有缺陷的图形就是这样。但最终,我意识到在这样的仪表盘上工作是一个边做边学的好机会。
从中可以学到许多类型的课程,比如与技术技能相关的课程,或者与如何收集、可视化和分析数据相关的课程。今天,当新冠肺炎的数据和数字到处都是时,我想分享一些关于数据科学中的科学(或缺乏科学)的思考。
1.获得(正确的)数据。
听起来很明显,没有数据来可视化或分析,就没有数据可视化或数据科学。因此,任何想要进行任何类型的数据可视化或数据分析的人首先要做的就是获取数据。第二:我们不能使用任何类型的数据。我们需要使用好的数据,我说的好的是指可靠的、可用的(就许可证、格式和结构而言)、最新的和频繁更新的*,并且希望官方的数据,即代表性的足以解释我们正在研究的现象。虽然这通常不是小事,但如果我们要解释一个全新的现象,就在我们说话的时候,它正在发生,而且像新冠肺炎一样在全球范围内发生,这就更重要了。*
通常情况下,只有两种可能的选择:要么自己收集数据,要么依赖他人的数据。虽然收集我们自己的数据可能是某些情况下的最佳选择,但在新冠肺炎的情况下,我们不太可能收集到对我们有用的数据(事实上,正如我们将看到的那样,甚至政府也在努力这样做)。因此,我们只有一个选择。当然,我们不能依赖某个随机的人或机构,我们需要依赖我们可以信任的人,比如大学(因为他们倾向于提供严格的数据)、政府(因为他们提供官方数据)或组织(比如世界卫生组织)。但是我们从哪里得到数据呢?
世卫组织的新冠肺炎仪表盘(截图自 2020 年 4 月 2 日)
虽然大多数政府以开放许可证的形式提供数据,允许出于任何目的使用和重新使用数据,但它们通常未能解决另一个重要问题:文件格式和数据结构。因此,在英国或西班牙等国家,如果没有手动操作,数据无法直接消费。其他公司,如世卫组织,提供了很好的数据仪表板,但他们不提供供第三方使用的原始数据。好消息是,有些人和机构正致力于使用开放许可证发布干净的数据,例如西班牙的data dista、约翰·霍普斯金的大学收集来自不同政府和世卫组织的数据,甚至还有像 R 这样的包,它从 UJH 获取数据,并为开发人员和数据科学家在他们的项目中使用提供一个很好的数据框架。
因此,难怪全球大多数信息图和仪表板依赖于相同的数据源。这似乎是一个明智的决定:我们不仅得到现成可用的数据,而且我们是从可信的来源得到这些数据的。然而,正如我要说的,正是因为这个原因,他们中的大多数人都错了。但是有什么可能出错呢?
2.不要把数据看得太重
既然我们知道从哪里获取数据,我们必须意识到:通过依赖他人生成的数据,我们没有解决数据收集的(主要)问题,我们只是将责任转移给了其他人,但有人仍然必须处理我们一直试图避免的事情。令人惊讶的是,并非每个国家都以相同的方式收集数据。
就拿最基本最关键的问题来说:确诊病例数是怎么定义的。因为新冠肺炎的症状与流感非常相似,而知道某人是否被感染的唯一方法是通过测试呈阳性。这似乎是一个很好的定义:我们有一个对每个人都一样的客观测试,所有国家似乎都使用相同的标准。不幸的是,这些测试需要稀缺的设备(与当前全球需求相比),只能在医院进行,并且需要两天才能得到结果。因此,有许多其他场景没有在本测试中考虑,如图 2a 所示。所以,是的,每个政府都提供了这个数字,然而他们都比真实数字低得多。低多少?没有办法知道。
确认数字≠实际数字。案例比官方的多很多。还有多少?我们不可能知道
让我们关注另一个例子:死亡人数由 COVID 19 。显然,这应该更容易。每个国家都有每天死亡人数和死亡原因的记录,所以应该很容易从所有可能的原因中筛选出死于新冠肺炎的人。嗯,不。正如我们所看到的,如果我们不能准确地定义感染新冠肺炎病毒的人数,我们就无法知道因此而死亡的人数。
但是,如果我们考虑到每个国家对如何统计检测呈阳性的死亡人数有不同的标准,情况可能会更加棘手。以英国的定义为例:
死亡数字几乎在所有情况下都与死于医院且新冠肺炎检测呈阳性的患者有关。[……]这些数字不包括院外死亡,如护理院内的死亡,除非上文另有说明。( [来源](https://www.gov.uk/guidance/coronavirus-covid-19-information-for-the-public ↩︎) )
所以,再一次:无论哪个国家进行测量,真实数字都比报道的要高得多。他们都错了。一些人认为,政府不想提供真实的数字,以免引起更多的社会恐慌,失去选民的支持,甚至比其他国家更好看。然而,通常更简单的答案是最有可能的答案:不是政府想对我们隐瞒信息,只是没有一个国家有能力面对这场疫情,更不用说采取准确的衡量标准了。新冠肺炎的另一出戏剧超越了个人悲剧:世界上没有一个国家准备好应对新冠肺炎所代表的压力测试。
这并不是说政府在密谋隐藏信息,只是他们没有办法获得更好的数据。戏剧就在这里!
但是让我们回到我们的道路:数据和数字的道路。在这一点上,我们不得不承认所有的数据都是有缺陷的,我们无法从中获得真实情况的完美画面。如果我们想这样做,我们需要使用其他数据来源,比如将每日死亡总数的记录与去年同期进行比较。当然,这将需要更多的时间,反过来,这也有其他影响和问题(例如,它不会给出新冠肺炎死亡的准确数字,因为没有办法知道他们的死因,但不同时期之间的显著差异可能是一个很好的代理)。
因此,我们现在有两个选择,要么对所有新冠肺炎信息图表和指标完全失去信心,要么承认它们的局限性,并假设它们只是对现实的粗略近似。
我们有两个选择:要么对所有新冠肺炎的信息图表完全失去信心,要么假设它们只不过是对现实的粗略近似
3.选择正确的图形和图像
太好了!如果你正在读这篇文章,这意味着你可以假设现实(一如既往)远比漂亮的仪表盘所能显示的更复杂,不管它们有多花哨。说到这里:当心花哨的视觉效果!
我敢肯定,在这一点上,你可能已经看到了许多任何类型的整洁的信息图,就像上面的那些:其中一些使用箱线图,其他线条,其他散点图…其中一些有平滑的边缘,其他的有对数刻度的轴。甚至有一些想要引入地理空间分析并呈现不同种类的地图(choropleths,bubbles,sizes 如果你像我一样,你可以享受观看它们并与它们互动数小时的乐趣。但是它们真的能有效显示有用的数据吗?可惜大部分都不是(甚至包括我自己的一些)。
最基本也是最常见的一种方法是显示一个国家内的大部分病例。大数字确实很吸引人,也很容易理解,但它们通常缺乏一些上下文,使它们真正有意义。当然,谁都能理解一个 7 位数的数字是个大数字,但要知道它到底有多大真的很难。我们需要将它与其他东西进行比较,以全面掌握它的真正重要性。此外,由于我们处理的是一个累积数字,因此必须了解所分析的时间跨度,因为在一天、一周、一个月或一年内达到某个数字是不一样的。
大数字很容易记,也很容易理解,但单独使用时并不真正有意义。这是我试图通过添加一些背景来解决的问题。来源:卡洛斯·卡马拉
一种常见的变化是提供累积案例的折线图,X 轴表示日期,Y 轴表示案例总数。有几种变化:显示相对数据(例如:病例数/人口数),用对数标度(以便更容易看到第一天与最近几天相比的变化),显示几个类别,代表不同地区或不同类型的病例…虽然它们真的很有效,而且从技术角度来看大多数都是正确的(特别是考虑到其中一些变化会产生很大的差异),但数字本身的表示可能很少或没有用处。真的能代表什么吗?通过提供一个根据定义将会一直增长的数字,我们可以回答什么样的问题?
显示累积案例的折线图。真的有意义吗?来源:世卫组织
正是出于这个原因,一些人决定使用其他指标来评估疫情的发展情况,例如每天新增病例的数量,因为这些指标使我们能够很容易地确定数字是好还是坏于前一天。同样,可以对前面的图进行同样的变化,以使其更有洞察力,例如下面的条形图,它显示了按类型分组的每日病例变化。我们不仅可以看到它们开始下降,而且,与死亡或活动病例相比,康复病例的数量正在增加。
每日案例,按类型。来源:卡洛斯·卡马拉
这确实比累积案例更有用,尽管它有些不稳定并可能导致混乱。以下图为例:
你能看到那种奇怪的意想不到的变化吗?就是周末效应!(这就是为什么在下一个仪表板版本中,我将突出周末)。来源:卡洛斯·卡马拉
你能看到 3 月 29 日和 30 日的所有数据在第二天再次达到峰值之前是如何急剧下降的吗?这确实是一种意想不到的行为,也很难解释。除非我们意识到这两天是周六和周日,并且由于在医院工作的人较少,数据不会像往常一样快,因此会在周一累积。这种现象被称为“周末效应”(我提到过你不应该把数据看得太重吗?😉)
正因为如此,其他一些人,如《金融时报》的约翰·伯恩-默多克(John Burn-Murdoch)更喜欢使用固定期限(如 3 天或 5 天)的滚动平均值,这是一个更稳定的数字,如下图所示。
来源:金融时报
其他用于修复这些异常值和显示趋势的技术是使用基于实际数据的平滑线图,就像下面由 Pablo Rey 制作的图。
基于实际数据的平滑线。来源:蒙特拉 34
4.不要仓促比较
当然,最常见的视觉类型是比较新冠肺炎是如何影响不同地区的,无论是在一个国家内还是在不同国家之间(通常以中国或武汉为参照——毕竟,这是一切开始的地方)。虽然这种图表可以回答一些问题,比如一个特定地区如何对待另一个地区(因此,例如,复制或避免他们针对新冠肺炎的措施),但这些比较确实存在问题。首先,人口或规模差异巨大的事实使得任何绝对比较都是无效的。
但是,即使在使用相对值(例如:每个居民的病例数)时,还有其他对疾病演变有直接影响的关键因素,其影响被认为是相同的,而实际上可能有几个数量级的差异,例如人口统计、地理、城市住区或卫生系统(就人力和财政资源而言),等等。
按年龄和国家分列的病例和死亡率柱状图。意大利的大多数病例发生在 70-90 岁之间,而韩国的病例发生在 20-30 岁之间,因此死亡总数存在巨大差异。来源: Diario.es
然而,在所有这些差异中,最相关的可能是检测新冠肺炎病毒的测试次数,这个数字不仅不同,而且通常是未知的。这绝不是微不足道的,因为我们已经看到案例的数量是使用这个参数定义的。因此,如果一个国家进行的检测数量非常少,那么它的病例数量也将非常少。眼不见心不烦。
因此,这里最大的问题是,如果不考虑这些因素,比较可能会得出大量与现实无关的有偏见的结论,例如,一些国家可能会避开新冠肺炎,或者具有某种免疫力,或者新冠肺炎只会影响卫生系统糟糕的国家,无组织的政府或不发达国家。因此,就像一些政客为了自身利益已经开始做的那样,一种建立在完全错误的基础上的道德优越感的叙事存在风险。
不要像 Wopke Hoekstra 那样做草率的比较,否则你可能会像他一样得出令人反感的结论。图片:维基共享资源
5.更不要把预测当回事
最后一组图,也是最复杂的一组图,是那些进行预测的图。虽然它们真的很吸引人,而且显然为我们的一个主要担忧提供了答案()“这什么时候会结束?”/“这种情况还会持续下去吗?”)用一种非常可以理解的方式来说,他们真的很狡猾。有几种方法可以进行预测,例如使用线性回归或模型。虽然模型可以像我们希望的那样简单或复杂(因此,它们的准确性会有很大差异),但它们主要依赖于拥有一组良好的历史数据或了解它们想要描述的现象的逻辑。不幸的是,由于新冠肺炎是一个新现象,我们两者都缺乏,因此,现阶段的预测容易出错。一些预测是基于以前爆发疫情的其他地方发生的情况,但我们已经看到这可能会产生多大的问题。
如果我们看不到(也不理解)预测背后的模型,它可以像算命师一样有用和可靠。图片:算命先生,由 阿尔伯特·安克尔(维基共享资源)
最后,但同样重要的是,我们不应该忘记,它们需要特定领域的大量知识,就像大多数做这些漂亮可视化的人(包括我自己)所缺乏的一样。因此,既然我已经公开承认这超出了我的知识范围,在这一点上,我只能建议对任何不是由该领域权威人士作出的预测持怀疑态度。即使在这种情况下(如果我能理解的话),我也会建议谨慎行事。或者更好的是:如果预测是由流行病学家做出的,而你是其中一员,那就依靠预测。
包扎
如前所述,如果数据可视化从来都不容易,那么对于像新冠肺炎这样的新现象就更不容易了。因此,当面对任何类型的视觉效果时,我们都应该谨慎行事。如果你正在做(或计划做)任何类型的可视化,问问你自己你想回答什么问题,最好的方法是什么,考虑前面提到的注意事项,并让它们对你的读者显而易见。此外,让你的分析具有可重复性,这样任何人都可以告诉你是否做错了什么,甚至可以自己解决。如果你只是简单地看着它们,去寻找所有那些解释,如果你找不到,去寻求它们,帮助作者或者干脆忽略它,去寻找一个替代方案。但无论如何,你要时刻记住,不要把数据看得太重,也不要太盲目。数据本身并不重要,重要的是我们用它做什么,以及如何做才能获得真正重要的知识。这就是科学发挥作用的时候了。
原载于https://www . carloscamara . es2020 年 4 月 4 日。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
一致值函数定义
从数学上定义价值函数和策略,以及这些定义的一些涌现属性。
安托万·道特里在 Unsplash 上拍摄的照片
在这篇文章中,我将定义强化学习中使用的标准γ-贴现值函数。从这些定义出发,我将讨论值函数的两个重要涌现性质,它们证明了定义的自洽性。我将从数学上构建这些概念,重点是写出推导中的每一步,并讨论每一步的含义。这些方程是 RL 中许多重要数学证明的基础,完全理解它们对于建立 RL 的理论理解是重要的。
价值函数
价值函数是强化学习的核心。对于任何给定的状态,代理可以查询值函数来确定与处于该状态相关联的“值”。我们传统上将“价值”定义为未来获得的回报的总和。因为它依赖于代理人在未来会看到什么样的回报,所以必须为给定的行为策略定义一个价值函数;一项政策。也就是说,状态的值取决于代理在访问该状态后的行为;一个独立于行为的“价值”的讨论是没有意义的。
我们将策略定义为将状态映射到动作概率分布的函数。形式上,
其中𝒮表示代理可以访问的所有可能状态的集合(通常称为“状态空间”),𝒜表示所有可能动作的集合(通常称为“动作空间”),δ(𝒜表示动作集合上的标准单形。标准单纯形只是在动作空间上书写概率分布的一种形式方法。简而言之,策略接受一个状态,并返回代理在该状态下应该采取哪些操作的权重。大的权重导致选择该动作的频率,小的权重导致低的频率。
有了价值函数的直观定义和策略的正式定义,我们可以写出价值函数的正式定义:
请注意,在偶发性问题设置中,我们可以假设终止后所有转换的γ=0,因此这些转换对总和仅贡献一系列零,可以忽略不计。
值得注意的是,上面给出的定义只是价值函数的一个可能的定义。强化学习的大部分理论是围绕上面定义的γ-折扣奖励值函数发展的,这也是我们将使用的定义。然而,也考虑了其他替代方法,尤其是最近,包括平均奖励值函数。
一个简单的三态 MDP。图片作者。
上面定义的价值函数提出了这样一个问题:“假设我们处于某个状态,我们可以期望在未来看到多少回报?”为了使用这个值函数来做出决策,代理可以查询可能的下一个状态的值。例如,假设一个代理处于状态 A,有两个动作分别指向状态 B 和 C,代理可以问 v(B) :“在状态 B 我会看到多少奖励?”或者 v© :“在 C 国我会看到多少奖励?”
使用状态值函数来选择动作的困难在于它(a)要求代理提前知道动作的结果(例如,采取“向左”动作导致进入状态 B ),以及(B)要求动作每次都确定性地导致相同的状态。强化学习框架旨在处理非常一般的问题设置,其中(a)和(b)不一定都为真。
为了克服这些挑战,我们引入了状态-动作值函数(一般简称为“动作值函数”);但是我不喜欢这种命名约定)。状态-动作值函数定义为
首先注意(顾名思义)这现在是一个状态和动作的函数,并返回未来奖励的平均值。这个和状态值函数的区别只在于(S,A,R,S,A,R,…)序列的第一个动作。在状态值函数的情况下,第一个动作是根据π(S₀分布的随机变量);然而,在状态-动作值函数的情况下,第一个动作是非随机的并且是给定的。
通过访问状态-动作值函数,代理不需要知道其环境的状态动态。它不需要知道在状态 A 中采取“左”的动作会导致状态 B,状态 B 具有值 v(B) 。相反,代理可以查询其状态-动作值函数,以获得在状态 A 中采取“向左”动作的值, q(A,left) 。正如我们将在下一节中看到的,代理人不再需要访问环境模型来做出决策这一事实是状态-动作值函数的一个定义性特征。直观地,状态-动作值函数隐含地学习环境动态的模型。
贝尔曼一致性方程
v 和 q 都满足一组所谓的贝尔曼一致性方程。也就是说,对于我们的任何状态和行为
其中 r(s,a) 是返回平均一步奖励给定状态 s 和动作 a 的函数。这有点复杂,所以让我们一点一点地来看。
等式(1)简单地说:如果对动作求平均,则状态 s 的状态值函数等于状态 s 的状态-动作值函数。将期望值写成一个和,我们得到
即:在 s 处的状态值函数是状态-动作值函数的所有可能动作的总和,由采取每个动作的概率加权。这是有道理的。两个价值函数对未来奖励有相同的定义,遵循政策π,并对γ折扣奖励进行求和。价值函数仅在第一步有所不同,无论行动是给我们的(状态-行动价值函数),还是我们根据π(状态价值函数)对行动取平均值。
通过访问状态-动作值函数,我们可以通过考虑序列中第一个动作的备选策略来构建任意多个可能的状态值函数。例如,假设代理想要考虑这样一个场景,其中(S,Aμ,R,S,Aπ,R,S,A~π,R,…)第一个动作是从策略μ中选择的,所有未来的动作都是根据策略π选择的。这种策略组合的价值函数可以写成
这种情况发生在策略改进设置中,代理一次只能在一个状态下改进其策略。代理为第一个状态寻找更好的策略,假设它为所有未来状态遵循π,那么根据策略改进定理,我们可以证明这个新的联合策略至少与π一样好,如果不是更好的话。
等式(2)更复杂。让我们从简单的部分开始,这个新函数的定义 r(s,a) ,
这就是我在下一次从状态 s 开始并采取行动a的转变中看到的平均回报
为了理解等式(2)的第二部分,我们先回忆一下价值函数的定义。
其中期望是以 s 和 *a、*为条件的,但是为了空间和清晰起见,我省略了这个细节。我还将第一次奖励的期望值替换为我们上面计算的平均奖励函数。
现在利用我们从第一个一致性方程(方程 1)中学到的知识,我们可以写出
我们恢复第二个一致性方程,方程(2)。
这个第二一致性方程给了我们一些关于状态-动作值函数和状态值函数之间的区别的直觉。特别是,国家行为价值函数的不同之处仅在于序列的第一个奖励。在状态-行动的情况下,我们考虑由确定性行动 a 选择的奖励,而不管该行动可能来自哪里(它可能被策略π采样,它可能被其他策略采样,等等)。).在状态值案例中,我们考虑平均奖励,其中根据策略π对所有行为取平均值。我们不能考虑作用的其他分布,也不能考虑特定的单个作用(这当然是作用分布的一个特例,所有的概率质量都在一个作用上)。
理解价值函数和策略的定义,以及它们的一些核心涌现性质,对于 RL 证明中更严格的构造是至关重要的。拥有直觉有助于阅读证明和获得“基本想法”,但直觉本身不足以抓住 RL 中的一些微妙之处;因此经常导致不一致的误解或代码中的错误。例如,一个常见的误解是,访问一个国家行动价值函数意味着一个人可以通过对该国家行动价值函数的行动进行预期来计算任何其他政策的值。然而,很明显(希望如此),这种期望仅仅改变了轨迹中的第一步,但是所有以后的步骤都是关于原始策略π的。
约束线性回归
市场组合建模和价格促销优化
里卡多·戈麦斯·安吉尔在 Unsplash 上的照片
当我第一次听说“约束回归”的时候,我很困惑,为什么有人想要约束为你的数据提供最优估计的系数?事实证明,这是市场组合建模和价格促销优化的一个重要方面,尤其是在零售和 CPG 行业。我把这篇文章分成两个部分,这样容易理解。
1.为什么我们需要约束回归?
2.执行约束回归的方法
为什么我们需要约束回归?
对于实际应用,我们转向一个叫做市场组合建模(MMM)的概念。它有助于量化各种营销因素对销售额或销量份额的影响。这些营销因素主要是营销的 4p,即价格、促销、产品和地点。
如果我提高一种产品的价格,我的销售额会有什么变化?如果我开展特定的促销活动,我的销售额会有怎样的变化?事实证明,“价格”和“促销”(持续)很容易量化,而“产品”和“地点”(分类)可能需要混合模型。
以销售为因变量,营销因素为自变量,进行多元线性回归,可以很容易地找到量化各因素影响的系数。
注:在行业中,专业人士喜欢交替使用市场组合模型、媒体组合模型、价格弹性模型等。在所有三个模块中工作过之后,我认为市场组合建模是母模块,媒体组合建模和价格弹性建模是子模块。
如果我们将销售量作为因变量,在将其他因素对销售的影响隔离后,只有营销支出作为自变量,我们通过模型系数估计 ROI,如果我们将销售量作为因变量,将价格作为自变量,在将其他因素对销售的影响隔离后,我们通过模型系数估计价格弹性。
假设我们正在对一些零售数据进行建模,将销售额作为因变量,将其中一种产品的价格作为其他几个变量中的一个自变量。该等式将如下所示,
来源:https://medium.com/@harsha.ft194029 @作者
约束回归的不同方法
二次规划:
https://en.wikipedia.org/wiki/Quadratic_programming
OLS 的成本函数可以很容易地转换成上述方程,因此 QP 可以应用于解决线性等式和不等式约束。
贝叶斯线性回归:
如果我们约束一些系数,这意味着我们对估计有一些先验知识,这就是贝叶斯统计所处理的。我们可以指定估计值的先验分布,并执行贝叶斯回归来获得期望的结果。
上面提到的并不是一个详尽的列表,请在评论区随意添加任何其他方法。
让我们考虑一些假设的销售和促销支出数据,如下所示。
来源:https://www . ka ggle . com/djokester/三年洗发水销售额(已修改)
我们将执行普通的最小二乘法,看看结果是什么。
来源:作者@https://medium.com/@harsha.ft194029
让我们把“花”的系数约束到一个任意的上界,比如说 0.5?
来源:作者@ https://medium.com/@harsha.ft194029
比较以下表格格式的结果,
来源:作者@https://medium.com/@harsha.ft194029
就 r2 而言,约束系数让我们付出了太多。上面用于约束回归的包是为营销组合模型工具定制的库。
如果您有任何疑问/反馈或者您想在数据科学项目上合作,请通过 LinkedIn 联系我
去神秘化的约束优化,用 Python 实现。
设计一种新的鲁棒约束优化算法。
非线性约束优化问题是一类重要的问题,具有广泛的工程和科学应用。在本文中,我们将看到简单无约束优化技术的改造如何导致约束优化问题的混合算法。稍后,我们将通过对一个问题集的详细分析来观察算法的健壮性,并通过将结果与 python 中的一些内置函数进行比较来监控 optima 的性能。
关键词 —约束优化、多变量优化、单变量优化。
许多工程设计和决策问题的目标是优化功能,同时要求满足由于空间、强度或稳定性考虑而产生的一些约束。因此,约束优化是指在某些变量存在约束的情况下,针对这些变量优化目标函数的过程。
具有 N 个变量的约束优化问题由下式给出:
——其中***gⱼ(x)*为 j 个不等式约束,【hₖ(x)**为 k 个等式约束, f(x) 为待优化的目标函数。让我们了解一些优化中常用的术语。
理论
用数学最优化的说法,有两条途径可以找到最优值(数值上):
***1。使用直接搜索法:这里只使用给定点的函数值来寻找最优。它的工作原理是比较一个点的邻域中的函数值,然后向导致函数值减少的方向移动(对于最小化问题)。当函数是不连续的,*因此导数在该点不可用时,通常使用直接搜索方法。
2。使用基于梯度的方法:这里,我们使用一阶和二阶导数来定位最优值。这些方法考虑了梯度信息,因此具有更快地收敛到最优值的优点。
***如何用数值求特定点的导数?*我们使用中心差分法,数学上给出为{limit h - > 0}:
我们提出的约束优化算法采用了两种单变量优化方法和一种多变量优化方法。我们的主要目的是将这个多变量约束优化问题转化为一个无约束的多变量优化问题,然后这个无约束问题可以用单变量优化方法来解决。
单变量优化
同样,有两种途径可以找到单个变量的线性或非线性函数的最优解,一种是使用直接搜索方法,另一种是通过基于梯度的技术。人们可以单独使用这两种方法中的任何一种来找到最优解。我们的约束优化算法使用了这两种方法。使用直接搜索方法,我们将包围最优值,一旦我们有了最优值的特定界限,我们就可以使用基于梯度的方法(对于单变量函数)找到精确的最优值。
有许多直接搜索和基于梯度的方法来获得单变量函数的最优值。我们的方法使用边界相位法和割线法。
注意:所有描述的优化方法都是迭代的。经过一系列迭代,我们逐渐收敛到最优值。
***边界相位法:**一种直接搜索法,用于寻找单变量无约束优化中最小值的上下界。算法给出为(***f’**指 1ˢᵗ阶在一点的导数):
- 选择初始猜测 x⁽⁰⁾,一个增量δ(~ 0),设置迭代计数器 k=0 。
- 若f(x⁽⁰⁾-δ)>f(x⁽⁰⁾+δ),则δ为正。否则如果,f(x⁽⁰⁾-δ)<f(x⁽⁰⁾+δ),那么,δ就是负。否则转到步骤 1 。
- 设定x⁽ᵏ⁺⁾=x⁽ᵏ⁾+2ᵏδ.(指数扰动)。
- 如果 f(x⁽ᵏ⁺ ⁾) < f(x⁽ᵏ⁾) ,设置 k = k+1 并转到 step_3 。否则,最小值出现在 (x⁽ᵏ⁻ ⁾,x⁽ᵏ⁺ ⁾) 和终止*。***
****割线法:一种非常流行的基于梯度的单变量优化方法。终止条件是当函数在一点的梯度很小(~0)时。该方法如下:
- *选择两点 a,b 使得f’(a)和f’(b)**符号相反。换句话说,*f’(a)。f’(b) < 0。选择 ε{epsilon} 一个小数字,又名终止因子。设定 x₁= a 和 x₂ = b 。
- 计算一个新的点z = x₂-(f’(x₂)(x₂-x₁))/(f’(x₂)-f’(x₁))并找到f’(z)。*
- ***如果 |f’(z)| ≤ ε ,终止。 否则如果 **f’(z) < 0,**置位 x₁= z 并转到 step_2 ,
否则如果 *f’(z) ≥ 0,置位 x₂ = z 并转到 step_2 。
其他流行的基于梯度的单变量优化方法有二分法、牛顿-拉普森法等。
单向搜索:这里的目标是找到在特定方向上函数值将最小的地方。数学上,我们需要找到标量α(α)使得, f(α) = f(x⁽ᵗ⁾+α.s⁽ᵗ⁾) 被最小化,这是使用单变量优化方法实现的。{s⁽ᵗ⁾ =搜索方向}。
注意:许多多变量优化技术不过是连续的单向搜索,沿着特定方向寻找最小点。
可变度量方法(大卫顿-弗莱彻-鲍威尔方法):
DFP 方法是一种基于梯度的多变量优化算法。它通过不考虑用于创建搜索方向的 hessian 而更快地收敛到最优值,从而克服了其他几种多变量优化算法的局限性。搜索方向由下式给出:**
其中矩阵 A 由下式给出:
e(x ⁽ᵏ⁾ ) 代表函数在点 x ⁽ᵏ⁾.的梯度单向搜索涉及割线方法和边界相位方法,以在搜索空间中找到 α 的值。单向搜索后获得的新的点是:
- 选择初始猜测 x⁽⁰⁾ 和终止参数 ε₁、ε₂ 。(注意,这里的 x⁽⁰⁾ 是矢量)。
- 在 x⁽⁰⁾ 找到∇f(x⁽⁰⁾){梯度ft5 }并设置s⁽⁰⁾=-∇f(x⁽⁰⁾){初始搜索方向}。****
- 找到α*(α)使得 f(x⁽⁰⁾ + α。s⁽⁰⁾) 最小,终止参数 ε₁ 。用 α表示。**设定 **x⁽ ⁾ = x⁽⁰⁾ + αs⁽⁰⁾ 且 k=1。算算∇f(x⁽⁾。{f(x⁽⁰⁾ + α。s⁽⁰⁾)是 α,的函数,我们将通过单变量优化方法找到这个 α 。
- 使用eq**【1】和 eq【2】中的公式找到 s⁽ᵏ⁾ 。******
- 找到λ⁽ᵏ⁾,让 f(x⁽ᵏ⁾ +λ⁽ᵏ⁾.s⁽ᵏ⁾) 最小,终止因子 ε₁ 。套, x⁽ᵏ⁺ ⁾ = x⁽ᵏ⁾ +λ⁽ᵏ⁾.s⁽ᵏ⁾ 。
- 检查终止条件。||x⁽ᵏ⁺ ⁾ -x⁽ᵏ⁾||/||x⁽ᵏ⁾|| ≤ ε₂吗?
{||。||表示向量的范数}。 - ***如果是,*终止;否则设置 k = k+1,转到 step_4。
罚函数法:
一个罚值*(正则项)是我们添加到目标函数中的附加项,它有助于控制目标函数的过度波动。通过添加这些惩罚项,我们将约束问题转化为无约束问题,其结构使得最小化有利于满足约束,如下图所示。***
简而言之,这种技术是在目标函数中增加一项,使得违反约束会产生很高的代价。这就是所谓的罚函数法*。数学上,***
其中 R 是罚参数,P(x,R)是罚函数,ω是罚项。根据约束的可行性和类型,有各种类型的惩罚条款。这一项被称为括号操作符罚项。在哪里,**
该方法给出如下:
- ***选择初始解 x⁽⁰⁾ 和终止参数 **ε₁,**惩罚参数 *R⁽⁰⁾,和一个更新因子 c 。
- 形成罚函数p(x⁽ᵗ⁾,r⁽ᵗ⁾)=f(x⁽ᵗ⁾)+ω(r⁽ᵗ⁾,g(x⁽ᵗ⁾),h(x⁽ᵗ⁾))* 。***
- 使用 DFP 方法找到 r⁽ᵗ⁾).p(x⁽ᵗ⁾的最小值设解为 x⁽ᵗ⁺ ⁾ 。{这个特殊的步骤是一个无约束优化问题}。对于 DFP,我们最初的猜测是 x⁽ᵗ⁾.
- 检查终止条件:
是 |P(x⁽ᵗ⁺ ⁾,R⁽ᵗ⁾) - P(x⁽ᵗ⁾,R⁽ᵗ⁻ ⁾)| ≤ ε₂ ?{|.|是 mod 函数}。
如果是,设置 xᵀ= x⁽ᵗ⁺ ⁾ 和终止*,否则
转到 step_5。*** - 更新 **R⁽ᵗ⁺ ⁾= cR⁽ᵗ⁾ 。设置,t=t+1,转到 step_2 。***
注意:所有描述的优化方法都是迭代的。经过一系列迭代,我们逐渐收敛到最优值。我们在每次迭代中更新这个 R 值。
使用罚函数法有几个限制。首先,它导致轮廓的变形,由于这种变形,算法需要更长的时间来收敛。而且,这导致了人为的局部最优值的存在。
为了实现的目的,我们将只坚持罚函数法。还有另一种方法称为 乘数法用来克服失真的局限性。它基本上是对罚函数法的一个微小修改。该方法不会扭曲轮廓,而是具有将轮廓移向约束最佳点的效果。所以,这里人为的局部最优值为零。
乘数的方法和罚函数方法*都将约束优化问题转化为无约束问题,进而可以用任何多变量优化方法求解。*******
嗯,就这样吧!!!如果你已经走了这么远,太好了!现在,让我们看看我们的方法的流程图,然后去实现。为了便于实现,我们将只讨论罚函数法。
Himmelblau 函数:
为了说明我们的方法,我们将使用著名的 Himmelblau 函数(见图),给出为 f(x,y)=(x+y11)+(x+y7)。
让我们使用我们提出的算法来解决下面的约束优化问题。
履行
DFP 方法用于多变量优化,结合边界相位和割线方法用于获得单向搜索。代码用 python 实现,托管在我的 GitHub repo 中。我们现在简要演示所使用的每个函数:**
multi_f: 该函数取一个输入向量 x* (搜索空间中的一个点)并返回该点的函数值(惩罚函数值)。***
**grad _ multi _ f:该函数使用中心差分方法计算搜索空间中特定点的梯度向量。
包围 _: 该函数实现了用于包围 α (通过执行单向搜索获得的最小值)的边界相位方法。它取一个矢量 x 和矢量 s (搜索方向)并输出一个区间,基于该区间可以对 α 进行评估。*
f _dash: 该函数用于使用中心差分法得到单变量函数的一阶微分。(代表f’)。
割线 _ 最小值: 该函数将从边界相位方法中找到的边界、一个点 x 和一个搜索方向 s 作为输入,并评估 alphastar。
compute_z: 该函数用于计算割线法中使用的公式:
DFP: 它只取输入向量 x 作为自变量,返回解向量。在主函数内调用该函数,直到满足罚函数法的终止条件。**
它首先从输入向量【x,*** 中找到一个搜索方向 s ,然后通过调用边界相位和割线方法执行单向搜索,以找到最优的 α 。然后,它通过评估等式(1)和(2)找到新的搜索方向*。该过程继续进行,直到满足 DFP 的终止条件,并且我们已经为该特定序列找到了该无约束问题的最优解。****
结果
完整的代码在我的 Github repo 上。注意,我们的方法是一般化的,并且适用于人们想要工作的任何数量的维度。
我们算法的参数设置是:
*** m = 2{指定我们正在处理的总尺寸},
*** R=0.1* {panalty 参数},
*** c = 1.55**{用于更新 r 的因子},
*** x_ip** (初始猜测)= (0.11,0.1)ᵀ 。***
我建议读者尝试使用不同的初始猜测,并使用这些参数值。因此,我们的算法在 14 个序列后收敛。我们得到了约束优化问题的最优解。
让我们将我们的结果与从 python 中 scipy 库的 优化 模块中找到的结果进行比较。{使用相同的初始猜测}:
结果非常接近,为了得到更接近的结果,我们可以尝试非常小的终止因子。我还尝试了一系列不同的初始猜测。是的,它们都融合了!!
“过早优化是万恶之源” —唐纳德·克努特(Donald Knuth)。
我希望你和我一起享受约束优化的过程。我很想知道任何阅读这篇文章的人的反馈(鼓掌👏🏼也会得到很好的反馈😇).我很乐意回答对上述任何概念的疑问/问题。你可以通过 Linkedin 联系我。
最后,特别感谢迪帕克·夏尔马教授,IIT·古瓦哈蒂,他教了我优化课程,作为我课程的一部分。
谢谢大家!!
Oracle 中的约束
保证数据完整性的方法
任何数据库管理系统的核心功能之一是确保数据在其生命周期中的完整性。数据完整性,简单来说,就是随着时间的推移,数据应该保持****【准确】*** 。不一致或损坏的数据对企业来说用处有限或毫无用处,在某些情况下甚至会造成威胁。损害数据完整性的方式有多种,例如在复制或传输过程中、来自多个来源的集成、人为数据输入错误等*
*在 Oracle 中,**“约束条件”*是一种实施规则的工具,以确保只有允许的数据值存储在数据库中。顾名思义,约束对可以存储在数据库表中的数据的类型或值进行限制/检查。Oracle 提供了以下约束来加强数据完整性:
- NOT NULL: 如果根据业务逻辑,表中的一列或一组列不允许空值,那么可以使用 NOT NULL 约束来防止这种情况。
***alter table SALES modify (cust_id NOT NULL);***
如果在销售表的 cust_id 列中输入空值,数据库将抛出错误
2。UNIQUE: 如果根据业务逻辑,一个表中的一列或一组列需要存储唯一的值,那么可以使用 UNIQUE 约束来实施这个规则。
***create table test (col1 number UNIQUE);***
唯一约束允许存储空值。
***3。主键:*主键约束是非空约束和唯一约束的组合。定义主键的一列或一组列只允许唯一值,不能为空值。
***create table test (col1 number PRIMARY KEY);***
一个 Oracle 表中只能有一个(且只能有一个)主键。
4。外键:经常需要将一个表中的数据与另一个表中的数据进行比较来验证。(例如,如果您在订单表中添加一个新订单,您必须交叉检查对应于该订单的有效产品是否出现在您的产品表中)。为了实现这种数据完整性,使用了外键约束。这种类型的验证也被称为。外键约束总是引用其他表的主键或唯一约束。定义了外键的表称为引用表的。定义了主键或唯一约束的表称为引用表**。****
****create table orders
(
order_no number primary key,
customer_name varchar2(10),
constraint cons_prod_fk foreign key(prod_no) references product(prod_no)
);****
如果使用’ ON DELETE CASCADE '选项定义外键约束,则当从被引用表中删除任何行时,相应的行也将从引用表中删除。
外键列中允许空值。
5。CHECK: Check 约束用于强制数据行的一个或多个检查条件。
****alter table customers add constraint customer_credit_limit CHECK (credit_limit <= 1000)****
这将确保 credit_limit 始终小于或等于 1000。否则,系统将引发错误
在 Oracle 中使用约束时,以下信息会非常有用:
- 约束名称存储在 ALL_CONSTRAINTS 表中。定义约束的列名可以在 ALL _ CONS _ 列中找到。
- 可以随时启用或禁用约束。创建、禁用或启用约束时,可以指定一些有关约束行为的其他信息。启用的约束可以有两个选项 VALIDATE 和 NOVALIDATE。VALIDATE 将验证表中的现有数据,而 NOVALIDATE 在启用约束后不会验证现有数据。
- 当您创建或启用主键或唯一约束时,Oracle 将在该约束的列上创建唯一索引。外键约束不强制自动创建索引。但是,在每个外键约束的列上建立索引是值得的。如果子表中的相应列没有索引,Oracle 在对父表执行删除操作时,将被迫对子表解除表锁。如果存在索引,Oracle 使用它来标识和锁定子代中的必要行,同时删除父代行。
数据完整性不应与数据安全性混淆。数据安全性涉及保护数据免受未经授权的访问,而数据完整性指的是存储数据的准确性和一致性。
数据完整性是衡量数字信息健康程度的标准。在数据管道中尽可能早地实施这些规则或检查,将导致最少的损坏,并提高业务流程的效率。
下面这段话通常适用于数据库设计和生活。
“诚信,在方便和正确之间的选择!”
构建决策树以及如何处理过度拟合
介绍
决策树是一种用于监督学习的算法。它使用树结构,其中有两种类型的节点:决策节点和叶节点。决策节点通过对某个特征提出布尔问题,将数据分成两个分支。一个叶节点代表一个类。训练过程是关于在具有特定值的特定特征上找到“最佳”分割。预测过程是通过在路径上的每个决策节点回答问题从根节点到达叶节点。
基尼杂质与熵
术语“最佳”分裂是指在分裂之后,两个分支比任何其他可能的分裂更“有序”。我们如何定义更有序?这取决于我们选择哪个指标。一般来说,有两种类型的指标:基尼系数和熵。这些指标越小,数据集就越“有序”。
这两个指标之间的差异非常微妙。要了解更多,你可以阅读这篇帖子。在大多数应用中,这两种度量的表现相似。下面是计算每个指标的代码。
建造这棵树
培训过程实质上就是构建树。关键的一步是确定“最佳”分割。过程如下:我们尝试在每个特征的每个唯一值处分割数据,并选择产生最少无序的最佳值。现在让我们把这个过程翻译成 Python 代码。
在构建树之前,让我们定义决策节点和叶节点。决策节点指定将根据其进行分割的要素和值。它还指向它的左右子节点。叶节点包括一个类似于Counter
对象的字典,显示每个类有多少训练样本。这对于计算训练的准确度是有用的(尽管这不是必需的,因为我们可以在模型被训练后通过预测每个例子来获得准确度)。此外,它还会导致到达该叶子的每个示例的结果预测。
给定它的结构,通过递归构造树是最方便的。递归的出口是一个叶节点。当我们无法通过拆分来提高数据的纯度时,就会出现这种情况。如果我们能找到一个“最佳”的分割,这就变成了一个决策节点。接下来,我们对它的左右孩子递归地做同样的事情。
预言;预测;预告
现在我们可以通过遍历树直到一个叶节点来预测一个例子。
事实证明,训练准确率为 100%,决策边界看起来很奇怪!显然,模型过度拟合了训练数据。好吧,如果你想一想,如果我们继续分裂直到数据集不能更纯,决策树将会过度拟合数据。换句话说,如果我们不停止分裂,模型将正确地分类每一个例子!训练准确率是 100%(除非有完全相同特征的不同类的例子),没有意外。
如何应对过度拟合?
从上一节,我们知道了决策树过度拟合的幕后原因。为了防止过度拟合,有两种方法:1 .我们在某个点停止分裂树。2.我们先生成一棵完整的树,然后去掉一些分支。我将用第一种方法作为例子。为了更早的停止分裂,我们需要引入两个超参数进行训练。它们是:树的最大深度和叶子的最小尺寸。让我们重写树构建部分。
现在,我们可以重新训练数据并绘制决策边界。
想象这棵树
接下来,我们将通过打印节点来可视化决策树。节点的缩进与其深度成比例。
|---feature_1 <= 1.87
| |---feature_1 <= -0.74
| | |---feature_1 <= -1.79
| | | |---feature_1 <= -2.1
| | | | |---Class: 2
| | | |---feature_1 > -2.1
| | | | |---Class: 2
| | |---feature_1 > -1.79
| | | |---feature_0 <= 1.62
| | | | |---feature_0 <= -1.31
| | | | | |---Class: 2
| | | | |---feature_0 > -1.31
| | | | | |---feature_1 <= -1.49
| | | | | | |---Class: 1
| | | | | |---feature_1 > -1.49
| | | | | | |---Class: 1
| | | |---feature_0 > 1.62
| | | | |---Class: 2
| |---feature_1 > -0.74
| | |---feature_1 <= 0.76
| | | |---feature_0 <= 0.89
| | | | |---feature_0 <= -0.86
| | | | | |---feature_0 <= -2.24
| | | | | | |---Class: 2
| | | | | |---feature_0 > -2.24
| | | | | | |---Class: 1
| | | | |---feature_0 > -0.86
| | | | | |---Class: 0
| | | |---feature_0 > 0.89
| | | | |---feature_0 <= 2.13
| | | | | |---Class: 1
| | | | |---feature_0 > 2.13
| | | | | |---Class: 2
| | |---feature_1 > 0.76
| | | |---feature_0 <= -1.6
| | | | |---Class: 2
| | | |---feature_0 > -1.6
| | | | |---feature_0 <= 1.35
| | | | | |---feature_1 <= 1.66
| | | | | | |---Class: 1
| | | | | |---feature_1 > 1.66
| | | | | | |---Class: 1
| | | | |---feature_0 > 1.35
| | | | | |---Class: 2
|---feature_1 > 1.87
| |---Class: 2
非线性特征
上面的例子清楚地显示了决策树的一个特征:决策边界在特征空间中是线性的。虽然该树能够对不可线性分离的数据集进行分类,但它严重依赖于训练数据的质量,并且其准确性在决策边界附近会降低。解决这个缺点的一个方法是特征工程。类似于逻辑回归中的例子,我们可以扩展特征以包括非线性项。如果我们添加像***【x1 x2】***x1和 x2 这样的术语,这里有一个例子。
结论
与其他回归模型不同,决策树不使用正则化来对抗过度拟合。相反,它采用了树木修剪。选择正确的超参数(树深度和叶子大小)也需要实验,例如使用超参数矩阵进行交叉验证。
关于完整的工作流程,包括数据生成和绘制决策边界,您可以访问 my github 。
构建强化学习政策的轴心
向研究界最不透明的框架迈了一小步。
强化学习(RL)是一种与环境交互的框架,用于学习策略以采取行动并实现某些目标,在许多领域都有所发展。有些领域是有意义的,有些永远不会起作用,而大多数注定会落在中间的某个地方。RL 之所以如此受欢迎,是因为它的优雅: 我们知道,大多数生物都是通过与它们的环境 互动来学习的(但是,我们应该注意到,进化实际上是对这些我们不知道如何建模的行为的强先验)。问题是 RL 在个人和群体层面上对我们的社会产生了有害的影响(见我写的关于推荐系统)——这不是一篇描述这些问题的文章,而是在取笑我们如何以更精确的方式解决它们。
然而,推荐系统极大地提醒了我们,将社会建模为强化学习问题是多么困难(有时甚至是倒退)。从工程师的角度来看,推荐系统是一个 RL 循环,其中消费者(我们)是环境,应用程序是代理,金钱是回报。令人不安的是,科技公司将探索你的内在工作方式,作为他们研究的环境。工程问题最终变成了设计师/用户和代理人之间的游戏——RL 传统上对行为的调整和突然、意想不到的变化非常敏感。在列举了几个现实世界的 RL 的例子之后,我提出了三个初始轴来开始关于 RL 策略的讨论:
- 模拟目标动态的能力,
- 目标动力学抽象的封闭性,
- 关于目标动态的现有规定。
我参加了一个阅读小组,该小组由伯克利的毕业生组成,他们在计算和工程领域获得了参与和扩展奖学金(googes)和长期网络安全中心( CLTC ),希望最终能就这个主题发表一份白皮书(感谢合作者)。
照片由Kendall Hoopes从 Pexels
真实世界 RL:现在和未来
RL 正以积极的方式在现实世界中使用,我乐观地认为它将在比最初预期更多的领域发挥作用。这里有几个例子可以让你开始思考:
示例:电网
电力系统已经被证明是非常易于强化学习的。它可以用于管理网络负载,计划不同工厂的生产,等等。许多论文利用动力学和故障保险的精确模拟,以便学习过程不会导致任何奇怪的行为。在电气工程中研究功率动力学的历史为新的基于学习的技术提供了明确的界限和故障保险。电网背后的这些主题就是为什么一些大型技术公司已经将 RL 应用于数据中心运营的优化。该系统在其抽象中是封闭的,具有精确的建模动态和合理的建模目标。【参见 1 、 2 、 3
示例:自动交易
自动化交易可能是 RL 最符合逻辑的问题空间——奖励功能就是赚钱,不停赚钱。行动是购买和销售,但如何在底层环境上放置一个边界框—它不仅仅是将资金转移到所有最终用户的银行账户。另一个问题是,行动空间是如此多样和难以约束(约束是由人类过去犯下的错误设定的,以及一闪而过的崩溃),动态非常未知。不确定性并没有阻止人们在这个领域赚很多钱,但我不认为我们已经结束了股票市场似乎脱离现实的闪电崩盘和其他时期。这里有一篇关于领域的好博文。我认为人们将继续在这一领域赚钱,除非真的出现问题,否则我们不会看到太多的监管,货币市场到最终用户的动态将无法捕捉(人们不总是喜欢谈论他们的钱在哪里)。
例如:医疗
用于医疗的 RL 很可能看起来像一台计算机,它计算出如何制造新药或管理以前未研究过的组合(在离线时尚中听起来不错),但它也可以采取多种形式,并故意模糊(突出挑战)。当前的医疗政策可以为未来的数据驱动的医疗政策提供信息,但这可能过于乐观了。具体来说,我提出医学治疗,因为 RL 在医学之外的应用领域有很多东西需要学习。医学临床试验将任何新方法与当前的护理标准进行比较。在 RL 中实现这一标准将是从当前以人为中心的医疗系统(或其他流程)到数据驱动系统的转变不会降低个人层面的性能(即使给某人送一台计算机更便宜)。这种性能比较应该在不考虑可及性的情况下进行(人类医生更昂贵,因为他们稀缺),并防止过早采用计算机医生。如果你对数据医学是否准备好了感兴趣,这篇博客调查了Reddit-corpus GPT 3 对医学思想的直觉,结果并不理想。
RL 策略的轴
这是我第一次草拟 RL 政策。这样的政策不应该禁止在这些轴之一的极端区域研究系统中的 RL,但是它应该要求额外的监督或更好的数据实践。减缓 RL 反馈循环的一个令人兴奋的领域是将一些研究领域限制为离线 RL——将记录的数据提取到策略中并偶尔更新而不是持续更新的过程。
轴 1:对目标代理建模的能力
考虑从电力系统到医疗的不同:我们知道麦克斯韦方程以及它们在工程系统中如何工作,但我们不知道人体(相对而言)。对电力系统背后的物理进行建模,让机器学习工程师受到物理现实的限制——我们知道何时某些动作会关闭电源,并且它们会从动作空间中移除(尽管这确实会使学习问题稍微困难一些)。
这个界限确保我们不会对我们所控制的系统的底层造成伤害。
轴 2:目标端点处抽象的准确性
我对现实世界中的强化学习最大的不满是,当目标终端用户,例如社交网络中的新闻源,显然不仅仅是单个用户。这个轴看起来和上面很像,但是我故意把它分开。例如,运行成本更高的数据中心和电网的潜在危害是非常不同的(尽管我们不一定知道谷歌倒闭实际上会造成多大的危害)。这条轴线还可以进一步细化,但我认为一些尺度感是重要的。我们可以将 RL 应用于我们的智能冰箱,但可能不会应用于食品配送基础设施。
这个框让我们考虑控制算法界限之外的潜在损害的规模。
轴 3:脚手架的现有规定
这个医学例子强调了现有的规范性行为和法规帮助定义问题空间的潜力。电力系统在这一点上处于中间位置:作为一家公用事业公司有助于约束一些行为。其他例子就更离谱了。RL 政策和其他技术诉讼应该依靠这个现有的脚手架。我知道食品药品监督管理局(FDA)和其他政府机构是通过修补历史错误而建立的,我认为这是一个难以前进的趋势,但我支持建立一个数据和算法管理局。
这个轴让我们记住,当环境和代理是相对自由的系统(咳咳,社交媒体)时,应用 RL 会有更多的潜在危害。
示例:运输
谷歌地图算法可能会被 RL 改进(也许他们是?让我知道)。运输和路线有很好的抽象、奖励和动态。首先,考虑一下医药与交通:医药是一个更受监管、更正式的规范结构。人们很高兴将 RL 应用于交通运输——交通运输对于提取奖励功能来说已经成熟,并且比药物等具有更规范内容的东西更容易。规范性内容与人们想要保持“人性”的强烈程度相关。交通是一个例子,其中大规模的 RL 可以转化为复杂的多智能体交互和意外问题(例如,自动驾驶汽车使行人无法使用通常不行驶的道路)。
运输我会把安全放在轴 1 上(本质上是遍历一个图),中等放在轴 2 上(不确定自主路由会如何进行,因为它是一个如此庞大的系统),安全放在轴 3 上(我们已经有很多汽车要遵循的规则)。
大规模 RL 成为多代理 RL
多主体强化学习(MARL)可以以多种方式定义,但它是带有个体微调的大规模强化学习的发展方向。讨论一些记录在案的 MARL 关键挑战是很有意义的(参见概述):
- 非唯一学习目标:每个智能体都有不同的目标,我们如何优化全局?
- 非平稳性:数据分布在每一步都会发生难以置信的变化,因为个体不再控制一切。
- 可扩展性问题:如果智能体考虑到附近每个智能体的行为,复杂性会呈指数级增长。
- 变化的信息结构:代理和环境数据在代理之间是异构的(我认为这是最接近解决的一个)。
我有兴趣通过合作与竞争游戏(只有一些是零和游戏)、顺序与并行 MDP、集中与去集中控制等等来阐述我对社交媒体世界的看法。从研究的角度来看,我对 MARL 越来越感兴趣,因为这是大多数基于应用的算法正在对我们做的事情。MARL 目前的共识是,几乎任何复杂的奖励函数都是难以处理的,所以这是所有科技公司决定进行的实验!
最后那句话是故意很多,为了某种戏剧而翻转了主宾顺序。但是,看起来确实是这样的:科技公司每天决定着我们越来越多的互动,尽管它们在优化利润,但每个个体代理人(我们)都有我们的奖励功能。下游效应正在显现。
我相信我会在未来更多地触及这一点,就像我过去在推荐系统的帖子中所做的那样。这个选举季更加强调我在社区和公益建筑技术方面的工作需求,也许我应该从改善心理健康和长期导向的社交网络开始。
我们都需要更多的正能量和更多的讨论。
这是我关于机器人学&自动化、 民主化自动化 的免费时事通讯的一个高峰。
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
构建协整的加密货币投资组合
加密货币
利用协整检验构建加密投资组合
像水一样,隐花倾向于一起移动,但要小心湍流!里奥·霍奇斯在 Unsplash 上的照片
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
2009 年,比特币(BTC)问世,成为第一种去中心化的数字货币。从那时起,比特币已经被成千上万的商家和供应商接受,加密货币市场也出现了巨大的增长。如今,除了比特币之外,还有一千多种加密货币,如以太坊(ETH)、莱特币(LTC)、比特币现金(BCH),以及更多正在国际主要加密货币交易所交易的货币。
多年来,由于各种原因,比特币的许多替代品被发明出来。例如,以太坊是一个运行智能合约的去中心化平台,它的创建是为了解决应用程序开发缺乏比特币脚本语言的问题。作为另一个例子,比特币现金是为了解决比特币的可扩展性问题而发明的,因为它的块大小限制了比特币网络在给定时间框架内可以处理的交易量,等等。这种创新导致了许多替代硬币的快速增长,以及加密货币市场规模的上升。尽管如此,比特币在交易量、价格和市值方面一直名列前茅。
比特币和许多替代币的兴起为投资者和投机者创造了交易机会。事实上,研究表明,加密货币指数(CRIX)和传统资产之间的相关性非常低。此外,实证结果表明,将 CRIX 纳入仅包含传统资产的初始投资组合可以扩大有效边界,并为投资者提供额外的效用。
回想一下,标准普尔 500 在 2017 年的回报率约为 21%,但比特币在一年内的回报率达到了惊人的 1318%。2017 年 12 月中旬,比特币价格达到历史最高水平,超过 1.9 万美元,24 小时交易量约为 230 亿美元。然而,随着价格在 2 月初跌至 6000 美元的低点。比特币曾被认为是最大的泡沫之一,在新冠肺炎疫情期间飙升,并像黄金一样被更广泛地接受为通胀对冲工具。
许多加密交易所允许投资者直接从他们的银行账户购买硬币,然后将硬币转移到不同的数字钱包和交易所进行交易。一些交易所甚至允许卖空加密货币。
与传统股票市场不同,大多数加密货币高度相关。例如,4 种数字货币(即 BTC、瑞士法郎、长期货币和 BCH)之间的日收益率相关性超过 75%。加密货币的高波动性要求开发市场中性的交易策略,它们的高相关性促使我们研究协整或均值回归策略。
密码之间日收益率的相关性。
寻求从价差的均值回复特性理解不同资产价格和套利的长期共同运动的学术研究者和实践者已经广泛地研究和学习了均值回复交易策略。
传统金融的许多领域都制定了策略,但对交易对或一篮子加密货币的研究却很少。事实上,大多数关于交易加密货币的研究都是基于技术分析,或者从交易所之间的价格差异中套利。
通过一系列统计测试,我们创建了一个可交易的投资组合,包括比特币(BTC)、以太坊(ETH)、比特币现金(BCH)和莱特币(LTC),具有快速的均值回复价格运动。
在我们最近的研究( Nguyen 和 Leung,2019 )中,我们分析了构建一组共同整合的加密货币的过程。这个过程涉及一系列的统计检验,包括(i) Johansen 协整检验,和(ii)Engle 和 Granger 开发的经典两步方法。
在我们的结果中,我们构建了涉及四种加密货币的协整投资组合:比特币(BTC)、以太坊(ETH)、比特币现金(BCH)和莱特币(LTC)。协整检验给出了一个可交易的投资组合,因为快速均值回复利差会经常跨越进场和出场水平。该策略基于交易的价差形式:
利差= BTC- aETH- bLTC- c*BCH,
有趣的是,这两个协整检验实际上产生了不同的均值回复投资组合。
价差由两种方法构成:(左)Johansen 方法,(右)Engle-Granger 方法
从上图可以看出,很难看出哪个利差看起来更稳定或均值回复。然而,从交易的角度来看,导致频繁 从两个方向跨越均衡水平的周期性运动或波动是可取的,特别是考虑到进入和退出规则是基于对平均价格的偏离。
由于这个原因,恩格尔-格兰杰方法在这个例子中更适合交易,因此被用来对我们的交易系统进行回溯测试。我们还设置了进出价格阈值,以均值的标准差来衡量。为了减轻更高提款的影响,我们还增加了 5%的止损单。
交易系统有 5%的止损,设置进场/出场水平为均值的负/正 1 个标准差。从上到下,我们绘制了价差、位置(-1,0,+1;蓝色)、累积 PnL(绿色)和下降(红色)。
我们发现设置更高的进场和出场水平会带来更高的利润(见下表)。与带止损出场或跟踪止损的交易系统相比,不带止损出场或跟踪止损的交易系统利润最高,但亏损也最大。除了建立这种新的加密投资组合,我们的方法可以更广泛地应用于使用其他加密货币创建新的共同整合投资组合。
测试期间跟踪止损 5%的交易策略统计。贸易统计词汇如下。
净值曲线:(上)没有止损/跟踪止损,(中)有 5%的跟踪止损,(下)有 5%的止损。
随着加密货币市场随着新硬币和新交易所的不断增长,个人投资者、加密基金经理和监管机构了解所有加密货币及其衍生品之间的价格依赖性非常重要。未来的研究有很多方向。我们的一个项目涉及开发一种机器学习方法,从大量加密货币中自动选择一个小的投资组合。
点击此处对上述综合加密组合的全面分析(免费 pdf)。
贸易统计解释
参考
H.Nguyen 和 T. Leung (2019),**构建用于统计套利的协整加密货币投资组合,**经济学和金融学研究,第 36 卷第 3 期,第 581–599 页
T.Leung T .和 X. Li (2016),最优均值回复交易:数学分析和实际应用,世界科学图书,
J.张,A. Aravkin,和 T. Leung (2020),通过惩罚似然优化的稀疏均值回复投资组合,自动化,第 111 卷,108651。https://doi.org/10.1016/j.automatica.2019.108651
T.Leung T .和 X. Li (2015),【有交易费用的最优均值回复交易&止损退出,国际理论杂志&应用金融,第 18 卷,第 3 期,第 1550020 页。
了解更多关于华盛顿大学的 计算金融&风险管理 项目
利用数字信号处理和机器学习构建、操作、分类和生成音频
作者图片
“我们生活在一个信息越来越多,而意义越来越少的世界里.”
“所以艺术无处不在,因为技巧是现实的核心。所以艺术死了,不仅因为它的批判性超越性消失了,还因为现实本身,完全被一种与其自身结构不可分割的美学所浸透,已经与它自己的形象混淆了。现实不再有时间呈现现实的外表。它甚至不再超越小说:它捕捉了每一个梦,甚至在它呈现出梦的外观之前。”
写于 1981 年,这两段引文都来自让·波德里亚的模拟和拟像。相邻的是*超现实的观念;*定义为:
超现实,在符号学和后现代主义中,是意识无法区分现实和对现实的模拟,尤其是在技术先进的后现代社会中
如果你在谷歌上搜索什么是音频?— 你会得到几个结果。
- 它源于拉丁语:’ *audire '。*意思是:听到
- 直到 19 世纪末 20 世纪初,这个词才在英语语料库中广泛使用。在 1880 年之前开始有一个轻微的上升趋势,然后在 1900 年到 1910 年之间突然上升。
谷歌图书 ngram 浏览器,word: 音频1800–2019
1857 年 3 月,爱德华·莱昂·斯科特·德·马丁维尔在法国首次为唱机签名申请专利。这是已知的最早的录音设备。它将声波描绘成被烟熏黑的纸张或玻璃上的线条。这种表现是声波在空气中传播的物理现象的直接反应。最初用于研究声学,它不是一种将声音作为媒介传播的方法,但在某些情况下,它被用于检测音乐音高,方法是记录一个人演奏乐器或唱歌的音高,然后将该转录与另一个音叉转录进行比较。使用表示对表示进行分类。
É.-L. Scott,1857 年 3 月 25 日的“第 31470 号专利申请”。6 页,包括证书和一张亲笔签名| 来源
下面是 1860 年 4 月 9 日用留声机录制的一段录音。据信是斯科特本人在唱一首法国民歌:“ Au clair de la lune
1860 年 4 月 9 日的录音
一个有趣的提示:当斯科特录制这些录音时,据说他并不想让任何人听到,而只是想做一个分析工具。直到 1877 年,有人认为声音可以通过再现来再现。
在 2008 年之前,Scott 的录音还没有被听到,最古老的录音是 Edison 的留声机——黄色石蜡缸在 1888 年 6 月 29 日的音乐会上,4000 个声音在英国伦敦的 Handel Festival 上表演了 Israel in Egypt 。
然而,第一个入耳式耳机是在 19 世纪 50 年代发明的。医用听诊器。第一个听诊器于 1816 年问世。那时候它还不是我们现在知道的入耳式设备。这是一种放大胸腔声音的工具。1816 年的听诊器不是用电,而是医生放在病人胸部的纸漏斗。1850 年的听诊器没有太大的不同,但作为双耳装置变得更加精致;允许来自病人胸腔的声音直接进入医生的双耳。
1895 年,我们首次使用无线电信号进行传输。虽然,第一次传输是字母“S”的电报。所以,不是真的处理声音。但是在 1910 年,纳撒尼尔·鲍德温发明了我们现在所知的现代耳机。最初是为了海军作为一种通信方式使用,它被设计成包含一英里长的连接到操作员头带的铜线。这允许模拟信号通过电在铜中传播。
当你搜索*“什么是音频”*时,你会发现第三个结果是这个定义:
音频信号是声音的表示,通常使用电压电平表示模拟信号,使用一系列二进制数表示数字信号。音频信号具有大约 20 到 20,000 Hz 的音频范围内的频率,这对应于人类听觉的下限和上限。
就本文而言,让我们来探索数字音频和机器用来表现声音的方法。
如何用数字信号处理模拟声音?
像模拟信号一样,数字信号也是声音的表现形式。允许机器再现的数字信号有两个主要方面。这两个方面可以认为是 X 和 Y;时间和幅度分别为:采样率和位深。
抽样率
如果您曾经打开过数字音频工作区(DAW ),或者检查过音频文件,您会对数字 44100 很熟悉。如果您还没有,44100Hz 是音频数字渲染的标准采样率。有不同的费率,如 88200,96000 和 196000,以及。但是 44100 是一个特定的数字,是信号采样的最低阈值。
采样率是指机器在录音时每秒钟分析输入声音或模拟信号的次数。网上定义为:空间频率 T5数字 采样 。相邻像素间中心距的倒数。这意味着,对于每个样本 (1/44100 秒),机器记录信号,并以一个数字表示每个箱。音频也可以用这些原则来构建。**
低到高(从左到右)采样率对呈现数字表示的影响的图示| 来源
在上图中,您可以看到,在低采样速率下,这种表示会丢失信号中的许多信息;并且随着采样率的增加,产生更精确的表示。将其分解:将声音或模拟信号转换为数字信号的任务是获取连续信号并将其转换为离散值,当随着时间的推移将这些离散值放在一起时,呈现连续信号的表示,然后可以转换回来。基本上,采样率越高,机器可以渲染得越准确和精确。但是为什么是 44100Hz 呢?
奈奎斯特采样定理陈述:要达到最准确呈现某一频率信号的采样率,采样率必须是频率的两倍。
Sampling_Rate_Needed = frequency * 2
因此,如果频率为 440Hz,那么最精确地呈现频率的数字表示所需的采样速率应为 880Hz。据此推断,人类的听觉范围上限约为 20,000 赫兹。因此,为了准确地呈现人类可以听到的任何声音的数字表示,我们至少需要 40,000Hz 的采样率。似乎为了安全起见,增加了 4100 赫兹。额外的采样速率用于特定情况,如环绕声、电影音频、音乐制作和其他需要更精确处理渲染信号的高保真体验。但是为了准确地表现人类能听到的任何东西,44100 赫兹是必要的频率。
钻头深度
位深度类似于采样率,因为它是一种分辨率。但是它不是沿着时间渲染,而是沿着振幅渲染。低分辨率位深度 1 只能将振幅渲染为两种动态:开或关。声音或寂静。类似于黑白图像。
不同位深度量化对呈现数字表示的影响的图示| 来源
您可以看到,随着位深度的增加,机器可以使用更多的离散值来呈现幅度。我们可以用以下公式计算每比特深度的离散值数量:
2^bit_depth
对于 8 位的深度,有 256 个离散值的范围*(0–255)*。对于 16 位,有 65536 个离散值的范围。对于 24 位,有 16777216 个离散值的范围。概念化该离散值范围的另一种方式是:机器渲染给定样本体积可用的振幅的可能动态范围。使用下面的公式,我们可以理解以分贝为单位的比特深度的动态范围。
n = bit_depth
20 * log10(2^n) = db
位深度为 8 时,动态范围为 48db。然而,比特深度为 16 时,我们有 96db 当我们考虑抖动因素时,我们可以达到 115db。对于一个人来说,140 分贝是我们的耳朵受到痛苦伤害之前的极限。因此,在渲染声音时,115db 的动态范围足以满足大多数制作需求。
声音信号被表示成离散数字数组的基本概述|原始 Aquegg |维基共享
上图显示信号为一条红线,由机器用蓝点进行分析,并用数字渲染模拟为右边的阵列。假设该图为一秒钟,则采样率为 21Hz,位深度为 4 位。不确定这听起来会不会太好。
我们听的大多数音乐都是 44.1KHz,16 位深度。因此,下一次您收听来自数字源的音频时,请尝试想象频率*(每秒 44100 个样本)*和振幅 *(65536 级动态范围)*上的所有离散值,这些值紧密地呈现在一个复合信号中,模拟了收听连续声波的体验。
构建数字音频
工程频率
在我的上一篇文章发音 PI 中,我构建了一个基于频率 3.14Hz 的泛音序列,并从该序列生成音频文件。在这里,我将更深入地介绍我为实现这一目标而构建的模块的功能。此外,我将解释如何构建西方音乐体系以及更复杂、独特的音乐体系。
当我们思考什么是音高时,我们经常会想到它们的字母名称。A,A#,G,G#’ …等等。但这些只是帮助我们理解音乐作为一种语言,并象征性地通过声波景观导航的抽象表示。“a”代表一类频率。为了引用“A”的更具体的实例,我们可以调用音高以及与其在序列中的位置相关联的八度音程数。这叫做科学记数法。“A”最常见的例子是“A4”。这个特定实例表示频率 440Hz,并且位于第四个八度音阶的位置。目前的调谐标准是基于 440 赫兹。每个八度音程位置正好是它上面八度音程的 1/2 和它下面八度音程的两倍。例如,“A5”代表频率 880 赫兹,“A3”代表频率 220 赫兹。在每个八度之间,有一个西方体系中所有十二个音符的实例。两个频率之间的最小间隔称为小秒。小秒针也是一种象征性的抽象概念,在西方语境中具有质量和定义的内涵;而仅仅是两个频率之间的数值距离的表示。有很多方法可以评估这个距离。
在下面的笔记本中有一些例子,它们是发展西方十二平均律音乐体系中使用的八度音阶所必需的数学关系。
分解西方音乐体系中音程的数学因素的笔记本
这本笔记本的目的是揭露一些简单的事实。
- 八度音程是 1 和 2 之间的空间的表示。
- 分八度就是把 1 和 2 之间的空间分成相等的音程。
- 等同于这些划分的音程由抽象的特征表示,并且对于它们所属的八度音阶是唯一的,但是共享共同的因子分解。
但是让我们用这个逻辑,调查一些另类的音乐系统。
笔记本打破另类音乐系统的发展
对于那些不熟悉西方音乐体系的人来说,本笔记本的目的是展示一个练习,这个练习描述了采用离散值的符号结构、解构它并将其整体嵌套在每个离散值的空间内的数学过程。在上部结构的空间内嵌入镜像下部结构。
建造 Wav
从这里开始,让我们使用这些系统的频率来制作它们音调的数字表示。
下面的笔记本简要概述了从一个数字开始构建音调,然后基于这些音调构建系统,并分析几个文件以验证它们是否被准确渲染的过程。
笔记本调查的建设和检查一个数字化建设的音频
用音调的数字表示构建功能音乐
图 1 是根据上述代码渲染的音调构建的三个音阶。
- 半音四分之一音阶从 440 赫兹移动到 880 赫兹
- 半音半音音阶从 880 赫兹移动到 440 赫兹
- 全音阶半音音阶从 440 赫兹移动到 880 赫兹
音频图 1
图表图 1 |由作者代码生成的图像
根据我们掌握的音调,我们可以做出任何音阶。我使用这三个只是为了证明概念。除了音阶,我们还可以构建和弦和级数。图 2 是从渲染音调构建的一个进程。
- 这个过程从一个第二代第六代开始
- 然后进入微音和弦,利用全音阶和微音系统的音调以混合和弦结束
音频图 2
图 2 |由作者代码生成的图像
数字音频的新结构
下面是我几年前画的一幅铅笔画的扫描图。下面是转换成数字音频并通过摄谱仪显示的同一幅图像。每个像素中的数据用于构建音频信息的频率和振幅。在未来的博客中,我可以详细说明这个过程是如何工作的,但现在,我只是想展示这个来进一步阐述数字音频是一种表现,而不是声音本身。
作者的墨水和铅笔画扫描|作者的图像
一段时间内以一系列频率呈现的图像|作者提供的图像
ps。当通过扬声器播放时,它发出的实际声音令人难以忍受
操纵数字音频
开发模拟音乐数学关系的数字渲染是一回事。很高兴知道机器可以实例化音调。但是当机器使用纯数学精度时,对声音的感知是熟悉的,但缺乏我们在物理世界中听到声音时所期望的品质。
让我们探索模块的更多功能,并使用录制的音频。在这一部分,我们将使用 20 世纪 70 年代公共领域购物中心 muzak 的舒缓声音。
70 年代的公共领域音乐
操作音频类似于 python 中的基本字符串和数组操作。
#to know how many elements are in an given array of audionum_of_ele = seconds*sample_rate
每个元素都是包含音频数据快照的样本。
下面是一个笔记本,它通过对音频阵列的一系列单个操作,并以一个将效果按顺序链接并传递音频的操作结束。所有产生的例子都可以在笔记本下面找到。
笔记本经历一系列操作
音频处理的结果
反向音频
python 中有几种反转音频的方法,但主要原理是将音频数据提取到一个数组中,反转数组,然后将其转换回音频文件。一个简单的方法是:
sr, y = read(wav)
reverse_y = y[::-1]
write(outfile, sr, reverse_y)
时间拉伸音频
这里有三个时间拉伸算法的例子,可以减缓音频的速度。根据您如何考虑采样率的变化,您可以获得不同的探测范围。
将采样速率乘以一个大于 1 的因子来减慢的算法
将采样速率除以小于 1 的因子以降低速度的算法
使用 scipy 的算法,当读入 wav 时,在 scipy 的数据输出中广播一个倍增因子
基本的想法是,你想让采样率更长,以便在更长的时间间隔上伸展音乐内容。为了加速音频,你做相反的事情。
下面是两个加速音频的例子。
将采样速率乘以小于 1 的因子来加速的算法
将采样速率除以一个大于 1 的因子来加速的算法
音高移位音频
音高上移 100 赫兹
找到音高移位方法的关键是改变采样速率的速度,而不导致 wav 时间拉伸。为了实现这一点,我将我想改变音高的赫兹数除以采样率,然后将文件分成左右声道。一旦我这样做了,我就对每个通道中的每个样本使用快速傅立叶变换并调换频率,然后反转该过程并将两个通道缝合在一起。
延迟音频
延迟设置为 1000 毫秒,因子为 0.5,重复次数为 3 次
如果您查看绘制该文件音频的摄谱仪,可以看到延迟如何模糊了文件的中间,但在开头和结尾有明显的三次重复,信号的重叠迭代明显较少。为了延迟数字音频,您必须通过生成偏移来处理字节。这样做的逻辑如下:
**def** delay(bytes,params,offset_ms):
# generate offset
offset= params.sampwidth*offset_ms*int(params.framerate/1000)
# add silence in the beginning
beginning= b'**\0**'*offset *#remove space from the end*
end= bytes[:-offset] # concat bytes with both beginning and end with sample width
**return** add(bytes, beginning+end, params.sampwidth)
使用代码块,如链式效果踏板
在序列中构建算法后:
反向- >延迟- >拉伸- >延迟半速- >层反向
并通过数字信号,下面的音频结果。
顺序算法效果
数字音频分类
到目前为止,一切都是在干扰呈现数字音频的数学机制。实质上是在玩音频阵列。在本文的其余部分,我们将更深入地研究使用特征提取的音频分析,以及机器如何使用这些特征来模拟音频。
可视化的 FFT | 来源
为了提取这些特征,我们将使用傅立叶分析中的方法;主要是:快速傅立叶变换。FFT 是一种提取复杂波形并将其解析为后续简单波形的方法。它允许我们访问基于频域的特征。在下面的笔记本中,我们将探索:
- 光谱质心
- 光谱带宽
- 梅尔频率倒谱系数
- 色度特征
简单解释一下:
光谱质心
频谱质心可以被认为是测量给定声音的’亮度。它计算给定样本中频率的加权平均值。
其中 x(n) 表示仓号 n 的加权频率值或幅度, f(n) 表示该仓的中心频率。
光谱带宽
频谱带宽与声音的频谱分辨率相关。它被定义为每个样本最大峰值频率一半处的频带宽度。
梅尔频率倒谱系数
梅尔频率倒谱是从功率倒谱构建的,是声音的短期功率谱的表示。系数是通过 FFT 检查样本,然后将功率映射到 mel 标度上而得到的。然后记录每个 mel 频率。之后,执行离散余弦变换,就好像对数梅尔功率列表是一个孤立的信号。即信号的合成振幅就是系数。这些系数精确地描述了给定样本的频谱包络的形状。
色度
色度提取沿着 0-11 的向量显示强度。该向量表示音高类别集,并揭示存在的每个音高类别的数量。换句话说,它告诉我们信号中存在哪些谐波频率。
这只是信号中存在的一小部分特性,但有了这些特性以及本笔记本中显示的其他一些特性,我们就可以开始对信号进行建模了。
显示信号建模特征提取示例的笔记本
有趣的是,对数字音频信号进行建模就是提取已有表征的特征的表征。
建模
使用 G. Tzanetakis 的集合,让我们使用这些特征提取来模拟音乐流派。该合集由 1000 首音轨组成,每首音轨时长 30 秒。它包含 10 个流派,每个流派代表 100 首曲目。轨道都是 22050 赫兹单声道 16 位 wav 文件。一旦我们从集合中提取了所有的数据,让我们从我们简单但很好的朋友开始,人工深度神经网络。
DeepANN 分类器| 来源
笔记本构建和实现一个简单的 DeepANN
该模型达到了 69.50%的准确率。
考虑到建模是信号工程表示的一种方法,让我们看看我们可以对数据建模的其他方式。让我们使用数字音频的图像,而不是提取代表样本中不同值的特征。为此,我们可以获取每个 wav 文件并生成一个摄谱仪。然后我们可以在光谱图上使用卷积神经网络(CNN)。
这是一个我们将用来训练 CNN 的光谱仪的例子。
gtzan collection 的 10 秒 wav 文件的摄谱仪,流派:hip hop |由作者代码生成的图像
CNN 将学习文件的视觉印象来理解一个流派的特征,而不是对提取的特征本身进行训练来理解一个流派的特征。
CNN 分类器| 来源
笔记本电脑建设和实施有线电视新闻网
虽然使用摄谱仪来表示音频的想法很有趣,但使用它来训练分类器似乎不是最有效的方法。更不用说 CNN 的训练时间在记忆和时间上要昂贵得多。
说到记忆和时间,让我们回到使用原始音频的特征提取,并尝试一个长短期记忆(LSTM)模型。
LSTM | 来源
笔记本电脑建设和实施 LSTM
我们达到了 66.66%的准确率——比我们在本节开始时使用的原始神经网络模型的准确率略低 3%。在这里,LSTM 是有效的,但对于分类问题,我仍然会选择人工神经网络。但是让我们看看 LSTMs 还能做什么。
生成数字音频
在我的文章生成性人工智能:故障、缺陷、非理性和表达中,我讨论了一些关于人工智能是否以及如何能够’生成的观点。简而言之,总的来说,我认为 AI 可以产生,从而创造,在某些情况下。在我们尝试让人工智能生成音乐之前,让我们使用预测功能来看看它复制音乐的能力有多强。
在这个笔记本里,我取了三个音频文件。
- 《魔法咒语》水晶城堡
- 《两个人就能赢》J·迪拉
- 《十二声部音乐第三部》,菲利普·格拉斯乐团(1975 年现场演出)
这里的任务是使用更高维度的音频数据,即我们在处理数字音频时使用的幅度阵列,来看看 LSTM 是否可以预测每个样本的正确幅度序列。
用于音频生成的笔记本构建和实现 LSTM
正如我们所看到的,LSTM 可以被训练得相当精确。下面生成的音频:
拼接在一起的三个音轨的真实音频
表演中的模型
第一个模型的训练性能|由作者代码生成的图像
模型学习但不太理解卷
第二模型的训练性能|由作者代码生成的图像
模型学习准确预测振幅并重现音频
第三模型的训练性能|由作者代码生成的图像
对于下一个生成音频的实验,我不会展示笔记本电脑,因为每个模型都需要几天甚至更长时间来训练(一个模型用 GPU 花费了近一周的时间!).但是对于那些有兴趣阅读模型代码的人来说,这里是最终模型的架构。根据我预处理数据的方式,这个模型最终产生了一些有趣的结果。
最终 LSTM 建筑
除了众多添加的层之外,该模型的主要区别之一是时间分布的密集分层,所有内容都构建在其中。这允许 LSTM 在训练时一致地返回层内和层间每一步的完整序列。它还产生一个完整序列的输出,而不是一次一个样本。
在这个实验中,我不想停留在振幅的表面水平,而是想在通过傅立叶分析提取的低维光谱特征上训练模型。我不是在一个复杂的音频文件上训练,而是在一个艺术家的完整专辑和现场表演上训练。我继续使用水晶城堡,J 迪拉和菲利普·格拉斯合奏。最初,我把整张专辑分成 10 秒钟的音频片段,最终在完整的音轨上训练了一个模型。
在训练过程中,我保存了不同模型开发的不同阶段,并从每个艺术家提取的特征数据中构建了一个随机序列生成器。然后,我让每个模型在不同的学习阶段尽可能地产生声音。下面是不同阶段的输出。音频不会以任何方式改变,而是按照模型学习阶段的时间顺序排列。
*警告:开始时有点吵
隔离后,你可能会发现这个 LSTM 在杰弗逊南部的约翰逊大街&法拉盛附近的布什维克闲逛
AI _ LSTM _ 生成 _ 水晶城堡的摄谱仪|图片由作者代码生成
** 50 秒到 1:40 秒之间发生了一些美丽而不完美的事情*
隔离后,你可能会发现这个 LSTM 每天都在伍德布里奇的盟友那里闲逛
AI_LSTM_Generated_J Dilla |图片由作者代码生成的摄谱仪
真正让我惊讶的是:在给定数据的情况下,模型首先学习音频的哪些部分,以及它从看似只是音调和声音到对节奏的明确理解有多快。这个输出让我想起了开车去北部时,通过调频广播信号调谐,寻找正确的电台。
现在,在这两个例子中,有一些严重的过度拟合,以及一些细微差别。事实上,在 J Dilla 赛道上,有趣的是这个模型不停地吐出循环。我想知道这是否与 J Dilla 使用样本有关。而在水晶城堡的音乐中,有重复,但它是人们重复的话,节奏和旋律,而 J Dilla 的轨道是录音和磁带的逐字取样重复。我还发现令人着迷的是,在 J Dilla 的音轨中,人声清晰,可以听到明确的词语——你可以在摄谱仪的后半部分看到人声的弦外之音;而在水晶城堡的音轨中,声音是存在的,但看起来是一个模糊的单词轮廓,与乐器天衣无缝地融合在一起,而不是明确的话语。
最后,让我们听听菲利普·格拉斯系综模型。有趣的事情正在这里发生。我不想听从白噪音到智能模拟的演变,我想放大来听这里发生的音乐选择,以及音色。在 Crystal Castles 和 J Dilla 中,每一个成熟的 AI 都会在逐字模拟和误差边缘之间振荡,误差边缘允许一些令人想起决策的故障缺陷。不过,在谷歌眼镜模式下,所有的输出都是现场录音中找不到的音乐片段。
艾 LSTM 菲利普·格拉斯合奏
AI _ LSTM _ 玻璃 _2_1_6 |图像的摄谱仪由作者代码生成
下面是一些我觉得很漂亮的光谱图。人工智能正在理解频率和节奏,并产生信号,这些信号在它接受训练的实际记录中并不存在。然而,它缺乏音色,听起来像一个模拟合成器;但对我来说,感觉奇怪的真实,有菲利普·格拉斯的幽灵般的影响,但却是增强的,创造性的和独特的。
由作者代码生成的所有光谱图
下面是我觉得有趣的输出汇编。音频没有改变。
GlassAI 汇编
结论
“所以艺术无处不在,因为技巧是现实的核心。所以艺术死了,不仅因为它的批判性超越性消失了,还因为现实本身,完全被一种与其自身结构不可分割的美学所浸透,已经与它自己的形象混淆了。现实不再有时间呈现现实的外表。它甚至不再超越小说:它捕捉了每一个梦,甚至在它呈现出梦的外观之前。”
这一点,连同 超现实 的概念,一直贯穿在我的脑海深处。虽然我知道鲍德里亚指的是作为一个对象系统的现实的理论讨论,但当我开始探索 DSP 时,这方面的一些东西引起了我的共鸣。我认为数字音频是一种表现,一种声音的模拟。无法与自然产生的声音区分开来的声音。技术上来说,是的。但以玻璃为结尾,让我觉得通过模拟和复制媒介的有意开发,我们可能会发现一个没有技术桥梁我们根本无法达到的创造力维度。回到人工智能可以成为一种创造性和协作性工具的想法。我以这本笔记本作为结束。
通过顺序算法发送玻璃信号的笔记本
通过顺序算法从玻璃信号输出
建筑和机器学习
Autodesk BIM 360 + Construction IQ 为施工现场带来了预测和分析能力。
来源:Franki Chamaki 通过 Unsplash。
介绍
承包商的工作性质是反动的。他们不断地在现场扑灭一场又一场大火,以确保施工尽可能顺利地进行。**但是,如果通过机器学习,我们可以改变这种被动的工作流程,变得积极主动呢?**机器学习可以消化承包商必须处理的大量项目数据,并可以将承包商每天需要关注的最关键问题浮出水面,以避免挫折。
要了解数据分析和预测如何帮助建筑行业,站在承包商的角度很重要。从承包商的角度来看,一个虚构的情况可以帮助我们。
承包商的生活
1.故事
想象一下:你是一个大型建筑工地的总承包商主管。你从头到尾监督现场的所有操作。您负责安排日常工作,监督所有正在进行的活动和任务,并确保现场每个人的安全。您的角色对于项目的成功和他人的安全至关重要。
你工作的建筑公司负责为一家大牌科技公司建造下一个主要总部(假设是亚马逊 HQ3)。建筑师完成了所有的图纸,加快了建筑许可过程,并将批准的计划发送给您,以便开始施工。施工时间表非常紧迫,您马上开始匆忙确保您的施工团队按时将建筑交付给客户。有数亿美元悬而未决,你开始感到压力。你知道亚马逊想要一个完美的建筑,而且他们希望尽快得到它。
作为施工主管或项目经理,需要管理很多很多的团队。这只是众多参与建设的人之间紧密合作的一个例子。资料来源:Josue Isai Ramos Figueroa。
2.压力是存在的
施工几个月后,齿轮正全速运转。混凝土地基已经浇筑完毕,大楼开始上升。现场有多个分包商(subs ),每个都在做自己的工作。作为总承包商,你要协调分包商工作的时间,评估他们工作的质量,并确保他们遵守现场安全措施。最重要的是,代课老师不停地问你问题:
防水部分:基础墙的防水是水泥防水还是液体防水?
钢接头:一些钢柱刚刚到达现场,它们看起来有点生锈了。他们应该是工厂准备好的吗?
混凝土分包商:结构工程师有没有回复我们,每层楼的混凝土桥面允许多少粉煤灰?
主管必须确保现场的每个人都遵守安全协议,以保证现场每个人的安全。来源:Josue Isai Ramos Figueroaviaun splash。
一天中没有足够的时间让你监视每个人并及时解决问题。结果,分包商问的几个问题被漏掉了,你没有定期与每个分包商联系,工作继续进行。
3.问题
一个月后,你注意到混凝土接头只完成了 2 层,而他们现在应该已经完成了 4 层。混凝土是施工关键路径的一部分——在混凝土完成之前,其他人员无法开始工作。
混凝土小组说他们不知道混凝土中允许有多少粉煤灰。他们几周前就问你了,但是因为你有太多其他的事情要做,你从来没有回答过。因此,他们没有永远等待你的回答,而是比平时更多地使用混音来省钱。这种混凝土比含有较少粉煤灰的混凝土需要更长的时间来固化——因此会延迟。现在你要么想办法补上一个月,要么向客户要求更多时间,失去信誉,并承受巨大损失。
你感到压力了吗?
承包商要管理的东西很多,可能会让人不堪重负。来源: 路易斯·比利亚斯米尔转自 Unsplash。
施工文件
好了,现在我们理解了承包商的一些潜在压力和挫折,我们可以同情他们的处境了。如果听之任之,很容易忽略一个小细节而造成严重后果。如果文档和数据没有组织好,就更难掌握细节。这句来自 BIM 360 博客的话完美地抓住了这一点:
“建设因为没有记录事情而受到很多批评,但我认为这是错误的。我们非常擅长记录。我们只是不善于把它放在可以被发现和分享的地方。”-杰夫样本,Contechcrew
在匆忙中,有时承包商文件的组织会变得有点混乱。(但我敢肯定,在这个问题上,他们并不孤单。来源:托马斯·耶茨通过 Unsplash 。
这句话揭示了承包商有时很难保持他们的信息有条理,以便它有用——这并不奇怪,因为有太多的因素会使施工过程变得混乱。在整个施工过程中,图纸、产品、系统、规范和分包商都可以修改和变更。行动项目可能存在于贴在墙上的便利贴上,要提取的标记可能存在于分散在桌子上的打印纸上,数字文件可能保存在内部文件夹结构中的任何地方(或在您的桌面上)。
Autodesk 知道这一点,他们为文档和数据创建了一个单一的数字环境,与承包商使用的其他建筑信息建模(BIM)软件共存。这个环境就是 Autodesk BIM 360。
BIM 360
为了避免多个流程和不同软件处理管理文档的复杂性,Autodesk BIM 360 允许承包商在一个地方管理所有文档和数据。
可以在此发送、接收、跟踪和组织 RFI 和提交文件。可以在这里管理、更新和共享图纸和规格。不同行业的三维模型可以在这里进行协调和分析。这里可以记录安全规则和观察结果。可以在这里管理检查表、问题列表和竣工查核事项表,以确保项目的质量。带有注释和标记的设计评审也在这里完成。
除了有助于保持承包商信息有序的明显优势,BIM 360 还允许承包商通过可定制的报告和仪表板受益于数据分析。BIM 360 还通过 建筑智商 提供来自机器学习模型的预测能力。
BIM 360 中的示例分析仪表板显示了正在建设的项目的数据。来源:Autodesk 截屏转载,由 Autodesk,Inc .提供
建筑智商
现在,我们开始了解 Autodesk BIM 360 激动人心的高科技功能。由于 BIM 360 是存储信息的单一位置,因此 Construction IQ 从这些数据中提取信息,利用机器学习来识别施工期间的风险。但是为什么预测“风险”很重要呢?
让我们回到我们虚构的故事,关于我们的主管管理亚马逊 HQ3 项目的建设。负责人发现太多的粉煤灰在混凝土混合物中使用得太晚,这导致了代价高昂的延误。但是如果我们能够预测像这样的潜在风险会怎么样呢?
如果有一个分包商经常出错,并且这些错误被记录在 BIM 360 中,Construction IQ 会分析这些数据并为每个分包商生成预测。它提供了一种“分包商预测”,告诉我们某个分包商今天是处于低风险还是高风险。这可以帮助我们防止“危险倾向”的潜艇犯错误。使用风险预测,总承包商可以更关注需要更多监督的分包商。
Construction IQ 还引起了我们对其他风险的关注,例如安全风险和设计风险。在仪表盘的帮助下,这一切都以干净、快速、直观、易读的快照呈现给忙碌的承包商。我们可以拖放“卡片”来获取我们想看的信息。
在右侧,有一些“卡片”,可以选择这些卡片向仪表板添加不同类别的项目信息,如设计、质量、安全、进度和问题。来源:Autodesk 屏幕截图,由 Autodesk,Inc .提供转载
引擎盖下的建筑智商
Construction IQ 从记录的项目问题、现场观察、清单、分包商任务、历史数据和其他元数据中提取用于风险预测的数据,以预测日常风险。
了解允许 Autodesk 预测分包商是否具有高风险的独特算法组合将是一件有趣的事情。从承包商那里收集的许多数据可能是文本——观察、问题、清单、任务,都是文本。这是除了图纸和标记的 pdf 之外,还有记录在 BIM 360 中的现场图像,机器学习算法可以使用这些图像来预测风险。
**为了确定分包商的质量和安全风险,**在幕后,可能正在对分包商工作的每个文本观察进行自然语言处理,以提取情感,然后通过分类模型(如逻辑回归、朴素贝叶斯或支持向量机(SVM))将其分为“好”或“坏”类别。如果有更多的“坏”观察,那么该潜艇的风险可能会更高。“高风险”和“低风险”观察的最终分类也可以通过查看现场拍摄的质量检查照片的 CNN 来增强。像 LSTMs 这样的时间序列建模可以对更近期的分包商观察进行更重要的加权,以更准确地预测分包商的风险。
**为了确定设计风险,**计算机视觉可用于检测图纸和标记 pdf 中的设计风险——搜索代码合规性问题和图纸中的任何错误。
展示 Construction IQ 的风险预测的示例建筑项目仪表板。来源:Autodesk 截屏转载,由 Autodesk,Inc .提供
下一步是什么?
机器学习只有在数据存在的情况下才有可能。没有数据就意味着没有机器学习。因此,只有通过将所有建筑信息数字化到我们的计算机中,并将这些信息集中在一个平台上(如 BIM 360),建筑中机器学习的出现才有可能。通过将信息组织、整理并存放在一个地方,文档很容易找到。
那么下一步是什么?在工作现场,机器学习还能帮助我们做什么?除了风险,这篇 BIM 360 博客提出,通过计算机视觉对不遵守安全标准的建筑工人进行图像标记有助于确保现场人员的安全。像 SmartVid.io 这样的公司处于这一努力的最前沿。
计算机视觉也可能有助于检测有缺陷的建筑,如开裂的混凝土、瓷砖、干墙和其他材料。查看我创建的这个 web-app 演示 ,它使用卷积神经网络(CNN)来检测建筑材料中的缺陷,并查看我的 GitHub 库 以了解开发该工具的详细信息。
我构建的这个网络应用程序使用了三个卷积神经网络(CNN ),可以帮助检测建筑工地上有裂缝的材料。它首先分类照片是“一般”还是“特定”。如果它是“特定的”,那么它会检测照片中材料的类型。最后,它决定了材料是“开裂”还是“未开裂”。来源:作者。
此外,机器学习可能有潜力为与承包商合作的建筑师和工程师提供进一步的设计帮助,例如当我们在 Autodesk Revit 模型中进行设计时,使用 AI 插件来确定代码合规性。 看看我的博客上与此相关的升级代码。
结论
机器学习有可能改变建筑工地上解决问题的方式,只要承包商将他们的数据数字化、组织化并全部放在一个地方。由于 Autodesk 的 BIM 360 环境中的Construction IQ等工具,承包商将能够在潜在风险变成重大问题之前对其做出反应。
机器学习在建筑、工程和施工方面还有许多应用有待开发。我们必须深入了解行业的努力和斗争,以便将机器学习最有意义的应用带到他们的工作中。
AI +消费级无人机技术将改变国防部
无人驾驶飞机,成群结队,无人驾驶飞机的风暴。
这最初出现在我的时事通讯《民主化自动化》上。 没有我想遇到来历不明的无人机的情况,而在未来,我们将会看到数百架。
2016 年消费级无人机购买量为 240 万架;高于 2015 年的 110 万辆[ 来源,来源 ]。继续这一趋势(悲观地说), 2020 年将有大约 1000-2000 万架无人机售出。小型无人机的消费化为稳定社会和战争的未来带来了大问题。
不相信我?点击下面的快速介绍。
无人机便宜、用途广泛,而且难以追踪。如果你认为,“嗯,也许人们不会利用它们,”这是美国军方释放微型飞行器(MAV)群的实践。分类内容肯定是比较极端的。
最重要的是,土耳其有可以出口的自杀式无人驾驶飞机(在以色列设计)。这款名为 Kargu 的无人机是以土耳其语中的 hawk 命名的。阅读一些技术规范:
15 磅重的 Kargu-2 能以每小时 90 英里的速度飞行,并能在空中停留长达 30 分钟。它有一个视距控制链路,范围约为 6 英里。
无人机可以携带三种不同类型的弹头中的一种,包括一种用于在户外攻击人员和其他无装甲目标的高爆炸碎片弹头,一种适用于建筑物或洞穴等封闭空间目标的温压型弹头,以及一种用于攻击轻装甲威胁的聚能装药。【 来源
鹰的命名现在应该非常清楚了——它有能力消灭任何可见的目标。卖家声称这款无人机是为了反无人机和非对称,现代战争。这些技术落入更具争议的手中只是时间问题。美军中央司令部司令已经宣布:
“美军跟不上廉价无人机的洪流。”
这是我正在写的无人机风暴。10 架、100 架或 1000 架无人机攻击我们在国外的军队或国内的领导人。我们如何防御这种情况?
来源-作者的研究。
无人机和蜂群的定义并不总是很清楚——尤其是蜂群。
嗡嗡声
谷歌默认定义(经过一些噪音和蜜蜂):
遥控无人驾驶飞机或导弹。
我认为谷歌的定义将很快过时,因为无人机是机载/本地控制的。
蜂群
谷歌的默认定义实际上并不太糟糕(比我遇到的许多使用这个词的研究人员要好):
一大群或密集的昆虫,尤指会飞的昆虫
我认为祈使的词是 密 。一个群体是一个密集的物体,在那里不同地控制一个成员可能完全不会被注意到。最后,一个群体由 a)涌现行为或 b)中央控制来管理。
一群机器人会变成 10 个、50 个、100 个或 1000 个代理人的群体吗?2000 年代的群体控制研究主要集中在 10 个机器人的最优控制上。这项研究集中在几个机器人上,每个个体仍然是至关重要的。在我的圈子里,我们不认为这是一个群体,但我们喜欢思考边界在哪里。我的导师克里斯·皮斯特对群体定义的评论:
人们如何做【群体控制】?不知何故,当通信中断或动态的时间常数短于通信/决策等待时间时,我们在所有级别上集中分层规划和分布式决策。军事行动是一个常见的例子(一窝蜂),但管理一个家庭也类似——通常你不会喝完咖啡,通常两个人不会同时买咖啡。(根据内森的定义,家庭不是群体,但军队是,公共卫生也是)。
我们对成群结队的微型机器人感兴趣,它们可以协助应急响应、农业、分布式传感等领域。区别在于微型机器人可以大规模制造(1000 个),所以我们有完全不同的关注点。
我们如何对付一群真正好斗的蜂群?
反无人机
以下是我在反无人机工作领域的发现(和所做的)。
无人机粉碎机?
这是在一系列关于国防工业无人机的电子邮件中。这架无人机(配备了一个旨在撞击其他无人机并破坏转子和马达的表面)被命名为 Anduril (也被称为西方的火焰),令人印象深刻,但我不确定它对预期目标的效果如何。
点击下面观看一个 反无人机无人机 如何表现的演示。
更智能的反无人机无人机?
我不喜欢这个,因为用来提高防守者的技术显然可以提高进攻者。我们正在研究一队防御性无人机如何试图阻止许多攻击者进入突出显示的区域。需要学习的是如何相对于攻击者定位每架无人机,以便它可以在空中向攻击者发射网(摧毁它)。我怀疑我们可能有无人机在机场和许多其他关键的公共区域做这件事。
点击下面的视频,展示了一个防御性的蜂群(红色)抵御来自基地区域的入侵无人机(蓝色)。这是基于 的 Boids 群集算法 ,也是一个活跃的研究领域。
头脑风暴反无人机技术得出了一些常见的答案:
- 无人机本身:一架装备了网的无人机可以轻松放倒另一架无人机。无人机也可以撞击目标来摧毁易碎的飞行部件(见下文,无人机击碎器)。一个军用物品与一个消费级无人机的一对一交易是非常昂贵的(我估计是 1000 倍)。
- 电磁脉冲:电磁脉冲受到欢迎,因为它会破坏电子设备,使电动汽车(及其控制电子设备)无法使用。问题是 EMP 脉冲通常对目标之外的东西有严重的影响,而移动/手持 EMP 的开发既昂贵又缓慢。
- 激光/其他地面防御:我不确定这些有多大用处,但是有些军用车辆装备了高功率激光,可以融化迎面而来的无人机。问题还是在于,这种防御比进攻(潜在的消费级无人机)成本更高。
反无人机技术工作的道德底线是什么?
我们在我的研究小组模拟“无人机斗狗”,我想知道我们是否应该这样做。尚不清楚如何控制作品的传播,但如何在不使世界变得更加危险的情况下,各国在技术上缩小从进攻到防御的差距(见军备竞赛)。历史表明,这是难以避免的。
我有一个未来的帖子,关于加速技术进步的问题以及进攻和防守能力之间的差异。我认为我们需要条约和积极的网络意识。无人机很难研究,因为消费者喜欢无人机!人们希望无人机能够稳健地交付披萨。如果消费者驱动市场,我们如何阻止进步和可用性?我们没有。
其他风暴正在酝酿
- 夜间,成群的无人机在科罗拉多和内布拉斯加大草原上空形成并移动。几乎无法追踪,侵犯了隐私,并引起了一些州级反应。
- 美国空军测试并利用无人驾驶飞机执行秘密任务。这并不奇怪。
- 美国空军测试无人驾驶战斗机。他们希望持续 g 力的优势会有所帮助,但老实说,现代自主系统的处理速度仍然落后几年。几年后,是的,这将成为现实。
你们中有多少人真的听过一群四旋翼无人机在附近飞行?烂透了。很多。以至于甚至考虑广泛使用四旋翼飞机进行本地运输对我来说听起来都很荒谬。
在我的研究小组中,我们正在开发一种静音无人机,但它距离实用还有很多步,所以我们不担心军事化(是的,我们讨论它的伦理)。可以看下面的视频。
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)*
消费者选择模型的 5 个技巧
本文分享了构建集体消费者选择模型时需要牢记的 5 大技巧!
你有没有想过——我们人类一天会做出多少选择?———估计有 35000 人!
照片由 Nathália Rosa 在 Unsplash 上拍摄
随着每天都有新产品推出,这些选择不断增加,如果不是呈指数增长的话。从在杂货店选择牛奶罐到选择下一个最佳职业步骤,一方面“是什么”对决策者来说很重要,另一方面,公司继续寻找背后的“为什么”。每个零售或制造公司以及服务提供机构都很想知道他们的客户是如何“做出选择”的
- 是什么让他们选择一瓶洗发水而不是旁边的另一瓶?
- 是什么促使他们购买一辆车而不是另一辆?
- 他们更愿意为产品支付什么,为什么?
- 他们可以为某些功能多付多少钱,为什么?
- 他们最喜欢在什么时候购买?
- 他们想买多少?
这些长长的问题列表令人兴奋,消费者模型也是如此。总体而言,有 3 种类型的消费者模型:
- 数数——他们买了多少
- 时机——他们什么时候买
- 选择——他们买什么
本文阐述了 【消费者选择车型】 。选择模型试图找到答案——顾客如何选择最终产品,即顾客如何根据某种潜在的尺度(如“效用”,即顾客对每件商品的“感知价值”)对给定商品进行排序。例如,给定一组 4 个项目,比如洗发水,消费者倾向于评估每个选项的效用,并根据个人偏好对它们进行排序。价格、是否无硫、香味、品牌的商誉、公众评价、个人经历等因素起着重要作用。显然,这种“效用”会因人而异。同样,对于消费者来说,它还取决于其他因素,比如年龄、性别、所在地、职业、收入,有时还有像性格这样复杂的因素。
这些具有挑战性的问题使得“消费者选择建模”变得更加有趣。虽然寻找这些问题的答案是令人兴奋的,但为客户提供更好的选择同样重要,如果不是更重要的话。最终, 一个消费者想要最好的产品,一个公司最想卖出去!
目标很简单——做的越多,卖的就越多!
因此**,选择建模**使数据科学家能够利用购买交易、调查和产品评论的大量消费者数据,找出描述、规定和预测消费者选择决策行为的模型,使企业能够制定更好的战略。随着人工智能高级应用的出现,出现了许多新的想法。例如,研究消费者在扫描货架时不断变化的面部表情,分析消费者在发现感兴趣的产品时的肢体语言,或者理解消费者在购物时的总体兴奋感,这提供了更深入的见解,从而提供了更深入的知识来改善消费者体验。
正如维基百科的定义一样, 选择建模 试图通过在一个或多个特定上下文中显示的偏好或陈述的偏好,对个人或群体的决策过程进行建模。
现在,想到的下一个有趣的问题是— 如何定义这些客户? —一个群体的整体?在一定数量的细分市场中(如果是,那么是多少)?还是在个人层面上分别对待每个客户?
毕竟,每个人都是不同的,他们的偏好也是不同的。答案在于高复杂度结果的粒度与更简单结果的一般化之间的权衡。这只不过是他们在机器学习语言中所说的老派“偏差-方差”权衡。人们可以根据最终目标、业务知识以及可用数据的大小和特征来做出决策。
因此,从高层次来看,有 3 种类型的消费者选择模型:
集体选择模型:它假设每个顾客都会以同样的顺序排列某些商品——例如,当一家快速消费品公司创造一种新产品时——通常它是基于假定的集体消费者偏好
**2)基于细分市场的选择模型:**一旦在给定业务、业务问题和最终目标的情况下找到最佳数量的细分市场,它就将整个消费者群划分为这些细分市场,并假设同一细分市场中的每个客户都会以相同的顺序对集合中的项目进行排序,而不同细分市场中的客户会对项目进行排序,使得至少有一个排序会不同。例如,当不同的优惠、折扣和产品被提供给根据各种标准(如忠诚度、频率、新近度、位置、性别等)分组的客户时。
**3)个人选择模型:**它假设每个顾客会对商品进行不同的排序。虽然,即使只有有限的排列是可能的,每个人都被单独评估和对待,在更精细的层次上考虑个人偏好和个性,例如电子商务网站上的推荐系统
让我分享一下我最近创建消费者偏好模型的经验吧!
作为哥伦比亚大学 capstone 项目的一部分,我有机会与四位出色的队友一起为北美一家顶级汽车制造公司创建消费者偏好模型。在这篇文章中,我分享了我从每个数据科学家那里学到的,基于这个项目建立一个成功的集体消费者偏好模型的 5 大技巧。
目标是什么?
许多公司的生产不是基于订单,而是一次批量生产——因此,就像任何企业一样,他们也想知道他们的客户偏好。因此,我们开始创建集体消费者偏好模型,以了解消费者更喜欢哪种汽车功能!
因此,以下是我们在从事该项目时发现的 5 大经验,我们很乐意与大家分享:
1)选择影响选择模型 —数据科学家应该问自己的第一个问题,**“消费者的购买决策之旅是什么?”**不清楚对不对?以这种方式思考——你买牛奶和买笔记本电脑有什么不同?这两种情况都涉及到消费者。两种情况下都要做出选择。在这两种情况下,有多种选择,可能有相似数量的选择。那么这两种决策和购买行为有什么不同呢?—区别在于这个问题的答案——消费者如何以及通过什么心理决策做出最终决定?虽然牛奶罐的选择取决于商店的库存,消费者通常会从货架上的所有选项中选择任何一个选项,但购买笔记本电脑需要几天的研究、集思广益,而不是只去预计会有所需选项的商店。此外,某些选择依赖于商店库存,然而,在所选择的备选项中,诸如品牌、RAM、价格等特征的某些其他选择比库存本身更依赖于消费者的“预设”偏好。选择模型假设消费者在特定时间看到所有的选择,并根据他们的效用排序做出决定。因此,根据业务设置,人们可能需要改变选择模型,创建复杂的约束,假设复杂的功能来创建一个好的模型。阅读更多关于选择模型的理论,解决它们的每种方法背后的假设,并加强自己的概率和统计游戏,例如, 这 是一个很好的汇编,可以带来很大的见解和更好的建模。
2)变量缩减 v/s 信息损失 —这种权衡是数据科学家在解决业务问题时需要做出的最重要的决策之一。假设您的数据集有汽车的颜色,并且有 100 多种独特的颜色。作为一名数据科学家,您首先想到的是什么?让我们减少这些颜色类别,因为在一次性编码之后,它将导致 100 列!!!
什么!!100 列只是为了颜色!?
来源: Giphy
我们,数据科学家,有这种尽可能减少变量的诱惑,因为 我们的 目标是做出稳健的模型。这仍然是一个从较少变量开始的好策略。为了应对这个充满变数的问题,我们的旅程是这样的:
我们的第一个想法是根据 RGB 分数将颜色分组**但是!**等一下!…消费者在购买汽车时是否会将黑色、深蓝色和深绿色汽车视为相似颜色的汽车?不要!他们的看法完全不同!因此,尽管“数学上”基于 RGB 代码对颜色进行分组听起来是最符合逻辑的论点,但它去除了“顾客如何感知汽车颜色”的本质。
注意:不正确的分组比没有分组更糟糕(即没有变量约简)!
因此,这种变量的减少会导致信息的丢失,而我们正在某个地方寻找我们的模型来捕捉这些信息,然后希望它学会做出一个好的预测!
我们的下一个想法是根据流行度对颜色进行分组 — 最初,我们认为根据频率进行分组将是最佳选择,因为将所有出现频率极低的颜色分组在一起将减少数据,而不会损失太多“信息”。不管怎样,我们正在去除颜色的纹理,因为数据科学家喜欢不择手段地减少变量 但是,这里也发生了信息丢失! 黑色“哑光”和黑色“金属色”看起来完全不同!
毕竟哑光就是哑光!
照片由 Philippe Oursel 在 Unsplash 上拍摄
通过去除这种粒度来使生活变得更容易是没有意义的,因此,结果是通过保持颜色原样来实现的!
3)选择合适的目标变量 —目标变量是先建模再预测的因变量。有时这个目标不能是明确的,相反,它必须根据要解决的最终目标,在商业敏锐度的基础上创建或决定。选择模型中的目标变量通常是二元变量,如果客户选择了特定的选择,则使用机器学习或最大似然估计对其进行建模。最重要的是,必须确保数据集遵循选择模型背后的基本假设。例如,在我们的班级中,汽车在一个特定的经销店按顺序售完,我们有每天售出多少辆汽车的数据。应用这种简单的选择模型会迫使模型**‘假设’每个客户在特定的一天看到了所有的选项,这在现实中是不正确的。事实上,在现实中,‘最受消费者青睐的选项’**首先会被抢购一空,我们的模型会将其视为被拒绝。因此,我们最终将“汽车在经销商处的库存时间”作为目标变量,因为它表明了汽车的“受欢迎程度”——汽车停留的时间越长,受欢迎程度就越低,越早售罄,就越受欢迎。其次,在对这个新创建的目标变量应用回归时,模型表现不佳。难道不是很直观吗?对于一个 1000k x k 维的小数据集,模型准确预测一辆汽车将在 35 天或 36 天内售出有意义吗?不仅仅是感觉,更重要的是,我们的业务问题需要解决吗?因此,我们将该变量转换为二元变量,其中根据经销商(即其服务的细分市场)选择临界值或“流行库存时间阈值”。该 XGBoost 模型优于所有模型,给出了 80%的平均 AUC。
4)消费者市场/细分 —集体选择模型,虽然简单,但处理 的问题过于一般化 而丢失了关于—变化的客户行为的重要信息。即使您的客户或业务问题要求创建一个集体消费者偏好模型,数据科学家也应该经常问自己——**我能在预测中纳入这些不同的客户行为吗?**我们可以选择为每个汽车经销商创建单独的模型,这些经销商通常相距 50 英里以上。如果后者的平均 AUC 有所提高或没有提高,制作一个集体和单独的市场/区域模型并比较它们总是一个好主意。后者的缺点是“数据量减少”。因此,必须仔细分析这种权衡,牢记我们正在解决的业务问题 !
5)现实世界的实现 —当我们创建一个成功的模型时会发生什么?—我们把它交给客户?—对吗?—事情是这样的:在一次通话中,我们告诉团队,我们已经成功地制作了精度为 xx 的模型!有一些赞赏,但缺乏预期的兴奋,这是有道理的?最终使用模型的人,通常不会被期望精通机器学习?—他们能否将新输入转换成所需的格式,然后成功调用预测函数?不是吧?这很有挑战性!因此,我了解到,一个数据科学项目,尤其是解决业务问题的项目,如果没有用户界面是不完整的,即使是 Jupyter 笔记本本身内置的基本界面也是如此。他们必须能够在现实世界中实现该模型。在接下来的通话中,当我们向他们展示了一个非常基本的用户界面,他们可以在其中插入所有输入内容时,他们大吃一惊!型号是一样的,只是 UI 增加了舒适性和便利性,这就完全不同了!
感谢阅读!
希望你喜欢阅读这篇文章,请分享你的宝贵反馈!
使用不到 30 行 Python 代码追踪联系人
机器学习如何帮助应对流行病?
图片由作者提供(使用 Canva 制作)
接触追踪是用于识别那些与传染病检测呈阳性的人接触的人的过程的名称,例如麻疹、艾滋病毒和新冠肺炎病毒。在疫情期间,正确追踪接触者有助于减少感染人数或加快感染者的治疗过程。这样做有助于拯救许多生命。
技术可以帮助实现接触追踪过程的自动化,产生比手动操作更有效、更准确的结果。一项可以帮助这一过程的技术是机器学习。更准确地说,集群。聚类是机器学习算法的一个子类,用于根据这些特征将共享某些特征的数据划分到不同的聚类中。
如何在混乱中找到模式?
towardsdatascience.com](/5-data-mining-techniques-every-data-scientist-should-know-be06426a4ed9)
有各种类型的聚类算法,如 K-means、Mean-Shift、谱聚类、BIRCH、DBSCAN 等等。这些不同的算法可以分为三类:
- ***基于密度的聚类:*基于区域的密度形成聚类——这种类型的例子有: DBSCAN (基于密度的有噪声应用的空间聚类)和 OPTICS (对点进行排序以识别聚类结构)。
- ***基于等级的聚类:*使用树型结构形成聚类。一些聚类是预定义的,然后用于创建新的聚类—这种类型的示例: CURE (使用代表的聚类)、 BIRCH (平衡迭代减少聚类,并使用层次)。
- ***基于划分的聚类:*通过将输入数据划分为 K 个聚类来形成聚类——这种类型的示例: K-means , CLARANS (基于随机搜索对大型应用进行聚类)。
对于接触追踪,我们需要使用基于密度的聚类算法。原因是,当感染者与他人接触时,疾病就会传播。因此,更加拥挤——密集——的地区会比不那么拥挤的地区有更多的病例。
为了追踪受感染者的活动,科学家们经常使用 GPS 数据集,这些数据集包含一个人在任何给定时间范围内的时间和位置信息。位置数据通常表示为经度和纬度坐标。
接触追踪算法
为了建立一个接触追踪算法,我们需要做三个步骤:
- 获取特定时间和地点内不同用户的位置数据。
- 对数据应用基于密度的聚类算法。
- 使用分类来预测受感染的人。
那么,让我们开始吧…
我们将编写一个 Python 代码,它使用 DBSCAN 聚类算法来预测谁可能会因为与感染者接触而被感染。
步骤№1:获取数据。
不幸的是,我们无法从 GPS 位置获得真实生活的数据。因此,我们将构建一个模拟数据集来应用我们的算法。对于本文,我使用了一个模拟数据生成器来生成一个 JSON 数据集,其中包含 10 个用户的 100 个位置条目。如果要尝试另一个数据集,请确保满足以下条件:
- 每个用户有多个条目。
- 用户彼此之间的距离很近,并且在一个时间范围内(例如,一天或特定的小时数)。
首先,让我们导入我们将使用的所有库。我们将需要Pandas
和Sklearn
来处理数据和Pygal
来显示数据。
*import pandas as pd
import pygal
from sklearn.cluster import DBSCAN*
***注意:*如果您没有这些库,您可以使用pip
从命令行安装它们。此外,如果你正在使用 Jupyter 笔记本,你需要添加这个单元格来显示Pygal
图:
*from IPython.display import display, HTML
base_html = """
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="[http://kozea.github.com/pygal.js/javascripts/svg.jquery.js](http://kozea.github.com/pygal.js/javascripts/svg.jquery.js)"></script>
<script type="text/javascript" src="[https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js](https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js)""></script>
</head>
<body>
<figure>
{rendered_chart}
</figure>
</body>
</html>
"""*
现在,我们可以加载数据集并显示前 5 行,以了解它是如何构建的。
*dataFrame = pd.read_json(r"Location_Of_Your_Dataset\MOCK_DATA.json")
dataFrame.head()*
为了更好地理解数据,我们将使用 Pygal 散点图来绘制它。我们可以提取每个用户的不同位置,并将其存储在一个字典中,然后使用这个字典来绘制数据。
*disp_dict = {}
for index, row in dataFram.iterrows():
if row['User'] not in disp_dict.keys():
disp_dict[row['User']] = [(row['Latitude'], row['Longitude'])]
else:
disp_dict[row['User']].append((row['Latitude'], row['Longitude']))
xy_chart = pygal.XY(stroke=False)
[xy_chart.add(k,v) for k,v in sorted(disp_dict.items())]
display(HTML(base_html.format(rendered_chart=xy_chart.render(is_unicode=True))))*
运行这段代码,我们得到…
原始数据散点图。
步骤№2:应用 DBSCAN 算法。
太棒了。现在我们有了数据集,我们可以对其应用聚类算法,然后使用它来预测潜在的感染。为此,我们将使用 DBSCAN 算法。
DBSCAN 算法将聚类视为由低密度区域分隔的高密度区域。因此,与 k-means 相反,DBSCAN 发现的聚类可以是任何形状,k-means 假设所有的聚类都是凸形的。
Sklearn 有一个预定义的 DBSCAN 算法;要使用它,您只需知道三个参数:
- eps: 该因子表示同一聚类中不同点之间的距离。在我们的例子中,我们将使用 CDC 推荐的距离,即 6 英尺(或 0.0018288 公里)。
- min_samples: 聚类中的最小样本数。如果数据集较大且有噪声,请增加该数值。
- ***度量:*设置数据点之间的距离度量。Sklearn 有很多距离度量,比如欧几里德,曼哈顿,闵可夫斯基。然而,对于我们的例子,我们需要一个距离度量来描述一个密码(地球)上的距离。这个度量叫做 哈弗辛。
我们现在可以将我们的模型应用到数据集。
*safe_distance = 0.0018288 # a radial distance of 6 feet in kilometers
model = DBSCAN(eps=safe_distance, min_samples=2, metric='haversine').fit(dataFram[['Latitude', 'Longitude']])
core_samples_mask = np.zeros_like(model.labels_, dtype=bool)
core_samples_mask[model.core_sample_indices_] = True
labels = model.labels_
dataFram['Cluster'] = model.labels_.tolist()*
应用具有这些参数的模型导致 18 个聚类。我们可以使用这段代码显示这些集群…
*disp_dict_clust = {}
for index, row in dataFram.iterrows():
if row['Cluster'] not in disp_dict_clust.keys():
disp_dict_clust[row['Cluster']] = [(row['Latitude'], row['Longitude'])]
else:
disp_dict_clust[row['Cluster']].append((row['Latitude'], row['Longitude']))
print(len(disp_dict_clust.keys()))
from pygal.style import LightenStyle
dark_lighten_style = LightenStyle('#F35548')
xy_chart = pygal.XY(stroke=False, style=dark_lighten_style)
[xy_chart.add(str(k),v) for k,v in disp_dict_clust.items()]
display(HTML(base_html.format(rendered_chart=xy_chart.render(is_unicode=True))))*
聚类散点图
在算法完成之后,如果有任何没有聚类的数据点,它们将被聚类为噪声或聚类-1。通常,您会发现这个数据集中的所有用户都是-1 集群以及其他集群的一部分。
步骤№3:预测感染者。
如果我们有一个被感染的人的名字,我们就可以用它来得到这个人所属的所有集群。从那里,我们可以看到这些集群中的其他人。这些人被感染的概率会比没有被感染的人高。
- 获取特定人所属的所有聚类
给定一个名字inputName
例如, William ,我们希望得到 William 所属的所有集群。
*inputName = "William"
inputNameClusters = set()
for i in range(len(dataFrame)):
if dataFrame['User'][i] == inputName:
inputNameClusters.add(dataFrame['Cluster'][i])*
执行完这段代码后,inputNameCluster
将变成{2,4,5,-1}。
- 将人们聚集在一个特定的群体中。
现在,我们想要属于这个特定集群集合的其他人。
*infected = set()
for cluster in inputNameClusters:
if cluster != -1:
namesInCluster = dataFrame.loc[dataFrame['Cluster'] == cluster, 'User']
for i in range(len(namesInCluster)):
name = namesInCluster.iloc[i]
if name != inputName:
infected.add(name)*
在这两个部分中,当inputName
在每个集群的名称列表中时,我使用集合来避免额外的 if-else 语句。
Voilà ,代码会返回{‘Doreen ‘,’ James ‘,’ John’},也就是说,那三个人有可能被感染,因为他们在某个时间某个地点接触过 William。
我将核心代码放入一个函数中,该函数获取数据帧和用户名,并对该用户进行接触追踪,最后打印出潜在的感染者。该函数将首先检查inputName
是否有效;否则,它将引发一个断言错误。最重要的是,它只有不到 30 行代码!!
联系人追踪功能的完整代码:
结论
接触追踪是我们可以利用技术挽救人们的生命并尽快为他们提供治疗的方法之一。政府和医务人员经常可以访问一些患者的 GPS 位置。我们在这篇文章中走过的过程,基本上与他们获取潜在感染的过程相同。幸运的是,感谢像 Sklearn 这样的库,我们可以在我们的数据集上使用预定义的模型,并通过几行代码获得结果。
参考
[1]“在带有噪声的大型空间数据库中发现聚类的基于密度的算法”,Ester,m .,H. P. Kriegel,J. Sander 和 X. Xu,载于第二届知识发现和数据挖掘国际会议论文集,俄勒冈州波特兰,出版社,第 226-231 页。1996
[2]“DBSCAN 再访,再访:为什么以及如何应该(仍然)使用 DBS can。舒伯特,e,桑德,j,埃斯特,m,克里格尔,H. P .,,徐,X. (2017)。《美国计算机学会数据库系统学报》(TODS),42(3),19。
[3] Sklearn 文档。