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

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

多元线性回归:深入探讨

原文:towardsdatascience.com/multiple-linear-regression-a-deep-dive-f104c8ede236

从零开始的多元线性回归:深入理解

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

·发表于 Towards Data Science ·10 分钟阅读·2023 年 3 月 3 日

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

两个特征(x1 和 x2)的多元回归(作者图片)

动机

我们人类已经尝试了很长时间去创建智能系统。因为如果我们能自动化一个系统,它将使我们的生活更轻松,并且可以作为我们的助手。机器学习使这一切成为可能。解决不同问题的机器学习算法有很多。本文将介绍一种可以用多个变量解决回归问题(连续值预测)的机器学习算法。假设你在经营房地产生意。 作为业务负责人,你应该对建筑物、土地等的价格有一个合理的了解,以便使你的业务盈利。对于一个人来说,跟踪广泛区域的价格是相当困难的。一个高效的机器学习回归模型可以大有帮助。想象一下你输入的位置、大小和其他相关信息,系统会自动显示价格。多元线性回归正是可以做到这一点。难道不很有趣吗!

我将解释多元线性回归的过程,并展示从零开始的实现。

*注意 — 如果你对简单线性回归没有清晰的概念,我建议你先阅读* [***这篇文章****再深入了解多元线性回归。]*

目录

  1. **什么是多元线性回归?**

  2. **我们什么时候使用多元线性回归?**

  3. **多元线性回归的详细介绍**

  4. **线性回归的向量化方法**

  5. **用 Python 的动手实现**

什么是多元线性回归问题?

在简单线性回归中,只能存在一个特征(自变量)。但在多重线性回归中,特征的数量多于一个。它们都用于预测连续值。

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

简单线性回归问题(作者提供的图像)

看看表格。表中是产品价格与重量的关系。通过线性回归,如果我们可以为给定的值拟合一条线,我们可以通过将产品的重量插入模型来轻松预测价格。相同的过程也适用于多重线性回归。不同的是,特征不止一个,而是多个(自变量)。

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

多重线性回归问题(作者提供的图像)

上述示例有两个特征 “**年龄**”“**收入**”。我们需要预测这两个新特征的每月 “**支出**”。这就是多重线性回归的一个示例。

多重线性回归不限于两个特征。它可以有两个以上的特征。

何时使用多重线性回归?

简单或单变量线性回归仅适用于从一个自变量预测连续值。

简单线性回归的过程不适用于多个特征。如果我们需要从多个特征(变量)中预测连续值,我们必须应用多重线性回归。值得一提的是,数据必须是线性分布的。非线性数据不适合线性回归。

多重线性回归的详细信息

让我们尝试以可视化的方式表示多重线性回归。我试图保持模型简单,只包含两个自变量(特征)。

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

两个特征(x1 和 x2)的多重线性回归(作者提供的图像)

*x1 和 x2* 是两个特征(自变量)。假设 x1=4x2=5。如果将这些值投影到 x1-x2 平面上,我们将得到点 **A**。在多重回归模型中,我们需要从数据集中创建一个回归平面,如图所示。现在,在回归平面上画一条垂直线会将平面划分为一个特定的点。通过从交点向 y 轴画一条水平线,我们可以得到预测值。预测值是 y 轴 的交点。

*[注 — 我仅使用两个特征可视化多重线性回归以作演示,因为可视化超过两个特征是不可能的。在特征更多的情况下,过程是相同的。]*

让我们尝试更深入地探讨

在简单线性回归中,我们根据一个自变量预测一个因变量。 *[阅读* [*上一篇文章*](https://medium.com/towards-data-science/deep-understanding-of-simple-linear-regression-3776afe34473) *以获取关于简单线性回归的更详细解释。]*

例如,一个简单的线性回归方程,***yi=mxi + c***。这里,‘m’是回归线的斜率,而‘c’y轴截距值。

在有多个自变量的情况下,我们需要扩展回归方程,如下所示。

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

其中,

y表示因变量(预测回归值)。

x1,x2, ……,xn是不同的自变量。

m1, m2, m3,…….,mn象征着不同自变量的斜率系数。

m0y轴的截距点值。

现在,我们将从数据集中获取自变量。我们面临的主要挑战是找出斜率的系数值(m0,m2,……., mn )

让我们考虑第一部分中显示的多元线性回归问题数据集。

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

如果我们有*m0, m1 和 m2*的最佳值,预测个人的‘支出’就很容易了。我们可以通过输入年龄收入值来轻松获得‘支出’

但没有直接的方法来找到系数的最佳值。为此,我们需要通过梯度下降来最小化代价(损失)函数。

关于梯度下降的详细信息 —

在深入梯度下降之前,我们应该对代价函数有一个清晰的了解。代价函数就是一个误差函数。它衡量预测模型的准确性。我们将使用以下误差函数作为代价函数。

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

在这里,y̅i是预测值,yi是实际值。

**梯度下降**是一个优化算法。我们使用这个算法通过优化回归方程的系数来最小化代价函数。

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

梯度下降(图片作者提供)

红色曲线是代价函数的导数。为了优化系数,我们随机分配系数的权重。现在,我们将计算代价函数的导数。为了简化起见,我们将考虑简单的线性回归方程。

  1. 让我们用*(mxi+c)*替换***y̅i***。这意味着方程如下 —*

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

2. 对**m****c**的偏导数。

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

*[注意 — 你可能会发现一些代价函数是乘以 1/2n 而不是 1/n。这没什么大不了的。如果你使用 1/2n,导数会中和它,结果将是 1/n 而不是 2/n。在实现部分,我们也使用 1/2n。]*

3. 现在,我们将通过以下方程迭代更新mc的值。

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

α 是学习率,指示我们在每一步中移动的距离以最小化成本函数(如图所示)。迭代将继续进行,直到成本函数显著最小化。

对于多重线性回归,整个过程是相同的。让我们再次考虑多重线性回归的方程。

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

如果我们像简单线性方程一样计算系数的导数,我们将得到一种通用形式(如上所示)。

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

其中 ***j*** 取值为 ***1,2,…..,n,*** 代表特征。

对于 *m0*,导数将是 —

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

我们将使用以下公式同时更新所有系数。

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

对于 m0, 我们将使用以下方程。

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

我们将不断更新所有系数以拟合模型并计算成本。如果成本显著降低,我们将停止更新系数。

但这个过程在计算上是昂贵且耗时的。向量化使实现变得简单。

向量化线性回归方法

让我们再次考虑多重线性回归。

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

我们添加了一个常数 *xi0=1* 以方便计算。它不会影响前面的方程。让我们看看方程的向量化表示。

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

线性回归方程的向量化实现(图像由作者提供)

这里,yi=1…..z, **z** 是总数据集实例的数量。X 存储了所有特征值,直到 z 实例。

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

简而言之,向量化方程是 —

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

现在,向量化成本函数的 导数如下(详细解释)。

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

现在是时候使用下面给出的公式更新权重了。

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

是的!我们已经完成了理论过程。现在是时候将整个过程编写成代码了。

从头开始的 Python 实现

现在是时候开始动手编写代码了。我将逐步展示指南。

*[附注 — 我们使用* [*波士顿房价*](https://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html) *数据集进行演示。* *它注册在公共领域。可从*[***这里***](https://www.kaggle.com/code/prasadperera/the-boston-housing-dataset/data)***]***

导入库

读取数据集

我们看到主数据集中没有列名。在下一步中,我们将根据文档设置列名。

设置列名

我们已经成功地将列添加到 Dataframe 中。

在本文中,我们的主要重点是理解多元线性回归的内部过程。因此,我们将主要关注实现过程,而不是项目的有效性。为了保持模型的简单性,我们将考虑高度相关的特征。

让我们找到与目标列的相关性 ***‘MEDV’***

为了方便起见,我们选择了三个特征,**‘RM’, ‘DIS’, 和 ‘B’**,以及目标值 **‘MEDV’**

规范化特征

归一化减少了模型的计算复杂度。因此,我们将对特征进行归一化。

将数据集拆分为测试集和训练集

我们必须将数据集拆分为训练集和测试集,以便进行评估。使用训练集,我们将训练模型,并用测试集评估我们的模型。

在这里,我们将 75% 的数据用于训练,其余 25% 用于测试。

带有向量化实现的梯度下降优化函数

让我们调用函数找出系数的最佳值。

该函数返回两个值,系数(w)和一个损失值列表。

优化过程的迭代可视化

创建预测函数以预测新值

让我们对测试特征进行预测。

将我们的自定义模型与标准 scikit-learn 库进行比较

在进行比较之前,我们需要创建一个用于多元线性回归的预测模型,使用 **scikit-learn**

使用 scikit-learn 的线性回归

从 MSE 的角度比较模型

两个 MSE 值非常相似。即使我们的模型的 MSE 稍低于 scikit-learn 模型。

这两个模型的预测差异有多大?

结果表明我们的优化非常完美,并且与 scikit-learn 的基准模型效果类似。

结论

我们主要使用多元线性回归来解决从多个特征预测连续值的问题。我们可以使用许多基准库和工具来实现线性回归。但我们无法了解算法的内部工作原理。通过这篇文章,我尝试从最基本的方面解释多元线性回归的过程。我相信这将为您提供对算法的清晰理解。

*您可以从* [***这里***](https://github.com/Zubair063/ML_articles/blob/main/Multiple%20Linear%20Regression/Multiple%20Linear%20Regression%20from%20scratch%20.ipynb) *下载完整的笔记本。*

[这篇 文章 指导我如何展示多元线性回归的概念。]

***关于 ML 算法从头实现的其他文章正在筹备中。***

之前关于 从头开始学习机器学习系列 的文章如下。

《从头开始的机器学习系列》***Machine Learning from Scratch Series***的先前文章如下。

## 深入理解简单线性回归

从零开始的线性回归:详细解释

towardsdatascience.com ## 从零开始的 K-means 聚类

K-means:用于数据聚类的最佳 ML 算法

towardsdatascience.com ## 从零开始的 KNN 算法

KNN 算法的实现和细节解释

towardsdatascience.com

**如果你是初学者,不要错过阅读以下系列。**

## 数据科学的统计学终极指南

数据科学中的统计学一览:标准指南

towardsdatascience.com

多变量分析 — 超越一次一个变量

原文:towardsdatascience.com/multivariate-analysis-going-beyond-one-variable-at-a-time-5d341bd4daca

Python 中的多变量分析与可视化

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

·发表于 Towards Data Science ·阅读时间 9 分钟·2023 年 1 月 12 日

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

一只反思数据的猫头鹰,来自 DALL.E 2

现在,企业和公司收集尽可能多的信息已成为一种常见做法,即使在收集时这些数据的使用场景尚不明确——希望是将来能够理解和利用这些数据。一旦这些数据集可用,数据驱动的个人将深入数据中,寻找其中隐藏的模式和关系。发现这些隐藏模式的工具之一就是多变量分析。

多变量分析涉及分析多个变量(即多变量数据)之间的关系,并理解它们如何相互影响。这是一个重要的工具,帮助我们更好地理解复杂的数据集,从而做出基于数据的明智决策。如果你仅对一次分析一个变量的影响感兴趣,可以通过单变量分析来实现,我在这篇文章中做了介绍。

## 单变量分析 — 介绍与实现

使用 seaborn 进行的单变量分析:统计数据可视化

towardsdatascience.com

现在我们已经熟悉了多变量数据,我们可以将单变量数据定义为多变量数据的一种特殊情况,其中数据只包含一个变量。类似地,双变量数据包含两个变量,依此类推。

在这篇文章中,我们将讨论数值和分类变量的双变量/多变量分析。因此,让我们先快速复习一下这两种变量的区别,然后再进入分析部分。

  • 数值变量: 代表一个可测量的量,可以是连续变量或离散变量。连续变量可以取某个范围内的任何值(例如身高、体重等),而离散数值变量只能取范围内的特定值(例如孩子的数量、停车场的汽车数量等)。

  • 分类变量: 代表一个组(或类别),可以取有限数量的值,例如汽车品牌、狗的品种等。

现在我们已经了解了这两种变量的区别,我们可以进入实际的分析部分。

我已经将这篇文章组织成一系列问答的格式,这是我个人认为的有效学习方法。我还在文末提供了一个链接,指向我用来创建这个练习的笔记本。阅读完这篇文章后,随时下载并练习!

让我们开始吧!

(除非另有说明,所有图像均由作者提供。)

[## 通过我的推荐链接加入 Medium - Farzad Mahmoodinobar

阅读 Farzad(以及 Medium 上其他作者)的每一个故事。您的会员费将直接支持 Farzad 和其他人……

medium.com](https://medium.com/@fmnobar/membership?source=post_page-----5d341bd4daca--------------------------------)

数据集

为了练习多变量分析,我们将使用来自 UCI 机器学习库(CC BY 4.0)的数据集,该数据集包括汽车价格及与每个汽车价格相关的一组汽车属性。为了简化过程,我已经清理和筛选了数据,可以从这个链接下载。

让我们先导入今天将要使用的库,然后将数据集读入数据框,并查看数据框的前 5 行,以熟悉数据。

# Import libraries
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline

# Show all columns/rows of the dataframe
pd.set_option("display.max_columns", None)
pd.set_option("display.max_rows", None)

# Read the data
df = pd.read_csv('auto-cleaned.csv')

# Return top 5 rows of the dataframe
df.head()

结果:

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

在这篇文章中使用的列是自解释的,因此目前无需担心理解所有列。

让我们继续分析吧!

数值双变量分析

让我们从一个包含两个变量的双变量数据集开始。双变量分析的目标是理解两个变量之间的关系。有多种统计技术可以用来分析双变量数据,而散点图是其中最常见的一种。让我们看看散点图是如何工作的。

问题 1:

价格与发动机大小之间的关系是什么?直观上,我们可能会预期发动机较大的汽车价格较高(其他条件相同),但让我们看看数据是否支持这一点。创建一个以价格为 x 轴、发动机大小为 y 轴的散点图。

回答:

# Create the scatterplot
sns.regplot(data = df, x = 'price', y = 'engine-size', fit_reg = False)
plt.show()

结果:

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

价格与发动机大小的散点图

正如我们所见,数据中价格与发动机大小之间似乎存在正相关关系。需要注意的是,这并不意味着存在因果关系(无论这种关系是否正确),只是展示了两者之间的正相关性。让我们添加相关值,以便为参考提供量化的测量。

问题 2:

返回价格与其他变量之间的相关性,并按降序排列。

回答:

# Create the overall correlation
corr = np.round(df.corr(numeric_only = True), 2)

# Return correlation only with price
price_corr = corr['price'].sort_values(ascending = False)
price_corr

结果:

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

结果确认了我们在散点图中观察到的价格与发动机大小之间的正相关性。让我们尝试更深入地了解数据中的变异情况。

异质性与分层

数据中的异质性指的是数据集中的变异。例如,我们的数据集包含了不同的车身风格,如轿车、掀背车、旅行车、敞篷车等。我们是否期望这些车身风格中价格与发动机大小之间的相关性是相似的?例如,客户对敞篷车大发动机的增量支付意愿可能会高于对主要用于家庭的旅行车的支付意愿。让我们检验这个假设,看看不同车身风格之间是否存在这样的变异,通过对数据进行分层分析。

问题 3:

数据集包括具有不同车身风格的汽车价格,如“body-style”列所示。数据集中每个类别有多少行?

回答:

# Apply value_counts to the df['class'] column
df['body-style'].value_counts()

结果:

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

根据结果,共有五类。

问题 4:

创建每种车身风格的价格与发动机大小的散点图,以展示车身风格之间是否存在视觉上的差异。

回答:

sns.FacetGrid(data = df, col = 'body-style').map(plt.scatter, 'price', 'engine-size').add_legend()
plt.show()

结果:

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

价格与发动机大小的散点图,按车身风格分类

这确实很有趣!这些分布与我们在问题 1 中观察到的总体分布相差甚远,并展示了这五种车身风格之间的视觉差异。所有五种车身风格都如预期般展示了价格与发动机大小之间的正相关性,但坡度似乎在敞篷车上最高(尽管数据点较少),而在旅行车上较低。让我们查看相关数字来量化这些差异。

问题 5:

对于每种车身风格,价格与发动机大小之间的相关性是什么?

回答:

bodies = df['body-style'].unique()

for body in bodies:
    print(body)
    print(df.loc[df['body-style'] == body, ['price', 'engine-size']].corr())
    print()

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

结果确认了我们的视觉检查——所有车身类型的价格与发动机尺寸的相关性都是正的,其中敞篷车的相关性最高,旅行车的相关性最低,这正如我们直观上所预期的。接下来,我们将查看分类双变量分析。

分类双变量分析

在本节中,我们将创建一个类似的双变量分析,但用于分类变量。在统计学中,这种分析通常通过“列联表”(也称为交叉表或 crosstab)来可视化,它显示了两个(对于双变量)或更多(对于多变量)分类变量的观察频率或计数。让我们看一个例子,以便更好地理解列联表。

问题 6:

创建一个显示汽车车身类型和气缸数量的列联表。你在结果中看到模式了吗?

答案:

crosstab = pd.crosstab(df['body-style'], df['num-of-cylinders'])
crosstab

结果:

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

如果你对汽车有所了解,最常见的气缸数量是 4、6 和 8,这也是我们在表中看到的频率最多的地方。我们还可以看到,我们的数据集中大多数汽车是四缸的,车身类型为轿车和掀背车,其次是旅行车。你是否注意到我们在进行心理计算,以计算每种气缸数量和车身类型组合的百分比?列联表可以被规范化来解决这个问题。有三种方法可以规范化这样的表格:

  1. 每行的条目总和为 1

  2. 每列的条目总和为 1

  3. 整个表格的条目总和为 1

让我们在下一个问题中尝试其中一个。

问题 7:

创建一个类似于前一个问题的交叉表,规范化方式是每行的条目总和等于 1,四舍五入到两位小数。

答案:

我将在这里演示两种不同的方法以供学习。第一种方法使用 Pandas 的 crosstab,第二种方法使用 groupby。

# Approach 1

# Create the crosstab (similar to previous question)
crosstab = pd.crosstab(df['body-style'], df['num-of-cylinders'])

# Normalize the crosstab by row
crosstab_normalized = crosstab.apply(lambda x: x/x.sum(), axis = 1)

# Round the results to two decimal places
round(crosstab_normalized, 2)

结果:

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

# Approach 2

# Group by and count occurences using size method
grouped_table = df.groupby(['body-style', 'num-of-cylinders']).size()

# Pivot the results using unstack and apply the row normalization
grouped_table_normalized = grouped_table.unstack().fillna(0).apply(lambda x: x/x.sum(), axis = 1)

# Round the results to two decimal places
round(grouped_table_normalized, 2)

结果:

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

混合数值和分类数据的双变量分析

我们经常需要分析混合了数值和分类变量的数据,所以让我们看看如何在我们已经知道如何分别处理每种数据类型的情况下来完成这项工作。

问题 8:

创建一系列箱线图,展示不同车身类型(x 轴的分类变量)下价格(y 轴的数值变量)的分布。

答案:

# Set the figure size
plt.figure(figsize = (10, 5))

# Create the boxplots
sns.boxplot(x = df['body-style'], y = df['price'])
plt.show()

结果:

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

按车身类型分层的汽车价格箱线图

我个人认为这个可视化非常有用。例如,我们可以看到,相比硬顶车或敞篷车,掀背车的价格范围相对较小。与其他车身风格相比,敞篷车的起始价格较高,并且根据车辆的各种特征,价格范围似乎也很广泛。

如果我们只关注轿车,并查看价格范围如何随气缸数量变化?让我们创建箱线图。

# Set the figure size
plt.figure(figsize = (10, 5))

# Create the boxplots
sns.boxplot(x = df[df['body-style'] == 'sedan']['num-of-cylinders'], y = df[df['body-style'] == 'sedan']['price'])
plt.show()

结果:

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

按气缸数量分组的轿车价格箱线图

正如预期的那样,气缸数量增加时,价格也随之上升。

包含练习题的笔记本

下面是包含问题和答案的笔记本,供参考和练习。

结论

在这篇文章中,我们介绍了多变量分析作为发现数据中隐藏模式的工具,然后讲解了如何实现对数值变量、分类变量以及两者混合的分析。我们利用了散点图和箱线图等可视化工具来展示变量之间的关系,并在一些情况下量化了这些相关性。

感谢阅读!

如果你觉得这篇文章有帮助,请 关注我在 Medium 上 并订阅以接收我的最新文章!

主成分分析中的多变量过程控制,使用 T² 和 Q 误差

原文:towardsdatascience.com/multivariate-process-control-by-principal-component-analysis-using-t%C2%B2-and-q-errors-c94908d14b04?source=collection_archive---------8-----------------------#2023-04-26

使用和解读 Hotelling 的 T² 和平方预测误差 Q 在异常检测系统中的应用

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

·

关注 发表在 Towards Data Science · 12 分钟阅读 · 2023 年 4 月 26 日

[]

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

图片来自 geraltPixabay

作为数据科学家的工作中,构建制造过程控制的异常检测系统是一个重要部分,主成分分析(以下简称 PCA)在我的工具箱中扮演着关键角色。

科学文献建议使用两种度量来追踪 PCA 中的异常:Hotelling 的 T²和平方预测误差,也称为Q 误差。尽管它们的计算并不复杂,但基础软件包通常忽略它们,其含义仍然相当神秘。

网络上有数百个关于 PCA 的优秀教程。然而,尽管信息量很大,一些关于 PCA 在生产环境中使用的问题仍然需要得到充分解决。在本教程中,我将避免重复之前已有的内容,直截了当地切入主题。

本教程

在对 PCA 进行快速介绍后——仅仅强调一些要点——在本教程中,我们将深入探讨 T²和 Q 误差的使用,拆解它们的公式以理解它们能告诉我们什么。这里你不会找到有关 PCA 及其在异常检测中使用的全部故事,但我将重点讲解 T²和 Q 度量的含义:它们从何而来以及如何解读。

我将使用基础的 Python 代码,直接利用numpy中实现的 SVD 算法。我只会提供获得所描述结果所需的代码,省略生成图表的代码(你可以在 这里 找到)。

如果你至少对 PCA 有一个浅显的了解,请继续阅读。如果你不知道什么是主成分,建议你先阅读关于 PCA 的一般论文,然后再回来这里。

目录

过程控制数据

数据中心化和缩放 通过 PCA 进行过程控制

编码-解码系统

蒸馏 通过 PCA 进行异常检测

平方预测误差 Q

Hotelling 的 T² 实际中的异常检测从数据到主成分…再回来

Q 贡献

T²贡献 总结性意见

过程控制数据

在本教程中,我生成了一些特定的数据,模拟了工业工厂中的一个简单过程控制。在 这个仓库 中,你可以找到数据和一个笔记本,其中包括用于运行分析的完整代码。

让我们开始读取数据并简要探索它。

import pandas as pd

plant = pd.read_csv("plant_generated.csv")
plant.head()
 group  time        var1       var2        var3       var4        var5
0  train     1   83.346705  28.115372  455.898265  12.808663  227.974152
1  train     2   90.594521  33.497319  462.503195  14.079053  228.173486
2  train     3  101.275664  30.396332  492.407791  16.832834  250.212025
3  train     4   90.898109  29.143537  472.162499  16.505277  234.079354
4  train     5   84.898605  29.459506  467.872180  12.801665  238.440786

表格包括一个“group”列,将观察分为训练集(100 条记录)和测试集(30 条记录)。记录了五个变量。

variables = plant.columns[2:].tolist()
print(variables)
['var1', 'var2', 'var3', 'var4', 'var5']

每个变量在时间上被监控。

plant.groupby(["group"]).agg({"time": [len, min, max]})
 time
       len  min  max
group   
 test   30    1   30
train  100    1  100

相关矩阵显示了变量集之间的良好关系。没有出现“孤立社区”或冗余测量。

plant.loc[plant.group=="train", variables].corr()
 var1      var2     var3       var4      var5
var1  1.000000  0.536242  0.773872  0.534615  0.727272
var2  0.536242  1.000000  0.535442  0.451099  0.632337
var3  0.773872  0.535442  1.000000  0.613662  0.709600
var4  0.534615  0.451099  0.613662  1.000000  0.571399
var5  0.727272  0.632337  0.709600  0.571399  1.000000

数据的中心化和缩放

由于数据具有不同的尺度,我们需要在运行 PCA 之前对值进行中心化和缩放,得到一个训练集,其中每个变量的均值为 0,标准差为 1。

为了重新缩放未来数据,我训练一个“缩放器”对象来存储中心和尺度参数,以便我可以转换训练数据。我将原始观察数据称为“X”,将缩放后的数据称为“Z”。

import numpy as np
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X_train = np.array(plant.loc[plant.group=="train", variables])
Z_train = scaler.fit_transform(X_train)

最后,看看每个自动缩放变量的时间序列记录。

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

图 1. 自动缩放变量的时间序列 — 图片来源于作者,许可证 CC0。

通过 PCA 进行过程控制

观察 PCA 的一种方式是将其视为一个经过训练的编码-解码系统,该数据集表示一个受控过程。在训练过程中,系统学习监控变量之间的关系规则。随后,依赖于这些规则,系统可以评估新数据,确定过程是否在控制之中。

PCA 将观察到的变量视作一个整体,并重新分配它们的变异性,构建新的正交变量:主成分(PCs)。从* k 个变量开始,PCA 可以得到 k *个 PCs。该算法估计系数(loadings),用于与观察变量(Z)相乘以获得 PCs。

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

图 2. PCA 中数据空间与成分空间之间的关系 — 图片来源于作者,许可证 CC0。

实际上,PCA 找到规则(即系数)来数据从观察数据空间投影到主成分空间,从而获得 PC 得分。这种投影可以通过将 PC 得分与转置的系数矩阵相乘来恢复(见图 2)。

我在以下代码块中使用奇异值分解算法来估计我们植物数据的系数。

u, s, vh = np.linalg.svd(Z_train)
loadings = np.transpose(vh)
print(loadings)
array([[ 0.46831293, -0.07447163,  0.50970523,  0.1634115 , -0.69902377],
       [ 0.40387459,  0.76147727, -0.41265167,  0.29133908, -0.04333374],
       [ 0.47556921, -0.21952275,  0.30115426,  0.43988217,  0.66441965],
       [ 0.40644337, -0.58699292, -0.68019685, -0.01720318, -0.16516475],
       [ 0.47561121,  0.14783576,  0.12867607, -0.83344223,  0.20187888]])

系数数组报告变量在行上,PCs 在列上。这是矩阵的常规方向,但软件包的排列方式可能会有所不同。

我们可以通过将观察数据矩阵乘以系数矩阵来获得 PC 得分。

train_scores = Z_train @ loadings

编码-解码系统

PCA 的一个关键概念是每个 PC 都由所有变量提供(尽管根据系数值的不同,程度有所不同)。因此,当我们检查单个 PC 的得分时,我们实际上是在一次性检查所有变量(是的,就是这样!)。

然而,总的数据变异性在 PCs 之间并不均等分配,因为 PCs 是从最大变异性(PC_1)到较少变异性(PC_k)进行排序的。实际上,前面的 PCs 代表数据中的“信号”,而后面的 PCs 代表噪声。因此,我们可以丢弃那些没有显著变异性的 PCs,将信号与噪声分开。

下面的图展示了我们数据的时间序列 PC 得分。显然,随着成分排名的增加(特别是从第一个成分跳到第二个成分),变异性减少。

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

图 3. 主成分得分的时间序列 — 图片来源于作者,许可证 CC0。

蒸馏

在下面的图像中,我放大了图 2. 我用名为提炼数据的灰色节点表示了所有保留的主成分,而用另一个灰色节点表示了所有被舍弃的主成分。我使用“提炼”这个词是因为每个组件是许多变量的融合精华。

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

图 4. PCA 作为编码-解码系统 — 图片来源于作者,许可证 CC0。

我们可以通过对 SVD 的奇异值进行平方并除以自由度,计算每个组件吸收的方差量。

n = Z_train.shape[0]
variances = s**2 / (n - 1)

让我们来看看结果。

pd.DataFrame({
    "Component": [*range(1, len(s)+1)],
    "Variance": variances,
    "Proportion": variances/np.sum(variances),
    "Cumulative": np.cumsum(variances/np.sum(variances))
})
 Component  Variance  Proportion  Cumulative
0          1  3.485770    0.690182    0.690182
1          2  0.573965    0.113645    0.803828
2          3  0.498244    0.098652    0.902480
3          4  0.276403    0.054728    0.957208
4          5  0.216122    0.042792    1.000000

第一个组件占数据总方差的 69%。加上第二个组件,我们可以解释 80%。如果我们假设剩下的 20%是噪声,那么这两个组件就足以概括整个数据。

仅使用五个组件中的两个,就像在数据压缩中丢失信息。然而,由于丢失的部分理论上是噪声,我们通过舍弃最后几个组件获得了优势。

让我们隔离系统中的载荷和方差。

n_comp = 2
pca_loadings = loadings[:,:n_comp]
pca_variances = variances[:n_comp]

当新数据到达训练好的 PCA 时,它们会被投影到组件空间中(编码)。之后,它们会被重建以逆转过程,仅使用最初的主成分(解码)。

通过 PCA 检测异常

现在,我们深入探讨通过 Q 和 T²误差度量检测异常。首先,让我们了解它们代表什么。稍后我们将直接看到公式应用于数据。

平方预测误差 Q

由于我们在编码步骤中丢弃了噪声,重建的数据不能与观察到的数据完全一致。这种差异产生了误差 Q。

当过程控制系统返回 Q 类型的异常时,某些东西破坏了相关结构:一个或多个变量不再与其他变量和谐变化(“和谐”这一概念由相关矩阵定义)。

我们可以区分两种极端情况。

  • 一个变量出现了意外的值(不一定超出范围),并且不再能从其他变量中“预测”。如果期望两个变量有某种相关性,但其中一个的方向突然变化,就不再观察到它们的预期关系,从而发出警报。

  • 变量表现正常,但其他所有变量都偏离了预期。如果之前的信息显示,当其他变量偏离时,我们的变量也应该偏离,但实际没有,这个过程就出现了异常。

第二种情况可能显得矛盾。因此,我们需要考虑另一种类型的误差:Hotelling 的 T²。

Hotelling 的 T²

与 Q 不同,T²与观察数据的度量更相关:超出预期范围的值会产生极端的 T²。

T² 统计量与马哈拉诺比斯距离紧密相关。我们可以将 T² 视为基于观测数据阈值的多变量异常检测系统,但有一些相关的差异。

  1. 观测数据已从编码系统中去噪。

  2. 异常在 PC 级别被搜索,只有在此之后它们才会在观测数据级别进行解码。

第二点很有趣,因为 PCs 综合了整个变量组。使用 T²,我们不是逐个变量地从单变量角度寻找异常,而是一次性分析数据。

在训练过程中,我们存储了 PCs 的方差。现在,我们可以使用这些信息,将观测到的 PCs 方差与期望的方差进行比较,为每个 PC 计算“异常分数”。之后,我们可以解码这个异常分数以返回数据空间,从而获取每个变量对 PCs 变化的贡献。

实践中的异常检测

我们之前构建了 PCA 系统。现在,让我们开始使用它,将新数据投影到 PC 空间中。我们首先进行数据的居中和标准化,然后可视化变量的时间序列。

X_test = np.array(plant.loc[plant.group=="test", variables])
Z_test = scaler.transform(X_test)

在下图中,表示了新数据中每个变量的时间序列。

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

图 5. 居中和标准化测试数据的时间序列 — 图片来自作者,许可证 CC0。

疯狂的数据,不是吗?正如你所见,我模拟了一个疯狂的过程。四个变量从期望均值剧烈偏移到高值,而第五个变量在初始偏移后逐渐恢复到正常值。

从数据到 PCs……再回到数据

我们可以编码数据,计算 PC 分数:

test_scores = Z_train @ pca_loadings

随后,我们可以通过计算期望数据来解码 PCs:

test_expect = test_scores @ np.transpose(pca_loadings)

现在,让我们可视化重建数据的时间序列:

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

图 6. 使用 PC 子集构建的期望数据时间序列 — 图片来自作者,许可证 CC0。

好的,这里我们终于揭示了多变量过程控制的一个根本问题。如果仔细查看上面的图表,你会注意到重建的数据与观测数据(图 5)相比显示了两个主要缺陷。

  1. 前四个变量的观测数据在高峰处达到稳定状态。不同的是,它们的期望值在达到高峰后逐渐减少。

  2. 第五个变量的观测数据在峰值处迅速增加并迅速减少。不同的是,其期望值在高峰后略微减少。从本质上讲,其趋势类似于其他变量之一。

前四个变量的重建受到了第五个变量情况的影响,而第五个变量的重建受到了前四个变量情况的影响。因此,每个重建的变量都是整个数据集的混合体。

这种不准确性发生因为我们通过丢弃最后的 PCs 来解码。根据我们的 PCA,新数据的“疯狂”是噪声,因此它从最后的 PC 中被吸收,而这些 PC 吸收了训练数据中不存在的新数据的“奇异性”。

在生产环境中,Q 和 T²误差可以用来监控这些异常并理解其来源。对于这两种统计量,我们可以计算以下值:

  • 每个变量对每种误差度量的贡献;

  • 每种误差度量的平方累积贡献,生成 Q 和 T²。

你可以在这里找到详细的数学解释。在这篇文章中,我将专注于贡献,因为数据监控的主要兴趣在于定位异常的来源。

Q 贡献

每个变量对 Q 误差的贡献是观察到的缩放数据与其预期(重建)值之间的距离。

contrib_Q = Z_test - test_expect

在下面的图片中,你可以可视化新数据的 Q 贡献时间序列。

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

图 7. Q 贡献的时间序列 — 图片来自作者,许可证 CC0。

粗略来说,自监控周期的一半以来,Q 贡献对所有变量的影响接近零。在周期的后半部分,Q 贡献开始从零漂移,尤其是对第五个变量。

这不应让我们感到惊讶。正如我们所见,直到周期中期,变量是异常的,但异常以同步的方式(与训练集中观察到的相关性一致)。在周期的后半部分,第五个变量返回到均值附近,趋向于“正常”值(接近训练集中的值),但打破了相关性结构。

T²贡献

获取 T²贡献的公式类似于将 PC 解码到数据层面的公式,但有一个重要的区别:缩放因子

PCs 都以均值为中心,因此所有 PC 的期望值为零。然而,由于每个 PC 吸收的数据方差不同(见图 3),每个 PC 具有其尺度。相同的分数可能在一个 PC 上代表小的变化,而在另一个 PC 上代表大的变化!

因此,在解码之前,每个 PC 都通过除以其标准差进行缩放。这样,PCs 在解码前被置于相同的尺度上。

pc_scaling = np.diag(1/np.sqrt(pca_variances))
contrib_T2 = test_scores @ pc_scaling @ np.transpose(pca_loadings)

下面的图片展示了 T²贡献的时间序列。

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

图 8. T²贡献的时间序列 — 图片来自作者,许可证 CC0。

总结

使用 PCA 的过程控制将被监控变量视为一个应当一致移动的系统,期望其元素在一定范围内(Q 统计量)和一致地变化(T²统计量)。

Q 和 T²异常之间的主要区别在于它们的来源:第一个是在数据层面,第二个是在PC 层面

Q 警告我们编码解码系统在新数据上由于变量间的观察关系未按预期工作。因此,Q 贡献使我们能够根据观察数据识别不可预测的变量。

T² 警告我们编码系统的 PC 分数与整个数据中心的距离过远。T² 贡献解码错误,“反向传播”到数据层级,允许我们识别具有异常观测值的变量。

核心思想是每条数据记录由信号和噪声组成。PCA 去除噪声并评估信号,如果变量的信号与预期(T²)过远或被噪声压倒(Q),则发出警报。尽管它们可以同时发生,但一个并不一定意味着另一个。

MusicGen 重新构想:Meta 在 AI 音乐领域的低调进展

原文:towardsdatascience.com/musicgen-reimagined-metas-under-the-radar-advances-in-ai-music-36c1adfd13b7?source=collection_archive---------6-----------------------#2023-11-21

探索被忽视但非凡的 MusicGen 进展

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

·

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

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

一张象征 Music AI 产品如何提升音乐创作的图像。图像通过与 ChatGPT 和 DALL-E-3 的对话生成。

事情是怎么开始的……

在 2023 年 2 月,谷歌推出了其生成音乐 AI MusicLM,引起了轰动。那时,两个事实变得很清楚:

  1. 2023 年将成为基于 AI 的音乐生成突破年

  2. 一个新模型很快就会超越 MusicLM

许多人预期下一个突破性模型在模型参数和训练数据方面将是 MusicLM 的十倍。这也会引发相同的伦理问题,包括对源代码的限制访问以及使用受版权保护的训练材料。

今天,我们知道这些说法只有一半是正确的。

发布于 2023 年 6 月,Meta 的 MusicGen 模型带来了一些巨大的改进,包括…

  1. 更高质量的音乐输出(24kHz → 32kHz)

  2. 更自然的乐器声音

  3. 可以根据任何旋律进行生成的选项(我写了一篇关于此的 博客文章

…同时使用更少的训练数据,开源代码和模型权重,仅使用商业授权的训练材料。

六个月后,炒作逐渐平息。然而,Meta 的研究团队FAIR继续发表论文并更新代码,以逐步改进 MusicGen。

…当前的进展

自发布以来,Meta 在两个关键方面升级了 MusicGen:

  1. 使用多频段扩散进行更高质量的生成

  2. 由于立体声生成,输出更加生动

尽管这听起来像是两个小改进,但差别很大。自己听听吧!以下是使用原始 MusicGen 模型(3.3B 参数)生成的 10 秒钟片段:

从官方 MusicGen 演示页面 提取的生成曲目。

使用的提示是:

具有自然质感、环保意识、尤克里里融入、和谐、轻快、随意、自然乐器、柔和的节奏

现在,这里有一个基于相同提示生成的 MusicGen 输出示例,展示了六个月后的效果:

使用 MusicGen 3.3B 立体声生成的曲目由作者创作。

如果你通过智能手机扬声器收听,可能不会很明显。使用其他设备时,你应该能够听出整体声音更加清晰自然,立体声使得作品更加生动和令人兴奋。

在这篇博客文章中,我想展示这些改进,解释它们的重要性和工作原理,并提供一些示例生成。

多频段扩散——这有什么用?

要了解多频段扩散是什么及其重要性,让我们看看原始 MusicGen 模型 [1] 是如何生成其输出的。

34kHz 采样率的 30 秒音频在计算机中表示为近 100 万个数字。逐样生成这样的音频相当于使用 ChatGPT 生成 10 部完整的小说。

相反,Meta 依赖于神经音频压缩技术。他们的压缩模型 EnCodec [2] 可以将音乐从 34kHz 压缩到大约 0.05kHz,同时保持重建到原始采样率所需的相关信息。EnCodec 包括一个编码器,用于压缩音频,以及一个解码器,用于重建原始声音(图 1)。

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

图 1 — Encodec:Meta 的神经音频压缩模型。图片作者提供。

现在回到 MusicGen。它不是以全采样率生成音乐,而是以 0.05kHz 生成,并让 EnCodec“重建”,从而在最小的计算时间和成本下实现高保真输出(图 2)。

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

图 2 — MusicGen:用户提示(文本)被转换为编码音频信号,然后解码以产生最终结果。图片作者提供。

尽管 EnCodec 是一项令人印象深刻的技术,但其压缩并非无损。与原始音频相比,重建后的音频中存在明显的伪影。请亲自聆听!

原始音频

EnCodec 音乐示例取自官方的EnCodec 演示页面

重建音频

EnCodec 音乐示例取自官方的EnCodec 演示页面

由于 MusicGen 完全依赖于 EnCodec,因此它是生成音乐质量的主要瓶颈。这就是为什么 Meta 决定改进 EnCodec 的解码部分。2023 年 8 月,他们开发了一个更新的解码器,利用了多频带扩散**[3]**。

Meta 发现 EnCodec 的原始解码器有一个问题,就是它倾向于先生成低频,然后生成高频。不幸的是,这意味着低频中的任何错误/伪影也会扭曲高频,从而大幅降低输出质量。

多频带扩散通过在组合之前独立生成频谱的不同部分来解决这个问题。研究人员发现,这一过程显著改善了生成的输出。从我的角度来看,差异非常明显。请用原始 EnCodec 解码器和多频带扩散解码器聆听相同的曲目:

原始解码器

生成的曲目取自多频带扩散演示页面

多频带扩散解码器

生成的曲目取自多频带扩散演示页面

当前文本到音乐系统的核心问题之一是其生成的声音总是有一种不自然的质量,尤其是对于声学乐器。多频带扩散使输出的声音更加干净自然,将 MusicGen 提升到了一个新的水平。

为什么立体声如此重要?

到目前为止,大多数生成音乐模型生成的是单声道声音。这意味着 MusicGen 不会将声音或乐器放置在左侧或右侧,从而导致混音较少生动和兴奋。立体声被大多忽视的原因是生成立体声并非一项简单的任务。

作为音乐家,当我们制作立体声信号时,我们可以访问混音中的各个乐器轨道,并将它们放置在我们想要的位置。MusicGen 并不是分别生成所有乐器,而是生成一个合成的音频信号。在没有这些乐器源的情况下,创建立体声音效是困难的。不幸的是,将音频信号拆分成各个源是一个棘手的问题(我已经发布了一篇 博客文章 讨论了这个问题),而且技术仍然未完全成熟。

因此,Meta 决定将立体声生成直接集成到 MusicGen 模型中。他们使用包含立体声音乐的新数据集,训练 MusicGen 生成立体声输出。研究人员声称,生成立体声与单声道相比没有额外的计算成本。

尽管我觉得论文中对立体声过程的描述并不十分清楚,但我的理解是这样的(图 3):MusicGen 已经学会生成两个压缩音频信号(左声道和右声道),而不是一个单声道信号。这些压缩信号必须分别解码,然后再结合起来生成最终的立体声输出。这个过程不会花费两倍的时间,因为 MusicGen 现在可以在大约生成一个信号的时间内同时生成两个压缩音频信号。

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

图 3 — MusicGen 立体声更新。请注意,由于论文中对该过程的记录不够充分,我不能 100% 确定这一点。请将其视为一个有根据的猜测。图片由作者提供。

能够生成令人信服的立体声效果确实使 MusicGen 从其他先进模型如 MusicLM 或 Stable Audio 中脱颖而出。从我的角度来看,这个“微小”的增加在生成音乐的生动性方面产生了巨大的差异。自己听听吧(在智能手机扬声器上可能很难听到):

单声道

立体声

结论

自发布之日起,MusicGen 就给人留下了深刻的印象。然而,从那时起,Meta 的 FAIR 团队不断改进他们的产品,提供了更高质量、更逼真的效果。在生成音频信号(而非 MIDI 等)的文本到音乐模型方面,我认为 MusicGen 在竞争对手中处于领先地位(截至 2023 年 11 月)。

此外,由于 MusicGen 及其相关产品(EnCodec、AudioGen)都是开源的,它们成为了令人难以置信的灵感来源和有志于成为 AI 音频工程师的首选框架。如果我们看看 MusicGen 在短短 6 个月内取得的进步,我只能想象 2024 年将是一个激动人心的年份。

另一个重要的点是,Meta 通过其透明的方法,也为希望将这项技术集成到音乐软件中的开发人员做出了基础工作。生成样本、头脑风暴音乐创意或者改变现有作品的风格 —— 这些是我们已经开始看到的一些令人兴奋的应用。通过足够的透明度,我们可以确保我们正在构建一个未来,使得人工智能不仅仅是对人类音乐能力的威胁,而是让音乐创作变得更加令人兴奋的未来。

注意:虽然 MusicGen 是开源的,但预训练模型可能不允许商业使用!访问 audiocraft 的GitHub 仓库以获取有关其所有组件预期使用的更详细信息。

参考文献

[1] Copet 等人(2023)。简单可控的音乐生成。arxiv.org/pdf/2306.05284.pdf

[2] Défossez 等人(2022)。高保真神经音频压缩。arxiv.org/pdf/2210.13438.pdf

[3] Roman 等人(2023)。从离散标记到高保真音频使用多频带扩散。arxiv.org/abs/2308.02560

关于我

嗨!我是一名音乐学家和数据科学家,分享我对人工智能和音乐当前主题的见解。这里是我之前与本文相关的一些工作:

MediumLinkedin找到我!

MusicLM — 谷歌是否解决了 AI 音乐生成问题?

原文:towardsdatascience.com/musiclm-has-google-solved-ai-music-generation-c6859e76bc3c

论文及其重要性解释

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

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

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

图片来源:Placidplace

介绍

在 2023 年 1 月 25 日的一个 PowerPoint 演示中,我描述了生成高质量长序列音乐作为音频 AI 领域在不久的将来需要解决的主要挑战之一。一天之后,我的幻灯片就过时了。

MusicLM 由 Google Research 开发,可以根据自然语言中的简单文本查询生成风格和流派各异的高质量音乐,时长为一分钟。

最好还是亲自体验一下,查看充满音乐示例的演示页面。如果你对细节感兴趣,也可以查阅研究论文,尽管本文也会涵盖所有相关主题。

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

来自 MusicLM 演示页面的摘录。图片由作者提供。

那么,是什么让 MusicLM 成为如此巨大的技术飞跃?它解决了过去十年困扰 AI 研究人员的哪些问题?为什么我仍然认为 MusicLM 是一种过渡技术——通向音乐制作不同世界的桥梁?这些问题以及更多内容将在这里解答,而不会让你感到枯燥的数学或过多的技术术语。

挑战 1:将文本转换为音乐

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

图片来源:Debby Hudson 供图于Unsplash

MusicLM 利用了最近发布的一种模型,将音乐和文本都映射到同一个“地图”上。就像计算从伦敦到斯德哥尔摩的距离一样,MusicLM 可以计算音频-文本对之间的“相似性”。

音乐难以描述

将文本转化为音乐是一项复杂的任务,因为音乐是一种多维度的艺术形式,不仅涉及音乐的旋律和和声,还包括节奏、速度、音色等等。为了将文本转化为音乐,机器学习模型需要能够理解和解释文本的含义,然后利用这种理解来创作出准确表现文本的音乐作品。

将文本转化为音乐的另一个问题是,音乐是一种高度主观的艺术形式。一个人认为是“快乐”的音乐可能会被另一个人听成是“苦涩”或“平静”。这使得机器学习模型很难创作出被普遍认为是“快乐”的作品。尽管音乐常被(在我看来是错误地)描述为一种普遍语言,但从口语到音乐的客观翻译似乎是不可能的。

MusicLM 的方法

考虑到这一点,你可能会惊讶地发现,将文本转化为音乐并不是 MusicLM 的主要贡献。将文本与音频、图像与文本或音频与图像关联起来的机器学习模型(我们称之为“跨模态模型”)在过去 2-3 年里在学术界和工业界变得相当成熟。当然,最著名的跨模态模型之一是DALL-E 2,它根据输入文本生成高分辨率图像。

在 MusicLM 中,研究人员并没有自己训练跨模态部分。相反,他们利用了一个名为“MuLan”的预训练模型,该模型于 2022 年发布(详见论文这里)。MuLan 通过一种称为“对比学习”的方法训练,以将音乐与文本关联起来。在这里,训练数据通常包括成千上万对音乐及其描述文本的配对。学习目标是,当呈现任何一对音乐和文本(不一定是关联的)时,模型能够判断文本是否属于音乐。一旦实现了这一点,模型就能够计算音频-音频、文本-音频或文本-文本对之间的相似度。

挑战 2:减少生成音乐的时间和资源

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

图片来源:Agê BarrosUnsplash

MusicLM 利用最先进的音频压缩工具,显著减少了生成高质量音频信号所需的信息量。

目前,该模型能够判断它生成的音乐是否符合给定的文本输入。然而,音频生成过程本身存在一些挑战,主要是创建一段音乐所需的时间和资源。

维度问题

尽管音乐对我们人耳来说很容易处理,但对于数据科学家来说,它是一种相当复杂的数据类型。普通的流行歌曲(3:30 min)在 CD 质量下以几乎 1000 万个数字存储在计算机中。相比之下,高清质量的图片(1280 x 720 像素)存储和处理的值甚至不到 100 万。近年来,已经开发了许多方法,将音乐压缩成计算上更便宜的格式,同时保持高质量的声音。

使用传统的方法,生成 1 分钟的 CD 质量音乐(44100 Hz)需要机器学习模型生成大约 260 万个数字——一个接一个。如果生成一个数字仅需 0.01 秒,那么这个过程仍然需要超过 7 小时来完成。不难想象,如果你请一位专业音乐家作曲和录制音乐,他们会更快地完成任务。关键点是:到目前为止,在快速音频生成和输出质量之间存在巨大的权衡。

以往的方法

为解决这个问题,已经尝试了许多方法。一种较新的方法是间接生成音频,即首先生成音频信号的图像表示(例如,“频谱图”),然后将此图像转换为“真实”音频(如在 “Riffusion” 中所做)。另一种方法是通过创建符号表示来避免直接生成音频。音乐的最广泛知晓的符号表示是乐谱。如你所知,乐谱并不是一个真实的音频事件,但音乐家能够将其转换为真实的音频。过去,我们已经看到机器学习模型在符号 MIDI 格式下生成音乐的相当成功(例如,参见 Magenta 的 Chamber Ensemble Generator)。然而,这两种方法都有其弱点,主要是因为生成“真实的东西”非常困难。

MusicLM 的 Approach

最后,让我们讨论 MusicLM 采用的方法。MusicLM 并不是生成音频的代理(如图像或 MIDI),而是应用了一种最先进的音频压缩算法 “SoundStream”,该算法于 2021 年发布。使用 SoundStream,模型能够以 24 kHz(每秒 24000 个数字)的速度生成音频,同时实际计算仅 600 个数字。每秒从 600 个值映射到 24000 个值的工作由 SoundStream 处理。换句话说,模型需要生成 97.5%更少的信息,同时实现大致相同的结果。虽然过去也有其他优秀的压缩算法,但 SoundStream 明显优于所有这些算法。

挑战 3:生成连贯且真实的音乐

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

图片由 Brantley Neal 提供,来自 Unsplash

通过将文本与音乐的关联任务与实际音频生成部分分开,MusicLM 可以在数十万小时的未标注音频数据上进行训练。这有助于其生成音乐的丰富性。

术语

对于“连贯”和“真实”音乐究竟是什么,确实值得讨论。然而,在 AI 生成音乐的背景下,可以说,我们甚至会考虑将 MusicLM 的作品称为“连贯”和“真实”,这一点已经足够说明问题。对于一个宽松的工作定义,假设连贯的音乐具有一个通过不同部分和/或通过音乐创意的重复、变化或引用来表现的基础结构。这里的“真实”指的是,AI 生成的音乐呈现出一种能够让我们相信是人类有意创作的方式。

音乐的“记忆”

生成连贯的音乐并不是 MusicLM 的突破。早在 2018 年,Google Magenta 的 “音乐变换器” 就能够创作具有清晰旋律和和声序列的 MIDI 音乐,其中音乐创意会重复或被改变。音乐变换器能够跟踪过去超过 45 秒的音乐事件。然而,由于原始音频远比符号 MIDI 表示复杂,这样的大“记忆”对于生成原始音频的模型来说长期以来都是难以实现的。MusicLM 拥有 30 秒的“记忆”,这比我所知道的任何类似模型都要多(尽管我可能错了——发布的模型实在是太多了……)。虽然这并不允许 MusicLM 创作出长达 15 分钟的史诗作品,但仍足以维持基本的音乐结构,如节奏、韵律、和声和音色,较长时间内不会丧失。

真实输出

更重要的是,在我看来,MusicLM 创作的音乐听起来出奇地真实。对此的技术解释可能是,MusicLM 找到了一种巧妙的方法,利用数千小时的未标注音乐(即没有文本描述的音乐)来训练文本到音乐的模型。通过使用预训练的“MuLan”模型来关联文本和音乐,他们设计了模型架构,使其可以将音频生成部分与未标注音频数据分开学习。其基本假设是,将音乐与文本关联并不像创作真实音乐那么困难。将问题重新定义并调整架构的这一“技巧”可能是 MusicLM 成功的关键因素。

从某种意义上说,结果不言而喻。首次出现的 AI 模型不仅仅是介于作曲和音乐之间的中间产品,或者是任何 4 岁儿童都能区分开的人造音乐。它这次确实感觉有所不同。感觉类似于我第一次阅读 GPT-3 写的文本时。类似于我第一次看到 DALL-E-2 生成的图像时。MusicLM 可能正是那个将在历史上留下印记的突破性 AI 音乐模型。

MusicLM 的不足与未来展望

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

Kenny Eliason拍摄于Unsplash

定量不足

尽管 MusicLM 具备所有这些令人惊叹的特点,但该模型绝非完美。我甚至会说,与文本的 GPT-3 或图像的 DALL-E-2 等模型相比,MusicLM 似乎更加有限。一个原因是,生成的音乐只有机器学习社区认为是高质量的。如果没有有效的方法将 24 kHz 的音乐上采样到 44.1 kHz,生成的作品将永远无法在现实世界中使用,因为仔细聆听时,即使是非专家也能注意到 CD 录音和 MusicLM 输出之间的质量差异。而一个 1024 x 1024 的图像(如 DALL-E-2 生成的)已经可以用于网站、博客等,而 24kHz 的音乐始终会被视为不合格。

类似地,虽然 30 秒的“记忆”对于一个音频机器学习模型来说令人印象深刻,但一个训练有素的作曲家可以创作数小时的连贯音乐,训练有素的音乐家也可以轻松演奏这些音乐。机器学习模型在这方面要赶上人类还有很长的路要走。然而,随着计算资源的增加,模型的采样率和“记忆”无疑会增加。此外,音频压缩和机器学习方法的改进可能会进一步加速这一过程。看到生成式 AI 模型在过去 2-3 年里提高得如此迅速,我相信这些问题在今年年底之前或多或少会得到缓解。

质量/伦理不足

然而,也有一些问题无法仅通过规模解决:知识产权问题。在最近的过去,许多大型生成模型已遭遇版权诉讼(GitHub Copilot & StableDiffusion,仅举其中两个)。在大多数情况下,这些模型是在未经商业用途许可的数据上进行训练的。虽然模型的创作是“新的”,但你可以认为它仍然“商业性地使用”了训练数据。MusicLM 也是如此。此外,总是有可能生成“窃取”了整个旋律或和弦序列的版权保护作品的内容。

在 MusicLM 论文中,生成与训练数据中的一段音乐“完全匹配”的概率不到 0.2%。虽然这个概率听起来很低,但请记住——假设 0.2%的生成率——每 500 个生成的曲目中可能有 1 个是版权声明的安全嫌疑对象。更大的数据集、更多的多样性以及改进的模型架构或训练算法几乎肯定能帮助降低这一比率,但核心问题依然存在,就像图像或文本等其他领域一样:如果我们计划使用在版权保护数据上训练的生成型 AI 模型,我们不能在大规模上生成输出而不冒重大法律风险。然而,这不仅仅是财务风险,也是一个重大的伦理问题。

此外,MusicLM 及其训练数据都没有公开发布。这引发了关于 AI 系统透明度和问责制的伦理问题。由于像 MusicLM 这样的 AI 模型有可能颠覆整个行业,因此开发过程和方法论应当接受审查。这将使研究人员能够了解模型的训练方式,评估其偏见,并识别可能影响其输出的任何局限性。如果没有模型的访问权限,很难评估其对社会的影响以及可能带来的风险。

最后,目前尚不清楚 MusicLM 或未来模型的商业应用场景。世界上已经有数以百万计的人在有效地免费制作优秀音乐。因此,通过用机器替代人类来降低音乐创作成本既在经济上没有效益,更不用说在伦理上是不可取的。尽管 MusicLM 仍有一定的盈利潜力,我认为生成型 AI 作为人类作曲家的助手,帮助他们快速原型化音乐创意并专注于为世界创造艺术价值,具有更大的潜力和价值。

未来展望

很难预测未来在音乐生成 AI 方面会带我们走向何方。可以确定的一点是:MusicLM 将被更大规模的模型取代,这些模型将使用更大的数据集和更智能的算法。这些模型无疑能够克服许多 MusicLM 的不足之处。似乎像这样的技术会不可避免地彻底改变音乐市场——而且这种改变可能会比我们预期的更早。然而,我认为将全部注意力集中在黑箱模型上是一个错误。总体而言,世界并不需要完全依赖机器进行音乐制作。我们有的是人类来完成这一任务。真正重要的是我们应当利用 AI 技术,通过开辟新的发明、创造和享受音乐的方式,将更多的艺术价值带入这个世界。

感谢阅读本文! 我主要撰写有关 AI 和音乐交集的内容,如果你对此感兴趣,你可能还会喜欢我的其他作品。

穆布里奇德比:利用人工智能使动物运动照片栩栩如生

原文:towardsdatascience.com/muybridge-derby-bringing-animal-locomotion-photographs-to-life-with-ai-b1918e6622ec

我如何使用 Midjourney 和 RunwayML 将埃德瓦德·穆布里奇的照片序列转化为高分辨率视频

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 罗伯特·A·贡萨尔维斯

·发表于 Towards Data Science ·阅读时间 16 分钟·2023 年 7 月 25 日

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

第 2 帧 第 626 号板,奔跑 由埃德瓦德·穆布里奇(左),基于 Midjourney 参考图像的 RunwayML Gen-1 视频生成器的转换(中间和右侧),这些图像由 AI 图像创建程序生成

背景

我相信你一定见过 19 世纪英国摄影师埃德瓦德·穆布里奇拍摄的奔跑的马的系列图片。为了帮助回忆,这里有一个 GIF 动画展示了他更著名的照片系列之一。

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

第 626 号板,奔跑 由埃德瓦德·穆布里奇创作,动画 GIF 由作者制作

这是穆布里奇的肖像,附有他为拍摄该系列照片而制作的设备插图。

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

埃德瓦德·穆布里奇的肖像(左) 图片来自 维基媒体穆布里奇的设备(右),图片来自 维基媒体

埃德瓦德·穆布里奇

穆布里奇是自然摄影师,由加州州长利兰·斯坦福委托拍摄他的豪宅和财物。斯坦福给穆布里奇提出了一个令人兴奋的挑战:他能否拍摄到一匹奔跑的马的清晰照片?

1872 年是马依布里奇开始热衷于运动摄影的年份。他受加州州长利兰·斯坦福委托,拍摄了他的赛马“西方”的运动步态。在此之前,马的运动步态仍是个谜。马蹄何时触地?四只脚是否曾同时离开地面?绘制奔跑中的马蹄一直是艺术家的难题。… [他使用] 12 台相机,每台相机连接到一个电器装置,当马奔跑经过时,装置会触发快门。 … 马依布里奇于 1879 年发明了 zoopraxiscope,这是一台可以将多达两百张单独图像投影到屏幕上的机器。1880 年,他首次向加州美术学院的一群人展示了投影移动图像,从而成为电影之父。- 维·惠特迈尔 [1]

马依布里奇不仅拍摄了移动的马。他还拍摄了移动的猫、狗、水牛、鸵鸟、人物等类似序列。

马依布里奇德比

对于这个项目,我想看看是否可以使用 AI 系统将马依布里奇的动物运动照片转换为高清晰度全彩视频。在尝试了各种技术后,我使用Midjourney通过文本提示生成参考帧,并结合 RunwayML 的 Gen-1 视频生成器,使原始序列变得更为逼真。为了好玩,我制作了一个短动画,“马依布里奇德比”,展示了这一工作。这里就是。

“马依布里奇德比,”基于爱德华·马依布里奇的动物运动照片, 作者制作的视频

在接下来的部分,我将描述如何转换运动序列、生成背景滚动以及将这些元素结合起来创建动画。

使用 Midjourney 生成参考帧

作为将马依布里奇照片系列转换为高清晰度视频的前提,我使用了原始系列的一张照片和 Midjourney 中的文本提示生成了高分辨率参考帧。

例如,这里是我用于生成马和骑手参考帧的提示,“一个戴着蓝色帽子、穿着蓝色夹克、白色裤子和黑色靴子的男人骑着一匹棕色马,背景为白色 -- ar 4:3。”请注意,–ar 4:3 参数表示 4:3 的宽高比。

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

第 626 号板画的 第二帧(左),Midjourney 缩略图(中),精选图像,修饰后,作者提供的图像(右)

我将穆布里奇第 2 帧的图像链接和提示粘贴到 Midjourney 中,它生成了四个缩略图。所有四张生成的图像都很不错。我喜欢这些图像的细节和质感,包括骑师的衣服和马的毛发光泽。虽然它们都没有完全匹配原始马的姿势,但我发现当对视频进行风格化时,这并不重要。RunwayML 中的视频风格化器仅捕捉图像的一般外观。我选择了右下角(以绿色轮廓标出)的缩略图,并在 Photoshop 中进行了一些编辑;我将图像水平翻转,将马的颜色更改为棕色,并改变了骑师帽子的风格。

我对动画中的其他四种动物重复了这个过程,包括一只猫、一只水牛、一只大象和一只鸵鸟。以下是结果。你可以在下面的左列看到穆布里奇照片系列中的一张图片。中间列显示了使用穆布里奇图像和文本(如“跑步中的猫的全彩照片,侧面视图,-- ar 4:3”)从 Midjourney 得到的结果。所选缩略图以绿色轮廓标出。右列展示了经过稍微清理和在 Photoshop 中水平翻转(如有需要)的所选图像。

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

运动照片的 水牛 大象** 和** 鸵鸟**,**由伊德华德·穆布里奇(左),Midjourney 缩略图(中),所选 Midjourney 图像,(作者)

Midjourney 系统在生成参考图像方面表现出色。动物的细节令人惊叹。你可以点击任何一张图片来放大查看。虽然它没有完全匹配参考图像中的姿势,但整体渲染质量非常优秀。有关 Midjourney 的更多信息,你可以查看我之前的文章这里。

接下来,我将展示如何利用参考图像使用 RunwayML 转换照片系列。

RunwayML

Runway 是一家位于纽约市的初创公司,研究并提供使用机器学习(ML)的媒体创建和编辑服务。他们因其网站的 URLrunwayml.com而被称为 RunwayML。他们提供不同价格点的订阅层级: 免费、每月$12、每月$28 等。

这是他们提供的一些服务的列表:

  1. 超慢动作 - 将视频转换为超平滑的运动

  2. 视频对视频编辑 - 使用文本或图像更改视频风格

  3. 移除背景 - 移除、模糊或替换视频背景

  4. 文本对视频生成 - 使用文本提示生成视频

  5. 图像对图像编辑 - 使用文本提示转换图像

我使用了前三个来为我的视频中的 Muybridge 序列进行风格化。

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

626 号牌,奔马**,**由 Eadweard Muybridge 创作,由 RunwayML 风格化,作者动画

RunwayML 的视频对视频编辑模型

RunwayML 的视频对视频编辑服务允许用户上传输入视频并提供文本或参考图像作为提示。然后,机器学习模型将通过施加提示中指定的风格来“编辑”镜头,同时保持输入视频的主要元素完整。该过程在他们的论文中有详细描述,结构和内容引导的视频合成与扩散模型 [2]。

在这项工作中,我们展示了一种结构和内容引导的视频扩散模型,该模型根据对期望输出的视觉或文本描述编辑视频。由于两个方面之间的解耦不足,用户提供的内容编辑与结构表示之间会发生冲突。作为解决方案,我们展示了在不同细节水平的单眼深度估计上进行训练提供了对结构和内容保真的控制。……我们发现从输入视频帧提取的深度估计提供了所需的属性,因为它们编码的内容信息显著少于更简单的结构表示。—— P. Esser 等人,RunwayML

注意“单眼深度估计”指的是深度图,其中像素的值表示从相机到场景中物体表面的距离。为了获得深度估计,他们使用了一组欧洲研究人员的另一个机器学习模型[3]。这个模型叫做 MiDaS(我猜,这是单眼深度估计器的倒编词?)MiDaS 系统在 3D 电影场景的数据集上进行了训练,如下图所示。

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

来自 3D 电影数据集的样本图像,来自MiDaS 论文的图像

你可以看到深度图中浅黄色显示了场景中较近的点,而深蓝色则显示了背景中较远的点。训练过的 MiDaS 模型可以从任何输入模型估计深度图。以下是论文中的一些结果。

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

使用 MiDaS 的预测深度图,图片来自MiDaS 论文

你可以看到 MiDaS 模型在深度估计方面表现出色。例如,你可以看到狗的尾巴非常清晰地突显出它在后面的水流中。

RunwayML 的视频到视频模型使用输入视频的预测深度图来条件化一个由文本提示或参考图像指导的扩散视频生成模型。

我们的潜在视频扩散模型根据结构和内容信息合成新的视频。我们通过根据深度估计进行条件处理来确保结构一致性,同时内容由图像或自然语言控制。通过模型中的额外时间连接和图像与视频的联合训练,实现了时间稳定的结果。— P. Esser 等人,RunwayML

你可以看到一些来自论文的文本提示的视频编辑结果。

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

RunwayML 的图像到视频编辑与文本的结果,图片来自RunwayML 的论文

各种风格,包括铅笔素描、动漫和低多边形渲染,转化了输入视频以创建输出。你可以看到应用风格在每一帧中的一致性。以下是一些论文中的例子,使用图像提示来美化视频。

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

RunwayML 的图像到视频编辑与参考图像的结果,图片来自RunwayML 的论文

再次,你可以看到颜色调色板和提示图像的外观如何将视频转变为指定的风格。生成帧的细节也在最终视频中保持一致。

使用 RunwayML 的视频到视频编辑服务

为了使用该服务,我创建了一个账户并登录了。如上所述,你可以使用有限制的免费版本,比如生成的视频最长只能为四秒。我选择每月支付 12 美元,这允许我创建最长 15 秒的视频并享受其他好处

我拍摄了一段关于兔子的简短影像以测试系统,用编辑系统进行了清理,然后上传到 RunwayML。我选择了 Gen-1: Video to Video 工具。我加载了剪辑,输入了提示语“在田野中的逼真兔子,耳朵下垂”,然后点击了预览风格按钮。系统思考了一会儿,渲染了四个缩略图。你可以在下面的截图底部看到它们。

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

RunwayML Gen-1: 视频到视频屏幕,图像由作者提供

四个缩略图看起来都不错。它们都遵循了影子木偶的形式,但画面中出现了一只逼真的兔子。我选择了第三个,然后点击 生成视频。视频渲染大约花了 20 分钟。我还用提示“在田野里有垂耳的 2D 动画兔子”制作了一个视频。你可以在下面看到结果,原始影子木偶视频,以及我的清理版本供参考。

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

原始影子木偶视频(左上),清理后的影子木偶视频(右上),使用提示“逼真 …”的 RunwayML 风格化视频(左下),和 使用提示“2D 动画 …”的 RunwayML 风格化视频(右下),视频由作者提供

生成的视频效果很好!左下角的逼真视频效果最好,兔子的眼睛、耳朵和鼻子细节非常漂亮。2D 动画渲染效果有些偏差。系统似乎对耳朵的识别有些困惑,背景也不太有趣。接下来,我用 Midjourney 生成的两个参考图像尝试了同样的实验。

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

使用提示“逼真 …”的 Midjourney 图像(左上),使用提示“2D 动画 …”的 Midjourney 图像(右上),使用逼真参考的 RunwayML 风格化视频(左下),和 使用动画参考的 RunwayML 风格化视频(右下),视频由作者提供

这些也做得很好。它们都从参考图像中拾取了风格,同时遵循了原始影子木偶视频中的形状和动作。然而,右边的那个视频有一个奇怪的效果从右侧出现,几乎看起来像是太阳光晕。注意到两个生成的动画都显示了参考帧中的背景细节,比如右侧漂亮的云朵。但参考帧中的前景形状却缺失了,比如左侧的麦粒和右侧的树。这可能是由于 RunwayML 使用的训练数据中包含了深度图像。它展示了我的手部动作被转换成兔子作为前景图像,但保留了参考图像中的背景元素,比如田野和天空。

使穆伊布里奇的照片栩栩如生

我使用了上述描述的 RunwayML 技术,并进行了小幅变更,将穆伊布里奇的原始图像序列转换为高分辨率版本。

超慢动作

由于穆伊布里奇的实验中动物动作很快,帧间存在大量的运动。例如,这里是马匹序列的三个帧。

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

帧 2、3 和 4 的 编号 626,疾驰 由 Eadweard Muybridge 制作

注意马腿间帧的运动量。我在尝试快速移动动画的视频到视频风格化时,结果并不理想。我的解决方案是先使用 RunwayML 的超慢动作功能将运动减慢两倍,然后应用转换,最后将结果视频的速度提高两倍。

这是减速视频的效果。

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

帧 2(左)和 3(右) 编号 626,疾驰 由 Eadweard Muybridge 制作,RunwayML 帧插值(中)由作者

你可以看到帧间的运动减少,尤其是马的腿部。这是原始马匹序列与 50% 慢动作版本的对比。

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

编号 626,疾驰由 Eadweard Muybridge 制作,作者动画(左),RunwayML 的 50% 超慢动作,作者动画

系统在运动插值方面表现出色。总体而言,使用 RunwayML 的超慢动作时运动更为流畅。当序列重置时,动作有一点小的卡顿,但当我将转换后的视频速度提高两倍时,这种情况会被掩盖。

视频到视频转换

我首先将减速的马匹动画上传到 RunwayML 来创建转换后的视频,然后选择了Gen-1: 视频到视频工具。我选择了图像风格 参考,并上传了我使用 Midjourney 创建的马匹参考帧。转换有多种设置,包括以下内容。

  • 风格:结构一致性 - 更高的值使输出与输入视频在结构上更有差异。

  • 风格:权重 - 更高的值强调匹配风格而非输入视频。

  • 帧一致性 - 值低于 1 会减少时间上的一致性;值高于 1 会增加帧与前一帧的相关性。

你可以在 RunwayML 的 帮助页面 上看到这些设置的变体示例。我试验了这些设置,但使用了默认值,即结构一致性 2、权重 8.5 和帧一致性 1。

然后我点击了预览样式,它在底部显示了四个选项。

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

RunwayML 的 Gen-1:视频到视频功能的屏幕截图,图片由作者提供

我选择了第三个预览,并点击了生成视频按钮。这里是参考图像、原始马匹序列和经过风格化的动画,速度加快了两倍以匹配初始速度。

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

Midjoruney 参考图像(左),626 号版图,飞跑(中),使用 RunwayML 风格化的动画(右)

这做得很好!你可以看到参考图像的风格如何被施加到原始的梅布里奇动画上,同时保持了马匹和骑手的动作完整。系统还进行了基于机器学习的视频缩放,将最终视频调整到 640x480,这带来了不少细节。请注意,系统有一个“放大”设置,它会将分辨率水平和垂直方向都翻倍。

我对另外四个图像序列执行了相同的操作。你可以在下面看到结果,包括 Midjourney 的参考帧、梅布里奇的原始动物照片序列和 RunwayML 的风格化视频。

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

Midjoruney 参考图像(左),伊德华·梅布里奇的动物运动研究(中),使用 RunwayML 风格化的动画(右)

这些看起来也很棒!就像马匹动画一样,RunwayML 模型从参考图像中提取了纹理和颜色,并将其应用于原始动画,同时保持运动的完整性。然而,新动画中的背景并没有从右到左滚动。但这不是问题。你可以在下一部分看到我如何创建一个“alpha mask”来保留前景图像,并将动物合成到新的背景上。

移除背景图像

我使用了 RunwayML 的 Remove Background 功能来替换奔跑动物片段的背景。我加载了来自 Muybridge 照片的原始视频片段,并用光标选择了两个点,即马匹和骑师的腿。系统思考了一会儿,然后显示了所选区域为绿色,如下面的截图所示。

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

RunwayML 背景移除功能截图,图像由作者提供

系统展示了它如何选择视频中所有帧的前景,我可以将其作为预览播放。它做得非常出色,没有花费我太多的工作。然后,我将 alpha matte 保存为视频以供合成应用程序使用。

我在 Midjourney 中创建了一个赛马场的静态图像,并将其用作动画的滚动背景。凡是 matte 为黑色的地方,会显示背景(赛马场);凡是 matte 为白色的地方,会显示前景(马匹和骑师)。这里是马匹的风格化剪辑、alpha matte 和最终结果。

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

使用 RunwayML 风格化的动画(左),Alpha Matte(中),和 最终结果(右),动画由作者提供

在我的合成程序中,我需要稍微清理一下 alpha matte。例如,我模糊了尾部,使其看起来更像头发而不是固体物体。你可以看到滚动背景如何帮助展示马匹向前奔跑的效果,而在原始风格化动画中并没有这个效果。

这里是最终的动画,这次稍微大一点,以便你查看细节。

“Muybridge Derby”,基于 Eadweard Muybridge 的动物运动照片,视频由作者提供

如果你想在大屏幕上观看动画,它将于 2023 年 8 月 5 日至 9 月 30 日在加州卡马里奥的 Studio Channel Islands Art Center 展出,地址是 The Next Big Thing

最终想法

我很享受使用 Muybridge 图片以及利用 Midjourney 和 RunwayML 的工具生成和修改媒体。如果你熟悉我在 Medium 上的写作,你知道我喜欢尝试新的制作方法,但我并不总是能创作出完整的作品。因此,将多个元素结合在一起让我感到很满意。作为一个“深度切入”,我使用了我为之前的文章生成的 AI 歌曲作为片尾音乐。这首歌叫做“我会在到达时到达”,这对一场德比比赛来说有点合适。😄

## AI-Tunes: 使用人工智能创作新歌曲

如何微调 OpenAI 的 GPT-3 来生成具有全球结构的音乐

towardsdatascience.com

输入和生成媒体的所有权

Midjourney 和 RunwayML 对于用于提示的图像和文本及生成的图像有不同的政策。Midjourney 区分付费用户和免费用户,而 RunwayML 对两种用户使用相同的政策。

Midjourney 条款

根据 Midjourney 的 服务条款,免费服务层的用户不拥有他们生成的图片。Midjourney 拥有这些图片。这些图片根据知识共享署名非商业性 4.0 国际许可证授权给非付费用户用于非商业用途。付费服务的用户拥有他们生成的图片,这些图片可以用于商业用途。

如果你在一家大公司工作,还有额外的限制。

如果你是年收入超过 1,000,000 美元的公司的员工或所有者,并且你是代表你的雇主使用这些服务,你必须为每一个代表你访问服务的个人购买“Pro”或“Mega”会员,以便拥有你创建的资产。如果你不确定你的使用是否代表你的雇主,请假设是。— Midjourney 服务条款

仅供参考,Pro 计划每人每月 60 美元,Mega 计划每月 120 美元。

此外,根据条款,所有用户授予 Midjourney 许可,以任何目的使用任何文本提示、上传的作为提示的图片以及生成的图片,包括用于训练未来版本的模型。

RunwayML 条款

根据 RunwayML 的 使用条款,所有用户拥有并可以商业化使用其生成的内容。然而,所有用户都授予 RunwayML 许可,以任何目的使用他们的输入和输出,包括训练未来的模型版本。

图片和动画的许可条款

我将为此项目发布的图片和动画采用知识共享署名相同方式共享许可证。

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

知识共享署名-相同方式共享

致谢

我想感谢 Jennifer Lim 对文章的审阅和反馈。

参考文献

[1] V. Whitmire,《国际摄影名人堂:伊德华·迈布里奇》(2017)

[2] P. Esser 等人,结构与内容引导的视频合成与扩散模型 (2023)

[3] R. Ranftl 等人,迈向鲁棒的单目深度估计:混合数据集进行零样本跨数据集迁移 (2020)

我的亚马逊经济学家面试

原文:towardsdatascience.com/my-amazon-economist-interview-186e52e58a27

问题、准备和建议

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

·发表于 数据科学前沿 ·阅读时间 8 分钟·2023 年 12 月 21 日

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

图片来源于 Christian WiedigerUnsplash

亚马逊是经济学及相关领域博士毕业生的主要雇主之一,提供与数据科学和机器学习(ML/DS)特别是因果推断领域密切相关的职位。它是少数几个提供明确称为‘经济学家’职位的公司之一,但这些角色往往与其他科技公司中因果推断数据科学家职位的职责和技能要求相似。作为准备进入经济学和数据科学交叉领域的人员,我发现亚马逊经济学家面试过程提供了丰富的洞察,适用于这两个领域。在本文中,我将分享我的亚马逊经济学家面试经验和准备过程,旨在为那些希望在亚马逊或其他数据科学职位上导航的人员提供资源。我的目标是揭示面试过程,提供对那些希望成为亚马逊经济学家的求职者以及对科技行业中专注于因果推断的数据科学家角色感兴趣的 ML/DS 求职者的相关见解和建议。

既然已经介绍完毕,我们来谈谈我的面试经历。我在 LinkedIn 上看到一个亚马逊经济学家职位:“经济学家——长期实习(10 个月),经济决策科学(EDS),”位于伦敦。这引起了我的兴趣,因此我决定申请。值得注意的是,这是一少数几次我在没有依赖个人关系如推荐信的情况下获得面试邀请的情况。面试发生在一段时间之前,我认为已经过去了足够的时间,所以现在分享我的准备过程和面试经历是合适的。

为了提供一些背景信息,我来介绍一下这个职位。这个角色的重点是应用计量经济学模型和使用大型数据集来解决亚马逊面临的实际商业问题。这个角色属于 EDS 团队,该团队在欧盟商店业务内运作,旨在优化和自动化决策。这个职位要求具备坚实的计量经济学基础,并且对统计编程工具如 Stata、R 或 Python 有基本的了解。

让我们继续讨论我如何准备面试以及面试内容。面试之前,我了解到其形式。面试持续一个小时,分为行为和技术两个部分。行为部分重点关注亚马逊的价值观,特别是他们的领导原则,你可以在亚马逊的领导原则找到这些原则。技术部分则围绕与角色相关的业务问题。在我的情况下,这个问题涉及到将计量经济学模型应用于亚马逊零售部门的一个场景。

作为提示,亚马逊的面试是在其自有的视频通话应用 Chime 上进行的。提前下载并检查其功能,例如背景模糊,或确保麦克风和音频配置正确,是个不错的主意。此外,招聘人员会告诉你面试官是谁。提前了解他们的工作是个好主意,这样你可以更好地与他们沟通。对我来说,面试官是一位经济学家,我很感激。

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

LinkedIn Sales Solutions拍摄,Unsplash

1 — 行为部分。

面试的前 15 分钟左右用于行为问题。有 2 到 3 个与领导原则相关的情境问题以及一些后续问题。

我确保为潜在的面试问题做好准备,为每个关键原则准备了 1-2 个故事,并使用 STAR(情况、任务、行动、结果)或 CAR(背景、行动、结果)框架大声练习这些故事。为了获得更多指导,你可以回顾每个原则的常见问题或示例,以了解面试中可能出现的问题类型。

我被问到了这样的问题:

  • 讲述一个你为复杂问题提出简单解决方案的经历。

  • 讲述一个你在存在分歧时影响决策的经历。

如果你了解领导力原则,你会发现第一个问题与“创新和简化”原则相关,而第二个问题与“有骨气;反对并承诺”或“经常正确”相关。面试官可能会要求对你的故事进行进一步的细节了解,所以要做好准备。例如,我被问到第一个问题的后续问题,关于简单解决方案的潜在风险以及我如何处理这些风险。

我保持了回答的简洁,并让面试官在需要更多细节时提出后续问题。使用“我”作为主语而非“我们”也很重要,并且在讲述这些故事时不要对任何你曾经合作过的人发表负面评论。

这些故事对我在其他公司的面试也很有帮助。因此,虽然这些是亚马逊的领导力原则,但许多公司都有类似的价值观,他们会问类似的情境问题。总的来说,为这次面试做准备对我在其他公司的面试非常有用。

第二部分 — 技术部分。

我通过回顾因果推断方法来准备,包括 差分中的差分法、匹配、合成控制、工具变量、回归不连续性和 A/B 测试(实验)。具体来说,我回顾了这些方法所需的假设、如何验证这些假设、可能存在的陷阱以及如何编写这些方程式或计算标准误差。

诚然,这些是经济学或相关领域博士的基础知识,但要能够当场提出答案并清晰沟通,仍需要复习。

我还练习了一些商业案例问题。有效沟通与选择适当的方法同样重要。在案例面试中,有几个关键方面需要注意。首先,必须要大声思考。这种方法让面试官了解你的思维过程和选择方法的理由。其次,如果问题的任何部分不清楚,不要犹豫去请求澄清。第三,与面试官进行对话,并对他们的建议持开放态度。在我的经验中,面试官在面试过程中提供了有用的提示和指导。

最终,我遇到的技术问题涉及评估亚马逊上一个假设的价格促销的影响。这个情景描述了一个捆绑定价交易:对购买任何四种价格在 10 美元以下的产品的顾客提供 10%的折扣。这项促销活动在所有地区同时实施。提出的挑战是:“你如何评估这项促销对亚马逊盈利能力的影响?”

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

Marques Thomas拍摄的照片,来自Unsplash

评估此次促销活动的影响需要考虑多个因素。一方面,这项促销可能是有益的,因为它鼓励顾客购买更多商品,可能通过捆绑减少运输成本。另一方面,10%的折扣可能会对利润产生负面影响。

在面试过程中,我询问了分析这种情况所需的数据可用性。面试官表示,我可以访问产品级销售数据、交易级数据和运输成本数据。根据这些信息,我提出了几种分析方法,包括进行一个事件研究和运用回归不连续性。我还解释了如何利用这些数据来进行这些分析。

还有一些后续问题。例如,这次促销活动并没有同时在所有地方推出,而是进行了一次实验,这次促销在一些州实施而没有随机化。提出的问题是:“你如何使用这个实验来衡量其影响?”对此问题,按我记得,我建议了一种合成控制方法。

面试官询问了我对几个其他假设情景的建议。其他一些跟进问题包括:“假设利润下降但收入增加。那你会建议什么?你会更广泛地实施促销还是不?”我认为在这些类型的问题中,你需要回到一些领导原则,例如“客户至上”,但我不太确定。不过,这些问题确实值得思考。

第三部分:问答环节。

我的面试官在会议结束时留了 5–10 分钟的时间供我提问。我准备了一些问题,例如团队是如何运作的,或者一天的工作是什么样的。所以,我问了这些问题。面试官非常详细地回答了这些问题,我确实很感激。如果你正在为这种面试做准备,你也应该准备一些问题。

回顾

对于行为类问题,我觉得回答起来并不难,但我不确定我的故事有多有力。因此,回过头来看,我可能会尝试准备更有说服力的故事。找到特别与公司文化和挑战相关的故事可能会更好。

对于技术部分,我发现了一些挑战。其中之一是要明确写出你的计量经济模型的方程。在整个面试过程中,你需要口头传达你的解决方案。我没有问题用这种方式沟通总体方法和假设,但大声说明回归方程却很具有挑战性。你还需要指定下标等。我习惯于把方程写下来,但大声说出来并不擅长。我还很难决定回归的最佳结果指标是什么,例如销售额还是利润。

起初,亚马逊计划了两轮面试,但我的旅程在第一轮就结束了。因此,我分享的见解基于我在亚马逊面试过程中的首次也是唯一一次经历。回顾这点,我想强调对于准备类似面试的人,无论是在亚马逊还是专注于因果推断的数据科学角色,重要的不仅仅是专注于行为问题和技术方法。同样关键的是能够解决业务问题,尤其是那些特定于角色背景的问题。在我的情况下,重点是零售行业。回头看,花更多时间审视零售特定场景会更有利。由于我平时的工作不涉及零售数据,深入研究这个领域会有助于迅速识别最佳指标并更清晰地表达我的想法。这种方法不仅对亚马逊的经济学家角色有益,也是任何进入行业特定角色的数据科学专业人士的宝贵策略,其中上下文理解对展示专业知识和解决问题能力至关重要。

感谢阅读!

如果你喜欢这篇文章并想查看更多我的文章,考虑 关注我

免责声明*:我写作是为了学习,所以你可能会发现文章中的错误。如果发现,请告知我。*

我对 DevOps 和 DataOps 的经验

原文:towardsdatascience.com/my-experience-with-devops-and-dataops-baf3471fd68c

这两种数据角色如何相似又如何不同

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

·发布于Towards Data Science ·阅读时间 6 分钟·2023 年 11 月 4 日

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

图片由Pawel Czerwinski提供,来源于Unsplash

当我首次成为数据工程师时,我在一个专注于 DevOps 的团队中工作。虽然这并不是我在第一个职位上想做的工作,但它教会了我很多。现在回头看,如果当时我没有在那种角色中工作,那么我今天作为分析工程师的经验可能就不会如此丰富。

现在,作为分析工程师,我专注于一种叫做 DataOps 的工作。虽然这可能听起来与 DevOps 类似,但它们却非常不同。DevOps 关注的是软件作为产品,而 DataOps 则关注于生产高质量的数据。对于专注于 DataOps 的人来说,数据就是产品!

在担任 DevOps 数据工程师期间,我支持软件工程师对我们的网页应用程序进行代码更改。我专注于每次部署后测试 UI 的更改,而不是检查数据的具体情况。我从未检查过表中的行数或字段中的值是否已填充。相反,我确保后端没有出现错误。

作为分析工程师,每次我进行代码更改或将内容推送到生产环境时,我需要关注元数据——即关于数据的数据。这涉及编写验证查询,以确保行数、列数和值的分布与我推送更改前的情况一致。或者,如果我希望它们看起来不同于之前的样子,它们反映了这些变化!

尽管 DevOps 和 DataOps 听起来相似,但它们服务于两个不同的目的。在这篇文章中,我们将深入探讨它们之间的差异,涉及它们旨在服务的产品以及成功的不同指标。

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

图片来源:Y42

什么是 DevOps?

DevOps 涉及软件代码更改的部署和测试。当我担任 DevOps 工程师时,这通常涉及长时间的部署夜晚,在许多不同环境中测试代码更改,并与进行更改的软件工程师验证这些更改。

软件作为产品

DevOps 团队的工作是服务于软件工程师。他们帮助管理更改发生的环境,确保最小化停机时间,并使平台能够相应地扩展。DevOps 数据工程师不会编写他们部署的代码,而是管理支持代码的基础设施。

我通常会与软件工程师合作,以确定何时应该推送更改,推送到哪个环境,然后验证我们的 AWS 资源是否能够妥善处理这些更改。我从不阅读拉取请求或检查某人的 JavaScript 编写方式。我则确保选择了正确的集群大小并相应地扩展了云资源。重要的是要记住,DevOps 专注于软件代码更改的可交付性。

为了确保你能够作为 DevOps 团队进行交付,你需要建立像 CI/CD 管道这样的流程,并利用这些流程不断迭代。如果在将内容推送到生产环境之前没有进行适当的测试,交付通常会失败。为了防止代码出现问题,主动测试代码在新环境中的表现至关重要。

DevOps 成功的关键指标

DevOps 团队将停机时间作为其核心成功指标。这是我们团队用来查看自己与之前几个月或其他团队的表现对比情况的关键指标。如果我们的停机时间增加,我们知道需要进行某些更改。这也是系统改进是否有效的一个很好的指标。

如果你做得很好,停机时间通常会被限制,因为部署过程中的一切都顺利进行。这表明你已经做好了充分的准备,并知道如何解决遇到的潜在问题。

然而,如果停机时间较长,这通常是部署过程出现问题或系统未能根据变化进行相应扩展的良好指标。这在 DevOps 中至关重要,因为客户通常是受到停机时间影响的对象。这也是为什么你通常会看到由 DevOps 团队引发的 SEV 1 和 SEV 2 事件。这些被认为是关键事件,因为它们阻止了客户使用你的产品。

什么是 DataOps?

DataOps 将数据视为产品。它不支持核心软件功能,而是专注于高质量的元数据。作为一名分析工程师,我每天都专注于 DataOps。如果我不能生成新鲜、准确且可靠的数据,那还有什么意义呢?

数据作为产品

DataOps 是任何数据角色的核心部分。与 DevOps 不同,它不是一个独立的团队来监督变化,而是每个数据从业者必须执行的任务。分析工程师和数据工程师应验证他们在模型中使用的数据模型以及模型生成的数据。许多人像我一样会进行自己的测试,然后监控这些测试以确保一切顺利进行。没有单独的团队来质量检查新数据如何融入现有的数据环境。

在 DataOps 中,不一定有部署计划或流程,因为它是持续进行的。分析师和数据工程师需要不断监控数据库、数据仓库和任何其他生成数据的系统。与其说有一个严格的流程,不如说是持续地进行更改,并确保你在过程中进行测试和监控。

然而,与 DevOps 类似,DataOps 也可能涉及构建 CI/CD 管道等功能,以便使代码更改更容易、更可靠。DataOps 还可能涉及设置不同的环境,以测试源数据或数据模型的变化如何影响下游数据。

DataOps 成功的关键指标

由于 DataOps 关注数据质量,成功的关键指标包括数据的新鲜度、计算值与实际值的接近程度,以及数据在需要时的可用频率。可观察性中强调的相同指标也被认为是 DataOps 中的成功指标。

归根结底,产生的数据需要被业务部门使用。如果业务无法利用这些数据来做出决策,那么 DataOps 的执行就不够好。其目的是引导业务走向成功并获得最大收入。高质量的数据会帮助你实现这一目标,而低质量的数据则会产生相反的效果。

结论

虽然 DevOps 和 DataOps 在服务的产品和测量的指标上有所不同,但归根结底,它们都是为了服务最终用户并提供最佳体验。对 DevOps 而言,这个最终用户是客户;对 DataOps 而言,则是业务利益相关者。

DevOps 和 DataOps 都关注产品的健康,并获得可能出现问题的洞察。他们通过在实施更改前进行适当的测试,尽量防止对客户或利益相关者产生负面影响。从根本上说,它们的存在是为了减少业务面临的问题数量。

尽管作为分析工程师和 DevOps 数据工程师的日常工作非常不同,但我的两个团队都位于组织的核心。他们的目标是服务他人并确保变更顺利进行。他们共享最佳实践,如在组织内实施严格的数据治理、使用版本控制和实施 CI/CD。从本质上讲,DevOps 和 DataOps 是以服务为中心的学科,没有它们,许多公司将会非常迷失。

如果你正在考虑寻找一个 DevOps 或 DataOps 的职位,我建议你先考虑一下你想要从事的产品类型。你对软件工程还是数据工程更感兴趣?如果你更倾向于数据工程,你可能需要了解一下 DataOps。

还要考虑你的生活方式——在 DevOps 中,你经常需要在半夜进行奇怪的部署。如果你是一个重视早睡和睡眠的人,这可能不是适合你的角色。

每个领域都有优缺点,你需要深入了解一下。练习我在本文中提到的一些关键技能,看看你更喜欢哪个。测试这些领域的唯一方法就是尝试各自的职责!

我与 ChatGPT 的第一次探索性数据分析

原文:towardsdatascience.com/my-first-exploratory-data-analysis-with-chatgpt-7f100005efdc

发掘 ChatGPT 的力量:深入探讨探索性数据分析和未来机会

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

·发布于 Towards Data Science ·15 分钟阅读·2023 年 5 月 10 日

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

“一个 AI 探索广阔的数据世界。数字艺术。生动的色彩。”(作者通过 DALL-E 2 生成)

ChatGPT 是一个非凡的工具,可以提高工作效率,这不仅仅局限于数据分析。在本文中,我们将通过一个 ChatGPT 执行的探索性数据分析(EDA)示例进行介绍。我们将覆盖 EDA 的各个阶段,看到一些令人印象深刻的输出(词云!),并指出 ChatGPT 表现好的地方(和不太好的地方)。最后,我们将讨论 LLM 在分析中的未来以及我们对此的兴奋之情。

用于分析的数据集是来自 Common Crawl 的样本,该数据集 免费供任何人访问和分析。Common Crawl 数据集是一个庞大的网络爬虫数据集合,包含来自互联网的数十亿网页。该数据集包括各种网页内容类型,并且定期更新。它作为训练语言模型(如 LLMs)的重要资源,占 ChatGPT 训练数据的 60%。你可以在 Kaggle 上找到由作者策划的数据集样本 这里

在整个文章中,内容将会被截断,所以可以直接查看 用于运行此分析的 Google Colab

我们将分析分为五个部分:

  • 🤔 总体结构

  • 🧹 数据清理

  • 💯 基本分析

  • 🇬🇧 NLP 方法

  • 🔑 关键发现

以上内容介绍完毕,让我们开始分析吧!

结构化工作

在开始分析工作之前,制定一个计划是很好的。EDA 通常遵循一个标准结构,开始时的步骤是固定的,然后在分析中发现有趣的见解时再进行扩展。一个这样的模板是这个,它详细介绍了核心组件:预览数据、清理数据、绘制数据。我们可以以此为起点,但假设我们一无所知,看看 ChatGPT 会提出什么。

Prompt:

让我们一起对 Common Crawl 文本数据集进行 EDA。数据集是从互联网上许多网页抓取的。列包括'text'、'WARC-Type'、'WARC-Target-URI'、'WARC-Date'、'WARC-Record-ID'、'WARC-Refers-To'、'WARC-Block-Digest'、'WARC-Identified-Content-Language'、'Content-Type'和'Content-Length'。数据集保存在一个名为 common_crawl_text 的 csv 文件中。

你应该给我一个整体计划,然后我们可以一步一步进行。在每一步中,你应该写一些代码,我会在终端中运行它,然后将结果反馈给你。

Response:

当然,这里是对 Common Crawl 文本数据集进行 EDA 的高层次计划:

  1. 将数据集加载到一个 pandas DataFrame 中。

  2. 检查每列中的缺失值,并适当地处理它们。

  3. 探索目标变量'WARC-Type'的分布。

  4. 检查'WARC-Identified-Content-Language'的分布。

  5. 检查'Content-Type'的分布。

  6. 探索'text'列,包括文本长度的分布和最常见的单词。

  7. 检查不同列之间的相关性。

  8. 总结发现并识别任何有趣的模式或见解。

让我们从第 1 步开始,将数据集加载到一个 pandas DataFrame 中。

ChatGPT 在这里做得相当好,覆盖了标准步骤。注意,它并不要求我们深入分析所有列,而是对特定子集感兴趣。这很合理,但我觉得它遗漏了一些有价值的数据点。例如,“WARC-Target-URI”值得探索,“WARC-Date”列将提供数据收集时间的见解。

我用这个提示了 ChatGPT,它很高兴地将这些内容纳入了计划。同时,它还添加了创建 Wordcloud 的步骤,这是我一直在考虑的。

我喜欢这种互动方式,感觉像是合作,而不仅仅是阅读一本书。

数据清理

按照结构中的每个步骤,我们可以要求 ChatGPT 扩展该步骤,并给我们提供精确的代码。首先,它建议:

我们可以从加载 Common Crawl 文本数据集并查看其结构开始。以下是将数据集加载到 Pandas DataFrame 中的代码:

import pandas as pd

df = pd.read_csv("common_crawl_text.csv")

一旦加载了数据集,你可以使用以下代码检查 DataFrame 的结构:

df.head()

这将显示数据框的前五行。你也可以使用 df.info() 方法来获取列及其数据类型的概述,以及每列中非空值的数量。

在提供结果后,它能够分享一些基本信息:

根据提供的数据,似乎我们有一个包含不同属性的网页档案记录的数据集,例如记录的类型、记录的 URI(统一资源标识符)、记录的日期、内容的长度和内容本身。内容以不同的语言和格式存在,例如纯文本,内容长度也各不相同。数据集包含 37832 条记录,其中一些记录在内容长度列中有空值。

我们可以进一步要求它给出每一列的详细描述:

提示:

你能提供一个详细的列列表和预期含义吗?

响应:

当然!这是数据框中列的详细列表及其预期含义:

  1. WARC-Type: WARC 记录的类型。WARC(Web ARChive)记录是一种用于存储互联网资源(如网页及其相关元数据)的格式。

  2. WARC-Target-URI: 被存档网页的目标 URI(统一资源标识符)。

  3. WARC-Date: 网页被存档的日期和时间。

  4. WARC-Record-ID: WARC 记录的唯一标识符。

  5. WARC-Refers-To: 此记录所引用的相关 WARC 记录的标识符。

  6. WARC-Block-Digest: 对 WARC 记录内容计算的加密哈希值。

  7. WARC-Identified-Content-Language: 在网页内容中识别的语言。

  8. Content-Type: 内容的媒体类型,例如 text/plain 或 text/html。

  9. Content-Length: 内容的字节长度。

  10. text: 网页提取的文本内容。

请注意,其中一些列是特定于 WARC 格式的,可能在其他类型的数据中不存在。

它在猜测这些列的含义方面做得相当不错。虽然有些可能不正确(例如 Content-Length),但这是一个有用的起点。它可能确实知道这些特定名称,因为它的训练数据,但我已经尝试了任意列名,它通常可以从名称和返回的数据的组合中猜测列将包含什么。

现在,它注意到有缺失值,我们来看看如何处理这些问题:

提示:

我们应该对缺失值做些什么吗?

响应:

是的,处理 Content-Length 列中的缺失值是个好主意。一种选择是删除那些缺失值的行,如果它们不是数据的重要部分。另一种选择是使用一些统计方法(例如均值、中位数或众数)来填补缺失值。然而,最佳方法将取决于数据的性质和所执行的分析。

这些可能是我处理它的方式。在这种情况下,我很乐意直接删除这些条目,因为数量不是很多。

提示:

我们就将这些删除,因为数量非常少。我该怎么做呢?

响应:

你可以使用 pandas 中的 dropna() 函数删除包含缺失值的行。以下是一个示例:

import pandas as pd

# 创建一个数据框

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

# 删除缺失值的行

df.dropna(inplace=True) print(df)

输出:

A B 0 1.0 5.0 3 4.0 8.0

在这个示例中,dropna() 函数会删除第二行,该行包含缺失值。inplace=True 参数会修改原始数据框,因此结果数据框只包含没有缺失值的行。

注意它如何提供有效的代码,并对每一行代码进行注释。它还在最后提供了发生了什么的解释。这很好,因为我们可以了解代码的运行情况,如果有需要修改的地方,也会变得容易得多。

我们现在可以开始分析的第一部分。

基本分析

步骤 3–5 大致相同,绘制一些数据分布图并查看是否有任何有趣的发现。

当提示开始步骤 3 时:

Sure, let's explore the distribution of the target variable 'WARC-Type'. We can do this by creating a histogram or a bar chart of the variable to see the count or percentage of each value in the dataset. If you are using Python, you can use libraries like Matplotlib or Seaborn to create visualizations. Here is an example code snippet to create a bar chart using Matplotlib: python import matplotlib.pyplot as plt
# Count the number of occurrences of each value in the 'WARC-Type' column
value_counts = df['WARC-Type'].value_counts()
# Create a bar chart of the value counts
plt.bar(value_counts.index, value_counts.values)
# Set the title and axis labels
plt.title('Distribution of WARC-Type')
plt.xlabel('WARC-Type')
plt.ylabel('Count')
# Show the plot plt.show() This code will create a bar chart showing the count of each value in the 'WARC-Type' column. You can modify the code to show the percentage of each value instead of the count.

这样会为我们输出一个图表。在这种情况下,图表并不特别有趣,因为实际上只有一个“WARC-Type”,但这是个不错的主意。图像的问题在于很难将结果反馈给 ChatGPT。我发现,建议 ChatGPT 返回数据表以解决这个问题会更好,同时在有意义的地方附上额外的图表。

了解列中只有一个值后,ChatGPT 很乐意继续进行下一阶段。当我们探索“WARC-Content-Language”时,我们开始看到一些更复杂的东西。返回的结果是:

eng 15903

rus 1551

...

hrv,nno,bel 1

zul,eng 1

从中学到的是:

似乎“WARC-Identified-Content-Language”列有 1187 个独特的值,最常见的语言是英语('eng'),其次是俄语('rus')、德语('deu')和中文('zho')。由于有如此多的独特值,分析变量的分布可能会很困难。简化分析的一种方法可能是将语言分为更广泛的类别,例如“英语”、“罗曼语系语言”、“斯拉夫语言”等,具体取决于研究问题。

关于分组的观点非常好,但这里有遗漏——每行可以包含多种语言。当多次询问这个问题时,它提出了一个很好的方法。

Here's an updated code that splits the rows with multiple languages and weighs them accordingly: import pandas as pd

# Split the rows with multiple languages
df['WARC-Identified-Content-Language'] = df['WARC-Identified-Content-Language'].str.split(',')

# Create a new DataFrame to store the split rows
df_split = pd.DataFrame({ 'WARC-Identified-Content-Language': [lang for langs in df['WARC-Identified-Content-Language'].tolist() for lang in langs], 'count': [1/len(langs) for langs in df['WARC-Identified-Content-Language'].tolist() for lang in langs] })

# Aggregate by language
df_agg = df_split.groupby('WARC-Identified-Content-Language')['count'].sum().reset_index()

# Plot the distribution of languages
plt.figure(figsize=(10,6))
sns.barplot(data=df_agg, x='WARC-Identified-Content-Language', y='count', order=df_agg.sort_values('count', ascending=False)['WARC-Identified-Content-Language'])
plt.title('Distribution of WARC-Identified-Content-Language') plt.xticks(rotation=90)
plt.show() 

This code splits the rows with multiple languages into separate rows, and weights them by the number of languages in each row. Then it aggregates the rows by language and plots the distribution of languages.

将这与一些关于语言分组的提示结合后,我们可以得到一个不错的图表:

我特别喜欢的一点是它给图表添加了标签。每次都写标签可能有点麻烦,但确实会有区别,所以看到它足够聪明地提供合理的标签是很不错的。

看起来英语仍然是主导语言——主导程度如何?

提示:

看起来主要是英语。你能计算一下汇总数据中英语的百分比吗?

Response:

当然,这里有一些代码来计算汇总数据中英语的百分比:english_percentage = (agg_data.loc['eng', 'weight'] / agg_data['weight'].sum()) * 100

print(f"The percentage of the aggregated data that is English is: {english_percentage:.2f}%")

这应该输出汇总数据中英语的百分比,保留到小数点后两位。

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

(作者创建的图像)

自然语言处理

现在我们可以进入第 6 步,这涉及对文本列进行一些探索。这将更注重分析,并需要自然语言处理(NLP)技术。让我们看看 ChatGPT 的表现。

Prompt:

很好。我们进入第 6 步:

"探索“text”列,包括文本长度的分布和最常见的词汇。"

Response:

Sure! To explore the 'text' column, we can start by calculating the length of each text and creating a histogram to visualize the distribution of text lengths. Here's the code to do that:

# Calculate the length of each text
df['text_length'] = df['text'].str.len()

# Create a histogram of text lengths
plt.hist(df['text_length'], bins=50)

This will create a histogram that shows the distribution of text lengths in the 'text' column. We can then look at the most common words in the 'text' column by first removing any HTML tags, punctuation, and stop words. Here's the code to do that: import re

import nltk from nltk.corpus
import stopwords

# Remove HTML tags from text
df['text'] = df['text'].apply(lambda x: re.sub('<.*?>', '', x))
# Remove punctuation from text
df['text'] = df['text'].str.replace('[^\\w\\s]','')
# Convert text to lowercase
df['text'] = df['text'].str.lower()
# Remove stop words from text
stop_words = set(stopwords.words('english'))
df['text'] = df['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in stop_words]))
# Tokenize text into individual words
df['text'] = df['text'].apply(nltk.word_tokenize)
# Flatten list of words into a single list
word_list = [word for sublist in df['text'] for word in sublist]

# Calculate frequency distribution of words
freq_dist = nltk.FreqDist(word_list)

# Print the 20 most common words
print(freq_dist.most_common(20)) 

This code will remove HTML tags and punctuation from the 'text' column, convert all text to lowercase, remove stop words, tokenize the text into individual words, and then calculate the frequency distribution of words. Finally, it will print the 20 most common words in the 'text' column.

结果如下:

[('nan', 36847), ('0', 3467), ('1', 2809), ('keresőoptimalizálás', 2498), ('idősgondozás', 1852), ('2', 1740), ('3', 1559), ('szerződés', 1529), ('eltartási', 1527), ('brands', 1442), ('5', 1362), ('4', 1350), ('usd', 1245), ('us', 1205), ('2023', 1204), ('new', 1178), ('sex', 1165), ('2022', 1031), ('home', 919), ('cookies', 904)]

我对此不是很满意,因为我们可以看到很多“常见词汇”只是数字,或者是其他语言的停用词(它只使用了英语停用词)。我能够在这方面进行调整,通过过滤掉非字母字符的词汇和包括其他语言的停用词列表来帮助清理数据。现在让我们在词云中可视化这些数据。

Prompt:

你能制作一个词云吗?

Response:

Sure! To create a wordcloud from the top 50 most frequent words, you can use the WordCloud library in Python as follows: from wordcloud import WordCloud

import matplotlib.pyplot as plt

# Convert the top 50 most frequent words to a dictionary
freq_dict = dict(top_words)

# Generate the wordcloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(freq_dict)

# Display the wordcloud
plt.figure(figsize=(12, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
This code will generate a wordcloud with the top 50 most frequent words in the text column. You can adjust the parameters of the WordCloud function to customize the appearance of the wordcloud.

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

警告:包含明显的语言。对于那些好奇的人,“keresőoptimalizálás”是匈牙利语中的“搜索引擎优化”(作者创建的图像)。

我不确定从这个图中能得到什么。似乎有一些词可能关联有用的内容(例如“信息”、“博客”、“品牌”),但也有很多不需要的内容。我将这些常见词汇分享给 ChatGPT 并询问它的看法:

Prompt:

我们对此可以说些什么?

Response:

根据“text”列中发现的常见词汇,数据可能包含很多垃圾信息或不相关的信息,因为许多常见词汇与在线约会、评论、贷款和陪玩相关。此外,像“nan”这样的词汇表明“text”列中可能有缺失或不完整的数据。进一步调查“text”列的数据性质和质量对于确定其在后续分析中的有用性是重要的。

这是一个合理的结论,实际上,与 Common Crawl 数据集合作的公司确实表示,他们投入了大量资源来清理数据集,以使其适合训练 AI 模型。

Wrapping Up

这就结束了 ChatGPT 概述的计划,所以我们将在这里结束分析,并查看它有什么发现。

提示:

很好。让我们继续第 8 步。你能总结一下我们迄今为止的所有分析结果吗?

回复:

当然,基于我们目前进行的分析,以下是一些关键发现:语言分布:数据集中最常见的语言是英语,其次是俄语、德语、中文和西班牙语。内容类型分布:数据集中大多数内容类型为"text/plain"。文本长度:数据集中,文本长度范围从 0 到 8,542,524,平均长度为 20,566。常见词:数据集中最频繁的词汇并不特别有信息量,因为它们包含许多停用词和其他非信息性术语。相关性:文本长度与内容长度之间存在强正相关。检测到的语言数量与内容长度之间也存在弱正相关。

如果有数据分析师带着这些内容来找我,我会感到非常失望。正如开始时提到的,有一些列数据可以分析得更详细,并且通常更好的是提出一些下一步的建议。然而,我们从未给它设定分析的目标,也没告诉它给出建议,所以我不会太过苛责。

讨论

如你所见,整个过程中使用的提示相对简单。考虑到这一点,ChatGPT 能够很好地理解我想要的并给出有用的回答,这一点令人印象深刻。这些提示可以通过在每个提示中提供更多上下文以及对我们希望返回的内容更严格来改进。例如,每个提示可以包含对其专注的具体任务的引用,以及额外的文本以确保其做我们想要的:

不要回应多余的文本。假设 pandas、numpy 和 matplotlib 已按标准方式导入。

这些可以保存在你自己的提示模板中以加快这类工作的进度,或者使用诸如LangChain这样的工具来完成。

我们还可以定义自己的总体模板。我让 ChatGPT 提出一个计划,但它并不完美。我们可以定义一个总体结构供其遵循,以及分析每个变量的标准方法。通过模板,ChatGPT 在这种分析中遗漏洞察的可能性较小。

虽然与 ChatGPT 反复交流以获取数据输出很有趣,但很快变得疲惫。ChatGPT 在能够直接运行代码时更为强大。ChatGPT 可以通过使用Python API连接到 Python 运行时。在这种情况下,代码可以自动运行,但要将人从循环中剔除,我们还需要一个额外的工具。

在过去一个月里,AutoGPT 作为 ChatGPT 的增强工具非常受欢迎,它有效地为 ChatGPT 代理提供了指南,允许他们持续朝着某个目标执行。AutoGPT 可以在这种情况下取代我,让 ChatGPT 代理设计代码,然后执行它,将结果反馈给 ChatGPT,直到它得到详细的分析。它还将与一个内存数据库接口,从而允许它执行更大规模的分析。

使用像 AutoGPT 这样的工具,我们可以设定一个明确的目标,包括分析的细节和期望的结论风格。在这种情况下,我们可以较少地检查结果,并最终很少需要工作即可得到一个不错的分析。

最后,我们应该指出 ChatGPT 远未达到“完美”,即便在这次模拟分析中,我也需要调整提示,以获得接近我想要的答案。虽然这比我预期的要容易得多,但仍然值得注意。它创建了一些有错误的代码,尽管每次被告知后都能修复这些错误。有时它创建的代码是我不想运行的,我需要建议它采用不同的方法,但再次提示后,它能够提出一个不错的解决方案。

结论

在本文中,我们已经看到 ChatGPT 如何用于支持探索性数据分析(EDA)的运行。我们发现,与系统合作时能够获得意想不到的良好结果,几乎不需要外部帮助。我们还注意到,已经存在一些工具可以扩展这一想法,例如 AutoGPT,它可能成为一个更强大的助手。

作为一名数据分析师,我已经在使用 ChatGPT 帮助我的分析,尽管我很少使用它进行本文中详细描述的端到端分析。随着像 AutoGPT 这样的工具的更多集成,以及使用摩擦的减少,我预计会越来越多地使用它,并且对此非常期待(虽然我不会被取代 😉 )。

我的#30DayMapChallange 第一周

原文:towardsdatascience.com/my-first-week-of-the-30daymapchallange-1bef0646c88e

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

作者提供的图像。

我对#30DayMapChallange 第一周的个人看法,这是一个旨在每年 11 月每天设计主题地图的社会挑战。

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

·发表于 Towards Data Science ·5 分钟阅读·2023 年 11 月 7 日

自 2019 年以来,每年 11 月地理信息系统(GIS)和空间分析社区都会变得非常忙碌——这要归功于一个名为#30DayMapChallange的有趣挑战。每年,这个挑战都有一个主题安排,提出一个应该作为当天地图可视化主要方向的主题。虽然这些问题确实意味着某种限制,但它们也帮助参与者找到共同兴趣,分享数据源,并在视觉和技术上表达个人风格。

在这里,我想简要概述一下我参加这个挑战的第一周,详细展示我创建的不同地图——通常使用 Python。

在本文中,所有图像均由作者创建。

第一天——点

这个挑战的第一天通常涉及所有几何形状中最简单的——点。为了创建我的 POI 地图,我使用了NASA 的开放数据门户的陨石着陆数据。这个数据集包含大约 40k 条观察数据,当这些数据放置在地图上时,与人口密度显示出显著的相关性。因此,陨石要么落在有人居住的土地上,要么我们在更多人居住的地方有更多关于陨石的数据,对吧?

为了创建这个(交互式)地图,我使用了 Python,特别是 Folium。

在可视化中,我根据每颗陨石的记录质量(以克为单位,范围从 0.01 克到 60,000 千克或 60 吨)来调整每个点标记的大小。顺便说一下,这颗 60 吨重的巨型 Hoba 是在 1920 年在纳米比亚的 Grootfonteinn 发现的。然后,我根据发现时间为每个标记着色。有趣的事实是:第一颗记录在案的陨石 Nōgata(472 克)是在 861 年在日本福冈县发现的,发现后不久。经过这次观察,数据库中几个世纪没有数据。然后,最后,Elbogen 在 1399 年(107000.0)出现,接着是 1490 年的 Rivolta de Bassi(103.3 克)和 1491 年的 Ensisheim(127000.0 克)。查看数据集中的后期,结果表明 35%的陨石是在 2000 年后记录的,98%是在 1899 年后记录的。

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

第 1 天——点

第 2 天——线

在点之后,自然地,就到了线(或者更准确地说,是线字符串)。作为一名网络科学家和地理空间数据科学家,我的选择显而易见:使用从 OpenStreetMap 收集的数据,通过OSMNx包来可视化我家乡布达佩斯的道路网络。

关于这个网络的有趣事实:它有 115,539 个节点和 316,096 条边,而所有道路段的总长度为 1,879 公里!

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

第 2 天——线

第 3 天——多边形

首先是点,然后是线——现在,轮到多边形了!在这张地图上,我将世界上的每个国家视为一个单独的多边形,基于Natural Earth数据进行构建。为了添加一个漂亮的渐变颜色,我根据每个国家距离赤道的距离来着色。所有计算都在 Python 中完成,视觉效果则使用 Matplotlib 制作。

这张地图形状相当奇特,因为我使用了所谓的 Larrivee 投影,这种投影由 Léo Larrivée 于 1988 年为加拿大开发。你可以在这里了解更多关于不同地图投影的信息。

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

第 3 天——多边形

第 4 天——一张糟糕的地图

地图挑战的第四天非常不寻常——当每个人都忙着制作自己一生中最好的地图时,我们必须制作一张差的地图。然而,这张地图如何糟糕则取决于解释。

为了确保我的地图足够差,我做了一些数学计算,以得出一张毫无意义、绝对糟糕的德国地图。首先,我使用 OSMNx 包从 OpenStreetMap 下载了德国的行政边界。其次,使用 Uber 的H3库将其拆分成六边形,使用六边形级别 6,得到了 12122 个六边形。第三,对于每个六边形,我计算了其质心的经纬度坐标(使用 epsg:4326),精确到 14 位小数。然后,我将经纬度坐标中的每个数字相加,得到用于为每个六边形单元着色的‘分数’。完成!毫无意义!

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

第四天 — 一张糟糕的地图

第五天 — 模拟地图

在经过四天的密集数据处理后,第五天我们被带到荒野中,并要求我们制作模拟地图。由于当时离万圣节还很近,我决定将其与地图挑战结合起来,并在上面雕刻布达佩斯的地图。

可怕的部分有点隐藏 — 我使用了 EPSG:23700,即匈牙利的本地投影系统,这在布达佩斯看起来非常好,但在其他任何国家的几何图形上使用时很可能效果糟糕。如果你敢试试的话!

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

第五天 — 模拟地图

第六天 — 亚洲

第六天,我回到了之前介绍的自然地球数据库,并下载了包含全球时区的 GIS 文件。由于第六天的主题是亚洲,我需要进行一些过滤,找出 48 个亚洲国家,然后得出了如下地图 — 使用了 Python 和 Matplotlib。

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

第六天 — 亚洲

第七天 — 导航

最近,我在哈佛数据集上发现了一个有趣的数据集,名为罗马道路网络(2008 版):这是一个完美的 GIS 格式的罗马帝国历史道路网络。我将其转化为网络分析项目,并发布在数据科学之路上。正如这个项目所展示的,确实,昔日的所有道路都通向罗马;我相信这是一个— 相对简单但仍然 — 的导航地图,引导每一个踏上这些道路的人前往中心。

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

第七天 — 导航

这是我进行#30DayMapChallenge 的第一周总结 — 还有三周的挑战,准备迎接更多的地图吧!现在,我还在我的Patreon频道上提供视频和代码教程。

我成为更好的数据科学家的五个关键学习心得

原文:towardsdatascience.com/my-five-key-learnings-to-be-a-better-data-scientist-39a99658c89e

对我六年数据科学职业生涯的反思

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

·发表于 Towards Data Science ·阅读时长 9 分钟·2023 年 1 月 2 日

我在 2018 年 1 月开始了我的第一份全职数据科学工作,担任助理产品分析师。这是我数据科学职业生涯的第七年,现在是高级数据科学家。六年过得很快(特别是疫情期间)。我为两家公司工作,支持了至少 10 个不同的团队,与合作伙伴在产品、工程、设计、财务和运营方面合作,并涉及各种数据科学领域,包括数据管道、仪表板、指标审查、深入分析、A/B 测试和建模。

因此,我觉得是时候对这段旅程进行反思了。以下是我五个关键的学习心得。

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

GPT 生成的图像

I. 技术技能很重要,但…

当我在学校时,我对技术技能非常着迷。我花了很多时间学习和探索不同的机器学习模型,并参加了 Kaggle 比赛。然而,自从我开始进入行业后,我意识到需要关注的事项远不止编写代码和构建华丽模型,有些事情实际上更为重要。

我想特别强调的一点是理解业务背景,无论你更侧重于分析还是机器学习。我们被公司聘用是为了创造(货币)价值,因此,归根结底,公司最关心的是你所做的分析或建立的模型是否能够带来更多用户、增加收入或降低成本。而理解业务背景是关键。我们都听说过“可操作的洞察”这一术语——最好的洞察是那些你的业务利益相关者可以采取行动的。但如果你没有足够的领域知识,你将无法知道哪些洞察是可操作的。

此外,我们在学校里通常会得到干净的数据集。但实际上,数据总是很混乱。你可能会花费至少 30%的时间来收集数据、清理数据,甚至设置数据管道,以确保你有高质量的数据来进行分析或构建模型。这需要对业务背景有深入理解,以便识别什么是‘高质量数据’。例如,良好的商业感觉使你更容易注意到当你计算的商业指标明显偏离正常范围时;不同的缺失值填补技术有不同的影响,商业理解可以帮助你选择最佳解决方案。

更不用说,如今 AI 工具如 ChatGPT 降低了成为数据科学家的技术门槛,并将继续这样做。在这篇文章中,我评估了 ChatGPT 的数据分析能力。你可以看到它能完成多少初级数据分析师/科学家的工作,但显然缺少的是对你特定业务问题的知识。

总之,技术技能是获得数据科学工作最低要求。但它们不是唯一区分你(与 ChatGPT)的因素,也不是让你成为优秀数据科学家的因素

那么,获取业务背景的最佳方法是什么呢?

  1. 如果可以的话,亲自使用产品。我记得在我在 Ancestry 工作时,至少有五个测试账户。而且我自己也经常使用 Brex。尝试不同的用户路径和在 UI 中点击是理解参与模型和识别潜在的流失点及痛点的非常有帮助的。

  2. 与跨职能的合作伙伴交谈,包括 PM、工程师、设计师等,并定期与他们会面,分享你的发现。他们通常从不同的角度对产品有大量的理解,可以帮助你了解当前的产品目标、过去尝试过的内容和所得到的经验,以及什么是可行的,什么是不行的。

II. 不要低估报告和仪表板工作

这可能不是一个受欢迎的观点。

如今,成为数据科学家意味着很多不同的事情。特别是如果你在一家初创公司工作,你几乎被要求具备“全栈”能力。在所有这些不同的任务类型中,我们都喜欢进行深度分析、运行 A/B 测试和构建复杂模型,同时,报告和仪表板工作通常不受欢迎。我大多数时候也是这样感觉的,我们数据科学家通常根据那些更技术性的项目进行评估。不过,我想说这些工作有其价值,并且对于过去数据支持不足的新产品功能或新的业务单元至关重要。我相信它们有三个主要价值:

  1. 它有助于建立基准。在进行任何高级分析之前,我们总是需要问自己我们的目标是什么,或者我们尝试改进的是什么。然而,如果我们没有跟踪关键指标的仪表板,或者我们甚至没有就关键指标达成一致,这就是一个困难的问题。想象一下,我们花了大量的努力通过媒体组合建模来优化营销预算,以获取大量新用户,但这些用户每月的流失率达到 90%(但由于我们没有跟踪留存率,我们并不知道),那么这只是浪费钱。

  2. 它可以带来快速的洞察。在产品开发的初期阶段,事情可能会发生快速变化,这意味着指标也会不断变化。因此,密切监控指标并快速诊断任何趋势变化是很重要的。即使是成熟的产品,你也可能会不时看到指标异常,这可能是由于功能变化、用户组合变化或竞争环境变化等原因。通过例行报告和指标审查,及早发现这些异常是很重要的。

  3. 最后但同样重要的是,这是一种赢得信任的好方法。报告和仪表板对理解产品和衡量其影响至关重要,因此业务利益相关者通常非常重视它。能够构建准确的报告,讨论指标,并根据这些指标提供业务建议,对建立与跨职能合作伙伴的关系非常有帮助,尤其是在初期阶段。

但当然,当我们有一组一致同意的关键指标来监控时,我们应该确保自动化这些报告工作,这样我们可以腾出更多时间去做我们更喜欢的工作,并最终释放更多价值。

III. 有效的沟通与合作

如果你问我离开学校后最大的惊讶是什么,我会说——会议。我从没想到数据科学家每天需要参加如此多的会议。有时候,会议占据了我一天的一半时间。然而,其中大多数是必要的。今天,我将数据科学项目视为一个迭代过程——我参加跨职能会议以收集业务痛点和问题,然后将它们转化为数据问题。接下来,我使用数据科学工具进行分析,并将其转化为业务语言。最后,我将洞察带回给利益相关者,我们讨论想法和下一步,这可能会发展成我们想要运行的实验、我们想要构建的模型或其他分析。这些步骤不断重复,有效的沟通和合作是持续提供业务价值的关键。

说实话,这对我来说一直很困难,因为我非常内向(根据我的观察,很多数据人员也是如此),而且英语不是我的母语。以下是一些我发现对提高沟通技能有用的方法。

首先,听取别人会议中的发言。许多时候,我在会议上过于害羞,特别是当我刚加入团队时。在这种情况下,我会利用机会向他人学习,特别是当我的经理或高级团队成员在这些会议中时。我学到的内容包括如何与不同的利益相关者沟通,如何用简单的英语讨论数据解决方案,如何设定正确的期望,如何进行小谈话,以及如何提出反对意见 😃

其次,打磨演讲技巧。演讲是与利益相关者分享分析工作和产生影响的最常见方式之一。打磨演讲包括两个部分——制作最佳的幻灯片和最有效地传达数据见解。网上有许多文章教你如何制作幻灯片。在我看来,一些关键要点包括:

  1. 限制幻灯片上的文本数量。在分析幻灯片上,用一句话总结见解,并将其放在幻灯片标题中,以配合图表。

  2. 选择合适的可视化类型,并使图表和标签足够大,以便人们能够轻松理解。

  3. 我特别喜欢以这样的结构来组织我的演示文稿:背景 -> 关键见解 -> 建议 -> 详细分析 -> 总结(重复关键见解和建议以加深印象)。这样可以帮助观众更容易捕捉你想传达的主要信息。

至于口头沟通,我 95%确信我的业务利益相关者无法准确解释什么是“统计显著”。但这没关系。我是说,我也需要几秒钟才能用科学术语表达出来。然而,我们的工作是进行严谨的统计分析,并以易于理解的方式传达我们的发现。如果你不够自信,正式演讲前的排练总是有帮助的。

当然,随着在这一领域的经验增加,我开始独立支持产品团队并领导分析项目。这些机会非常宝贵,因为它们迫使我跨部门合作并迅速成长。

IV. 成为一个团队成员

作为一名资深数据科学家,我不仅需要成为一个优秀的独立贡献者,还要能够为团队做出贡献并帮助他人成长。我感受到成为一个优秀团队成员的重要性。那么,如何成为一个优秀的团队成员呢?

首先想到的是编写良好的文档。这虽然小(且繁琐),但却非常重要。人们在入职时通常会遇到的问题是理解所有的表格、指标和过去的项目。当我遇到这种情况时,我通常会首先在 Slack、Confluence 和 Google Drive 中搜索,然后向团队成员询问。这时,我希望有更好的文档。因此,为了让他人的工作更轻松(并在你需要三个月后返回某些内容时让自己的工作更轻松),添加详细的表格文档、编写项目总结和模型方法文档是至关重要的。

为了拓宽范围,我认为当我们看到机会时,应该总是考虑为团队建立最佳实践。以文档为例,看到有多少表格缺少描述,也许这是提出全团队范围内增加文档覆盖率和为新表格设置要求的好时机。我已经启动了一项 Looker 培训,帮助队员和利益相关者快速上手 Looker,并起草了一个 SQL 查询优化课程,以倡导 SQL 最佳实践,节省查询时间和成本。

最后,尝试指导你的初级队员。这是我新接触的领域,所以我仍在学习。在过去六年中,我遇到了许多优秀的经理和导师,因此我完全理解良好导师对新人的价值。我还发现这种导师过程对双方都有益,因为我了解了更多他人的项目,并学习了新的领域知识和技术。

V. 持续学习并做好准备

我想分享的最后一个收获是持续学习。我们都知道数据科学是一个快速发展的领域。每天都有新的模型和技术。例如,许多 AI 工具每天涌现,使我们的数据科学家生活更轻松。我每周五和周日晚上都会抽出时间阅读 Medium 上的有趣博客(可以在这里查看我的双月阅读笔记)。并不是每一篇博客都能立即对工作有所帮助,但它们至少让我了解了现有的东西,当我遇到新问题时,我知道自己可以潜在地使用什么。

此外,学习不应仅限于数据科学领域。如今数据科学角色高度跨功能,因此我发现深入了解工程框架、数据管道工具、产品设计知识等也很有帮助。这使得与利益相关者的对话更加顺畅,并为未来的挑战做好准备。

我没想到在开始写这篇文章时,它会成为一篇 2000 字的长文,而且这篇文章也没有涵盖我过去几年的所有学习内容。然而,我希望这对刚刚开始数据科学职业生涯或有意进入这个领域的人有所帮助。

这篇文章最初发布在我的博客上,时间是 2023 年 1 月,并在 2024 年 6 月更新。

我的#30DayMapChallange 第四周

原文:towardsdatascience.com/my-fourth-week-of-the-30daymapchallange-c2c79c09a38c

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

我对#30DayMapChallange 第四周的个人看法,这是一个旨在每年 11 月每天设计主题地图的社交挑战。

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

·发表于 Towards Data Science ·阅读时间 7 分钟·2023 年 11 月 29 日

自 2019 年以来,地理信息系统(GIS)和空间分析社区每年 11 月都很忙碌——得益于一个有趣的挑战,称为#30DayMapChallange。每年,这个挑战都有一个主题安排,提出一个应该作为地图可视化主要指导方针的主题,并在那一天发布。虽然预设的每日主题确实对创意思维造成了约束,但它们也帮助参与者找到共同的兴趣,分享数据源,并在视觉和技术上表达个人风格。

在这里,我想简要回顾一下我在这个挑战的第四周——也是最后一周——详细描述并展示我创建的不同地图——通常使用 Python 及各种空间分析和地理空间数据工具。

在这篇文章中,所有图像均由作者创建。

第 22 天 — 𝐍𝐨𝐫𝐭𝐡 𝐢𝐬 𝐍𝐨𝐭 𝐀𝐥𝐰𝐚𝐲𝐬 𝐔𝐩

在这个部分,我在主题和视觉效果上都进行了大量的探索。最后,我依靠我的物理学背景,决定绘制地球磁场及其主磁场倾角线。这些线条作为磁极,可以是正的也可以是负的。地球的磁北极由这些线条定义——而且并不总是向上的。它在移动!近年来,它开始从加拿大北极迁移到俄罗斯,速度每年几公里。

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

第 22 天 — 北极并非总是向上

第 23 天 — 3𝐃

我的第一个 3D 地图——所以我保持了数据的相对简单,选择了布达佩斯市区,特别是佩斯区的第 V 区和第 VI 区,并基于ATLO的布达佩斯开放数据地图可视化了其建筑高度轮廓。至于技术部分,我像往常一样使用了 Python,并最终学习了 Pydeck 的基础知识来创建这一作品。享受交互式版本这里,每栋建筑的高度与其实际高度成比例,该信息也通过颜色共享进行编码:

对于当地人——看到国会大厦和大教堂作为最高的建筑物令人安心!

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

第 23 天——3D

第 24 天——黑白

我终于在我的黑白地图中创建了我的第一个山脊图,参考了几个美丽的 Joy-division 专辑封面风格的地图示例。我使用了Colin Carroll 实现的 Python 版本。技术方面,山脊图使用的高程数据

美丽的工具和结果;享受这里意大利的风景:

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

第 24 天——黑白

第 25 天——南极洲

这是一个棘手的任务——可用的数据非常少。我对其他人的帖子异常好奇!至于我自己,我最终只是可视化了由国家雪冰数据中心提供的 125 米分辨率的整个大陆 SAR 图像。虚假颜色的色调对应于不同的形态特征,正如文档所述:

“𝘛𝘩𝘦 25 𝘮 𝘪𝘮𝘢𝘨𝘦 𝘵𝘪𝘭𝘦𝘴 𝘱𝘳𝘦𝘴𝘦𝘳𝘷𝘦 𝘢 𝘵𝘳𝘶𝘦 𝘲𝘶𝘢𝘯𝘵𝘪𝘵𝘢𝘵𝘪𝘷𝘦 𝘮𝘦𝘢𝘴𝘶𝘳𝘦 𝘰𝘧 𝘣𝘢𝘤𝘬𝘴𝘤𝘢𝘵𝘵𝘦𝘳 𝘸𝘩𝘪𝘤𝘩 𝘮𝘢𝘺 𝘣𝘦 𝘥𝘪𝘳𝘦𝘤𝘵𝘭𝘺 𝘳𝘦𝘭𝘢𝘵𝘦𝘥 𝘵𝘰 𝘴𝘪𝘨𝘮𝘢-𝘯𝘢𝘶𝘨𝘩𝘵. 𝘍𝘰𝘳 𝘵𝘩𝘦 𝘰𝘵𝘩𝘦𝘳 𝘱𝘳𝘰𝘥𝘶𝘤𝘁𝘀, 𝘦𝘢𝘤𝘩 𝘱𝘪𝘹𝘦𝘭’𝘀 𝘪𝘯𝘵𝘦𝘯𝘴𝘪𝘵𝘺 𝘲𝘶𝘢𝘭𝘪𝘵𝘢𝘵𝘪𝘷𝘦𝘭𝘺 𝘳𝘦𝘱𝘳𝘦𝘴𝘦𝘯𝘵𝘴 𝘪𝘵𝘀 𝘳𝘢𝘥𝘢𝘳 𝘣𝘢𝘤𝘬𝘴𝘤𝘢𝘵𝘵𝘦𝘳 𝘪𝘯𝘵𝘦𝘯𝘴𝘪𝘵𝘺, 𝘣𝘶𝘵 𝘢𝘤𝘵𝘶𝘢𝘭 𝘣𝘢𝘤𝘬𝘴𝘤𝘢𝘵𝘵𝘦𝘳 𝘷𝘢𝘭𝘶𝘦𝘴 𝘩𝘢𝘷𝘦 𝘣𝘦𝘦𝘯 𝘢𝘳𝘣𝘪𝘵𝘳𝘢𝘳𝘪𝘭𝘺 𝘢𝘥𝘫𝘶𝘴𝘵𝘦𝘥 𝘵𝘰 𝘪𝘮𝘱𝘳𝘰𝘷𝘦 𝘮𝘰𝘴𝘢𝘪𝘤 𝘪𝘮𝘢𝘨𝘦 𝘲𝘶𝘢𝘭𝘪𝘵𝘺. 𝘝𝘢𝘳𝘪𝘢𝘣𝘭𝘦𝘴 𝘢𝘧𝘧𝘦𝘤𝘵𝘪𝘯𝘨 𝘳𝘢𝘥𝘢𝘳 𝘣𝘢𝘤𝘪𝘯𝘨 𝘪𝘯𝘤𝘭𝘶𝘥𝘦 𝘴𝘶𝘳𝘧𝘢𝘤𝘦 𝘳𝘰𝘶𝘨𝘩𝘯𝘦𝘴𝘴, 𝘵𝘩𝘦 𝘴𝘶𝘳𝘧𝘢𝘤𝘦 𝘮𝘢𝘵𝘦𝘳𝘪𝘢𝘭’𝘀 𝘥𝘪𝘦𝘭𝘦𝘤𝘵𝘳𝘪𝘤 𝘱𝘳𝘰𝘱𝘦𝘳𝘵𝘪𝘦𝘴, 𝘢𝘯𝘥 𝘵𝘩𝘦 𝘨𝘦𝘰𝘮𝘦𝘵𝘳𝘺 𝘣𝘦𝘁𝘸𝘦𝘦𝘯 𝘵𝘩𝘦 𝘴𝘱𝘢𝘤𝘦𝘤𝘳𝘢𝘧𝘁 𝘢𝘯𝘥 𝘵𝘢𝘳𝘨𝘦𝘁. 𝘍𝘰𝘳 𝘮𝘰𝘳𝘦 𝘪𝘯𝘧𝘰𝘳𝘮𝘢𝘵𝘪𝘰𝘯, 𝘴𝘦𝘦 [𝘛𝘦𝘤𝘩𝘯𝘪𝘤𝘢𝘭 𝘙𝘦𝘧𝘦𝘳𝘦𝘯𝘤𝘦 𝘰𝘯 𝘚𝘈𝘙 𝘛𝘩𝘦𝘰𝘳𝘺/𝘐𝘯𝘵𝘦𝘳𝘱𝘳𝘦𝘵𝘪𝘯𝘨 𝘐𝘮𝘢𝘨𝘦𝘴](https://daacdata.apps.nsidc.org/pub/DATASETS/nsidc0103_radarsat_sar/geoTIF_V2/ https://nsidc.org/sites/default/files/nsidc-0103-v002-userguide_0.pdf)。”

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

第 25 天——南极洲

第 26 天——极简

所以我们选择了极简——而我最喜欢的极简地图是布达佩斯,尤其是从 Budapest Open Data Portal收集的其海拔等高线。地图清晰地展示了多瑙河如何将城市分成两半,右侧的佩斯区是多么的平坦(大约在海平面上 100 米),而布达山丘则从 500 米的高空俯视它!

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

第 26 天 — 极简

第 27 天 — 点

对于我的点地图,我再次选择了Budapest Open Data Portal,它提供了布达佩斯的一个很好的栅格化人口地图(关于人口栅格数据的更多信息,也可以查看我关于 TDS 的教程)!然后,我将每个网格单元转化为其多边形的 POI,并用一个大小与相应网格单元中的居民数量成比例的标记绘制每个 POI。随后,我随机将每个点涂成红色、蓝色和白色,赋予它这种略显复古的 3D 效果(我也要承认,今年我成了霓虹红蓝色调的最大粉丝,这在某种程度上受到《星球大战》的启发)。

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

第 27 天 — 点

第 28 天 — 这是图表还是地图?

毫无疑问,这是最奇怪的主题。我应该制作一个地图吗?最后,我决定重新创建我最喜欢的地图衍生可视化之一,这个可视化最初是由Geoff Boeing设计的。这个地图本质上显示了一个特定城市——这里是一系列欧洲城市——的扩展程度。这可以通过测量道路段的总长度来轻松捕捉,这些道路段的方向落在某个范围内(例如,0 到 5 度之间)。然后,将这些转化为极坐标条形图,我们得到了城市道路网络的有趣数字足迹:

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

第 28 天 — 这是图表还是地图?

第 29 天 — 人口

在这里,我回顾了我之前的文章,𝐄𝐱𝐩𝐥𝐨𝐫𝐢𝐧𝐠 𝐋𝐚𝐫𝐠𝐞-𝐬𝐜𝐚𝐥𝐞 𝐑𝐚𝐬𝐭𝐞𝐫 𝐏𝐨𝐩𝐮𝐥𝐚𝐭𝐢𝐨𝐧 𝐃𝐚𝐭𝐚,发布在 Towards Data Science,在文章中我探讨了两组全球人口数据,这些数据以栅格格式提供,并展示了如何在全球、国家和城市层面进行可视化和处理。

“𝘐 𝘩𝘢𝘷𝘦 𝘰𝘧𝘵𝘦𝘯 𝘴𝘦𝘦𝘯 𝘣𝘦𝘢𝘶𝘵𝘪𝘦𝘶𝘭 𝘱𝘰𝘱𝘶𝘭𝘢𝘵𝘪𝘰𝘯 𝘮𝘢𝘱𝘴 𝘤𝘪𝘳𝘤𝘶𝘭𝘢𝘵𝘪𝘯𝘨 𝘰𝘯𝘭𝘪𝘯𝘦; 𝘩𝘰𝘸𝘦𝘷𝘦𝘳, 𝘐 𝘶𝘴𝘶𝘢𝘭𝘭𝘺 𝘨𝘰𝘵 𝘴𝘵𝘶𝘤𝘬 𝘢𝘵 𝘴𝘰𝘮𝘦 𝘵𝘦𝘤𝘩𝘯𝘪𝘤𝘢𝘭 𝘱𝘢𝘳𝘵𝘴, 𝘭𝘪𝘬𝘦 𝘷𝘪𝘴𝘶𝘢𝘭𝘪𝘇𝘪𝘯𝘨 𝘰𝘵𝘩𝘦𝘳 𝘮𝘢𝘱 𝘴𝘦𝘨𝘮𝘦𝘯𝘵𝘴 𝘵𝘩𝘢𝘯 𝘴𝘩𝘰𝘸𝘯 𝘪𝘯 𝘵𝘩𝘦 𝘵𝘶𝘵𝘰𝘳𝘪𝘢𝘭 𝘰𝘳 𝘵𝘶𝘳𝘯𝘪𝘯𝘨 𝘵𝘩𝘦 𝘭𝘢𝘳𝘨𝘦-𝘴𝘤𝘢𝘭𝘦 𝘳𝘢𝘴𝘵𝘦𝘳 𝘥𝘢𝘁𝘢 𝘪𝘯𝘵𝘰 𝘮𝘰𝘳𝘦 𝘤𝘰𝘮𝘱𝘶𝘵𝘢𝘵𝘪𝘰𝘯-𝘧𝘳𝘪𝘦𝘯𝘥𝘭𝘺 𝘷𝘦𝘤𝘵𝘰𝘳 𝘧𝘰𝘳𝘮𝘢𝘵𝘴. 𝘐 𝘰𝘷𝘦𝘳𝘤𝘰𝘮𝘦 𝘴𝘰𝘮𝘦 𝘰𝘧 𝘵𝘩𝘦𝘴𝘦 𝘴𝘩𝘰𝘳𝘵𝘤𝘰𝘮𝘪𝘯𝘨𝘴 𝘪𝘯 𝘵𝘩𝘪𝘴 𝘢𝘳𝘵𝘪𝘤𝘭𝘦 𝘸𝘪𝘵𝘩 𝘢 𝘩𝘢𝘯𝘥𝘴-𝘰𝘯 𝘨𝘶𝘪𝘥𝘦 𝘵𝘰 𝘵𝘸𝘰 𝘱𝘳𝘪𝘮𝘢𝘳𝘺 𝘨𝘭𝘰𝘣𝘢𝘭 𝘱𝘰𝘱𝘶𝘭𝘢𝘵𝘪𝘰𝘯 𝘥𝘢𝘵𝘢 𝘴𝘰𝘶𝘳𝘤𝘦𝘴.”

还需要注意的是,除了美学价值之外,人口数据显示它们的地图是最基本的信息之一,并且是任何城市发展位置智能任务中可以收集和整合的有价值的信息。它们在规划新设施选址捕捉分析估计城市产品规模描述不同邻里等使用场景中尤为重要。

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

第 29 天——人口

第 30 天——我最喜欢的

为了结束今年的地图挑战,我决定不挑选我个人的最爱,而是选择人们最喜欢的前 12 个城市,展示它们基于 OpenStreetMap 的路网,使用 OSMNx 包。现在我已经使代码完全可重复使用,最初是在数据可视化协会发布的,文章链接如下,开头是:

“路网是城市的鸟瞰图,放大了的指纹,展示了城市的悠久话题城市规划的基石以及空间数据科学。作为今天城市规划的一个主要目标,即设计宜居的、未来-proof 的城市,通过像15 分钟城市这样的概念,这里我汇总了最宜居城市的顶级列表,并提供了这些城市的路网的可视化概览——以ChatGPT的方式呈现。”

一切都结束了——这就是我上一周做#30DayMapChallenge 的总结。第一年我选择了完整包,学到了很多,玩得很开心,还花了很多时间尝试让地图看起来美观,无论话题是什么!

查看第三周的概览这里!

查看第二周的概览这里!

查看第一周的概览这里!

我在人工智能领域获得博士学位的旅程

原文:towardsdatascience.com/my-journey-to-phd-admission-in-artificial-intelligence-35593adb923f?source=collection_archive---------0-----------------------#2023-06-18

关于在未知领域中导航的个人回忆

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

·

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

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

照片由 Casey Olsen 提供,来源于 Unsplash

一切就此结束!

在经过 6 个月的紧张大学申请和焦急的倒计时之后,我很高兴地说我将在 2023 年秋季攻读人工智能博士学位。我决定写这篇博客,分享我在这段旅程中学到的宝贵经验和遇到的挑战,这些都让这一切成为可能。

背景

关于我的一点背景,我在印度一所顶级私立学校完成了机器人与自动化学士学位。这所学校在全国排名第 63 位,在该州前 10(大约 500 所大学中)。我选修了机器学习和人工智能课程,这激发了我对这一领域的兴趣。虽然在那里度过的时光塑造了我的学术成功,但我常常疑惑为什么当时没有考虑研究的道路。我遇到了一些幸运的人,他们在本科期间发现了对研究的热情,并积极与教授合作,参与同行评审期刊或会议论文的撰写。显然,早期发表可以成为游戏规则的改变者,我也见证了它如何积极塑造了该领域其他人的档案。

在本科毕业后,我在一家初创公司担任机器学习工程师(MLE)。虽然我的时间相对较短,但我获得了使用流行深度学习框架——TensorFlow 的宝贵经验。我参与了一个集中于神经网络量化的项目,涵盖了训练、评估和推断阶段。通过这个过程,我学会了如何构建神经网络架构,修改图层,并从头开始创建内核,使我对 TensorFlow 的底层源代码有了全面的了解。参与这样的项目(即使是个人项目)将培养深度学习优化技术的坚实基础,增强作为研究员的思维能力。它还将提供不仅是预训练算法的最终用户的信心,还能设计符合研究目标的定制或特定神经网络模型。

尽管有些人跳过了在行业中工作的这一过程(这完全没问题!),但我个人看到了合作并获得实践经验的价值,这让我在继续攻读研究生学业时具备了优势。这个过程教会了我如何有效地与团队成员合作,如何将项目从构思推进到完成,以及如何无畏地深入探究,在过程中制造和打破事物。总的来说,我作为机器学习工程师的短暂经历是一次非常充实的旅程,为我下一阶段的旅程奠定了基础。

无论你在旅程中处于何处,不要担心错失的机会。考虑一下你在接下来的日子里能控制的事物,并把精力投入到下一个最重要的事情上。

作为下一步,我进入了一个硕士项目,旨在深入探索人工智能。在此期间,我享受了创建一个作品集网站、LinkedIn 个人资料和定制简历以展示我的能力的额外挑战。基本上,建立一个专业品牌。展望未来两年,并不断增加对未来目标有意义的内容。但这还不是全部!这段时间还通过各种演讲锻炼了我的沟通技能,有效地让我传达我的想法。与来自不同背景的专业人士合作,帮助我建立了一个能够持续一生的强大网络。我还有机会作为课程的一部分参与令人兴奋的实际项目,这帮助我建立了研究作品集,并深深地培养了对研究的热情。

我相信,对研究的热情源于对研究潜力的好奇心,这种潜力能够推动特定领域的边界,同时对社区产生积极影响。此外,你还会有机会与跨大学的研究人员合作——这教会了你准备研究实验室会议、批判性思维和科学写作的过程。它还为你提供了参加技术会议的机会,在那里你可以与来自全球不同领域的专家互动。这与探索感兴趣领域的自由相结合,就是我所说的理想“研究者的世界”——一个好奇心、韧性、合作和影响力交织的世界。我的研究经验属于负责任的人工智能(Responsible AI)这一大范畴,我希望成为隐私保护的人工智能/机器学习系统的专家。每天 intellectually 刺激我的,是阅读现有文献、制定研究问题以及设计实验以检验我的假设的过程。

在硕士课程的第二年,我有三个选择:课程学习、项目基础和论文基础。从一开始,我就决定选择论文,这确保了通向博士学位的道路始终对我开放。论文是完成硕士学位的最具挑战性的路径,与博士论文非常相似,但规模小得多。我认为自己很幸运,找到了一个与我兴趣紧密相关的论文指导老师。在生成性人工智能(Generative AI)在行业内掀起热潮之前,我就对基于计算机视觉的生成模型产生了兴趣。经过数月的相关文献阅读、多个精心设计实验的迭代和与导师的一对一会议,我成功完成了题为“Phoenix — 一个联邦生成扩散模型”的论文。

下面是我在这个过程中学到的一些关键经验:(1)通过跟踪你感兴趣领域的预印本和同行评审的研究工作,保持相关性;(2)主动识别机会并解决人工智能领域的动态变化中的空白;(3)准备进行严格的实验,以彻底测试你的方法。对于所有打算攻读博士学位的硕士生来说,我的建议是:享受学习的过程,并记住抓住每一个超越课程的机会。

博士申请过程

一旦我决定攻读人工智能领域的博士学位,我意识到还有很多工作要做——完全不知道从哪里开始申请过程。作为家中第一个踏入这个未知领域的人,我通过博客和视频进行了大量自学,每个博客和视频都详细描述了他们申请博士的个人经历。我理解和遵循的核心要点如下,

  • 项目 — 更深入地研究你想攻读的项目(计算机科学、人工智能或电子工程),然后缩小你的研究兴趣范围。这可以是你已经熟悉的领域,或者你可以选择进入一个新的、令人兴奋的领域,进一步探索你热衷的方向。

  • 大学 — 选择大学没有明确的指导方针,但通常人们会参考一些大学排名网站(如 csranking、drafty.cs、usnews),并申请梦校、目标校和保底校的组合。然而,我建议不要完全依赖排名列表来作为决策的唯一标准。研究设施、跨学科合作和资金机会更为重要。记住,作为博士生,你的生活在很大程度上依赖于研究质量和导师的指导,这比大学本身更为重要。

  • 潜在导师 — 这是可能是最重要的考虑因素。阅读你潜在导师的出版物,看看是否有特别吸引你兴趣的内容。建立一个强大且支持性的关系对你接下来 4 年以上的生活至关重要——在这一过程中分配足够的时间来彻底决定。个人而言,我在每所大学选择了两位与我的研究兴趣一致的导师。我还记下了关键点(例如,我对他们的哪些工作印象深刻、我为何适合、我们的共同目标和兴趣等),这些我可以在个人沟通和申请论文中提及。

  • 个人陈述—— 这是展示你的写作技巧和突出你研究成就的最佳机会。请不要以“自从我出生以来,我就想做研究”等通用短语开头。要现实地自豪地描述你的研究背景,包括它的起源时间和地点。你还应详细说明你最显著的研究成果、社区参与和志愿活动。此外,添加一些关键点,说明为什么你会选择与某位导师合作,以及这将如何强化你的研究生涯。这篇文章应该清晰地表达你为什么值得在他们的大学/研究实验室追求博士学位。我见过一些样本文章还突出个人挑战及其克服方式,但这完全取决于你是否愿意在个人陈述中包含这些内容。虽然添加所有这些技术细节很重要,但不要忘记注入最能代表你的个人风格。毕竟,这不是一份报告!

  • 推荐信—— 你需要至少三位教授的强有力推荐信。然而,你也可以请求两位教授和一位在行业内知名人士的推荐信。虽然信件内容是保密的,但你可以请求与你有良好工作关系的个人撰写信件。这样,这些信件更有可能传达出对你性格和独立研究能力的积极评价。

我的检查清单

在整个入学申请过程中,我保持了一个电子表格来保持组织性。这个表格可以跟踪我阅读的博客、任何突发的想法以及所有我打算申请的大学的全面列表。这里列出了一些表格字段,但可以根据需要自定义,因为没有一个模板适合所有人。

** University
* Department/Program
* Links
* Personal Ranking
* Deadline
* Tests GRE/TOEFL
* Application Fee
* Potential Advisors
* Recommendation Letters
* Extra Notes*

大多数入学申请截止日期从 12 月初到 1 月中旬。为了让这一过程更可控、更少压力,我决定每天申请一所大学。申请提交后,进入了等待阶段。这个阶段开始时充满了查看 gradcafe、discord 群组的诱惑,这让集中精力于日常活动变得更加困难。我建议不要像我一样陷入这个循环,因为结果会在 2 月后逐渐公布。在此期间,你还可能会开始收到来自教授的邮件,表达他们对进一步对话(如匹配面试)的兴趣,无论是面对面还是虚拟的。

反思和教训

  • 尽早开始——研究、研究、再研究!不仅是你的发表作品,还有潜在的大学、导师以及工作领域。

  • 建立你的个人资料 — 收集所有本科期间的成果,并考虑建立一个作品集网站以突出你的成就。

  • 建立网络 — 利用 Linkedin 的力量,与那些经历过类似道路的其他人建立联系。他们通常会提供来自个人经验的见解。

好事需要时间,而伟大的事物则需要更长的时间。

希望这对那些想开始申请博士学位的朋友有所帮助。虽然这听起来可能很艰难和具有挑战性,但这个过程是值得的。不要被未选择这条道路的同龄人或身边的人所影响。选择这条少有人走的路,过程会更加激动人心,需要极大的热情和努力!祝好运,我们在另一端见 😃

我最欣赏的 AI 科学家:李飞飞博士、安妮玛·安南库玛博士、达芙妮·科勒博士

作品集Linkedin我作为艺术家

我在#30DayMapChallange 的第二周

原文:towardsdatascience.com/my-second-week-of-the-30daymapchallange-11fbab10cae6

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

我对#30DayMapChallange 第二周的个人看法,这是一个旨在每年 11 月每天设计主题地图的社交挑战。

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

·发表于Towards Data Science ·阅读时间 5 分钟·2023 年 11 月 14 日

自 2019 年以来,每年 11 月,地理信息系统(GIS)和空间分析社区都会变得非常忙碌——这要归功于一个有趣的挑战,称为#30DayMapChallange。每年,这个挑战都有一个主题日程,提出一个主题作为当天地图可视化的主要方向。虽然预定义的每日主题确实意味着对创造力的限制,但它们也帮助参与者找到共同的兴趣,分享数据源,并以视觉和技术的方式表达个人风格。

在这里,我想简要概述我在此挑战的第二周,详细说明并展示我创建的不同地图——通常是用 Python 制作的。

在这篇文章中,所有图片均由作者创建。

第 8 天 — 非洲

为了启动第二周,我利用了联合国粮农组织发布的[非洲河流](https://lnkd.in/dZ6rZeGG https://lnkd.in/dUZFPdBN)数据集。它们的 GIS 文件包含近 20 万条线性多边形,属于河流,并具有几个参数,如其主要流域或每段弯曲的 Strahler 流序。我用这些字母来设置每条河流的颜色和宽度;等级越高,河流越暗且越细,从一阶溪流到 8 阶主干河流。

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

第 8 天 — 非洲

第 9 天 — 六边形

这个图有点复杂,但基于 Uber 的H3 六边形。首先,我从IUCN 红色名录受威胁物种的地理空间数据库收集了所有(大约 5000 种)哺乳动物物种栖息地的多边形格式数据。然后,我通过逐对比较计算每个物种栖息地的空间重叠。由于多边形的复杂性,如果使用简单的 GeoPandas 覆盖,这将耗费大量时间,因此我将每个栖息地分割成六边形,并仅通过共享的六边形 ID 数量捕捉栖息地的重叠。这样,我成功地将网络节点定义为物种,并将它们的网络连接定义为它们的六边形 ID 集合的 Jaccard 相似度指数(它们共享栖息地的相对比例),然后我可以使用 Gephi 可视化它们。

最后,网络节点的大小基于它们的度中心性 — 即它们与之共享栖息地的其他物种的数量。此外,每个节点的颜色 — 依然是物种 — 基于其最大栖息地国家的主要颜色,为这个网络图赋予了最终的世界地图效果。

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

第 9 天 — 六边形

第 10 天 — 北美

这张地图展示了基于自然地球数据集的北美道路网络,直观地展示了 49,183 段道路,并清晰地显示了大陆的形态和人口密度的变化,北部道路稀疏,而在人口较多的地区则呈现整齐的网格结构。

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

第 10 天 — 北美

第 11 天 — 复古

在这里,主题是复古的 — 所以我回顾了不久前由 Towards Data Science 发布的一张怀旧地图,展示了布达佩斯和维也纳公开可用除颤器设备的可达性。每个交点的颜色表示可达时间,从绿色到红色,显示从跑步速度到达最近设备所需的时间,范围从 0 分钟(绿色)到 10 分钟(红色),用红色区域捕捉了最关键的区域。

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

第 11 天 — 复古

第 12 天 — 南美

第 12 天,我使用 OpenStreetMap(OSMNx)和维基百科数据构建了我的地图。特别是,我收集了所谓的经济复杂性指数,这是一个宏观经济指标,捕捉一个国家的生产能力。利用网络理论,这个指标源自国家的国际贸易档案以及进出口模式,衡量国家的经济稳定性和潜力。作为一种以简化方式量化整个国家的测量方法,还允许比较和排名国家,它有着长长的支持者和批评者名单,但这留待另日讨论。至于地图,像往常一样,我在 Python 中构建了它,使用了 OSMNx、Matplotlib、urllib,并且为了给最终效果增添黑暗模式的底图,使用了 contextily。

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

第 12 天 — 南美洲

第 13 天 — 色斑图

在这张地图和相关的文章中,我提出并解决了一个流行且关键的城市发展问题——绿色平等和绿色区域的可达性。我在这篇文章中使用维也纳的政府开放数据来探索这些概念,通过计算维也纳不同社区的人均绿地面积,并将其与当地的财政状况相关联。原文发布在Towards Data Science

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

第 13 天 — 色斑图

第 14 天 — 欧洲

这张欧洲地图显示了每个国家的每平方公里人口密度,基于 WorldPop 发布的 100x100 米建模网格数据。正如我在原始文章中所写,我展示了如何创建这样的地图的教程,我经常看到网上流传着漂亮的人口地图;然而,我通常在一些技术细节上卡住,比如如何可视化教程中未显示的地图段,或将大规模栅格数据转换为更易于计算的矢量格式。在这篇文章中,我通过实用指南克服了这些不足,介绍了两个主要的全球人口数据来源。阅读全文教程这里。

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

第 14 天 — 欧洲

这是我进行#30DayMapChallenge 的第二周总结——还有两周时间,所以准备好迎接更多地图吧!现在,在我的Patreon频道上,还有视频和代码教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值