TowardsDataScience 博客中文翻译 2021(一百八十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

连接朴素贝叶斯和逻辑回归:二元分类

原文:https://towardsdatascience.com/connecting-naive-bayes-and-logistic-regression-binary-classification-ce69e527157f?source=collection_archive---------4-----------------------

概率、似然和张量流概率库

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

给企鹅分类【照片由马丁·韦特斯坦Unsplash 上拍摄】

朴素贝叶斯和逻辑回归都是非常常用的分类器,在这篇文章中,我们将试图找到并理解这些分类器之间的联系。我们还将使用帕尔默企鹅数据集来看一个例子,该数据集在 CC-0 许可下可用。你希望从这篇文章中学到什么?

  • 概率和可能性基础。
  • 朴素贝叶斯分类器是如何工作的?
  • 区分和生成分类器。
  • 朴素贝叶斯和逻辑回归之间的联系。

这里使用的所有公式都来自我的笔记本,链接和其他有用的参考资料都在参考资料部分。我们开始吧!

概率和可能性:

每个概率分布都有一个连续分布的概率密度函数(PDF ),如高斯分布(或离散分布的概率质量函数或 PMF,如二项式分布),表示样本(某点)取特定值的概率。该函数通常由 P ( y | θ 表示,其中 y 是样本值, θ 是描述 PDF/PMF 的参数。当一个以上的样本彼此独立抽取时,我们可以写成—

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

情商。1:独立绘制样本的 PDF。

当我们知道分布(和相应的参数 θ )并想要推导出ys 时,我们在计算中考虑 PDF。这里我们认为 θ 对于不同的样本是固定的(已知的),并且我们想要推导出不同的 y 。似然函数是相同的,但是有所改变。这里 y 是已知的,而 θ 是我们想要确定的变量。至此,我们可以简单介绍一下最大似然估计(MLE)的思想。

极大似然估计: MLE 与数据的建模密切相关;如果我们观察数据点 y 1, y 2,…, yn 并假设它们来自一个由 θ 参数化的分布,那么似然性由 L ( y 1, y 2,…、yn|θ);对于 MLE,我们的任务是估计最大似然的θ。对于独立观察,我们可以将最佳θ的表达式写成如下所示—

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

情商。2:最大化可能性

优化的惯例是最小化一个函数;因此,最大化似然归结为最小化负对数似然。这些是我们稍后将会用到的概念,现在让我们转到朴素贝叶斯分类器。

朴素贝叶斯分类器:

朴素贝叶斯分类器是生成分类器的一个例子,而逻辑回归是鉴别分类器的一个例子。但是我们所说的生成性和辨别力是什么意思呢?

**判别分类器:**一般来说,分类问题可以简单地认为是预测给定输入向量的类别标签p(C _ k|x)。在判别模型中,我们假设p(C _ k|x)的某种函数形式,并直接从训练数据中估计参数。

**生成分类器:**在生成模型中,我们估计p(x|C _ k)的参数,即每个类的输入的概率分布以及类先验 p ( C_k )。两者都用在贝叶斯定理中计算p(C _ k|x)。

我们已经将类别标签定义为 C_k ,让我们在此基础上定义贝叶斯定理——

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

情商。3:贝叶斯定理,x 是训练数据 C_k 代表类别标签。

p ( x )可以认为是一个归一化常数;p(x)=∑p(x|C _ k)p(C _ k),∑超过类标签 k

让我们考虑一个一般化的场景,其中我们的数据有 d 个特征和 K 个类,那么上面的等式可以写成—

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

情商。4:同 Eq。3 但是对于具有 d 特征的数据。

给定类 Y ,通过“天真地”假设每个数据特征 X_i 是相互条件独立的*,可以极大地简化类条件概率项。现在我们重写等式(2.2),如下所示***

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

情商。5:同 eq。但是对于给定的类 y,数据特征有条件地相互独立。

这是朴素贝叶斯分类器的基本方程。一旦估计了类别先验分布和类别条件密度,朴素贝叶斯分类器模型就可以为新的数据输入 X 做出类别预测 Y ^ (y hat)

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

情商。6:对新数据点的类别预测。

由于我们这里的分母 p ( X_ 1, X_ 2,…, X_d )对于给定的输入是常数。我们可以用最大后验概率(MAP)估计来估计p(Y=c _ k)和p(X _ I|Y=c _ k)。前者则是训练集中类别的相对频率。这些在我们后面做编码部分的时候会更加清晰。

不同的朴素贝叶斯分类器的区别主要在于它们对p(X _ I|Y=c _ k)的分布所做的假设。这对于 MAP 估计非常重要,例如,如果我们假设类别条件是单变量高斯分布,则需要确定的参数是均值和标准差。要估计的参数数量取决于特征和类别。

连接朴素贝叶斯和逻辑回归:

代替上述具有 K 类的朴素贝叶斯分类器的一般化情况,我们简单地考虑 2 个类,即 Y 现在是布尔型(0/1,真/假)。由于逻辑回归(LogReg)是一种判别算法,它从假设P(Y|X)的函数形式开始。

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

情商。7:用于逻辑回归任务的 Sigmoid 函数。

正如所料,逻辑回归的条件类分布的函数形式基本上是 sigmoid 函数。在另一篇文章中,我详细讨论了如何从线性回归开始实现逻辑回归。可以使用训练数据导出参数(权重 w )。我们可以拓展情商。7,对于 Y(类标签)为布尔型—

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

情商。8:同 Eq。7,但明确是为二进制分类编写的。

对于给定的 X,要指定 Y=0,我们施加一个简单的条件如下—

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

在 Eq 上加一个条件。8,并在第二步中对两边应用自然对数。

我们将使用高斯朴素贝叶斯(GNB)分类器,恢复 P(Y|X)的形式,并将其与逻辑回归结果进行比较。

高斯朴素贝叶斯作为二元分类器;

在高斯朴素贝叶斯(GNB)分类器中,我们将假设类条件分布p(X _ I|Y=c _ k)是单变量高斯分布。让我们明确地写出假设—

  1. Y 有一个布尔形式(即 0/1,真/假),它由伯努利分布控制。
  2. 既然是 GNB,对于类条件句P(X _ I|Y=c _ k)我们假设一元高斯。
  3. 对于所有 ijIX_iX_j 都是有条件独立给定 Y

让我们用贝叶斯法则写出P(Y= 1 |X)

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

情商。9:类似于 Eq。4,但只为 Y=1 而写。

我们可以通过引入指数和自然对数来进一步简化这个方程,如下所示—

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

情商。10:由等式简化而来。用一种更适合与逻辑回归比较的形式来写它。

让我们假设p(y= 1 |x)=π,p(y= 0 |x)= 1-π并且还使用给定类别标签的数据点的条件独立性来将上面的等式重写如下——

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

情商。11:来自 Eq。10 我们假设P(Y= 1 |X)=π的先验分布,并使用条件独立性。

对于类别条件P(X _ I|Y=c _ k)我们假设单变量高斯函数带参数N(μ_ { ik】σ_i ),即标准偏差为我们将用它来简化上面等式的分母。

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

情商。12:简化等式中的分母。11 假设类条件句由单变量高斯函数描述。

我们可以将该表达式用于之前的等式(等式)。11)以更简洁的形式写出 Y=1 的后验分布,如下所示

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

情商。13:使用等式中的表达式。12 回到 Eq。11

P(Y= 1 |X)写成这种形式,让我们有了直接和 Eq 比较的可能。8,即逻辑回归的条件类分布的函数形式,我们根据高斯均值和标准差获得参数(权重和偏差),如下所示—

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

情商。14:以高斯平均值和标准偏差表示的逻辑回归参数。

这里,我们从高斯朴素贝叶斯分布出发,得出了逻辑回归的生成公式,并且,对于给定的二元分类问题,我们还可以找到这两种分布的参数之间的关系。

实现高斯朴素贝叶斯;循序渐进:

理解上述步骤的最佳方式是实现它们,为此,我将使用 Palmer Penguin 数据集,它与 Iris 数据集非常相似。让我们从导入必要的库和加载数据集开始。

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

这是一个数据集,包括 3 种不同的企鹅‘阿德利’、‘巴布亚’和‘下颚带’,以及一些特征,如喙长、鳍长等。都是给定的。我们可以看到企鹅类基于两个参数“喙长度”和“喙深度”的分布,使用简单的一行代码如下—

penguin_nonan_df = penguin.dropna(how=’any’, axis=0, inplace=False)
sns_fgrid=sns.FacetGrid(penguin_nonan_df, hue=”species”, height=6).map(plt.scatter, “bill_length_mm”, “bill_depth_mm”).add_legend()plt.xlabel(‘Bill Length (mm)’, fontsize=12)plt.ylabel(‘Bill Depth (mm)’, fontsize=12)

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

图 1:基于 2 个不同参数的不同企鹅种类的分布。(来源:作者笔记本)

为了简单起见,我们将只选择这两个特性,而不是使用所有可用的特性。

penguin_nonan_selected_df = penguin_nonan_df[['species', 'bill_length_mm', 'bill_depth_mm']]X=penguin_nonan_selected_df.drop(['species'], axis=1)Y=penguin_nonan_selected_df['species']from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=30, stratify=Y)print (X_train.shape, y_train.shape, X_test.shape)>>> (266, 2) (266,) (67, 2)X_train = X_train.to_numpy()
X_test = X_test.to_numpy()y_train = y_train.to_numpy()
y_test = y_test.to_numpy()

要从头开始构建朴素贝叶斯分类器,首先,我们需要定义类的先验分布,在这种情况下,我们将计算唯一类的数量,然后除以样本总数,以获得类的先验分布。我们可以定义如下—

让我们打印基于训练样本的先验分布—

prior = get_prior(y_train)print (prior)print (‘check prior probs: ‘, prior.probs,)>>> [0.43984962 0.20300752 0.35714286]
tfp.distributions.Categorical("Categorical", batch_shape=[], event_shape=[], dtype=int32)
>>> check prior probs:  tf.Tensor([0.43984962 0.20300752 0.35714286], shape=(3,), dtype=float64)

定义先验分布后,我们将定义类别条件分布,正如我之前所述,对于高斯 NB,我们将假设单变量高斯分布,如下式所示。记住,对于我们的问题,我们有 2 个特性和 3 个类。

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

情商。15:高斯分布作为类条件

为了定义类别条件,我们需要知道均值和方差,对于正态分布,它们可以很容易地计算出来,查看这里的。

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

情商。16:等式中类别条件分布的均值和方差。15:

让我们把它们放在一起,定义类条件函数。

再次检查代码块,理解并领会它确实给了我们 Eq。15 使用等式的平均值和方差。16.我们还可以打印来检查训练数据的均值和方差—

class_conditionals, mu, sigma2 = class_conditionals_MLE(X_train, y_train)print (class_conditionals)print (‘check mu and variance: ‘, ‘\n’)print (‘mu: ‘, mu, )print (‘sigma2: ‘, sigma2, )# batch shape : 3 classes, event shape : 2 features>>> tfp.distributions.MultivariateNormalDiag("MultivariateNormalDiag", batch_shape=[3], event_shape=[2], dtype=float64)>>> check mu and variance:
>>> mu:  [ListWrapper([39.017094017093996, 18.389743589743592]), ListWrapper([49.12592592592592, 18.479629629629624]), ListWrapper([48.063157894736854, 15.058947368421052])]
>>> sigma2:  [[7.205861640733441, 1.5171597633136102], [10.038216735253773, 1.1042146776406032], [9.476642659279785, 0.9687357340720222]]

最后,我们在测试集上进行预测。因此,我们逐个样本地选择,并使用来自先验概率和类别条件的信息。这里我们构建一个函数来表示 Eq。5 和情商。这是我们在文章开头写的。

def predict_class(prior_dist, class_cond_dist, x):“””We will use prior distribution (P(Y|C)), class-conditional distribution(P(X|Y)),and test data-set with shape (batch_shape, 2).“”” y = np.zeros((x.shape[0]), dtype=int) for i, train_point in enumerate(x): likelihood = tf.cast(class_cond_dist.prob(train_point), dtype=tf.float32) #class_cond_dist.prob has dtype float64 prior_prob = tf.cast(prior_dist.probs, dtype=tf.float32) numerator = likelihood * prior_prob denominator = tf.reduce_sum(numerator) P = tf.math.divide(numerator, denominator) # till eq. 5 #print (‘check posterior shape: ‘, P.shape) Y = tf.argmax(P) # exact similar to np.argmax [get the class]
       # back to eq. 6 y[i] = int(Y) return y

我们可以预测测试数据点的类别,并将它们与原始标签进行比较

predictions = predict_class(prior, class_conditionals, X_test)

为测试数据点绘制决策边界(使用等高线图)将产生下图

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

图 2:使用 GNB 分类器的测试数据集的决策区域。(来源:作者笔记本)

以上所有任务都可以用 Sklearn 完成,只需要几行代码—

from sklearn.naive_bayes import GaussianNBsklearn_GNB = GaussianNB()
sklearn_GNB.fit(X_train, y_train)predictions_sklearn = sklearn_GNB.predict(X_test)

了解这些基本算法的幕后工作总是好的,我们可以比较与我们之前获得的参数非常接近的拟合参数—

print ('variance:',  sklearn_GNB.var_)print ('mean: ', sklearn_GNB.theta_)>>> variance: [[ 7.20586167  1.51715979]
 [10.03821677  1.10421471]
 [ 9.47664269  0.96873576]]
mean:  [[39.01709402 18.38974359]
 [49.12592593 18.47962963]
 [48.06315789 15.05894737]]

让我们绘制决策区域,以便与我们的硬编码 GNB 分类器进行比较—

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

图 3:与图 2 相同,但结果来自使用 Sklearn 库。(来源:作者笔记本)

他们看起来和预期的非常相似。让我们移动到明确连接 GNB 和逻辑回归分类器的二元分类问题。

来自 GNB 的逻辑回归参数:

如前所述,为了将朴素贝叶斯和逻辑回归联系起来,我们会想到二元分类。由于企鹅数据集中有 3 个类,首先,我们将问题转化为一个 vs rest 分类器,然后确定逻辑回归参数。同样关于 GNB 作为二元分类器的推导,我们将使用相同的σ_i 用于两个不同的类(没有 k 依赖性)。这里我们会找到 6 个参数。4 为 μ_{ik} & 2 为 σ_i 。这排除了使用我们之前使用的类条件函数的可能性,因为在标准差公式中使用了 μ_{ik} ,并且均值取决于类和特征。所以我们要写一个函数,用梯度下降型优化来学习类独立标准差。这是主要的编码任务。

在所有这些之前,我们需要对标签进行二值化,为此,我们将对标签为 2 的样本使用标签 1。

class_types_dict = {'Adelie':0, 'Chinstrap':1, 'Gentoo':2}y_train_cat = np.vectorize(class_types_dict.get)(y_train)y_train_cat_binary = y_train_caty_train_cat_binary[np.where(y_train_cat_binary == 2)] = 1 
# gentoo == chinstrapy_test_cat = np.vectorize(class_types_dict.get)(y_test)y_test_cat_binary = np.array(y_test_cat)y_test_cat_binary[np.where(y_test_cat_binary == 2)] = 1print (‘check shapes: ‘, y_train_cat_binary.shape, y_test_cat_binary.shape, y_train_cat_binary.dtype, ‘\n’, y_train_cat.shape)>>> check shapes:  (266,) (67,) int64
>>> (266,)

我们可以绘制数据分布图,如下图所示—

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

图 4:对巴布亚企鹅和下颚带企鹅使用相同的分类标签,将问题转化为二元分类。(来源:作者笔记本)。

我们可以使用先验分布函数来获得这两个类别的类别标签先验

prior_binary = get_prior(y_train_cat_binary)print (prior_binary.probs, print (type(prior_binary)))>>> [0.43984962 0.56015038]
<class 'tensorflow_probability.python.distributions.categorical.Categorical'>
tf.Tensor([0.43984962 0.56015038], shape=(2,), dtype=float64) None

与之前的先验分布相比,我们会看到 Adelie penguin 类具有相同的先验(0.43),并预期增加 Gentoo 和 Chinstrap 先验分布(≈ 0.20 + 0.35)。

为了学习标准差,我们将在给定数据和标签的情况下,使用梯度下降来最小化负对数似然。

一旦训练结束,我们就可以检索参数—

print(class_conditionals_binary.loc.numpy())print (class_conditionals_binary.covariance().numpy())

使用类条件句,我们可以绘制如下等高线——

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

图 5:2 类[0,1]的类条件轮廓。(来源:作者笔记本)。

我们也可以画出二元 GNB 分类器的判定边界——

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

图 6:使用 GNB 分类器的二元分类的判定边界。

一旦我们有了均值和对角协方差矩阵,我们就可以为逻辑回归寻找参数了。权重和偏差参数是使用等式中的均值和协方差导出的。14,让我们再重写一遍—

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

情商。17:用均值和协方差矩阵表示的逻辑回归参数。

就这样,我们到了帖子的末尾!涵盖了许多重要的基本概念,希望这对您有所帮助。

参考资料:

[1] 企鹅数据集,CC-0 许可,可自由改编。

[2]机器学习的书;卡内基梅隆大学的汤姆·米切尔;新章节

[3]本帖使用的完整笔记本。 GitHub 链接

保持坚强!!

连接人工智能、物联网、云和网络开发

原文:https://towardsdatascience.com/connecting-the-dots-ai-iot-cloud-and-web-dev-848447e1ca66?source=collection_archive---------34-----------------------

使用趋势技术进行端到端解决方案开发的小旅程

最终目标和步骤:

这个项目背后的想法是确定我在家工作的性能,并了解如何使用物联网设备、AWS 云以及简单的 Web 应用程序在 edge 上使用计算机视觉来改善我的工作站设置。

此外,我想分享在开发过程中发现的挫折,以及我为解决这些挫折而采取的措施。

所以,根据需求,我的第一个想法是这样的:

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

我工作站上方的摄像机,为了确定脸部位置,我拍摄作者

一旦定义了初始设置,我就开始确定获取数据所需的最少工具,在本例中是相机;由于在 LPR 识别文章 中我使用了 SV3C 低成本摄像头,我决定使用相同的摄像头,因为集成已经使用 HTTP 完成。

这些是最初的图像:

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

右中我作者法师

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

空,左,我作者法师

我使用了两个脚本来获取这些图像,一个用 Python,一个用 Bash(注意:关于这个项目的所有信息都可以在下面的 Github repo 中获得)。第一个用于创建名为create-folder-structure . sh的文件夹结构,第二个用于收集名为 collect_images.py 的数据。

获取输入数据:

此时,我有了每个位置的设置和 200 张图像,我开始考虑如何使用这些图像,所以我最终使用带有 EfficientNetB0 的迁移学习作为特征提取器,只训练最后一层。这里是 Colab 链接

仅仅过了几个纪元,我就能达到 80%以上的准确率。然而,我在实时测试中发现了一些挫折,因为我的想法是基于我的头部位置进行训练。然而,网络实际上学习了我的肩膀和手臂的位置,所以我有了更多的选择,如获得更多的数据,获得不同的图像,数据增强和更复杂的网络。不过,我想保持简单,所以我做了更多的研究,找到了一种新的方法。

基于我最初的想法,我想跟踪我的脸,经过一些研究,我发现了一个名为 MoveNet 的神经网络,它由谷歌在 2021 年发布,能够检测身体中的 17 个关键点(鼻子,左眼,右眼,左耳,右耳,左肩,右肩,左肘,右肘,左手腕,右手腕,左臀部,右臀部,左膝盖,右膝盖,左脚踝,右脚踝),通过前五个关键点,我有了一些关于我的脸的信息,或者任何信息

另外,我改变了摄像机的位置。这就是做一个真正的项目而不是用数据集测试和学习的区别。对于真实的项目,您可以更改输入数据,并验证新数据是否比以前的数据提供了更多信息,我可以这样做,因为这是一个端到端的项目。

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

我是作者的法师

有了这个信息,现在的方法是检测这 5 个关键点,并选择 ML 分类器来确定头部的位置。

选择分类器:

作为面向 ML 初学者的趋势技术的一部分,有几个 AutoML 解决方案( FLAMLMLJAR ),所以我决定测试 FLAML 并获得使用哪个分类器的初始方向

只用几行代码:

from flaml import AutoML
automl = AutoML()
automl.fit(X_train, y_train, task=”classification”, time_budget=120)

我在验证集里得了 84 分

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

最佳 ML 解决方案*,作者本人作者

但是在测试集中有 93%。

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

作者法师

这里是用于 MoveNet 未来提取和 AutoML 分类器的 Colab

与 AWS 物联网的集成:

一旦我设置好获取图像,使用 MoveNet 获取关键点,并使用 FLAML 对图像进行分类,我想将信息发送给 AWS。一个有趣的服务是 AWS 的物联网核心,所以这是我最后要介绍的基本架构:

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

建筑,我作者法师

基本架构描述:

SV3C 摄像头符合 OVNIF 标准。OVNIF 有一些使用 HTTP 协议获取图像快照的标准方法,允许您随时获取图像,而不必处理视频流。你可以在 Github 中看到这个请求。

对于终端设备和 AWS 物联网核心之间的通信,我使用了 MQTT,这是一种帮助我轻松通过远程设备进行通信和操作的通信协议,允许我在未来添加任何智能开关,以便在我离开办公室时关灯。

这部分是基于下面的 AWS 博客来使用 Python awsiotsdk

关于我正在使用的 AWS 服务,两者都是无服务器的,可以扩展到数十亿台设备,我只为我使用的服务付费(按需付费)。对于 DynamoDB,集成基于以下文档。我还将图片上传到一个 S3 桶中,并存储在一个名为 predictions 的文件夹中,这将帮助我验证模型的行为。

然后我们有 Streamlit,我现在在本地使用它只是为了得到一个概述。

在 JetsonNano 中运行它:

当我准备好模型并在我的电脑上工作后,我决定将它转移到 Jetson Nano 上时,真正的挑战就开始了。主要原因是 Jetson 耗尽了内存,AutoML 库(Flaml)有一些问题需要安装。

经过进一步的研究,我发现使用 Tflite 的 MoveNet 模型解决了内存问题,但我仍然有 Flaml 库的问题。然而,这个博客中提到了解决方案;我建议 AutoML 获得一个初始方向,并且基于从 Flaml 库获得的输出,我找到了 AutoML 建议的模型的特定库,在这种情况下, LGBM 如(最佳 ML 解决方案*)图所示。

参见realtimepredictionmovenetflaml.py中的 Tflite 实现和本 Colab 中的初始测试

参见本 Colab 中的 LGBM 培训

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

作者法师

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

杰特森留言,我法师作者

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

AWS 物联网控制台记录消息

运行项目的脚本:

  • 要进行实时推断并将数据发送给 AWS:

python realtimepredictionmovenetflaml.py

  • 要在本地运行 Streamlit 服务器:

streamlit run app.py

  • 要从相机收集图像:

python collect_images.py

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

网页原型,作者本人图片

从原型到产品的改进和评论:

本项目有许多需要改进的地方,例如:

  • 从 Streamlit 到 SPA 的变化可能类似于 React.js
  • 使用更多图像进行训练,以提高准确性
  • 添加数据扩充
  • 添加基础设施作为配置所有 AWS 服务的代码
  • 获取更多指标
  • 添加可见性(日志)

为数据科学家、分析师和工程师连接到 SQL 数据库

原文:https://towardsdatascience.com/connecting-to-sql-databases-for-data-scientists-analysts-and-engineers-58dc77a9165e?source=collection_archive---------8-----------------------

了解如何利用企业中最常见的数据存储来源之一。

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

本杰明·雷曼在 Unsplash 上的照片

无论你是在构建分析还是在寻求训练一个机器学习模型,数据工程、分析和科学的基础都是对数据的访问。数据本身可以从许多不同的来源收集:web 抓取、API 调用、平面文件;但是跨企业的数据存储的最常见来源之一是结构化数据库,它通常被称为 SQL 数据库。

SQL 数据库是一个包罗万象的术语,指的是使用结构化查询语言(SQL 查询)进行交互的关系数据库管理系统(RDBMS)。SQL 数据库能够快速处理和存储大量数据,使其成为企业中非常常用的数据存储和管理应用程序。

虽然 SQL 语言能够对数据库执行标准分析(GROUP BY/FILTER/etc……),但在实践中,许多企业不鼓励直接在数据库本身上大量使用 SQL,因为它们要么是热数据库(根据它们所服务的软件应用程序的需要而活动),要么是报告数据库(从热数据库同步,专门用于数据提取)。此外,由于 SQL 语言的限制,许多统计和机器学习工具不可用,因此在企业环境中,在处理数据之前摄取数据是常见的做法。

数据接收是从一个存储介质(源)获取数据并将其转储到另一个更适合数据操作的存储介质(接收器)的过程。谈到大数据,企业环境中最常见的大规模数据吸收汇是数据湖(通常通过 Hadoop 生态系统)。一旦数据进入湖中,就可以由任何 Hadoop 生态系统工具(Spark、Pig 等)自由转换或操纵。)或转换成开发者喜欢的不同形式。为了将数据从 SQL 数据库接收到您选择的介质中,必须使用连接器作为开发的软件应用程序的一部分。

ODBC / JDBC 驱动程序

开放式数据库连接(ODBC)是数据库采用的 API 标准,它允许软件应用程序与数据库管理系统(DBMS)接口。在这方面,ODBC 驱动程序或 Java 数据库连接器(JDBC)驱动程序都是这些标准的实际应用,它们可以被软件应用程序用来连接到如图 1 所示的数据库。

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

图 1 软件应用程序通过 ODBC/JDBC 驱动程序连接到 SQL 数据库的描述(图片由作者提供)

由于每个数据库引擎(MySQL、Microsoft SQL、PostGreSQL、Oracle 等)的内部操作不同,每个数据库引擎都有自己特定的 ODBC/JDBC 驱动程序用于交互。然而,这些 ODBC/JDBC 驱动程序的功能都是相似的,因此许多编程语言都有一种标准的方式来调用用于连接这些数据库的各种 ODBC/JDBC 驱动程序。一旦软件应用程序加载了 ODBC/JDBC 驱动程序,该驱动程序就被配置为指向 SQL 数据库并与之交互,这需要设置:主机/URL、数据库名称以及可以访问数据集的凭证。

为了演示从 SQL DB 获取或加载数据的不同连接方式,本教程将介绍使用 Python (pyodbc 包)、Spark(Scala Spark 和 PySpark)和 Sqoop(Hadoop 生态系统的数据获取工具)获取数据。此外,Docker 将用于容器化环境,以更接近地模拟企业环境,并允许读者轻松复制演示。

码头工人

Docker 是一个允许您轻松构建和部署轻量级虚拟机(也称为容器)的工具,这些虚拟机可以连接起来形成一个网络。在大多数实际的企业环境中,需要来自 SQL 服务器的数据的软件应用程序不会在与 SQL 服务器相同的机器上运行,因此我们可以使用图 2 所示的 Docker 体系结构来模拟这样的企业环境。

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

图 2 使用 Docker 容器和网络的模拟企业环境(图片来自作者)

为了便于跟随教程,上面的 Docker 环境和所有用于连接 MySQL 数据库的脚本都可以在 GitHub [1]上找到。

使用 MySQL 设置 SQL 数据库

MySQL 是一个用于存储和管理企业架构中常见的结构化数据的通用数据库引擎,它代表了一个用于本地部署的开源(并且容易获得)SQL DB,以构建我们的沙盒企业环境。

mysql 提供了一个基本的 Docker 映像,mysql/mysql-server [2],它在一个容器中启动一个预安装的 MySQL 实例,该实例将在我们的模拟企业环境中充当 SQL Server。

此 Docker 图像接受。sql 脚本作为容器初始化时运行的命令,我们可以使用它(与。下面的 sql 脚本)来配置数据库,并为我们的连接测试创建假数据。

*-- Create database**CREATE DATABASE test_db;**USE test_db;**-- Create table**CREATE TABLE test_table(**row_id INT AUTO_INCREMENT PRIMARY KEY,**test_value VARCHAR(255) NOT NULL**);**-- Fill table with values**INSERT INTO test_table(test_value) VALUES ("A");**INSERT INTO test_table(test_value) VALUES ("b");**INSERT INTO test_table(test_value) VALUES ("C");**INSERT INTO test_table(test_value) VALUES ("4");**-- Add user with remote access priveleges**CREATE USER "remote_connect_user"@"%" IDENTIFIED BY "remote_connect_password";**GRANT ALL PRIVILEGES ON * . * TO "remote_connect_user"@"%" WITH GRANT OPTION;**FLUSH PRIVILEGES;*

上面的代码执行两个主要功能:

  1. MySQL 服务器创建一个数据库(名为 test_db ),在数据库中创建一个表(名为 test_table ),并用少量记录填充 test_table(见下面的表 I ),当我们尝试提取数据时,可以在接收端验证这些记录
  2. MySQL 服务器创建一个用户帐户(名称:remote_connect_user,密码:remote_connect_password ),该帐户具有远程访问数据库的权限

表 I: test_db.test_table 值

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

设置好 MySQL 数据库后,我们可以专注于如何通过各种软件应用程序提取数据,在本教程中从 Python(和 pyodbc 包)开始。

使用 Python 的 MySQL 数据库连接(通过 pyodbc)

通过使用 pip install 调用许多可用的 ODBC 包之一,可以很容易地使用 Python 连接到 SQL DB。在本教程中,我们将重点关注使用 pyodbc [3]包使用 Python 连接到 MySQL DB,该包作为 Docker 映像 laudio/pyodbc [4]提供,并包含 MySQL ODBC 8.0 驱动程序。

为了连接到容器以建立 python 连接,我们可以运行命令:

*docker exec -it sql-ingestion-tutorial-python-client-1 python*

它远程连接到容器,并在容器中启动 python 的交互式会话。

加载 python 后,我们可以使用下面的代码来加载 pyodbc 包,配置驱动程序的设置以连接到我们的 MySQL 实例,并运行测试查询来选择*并在控制台中输出结果。

*# Imports**import pyodbc**# Set configuration for DB**MYSQL_HOST="mysql-server"**MYSQL_USER="remote_connect_user"**MYSQL_PASS="remote_connect_password"**MYSQL_DB="test_db"**MYSQL_TABLE="test_table"**# Establish connection to MySQL DB**cnxn = pyodbc.connect(f"DRIVER={{MySQL ODBC 8.0 Driver}};SERVER={MYSQL_HOST};DATABASE={MYSQL_DB};UID={MYSQL_USER};PWD={MYSQL_PASS}")**cursor = cnxn.cursor()**# Run query to select * and output results**cursor.execute(f"SELECT * FROM {MYSQL_TABLE}")**row = cursor.fetchone()**while row:* *print (row)* *row = cursor.fetchone()*

在这种情况下,pyodbc.connect 函数引用 MySQL DB 的预安装 odbc 驱动程序,并且该驱动程序被配置为包括服务器 URL、数据库名称和运行查询所调用的凭证。然后,test 命令通过对 DB 中的表运行 SELECT *语句来引用这个连接,并迭代地打印输出,如下所示。

(1, 'A')
(2, 'b')
(3, 'C')
(4, '4')

使用 Apache Sqoop 的 MySQL 数据库连接

Apache Sqoop [5]是 Hadoop 生态系统中的一个工具,用于结构化数据库中的数据与 Hadoop 文件存储之间的批量传输。虽然 Apache Sqoop 已于 2021 年 6 月退役[6],但该工具通常被企业用来将数据吸收到数据湖中,实际上需要一段时间才能从企业生产系统中完全退役。

与其他容器类似,Apache Sqoop 可以使用 dvoros/sqoop 映像[7]立即获得,该映像预装了 Apache Sqoop 和所有用于支持 Sqoop 的 Hadoop 生态系统工具。

Sqoop 映像不包含 JDBC 驱动程序,Sqoop 将使用该驱动程序连接到 MySQL 数据库,因此正在启动的 Docker 容器包括将 JDBC 驱动程序装载到容器中,当该容器放置在/usr/local/sqoop/lib 文件夹中时,Sqoop 将自动识别该容器。考虑到要连接到一个 MySQL 数据库,我们可以通过下载 MySQL 网站[8]上提供的连接器的平台无关版本来获得这个连接器。

Sqoop 本身有许多参数来帮助实现常见的数据摄取功能[9],但是出于本教程的目的,演示将是使用下面给出的代码以文本形式从 MySQL 数据库到 HDFS 的基本摄取:

*# Create the data ingestion location**hdfs dfs -mkdir /user/sqoop* *# Sqoop import example**MYSQL_HOST=mysql-server**MYSQL_USER=remote_connect_user**MYSQL_PASS=remote_connect_password**MYSQL_DB=test_db**MYSQL_TABLE=test_table**sqoop import --connect jdbc:mysql://$MYSQL_HOST/$MYSQL_DB --table $MYSQL_TABLE --username $MYSQL_USER --password $MYSQL_PASS --as-textfile --target-dir /user/sqoop/text -m 1**# Test the output**hdfs dfs -ls /user/sqoop/text**# Inspect the parquet file**hdfs dfs -cat /user/sqoop/text/part-m-00000*

如代码所示,首先在 HDFS 创建一个目标文件夹来存储接收到的数据。Sqoop 摄取过程直接从命令行执行,与建立连接的其他应用程序类似,MySQL 连接器被引用并配置为指向正确的表位置和凭证。

1,A
2,b
3,C
4,4

代码的最终结果如上所示,它验证了 MySQL 数据库的快照已经被 HDFS 接收。此时,可以通过 Spark 或其他方式在 Hadoop 中原生拾取。

使用 Spark 的 MySQL 数据库连接

与上面的例子类似,我们可以利用 Spark 自带的 Docker 容器,在这种情况下,我们将使用 jupyter/pyspark-notebook 映像[10]。然而,与其他连接不同,当我们提交应用程序时,我们必须将 JDBC 驱动程序作为一个添加的 jar 文件包含在 Spark 中。下面是 Scala Spark 和 PySpark 连接 MySQL 数据库的示例代码。

使用 Scala Spark 连接 MySQL 数据库

与之前的容器一样,我们首先运行以下命令来连接 Spark 容器并调用 Scala 提示符:

*docker exec -it sql-ingestion-tutorial-pyspark-client-1 spark-shell --jars /jdbc/**

连接到 Scala 提示符后,以下命令调用 JDBC 驱动程序连接到 DB 并打印结果数据以验证连接成功。

*// Set configuration for DB**val MYSQL_HOST="mysql-server";**val MYSQL_USER="remote_connect_user";**val MYSQL_PASS="remote_connect_password";**val MYSQL_DB="test_db";**val MYSQL_TABLE="test_table";**// Establish connection for MySQL DB using credentials provided**val df = (spark.read**.format("jdbc")**.option("url", s"jdbc:mysql://$MYSQL_HOST/$MYSQL_DB")**.option("driver", "com.mysql.cj.jdbc.Driver")**.option("dbtable", MYSQL_TABLE)**.option("user", MYSQL_USER)**.option("password", MYSQL_PASS)**.load())**// Display results for validating successful connection**df.show()*

成功建立连接后,将生成以下输出。

+------+----------+
|row_id|test_value|
|     1|         A|
|     2|         b|
|     3|         C|
|     4|         4|
+------+----------+

使用 PySpark 连接到 MySQL 数据库

为了连接到 PySpark 提示符,将调用之前使用的同一个容器,但是下面的命令将启动一个 PySpark 会话来连接到 DB。

*docker exec -it sql-ingestion-tutorial-pyspark-client-1 pyspark --jars /jdbc/**

调用 JDBC 驱动程序并提取数据的 PySpark 版本代码如下:

*# Set configuration for DB**MYSQL_HOST="mysql-server"**MYSQL_USER="remote_connect_user"**MYSQL_PASS="remote_connect_password"**MYSQL_DB="test_db"**MYSQL_TABLE="test_table"**# Establish connection for MySQL DB using credentials provided**df = spark.read.format('jdbc').options(**url = f"jdbc:mysql://{MYSQL_HOST}/{MYSQL_DB}",**driver = "com.mysql.cj.jdbc.Driver",**dbtable = MYSQL_TABLE,**user = MYSQL_USER,**password = MYSQL_PASS**).load()**# Display results for validating successful connection**df.show()*

成功建立连接后,将会看到以下输出。

+------+----------+
|row_id|test_value|
|     1|         A|
|     2|         b|
|     3|         C|
|     4|         4|
+------+----------+

结论

没有数据,分析或数据科学就没有机会让业务受益。大多数企业系统严重依赖 SQL 数据库来存储大量数据,并不是每个团队都有专门的数据工程师或数据仓库来提供对开发数据的轻松访问。在这种情况下,值得你自己学习这些技能,让你的生活变得更轻松。本文简要介绍了如何使用 ODBC 和 JDBC 连接器在软件应用程序中建立与数据库的连接,并使用 Python (pyodbc 包)、Sqoop 和 Spark (PySpark 和 Scala Spark)进行了演示。

参考

[1] SQL 摄取教程 Github 页面,https://github.com/mkgray/sql-ingestion-tutorial

[2] MySQL 服务器 Dockerfile,【https://hub.docker.com/r/mysql/mysql-server/

[3] PyODBC 包,【https://pypi.org/project/pyodbc/

[4]pyodbc dock file,https://hub . docker . com/r/laudo/pyodbc

[5] Apache Sqoop,https://sqoop . Apache . org/

[6] Apache Sqoop Attic,https://attic . Apache . org/projects/sqoop . html

[7]Apache sqoop docerfile,https://hub . docker . com/r/dvosos/sqoop

[8] MySQL JDBC 连接器,https://dev . MySQL . com/downloads/connector/j/

[9] Apache Sqoop User Guide,https://sqoop . Apache . org/docs/1 . 4 . 6/sqoop user guide . html

[10]spark dock file,https://hub . docker . com/r/jupyter/pyspark 笔记本电脑

使用虚拟网络对等和 ARM 模板连接两个分立虚拟网络

原文:https://towardsdatascience.com/connecting-two-discrete-vnets-using-vnet-peering-and-arm-templates-c33a96812d9c?source=collection_archive---------33-----------------------

利用 VNet 对等和 Azure ARM 模板从我们的代码构建基础设施

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

照片由 Unsplash 上的 israel palacio 拍摄

动机:

如果操作不当,连接虚拟网络有时可能会很麻烦。一次又一次地创建它,会更容易出错。因此,我们将利用来自 Azure 的名为 Azure ARM Templates 的服务,以幂等的方式部署我们的基础设施。我们也将只为一些任务使用门户网站,但它的大部分将从模板完成。

建筑:

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 1。2021.JPEG 文件。

先决条件:

  1. Azure 帐户
  2. Azure 虚拟机
  3. Azure VNet
  4. ARM 模板

Azure 虚拟网络:

Azure 虚拟网络是 Azure 在云中的网络。这个虚拟网络可以细分成不同的子网。在本练习中,我们将创建两个虚拟网络:东和西,每个虚拟机有两个子网,其中东 VNET 仅限于私有 IP,西可以访问公共 IP,如上图所示。稍后,我们将使用 VNet 对等来连接不同地区的这两个不同的 VNet。

ARM 模板:

ARM 模板是以 JSON 形式编写基础设施以获得最大可用性的幂等方法。创建虚拟机、虚拟网络和子网是一个非常漫长的过程,我们在创建过程中可能会出现错误,因此,ARM 模板是首选。我已经创建了 ARM 模板,并且在我的 GitHub 上。但是不要担心,我会教你如何编写 ARM 模板,更重要的是生成它们,因为从头开始编写非常困难。

假设我已经创建了一些基础设施,我想为它创建一个 ARM 模板。进入资源组,选择资源,导出模板。

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 2。2021.JPEG 文件。

然后点击下载按钮。

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 3。2021.JPEG 文件。

您将获得 template.json 和 parameter.json。template . JSON 包含您想要使用其详细信息创建的基础结构,parameter . JSON 包含您想要为资源指定的唯一名称。在这篇文章中,我将添加我自己的默认值。您可以通过 parameter.json 添加唯一的名称,并输入下面给出的命令。

在您使用 CLI 执行命令后,它可能无法运行,因为您必须对 JSON 文件进行一些整理,比如删除订阅 id 以实现动态可用性,还需要删除不必要的键值对。对于这篇文章,你不必担心,因为我提供的 JSON 已经发挥到了极致。打开代码后,这里是您需要线性输入的命令。

az group create --name oss-east-rg --location eastusaz group create --name oss-west-rg --location westusaz deployment group create --resource-group oss-east-rg --template-file template.jsonaz deployment group create --resource-group oss-west-rg --template-file template.json

虚拟网络对等:

我们将使用一个门户来对等这两个虚拟网络。进入东方虚拟网络,设置,peering+Add

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 4。2021.JPEG 文件。

我们应该记住,我们连接的是东到西,但也是西到东,所以有两个空白的对等链接名称。填写基本信息,点击添加。

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 5。2021.JPEG 文件。

演示:

现在,让我们连接到具有公共 IP 地址(west)的虚拟机,然后使用不同 VNet 上的私有 IP 地址连接到 east。我已经在存储库中提供了 PEM 文件。先从西 VM 说起。

sudo ssh -i vm.pem azureuser@104.40.10.98

已经建立了连接。

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 6。2021.JPEG 文件。

现在,让我们使用私有 IP 连接到东部虚拟机。记得将 PEM 文件复制到虚拟机本身。

sudo ssh -i vm.pem azureuser@10.0.0.4

再次建立了连接。

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

苏拉布什雷斯塔。使用 VNet 对等和 ARM 模板连接两个分立的 VNet 7。2021.JPEG 文件。

结论:

我们展示了如何利用 Azure ARM 模板轻松创建复杂的基础设施。这只是最低限度,因为我们可以向 ARM 模板添加越来越多的内容。还有其他工具,如 Terraform 和 Pulumi,我们可以利用它们以声明和命令的方式编写 IaC 代码。可能性是无限的,选择是无限的,你想做什么取决于你自己。如果你遇到任何问题或难以遵循这些步骤,请在下面评论这篇文章或在 tsulabh4@gmail.com 给我发消息。也可以在 LinkedinGitHub 上和我联系。

资源:

[1] Azure 虚拟网络:https://docs . Microsoft . com/en-us/Azure/Virtual-Network/Virtual-networks-overview

[2] ARM 模板:https://docs . Microsoft . com/en-us/azure/azure-resource-manager/templates/overview

将微件连接到可视化

原文:https://towardsdatascience.com/connecting-widgets-to-visualizations-dc668bbeaeb?source=collection_archive---------43-----------------------

使用 IPyWidgets 创建小部件来控制可视化

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

来源:作者

数据可视化有助于分析数据中肉眼不可见的隐藏模式。它有助于理解数据行为和数据关联。有各种各样的可视化工具可用于分析数据,如条形图、散点图等。

当我们试图分析不同的数据点时,控制可视化会很有帮助。它不仅有助于控制数据,还可以用来显示一个数据点相对于其他数据点的表现。

IPyWidget 是一个开源 Python 库,用于创建有助于控制图形或数据并使其具有交互性的小部件。

在本文中,我们将探讨如何使用通过 IPyWidgets 创建的小部件来控制数据可视化。

让我们开始吧…

安装所需的库

在本文中,我们将使用 Bokeh 创建一个可视化,并使用 IPyWidgets 创建小部件。所以我们需要使用 pip 安装来安装这些库。下面给出的命令将安装这两个库。

!pip install bokeh
!pip install ipywidgets

导入所需的库

在这一步中,我们将导入创建可视化和小部件所需的所有库。

import numpy as np
import bokeh
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show, output_notebook
from ipywidgets import interact

创建可视化

现在我们将创建想要使用小部件控制的可视化。在创建可视化之前,我们需要运行散景命令来显示笔记本中的可视化。

output_notebook(bokeh.resources.INLINE)x = np.linspace(0, 2*np.pi, 2000)
y = np.sin(x)
source = ColumnDataSource(data=dict(x=x, y=y))
p = figure(title="Bokeh example", plot_height=300, plot_width=600)
p.line('x', 'y', source=source, color="#2222aa", line_width=3)
show(p, notebook_handle=True)

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

可视化(来源:作者)

创建小部件

现在我们将开始创建小部件,我们将使用它来控制我们上面创建的可视化。

def update(f, w=2, A=1, phi=0):
    if   f == "sin": func = np.sin
    elif f == "cos": func = np.cos
    elif f == "tan": func = np.tan
    source.data['y'] = A * func(w * x + phi)
    bokeh.io.push_notebook()_ = interact(update, f=["sin", "cos", "tan"], w=(0,100), A=(1,10), phi=(0, 10, 0.1))

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

来源:作者

现在我们将使用这个小部件来控制我们上面创建的可视化。

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

来源:作者

在这里,您可以清楚地看到我们如何控制我们创建的可视化的不同方式。继续尝试不同的可视化效果,并使用小部件控制它们,让我知道你在回复部分的评论。

本文是与 Piyush Ingale 合作完成的。

在你走之前

感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。

ConnectorX:加载 Python 数据框最快的库

原文:https://towardsdatascience.com/connectorx-the-fastest-way-to-load-data-from-databases-a65d4d4062d5?source=collection_archive---------4-----------------------

理解大数据

用一行代码将 Pandas read_sql 加速 10 倍

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

NASAUnsplash 上拍摄的照片

ConnectorX 旨在通过向开发人员提供高效、轻量级且易于使用的工具来加快从数据库加载数据的过程。在本文中,我们将通过回答以下问题为您简要介绍 ConnectorX:

什么是 ConnectorX?

ConnectorX 是一个开源库,可以加速将数据从数据库加载到像 pandas 这样的数据结构中。数据框用于进一步处理和分析。

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

ConnectorX 的高级工作流程示例

ConnectorX 由两个主要概念组成:(例如 PostgreSQL )和目的地(例如熊猫。数据帧。ConnectorX 会将用户给出的 SQL 查询转发给,然后高效地将查询结果从传输到目的地。上图显示了当前支持的源和目的地的示例。

为了同时提供高效的性能和强大的功能,ConnectorX 中繁重的提升工作量被写成了 Rust。它还有一个带有简单 API 的 Python 绑定,可以轻松地与 Python 中的其他数据科学库进行互操作。

接下来,让我们看看如何通过一行代码以不同的方式使用 ConnectorX。

如何使用 ConnectorX?

步骤 1:安装连接器 x:

pip install connectorx

第二步:用 read_sql 从数据库加载数据。使用连接字符串定义源,默认情况下目的地是 pandas。数据帧可以通过设置 return_type 来改变:

import connectorx as cx

# source: PostgreSQL, destination: pandas.DataFrame
df = cx.read_sql("postgres://postgres:postgres@localhost:5432/tpch", "SELECT * FROM lineitem")

查询结果将返回一只熊猫。数据帧如下所示:

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

为了进一步提高速度,ConnectorX 支持通过对查询进行分区并并行执行分区查询来提高 CPU 和带宽资源的利用率。用户可以指定分区列,也可以手动定义分区查询:

# specify the partition column and number of partitions
df = cx.read_sql("postgres://postgres:postgres@localhost:5432/tpch", "SELECT * FROM lineitem", partition_on="l_orderkey", partition_num=4)

# manually partition the query
# the partition bellow is equivalent with the one above
df = cx.read_sql("postgres://postgres:postgres@localhost:5432/tpch", [
    "SELECT * FROM lineitem WHERE l_orderkey > 0 AND l_orderkey <= 15000000",
    "SELECT * FROM lineitem WHERE l_orderkey > 15000000 AND l_orderkey <= 30000000",
    "SELECT * FROM lineitem WHERE l_orderkey > 30000000 AND l_orderkey <= 45000000",
    "SELECT * FROM lineitem WHERE l_orderkey > 45000000 AND l_orderkey <= 60000000"
])

ConnectorX 将并行运行所有分区查询,并将所有查询结果连接成一个单独的 pandas。数据帧。至于分区,目前,对于 SPJA 查询,ConnectorX 支持对整数列进行自动分区。下面是一个更复杂的查询示例:

query = f”””
SELECT l_orderkey,
 SUM(l_extendedprice * ( 1 — l_discount )) AS revenue,
 o_orderdate,
 o_shippriority
FROM customer,
 orders,
 lineitem
WHERE c_mktsegment = ‘BUILDING’
 AND c_custkey = o_custkey
 AND l_orderkey = o_orderkey
 AND o_orderdate < DATE ‘1995–03–15’
 AND l_shipdate > DATE ‘1995–03–15’
GROUP BY l_orderkey,
 o_orderdate,
 o_shippriority 
“””df = read_sql(“postgresql://postgres:postgres@localhost:5432/tpch”, query, partition_on=”l_orderkey”, partition_num=4)

请查看我们的 Github repo 获取更多用法和示例!

为什么 ConnectorX 是更好的选择?

其他常用的 Python 库如 Pandas 已经提供了类似的 read_sql 函数,那么为什么还要使用 ConnectorX 呢?为了回答这个问题,让我们来看一个简单的基准测试,我们将 ConnectorX 与其他三个现有的解决方案( PandasModinDask )进行了比较,这三个解决方案也能够将数据从数据库加载到数据框。

我们使用来自 TPC-HLINEITEM 表,并将比例因子设置为 10。该表包含 60M 记录 x 16 列,如果转储到 CSV 文件中,其大小为 8 GB,在 PostgreSQL 中为 11 GB。我们测量每个解决方案从数据库加载整个表并写入到 pandas 所需的时间。不同并行度(1 到 10 核)和带宽条件下的 DataFrame 。我们还测量了该过程中每种方法的峰值内存使用量。我们在这里展示的测试结果是在一个 AWS r5.4xlarge 实例上进行的,我们在该实例上运行 ConnectorX,并从运行在 AWS RDS 上的 db.m6g.4xlarge 实例上的 PostgreSQL 加载数据。(有关其他数据库的更多基准测试结果,请点击查看。)结果显示,在所有场景中,ConnectorX 都是速度最快、内存效率最高的解决方案!

  1. 更快的数据加载

下图显示了使用 4 个 CPU 内核测试不同方法速度的结果。我们可以看到,ConnectorX 是所有解决方案中速度最快的,在 PostgreSQL 上比 ModinPandasDask 分别加快了 3x 、 **10x、**和 20x 的数据加载速度!

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

read_sql (4 核)的时间比较

我们还改变了用于 read_sql 的内核(分区)数量,从 1 到 10 不等,并在不同的网络条件和机器下进行了测试。( Dask 由于内存不足(OOM)无法使用完一个内核。Pandas 不支持并行,所以我们只使用一个内核。)我们发现 ConnectorX 在所有设置中始终优于其他方法。

2。更小的内存占用

接下来,我们来看看每种方法的内存使用情况。这里我们绘制了 4 核设置的比较结果。我们可以看到 ConnectorX 使用的内存比其他方法少 3 倍。在不同的并行度下,结果是相同的。

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

read_sql 的内存比较(4 核)

【ConnectorX 是如何做到这一点的?

ConnectorX 实现这一性能的三个主要原因是:

  1. **用原生语言编写:**与其他库不同,ConnectorX 是用 Rust 编写的,避免了用 Python 实现数据密集型应用的额外成本。
  2. 精确复制一次:当从数据库下载数据时,现有的解决方案或多或少会进行多次数据复制,而 ConnectorX 的实现遵循“零复制”原则。我们设法精确地复制数据一次,直接从目的地,即使是在并行的情况下。
  3. **CPU 缓存高效:**我们应用了多项优化,使 ConnectorX CPU 缓存友好。与“零拷贝”实现不同,ConnectorX 中的数据处理是以流的方式进行的,以减少缓存缺失。另一个例子是,当我们在 Python 中构造字符串时,我们将一批字符串写入一个预先分配的缓冲区,而不是为每个字符串分配单独的位置。

接下来会发生什么?

到目前为止,ConnectorX 支持广泛使用的,包括 PostgreSQL、MySQL、SQLite 以及其他采用相同有线协议的数据库(例如,通过 PostgreSQL 的 Redshift、通过 MySQL 的 Clickhouse)。我们现在正致力于增加更多的流行数据库和数据仓库。我们还计划在未来支持以不同的文件格式(如 CSV、JSON、Parquet)从数据存储(如亚马逊 S3 )传输数据。

至于目的地,ConnectorX 支持 Python 和 Rust 中所有流行的数据帧,包括熊猫阿帕奇箭头摩丁DaskPolars 。已完成和正在进行的源和目的地的完整列表可在这里找到。让我们知道你是否有其他的建议!

除了支持更多的源和目的地,该团队还在开发新功能,以帮助最大限度地减少数据加载的时间成本,例如维护一个客户端数据缓存。我们还对优化查询分区感兴趣,例如支持从数据库收集元数据的自动分区。您可以在 Github 上关注我们,了解我们的最新实施情况和下一步计划!

征服数据科学面试中的 Python 编码回合

原文:https://towardsdatascience.com/conquer-the-python-coding-round-in-data-science-interviews-5e27c4513be3?source=collection_archive---------2-----------------------

我 2021 年在印度班加罗尔作为数据科学家面试的经历。

编码环节已经成为数据科学面试不可或缺的一部分。尽管它可能无处不在,但对许多人来说,它也是一个可怕的回合。在这篇文章中,我的目标是通过分享我最近遇到的不同类型的编码采访和问题,用信息战胜恐惧。

让我们看看执行和提问的不同格式,并了解问题所测试的是什么概念。

格式 1 —现场编码

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

照片由 Unsplash 上绘制

你被要求打开一个编辑器(Jupyter 笔记本),与面试官分享你的屏幕。当一个候选人在整个过程中与面试官保持一致时,这是值得赞赏的。通常,面试官会将应聘者推向预期的方向。大多数面试官都很体贴,允许稍微搜索一下语法等。

一些例子:

Q1。探索新冠肺炎数据集。绘制各州的月环比 Covid 正数。显示六月份的前 3 个州。

https://www.kaggle.com/sudalairajkumar/covid19-in-india?select=covid_19_india.csv

概念测试

  1. 探索性数据分析

2。数据清理

3。处理缺失值

4。数据帧操作

5。执行聚合操作

6。日期时间操作

7。数据可视化

Q2。创建一个包含传感器值的虚拟数据集

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

传感器数据,虚拟数据集(图片由作者提供)

找出这个时间范围内压力与温度的最高比值。

概念测试—

  1. 探索性数据分析

2。数据清理

3。数据帧操作

4。执行聚合操作

5。日期时间操作

6。数据可视化

Q3。编写一个代码,从用户那里获取一个数字,并输出小于用户输入的所有斐波纳契数。

概念测试—

1。基本 Python 编程

2。基本逻辑思维

3。了解数据结构和算法(使用动态编程可以更快地解决这个问题)

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

照片由 LinkedIn 销售解决方案Unsplash 上拍摄

格式 2 —基于平台的测试

在 Hackerrank/Hackerearth(或其他)平台上作为定时测试执行。

公司使用这种测试来检查数据科学的各个领域。因此,常见的是混合了概率和统计、机器学习、深度学习的客观类型问题(比如 10 个问题,每个 2 分)和一些关于 SQL、机器学习和数据结构和算法的编码问题(很少但很明显)(2-5 个问题,其权重基于复杂性和概念)

几个例子:

Q1。给定一个分布的 CDF,求其均值。

概念测试— 基础概率论

Q2。人 A 决定进行一次跳伞旅行。根据他的研究,小故障导致死亡的概率是 0.001。如果 A 进行 500 次高空跳伞,死亡概率是多少?

解决方案选项:

答:50

b) .29

c) .39

d) .01

概念测试— 分布知识

Q3。给定 1 年期间欧洲 4 家商店出售的软饮料的数据集。执行数据争论和可视化。你能预测未来的需求并确定不同的特征如何影响它吗?如果合适,请使用评论和可视化方式向技术和非技术受众有效地解释您的发现。

概念测试数据科学项目直到建模的全部活动。

Q4。关于在样本数据集上编写 SQL 查询的问题。

概念测试— 联接、分区和排序、排序依据、分组依据

**Q5。给定两个数字 a,b;a<b .**的打印输出

f(a,b)= g(a)+g(a+1)+g(a+2)+…+g(b-2)+g(b-1)+g(b)

其中 g(x)定义为所有小于 x 的斐波那契数。

概念测试—

1。Python 编程

2。逻辑思维

3。数据结构和算法

Q6。给定一个数 X,求 X 的两个因子(a,b)的最小和

概念测试—

1。Python 编程

2。逻辑思维

Q7。使用 get 请求读取这个 链接 中的数据。它包含了莎士比亚的全部作品。删除 链接 中出现的数字和停止字。现在数数课文中出现的独特单词的数量。

概念测试—

  1. 使用 Get 和 Pull 请求读取数据

2.基本的自然语言处理,如停用词移除

3.将字符串拆分成标记

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

照片由 BRUNO EMMANUELLEUnsplash 拍摄

格式 3 —现场案例研究/带回家作业

这可以是现场(现在是在线)短期(1-3 小时)案例研究,也可以是为期 3-7 天的带回家作业,其中给候选人一个样本数据集(在大小和复杂性上与真实数据集非常相似),并要求其在 90 分钟内解决一个业务目标。指出他们需要向面试小组介绍他们的解决方案和思考过程。

在带回家的版本中,大多数公司理解人们也有他们的日常工作,并且足够体贴地在合理的范围内延长时间表。

亲提示:

这种形式是展示你知识广度和深度的好地方。超越所陈述的问题会得到高分。比如找与手头问题相似的文献(论文)。展示你的解决方案是如何受到论文启发的。如果小组特别要求基于深度学习的解决方案,那么就这样做,但也要创建一个机器学习解决方案,并比较和对比他们的结果。也许一个模型在数据的某些部分优于另一个。调查这些细分市场。尝试建立两者的整体模型。

这向面试小组展示了你超越了最低要求,并展现了你所有的技能。

举例: 零售交易案例分析

这家公司给了我一个礼品店两年的交易数据集。

商业问题:预测一个客户下个月是否要买一个产品。

他们坚持要我用深度学习技术解决这个问题。

这是一个完美的地方来展示我在模型制作方面的技能,我充分利用了上面提到的技巧来将面试转化为工作机会。

结论

我希望通过这篇文章,我减轻了对编码的恐惧,并在一定程度上平衡了比赛场地。它展示了公司测试应聘者编码和解决问题能力的各种方法。实践上面提到的概念肯定会有很大的帮助。

如有问题,您可以在 LinkedIn 上留言或给我发信息。

你可能也喜欢:

</4-types-of-data-science-interview-questions-part1-d17db4253c69> </4-types-of-data-science-interview-questions-part2-106f5bf7218d>

意识和人工智能

原文:https://towardsdatascience.com/consciousness-and-ai-8be0f8860247?source=collection_archive---------35-----------------------

播客

格奥尔格·诺瑟夫解释了一个好的意识理论如何能带来更好的人工智能

苹果 | 谷歌 | SPOTIFY | 其他

在过去的十年里,人工智能的进步主要是由深度学习推动的——这是一个直接从人脑的结构和功能中汲取灵感的研究领域。通过在大脑和计算机之间进行类比,我们已经能够建立计算机视觉、自然语言和其他预测系统,这在十年前是不可思议的。

但是类比有两种方式。既然我们已经有了自动驾驶汽车和人工智能系统,它们在日益复杂的任务中经常胜过人类,一些人想知道逆转通常的方法——并从人工智能中汲取灵感以告知神经科学的方法——是否可能是一种有前途的策略。这种更加数学化的神经科学方法正是今天的嘉宾格奥尔格·诺尔托夫正在研究的。Georg 是渥太华大学的神经科学、精神病学和哲学教授,作为他为神经科学发展更多数学基础的工作的一部分,他探索了一种独特而有趣的意识理论,他认为这种理论可能会成为开发更先进的人工智能系统的有用框架,从而造福人类。

以下是我最喜欢的对话内容:

  • 格奥尔格的意识理论强调感知的时间维度的重要性。他认为,如果某种东西的内部状态能够在很大范围的不同时间尺度上跟踪其环境的状态,那么它就是有意识的。作为一个例子,他引用了人类大脑及其欣赏音乐的能力,这要求我们对非常短时间范围内的事件(如单个音符或一小组音符)以及更长时间范围内的事件(如叠句和合唱)做出反应。这些不同的时间尺度被一起处理,导致对“旋律”的感知。他讨论了一些有趣的实验数据,这些数据支持大脑从根本上感知和处理不同时间尺度的观点,我们讨论了致幻剂和心理障碍对这种感知的影响。
  • 由于格奥尔格的理论从一个实体能够做出反应的时间和空间范围来确定它的意识水平,这表明人工智能没有理由不能变得有意识,而且它还表明人类可以变得比现在更有意识,只要增加我们能够感知的时间窗口。例如,人类无法从视觉上察觉时间尺度小于 30Hz(30 分之一秒)的事件。我们也往往不会注意到当时足够缓慢的视觉变化——例如,我们不认为植物是移动的生物,但它们在一天中确实移动了相当一部分,因为它们试图将自己朝向太阳。通过让自己对更多的时间尺度敏感,我们将能够欣赏更多的世界,甚至可能意识到更多的东西比我们想象的更有意识,包括像植物(移动太慢)和变形虫(移动太慢,而且太小)这样的东西。Georg 认为人工智能的一个重要用例将是人类直接感知在新的时间尺度上的延伸。
  • Georg 在一定程度上深入考虑了大脑/计算机类比,我们讨论了 OpenAI 的 GPT-3 等高级语言模型使用的处理策略与 Georg 主张的基于时间的处理相比如何。特别是,我们回顾了婴儿学习新单词和抽象概念的学习过程,以及今天深度学习系统使用的学习过程。Georg 认为这种比较提供了洞察力,可以导致更具表演性的人工智能系统。

你可以点击这里查看乔治的网站,或者点击这里在 Twitter 上关注我

播客中引用的链接:

  • 乔治出版了关于神经科学的书籍。

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

章节:

  • 0:00 介绍
  • 1:33 乔治的背景
  • 8:09 时标问题
  • 14:32 音乐示例
  • 18:00 与神经科学的联系
  • 26:44 衬底独立性和 AI
  • 人类文明和意识
  • 33:19 共同货币
  • 40:46 透视隐形实体
  • 43:42 气候变化示例
  • 51:51 生活经历
  • 55:12 大脑
  • 57:57 总结

请查看以下文字记录:

杰瑞米·哈里斯(00:00):
大家好,我是杰瑞米。欢迎回到“走向数据科学”播客,顺便说一下,该播客现在配备了一个全新的专业麦克风。对此我真的很兴奋。显然是如此兴奋,以至于我甚至没有等到摊位的到来。它仍由亚马逊运送,但我们会为您设置一整套专业设置,并很快准备就绪。我甚至不能在这一集使用它,但我想在这个介绍中使用它。

Jeremie Harris (00:19):
无论如何,尽管我对麦克风感到兴奋,但我对今天的嘉宾感到超级兴奋。我们采访了乔治·诺瑟夫,他是渥太华大学的神经科学、精神病学和哲学教授。他有一个令人着迷的意识理论,实际上是非常独特的,它与我们在前几集关于人工智能甚至人工智能安全的很多对话有着惊人的联系。我们会讨论意识理论。

Jeremie Harris (00:44):
如果我们要在未来设计更好的人工智能系统,我们还将研究 Georg 的想法,为什么意识对于理解意识非常重要,以及意识和大脑之间可能有什么联系。在这一集里,一大堆真正有趣的哲学、神经科学和人工智能的话题交织在一起。我希望你喜欢它。录制音乐非常有趣。我二话没说,就要让开了,让你们尽情聊天。乔治,非常感谢你能来参加这个节目。

格奥尔格·诺瑟夫(01:10):
不客气。

Jeremie Harris (01:11):
我听过很多你的演讲。我看过你很多关于意识主题的作品,也看过很多关于人工智能的第一次。我认为这是一个非常有趣的领域,因为现在很少有人探索这种协同作用。在我们深入讨论之前,我不想在这里超越自己。你能不能先给我们定位一下,你最初是怎么进入这个领域的,你的背景是什么?

Georg Northoff (01:33):
我最初的背景,我是一名神经科学家、精神病学家和哲学家,但我一直对大脑思维感兴趣。就大脑而言,我们并不真正知道大脑是如何工作的。我们只是不知道。我们喜欢模型和设计。我们现在有了一个特定的想法,并在整个演讲中展现出来。我现在可以用人工智能来探索我的一些想法,真正地探索它是否可行,因为你们大多数人都是工程师,这个东西必须可行。这证明了你的模型是正确的。

Georg Northoff (02:10):
另一件事是,我也是一名精神病医生,我看到这些病人,我们仍然在通过反复试验来治疗他们。我希望从大脑中学习一些东西,但超越大脑,我们可以通过使用一些人工智能设备更好地治疗这些患者。你会看到,在我的关注点,用户关注点…当然,对于临床医生,你需要一些分类,你有大规模数据集,10,000 名受试者,然后你会得到一些更好的。这不是我在《人工智能在精神病学中的案例》中预见的过去。

Jeremie Harris (02:44):
那么,可以公平地说,你正在使用人工智能作为一种更多地从基本原则出发解决大脑问题的方法,从我们可以更直接地理解和操纵的数学基础上建立它吗?

乔治·诺瑟夫(02:57):
是的。非常好的问题。我们缺少大脑的数学运算。我们不知道。我们也不知道神经元活动如何转化为精神活动。实际上,我的一个非常聪明的博士后学生,Kolozaki 元帅说,“你真的缺乏关于大脑内在特征的知识。”独立于认知的大脑的内在是什么?我们不知道。这基本上是你的基本设计原则,你需要知道,设计你的人工智能设备,设计你的深度学习网络,这可能是有帮助的。

杰里米·哈里斯(03:36):
对不起。在这种情况下,什么是内在特征?什么-

格奥尔格·诺瑟夫(03:39):
例如,对于大脑来说,你有不同的时间尺度。你操作,你很慢的时间尺度,很快的时间尺度。我给你举个例子。当你去海边的时候,你会去大西洋或太平洋,这里是加拿大。你有一个非常暴风雨的一天,你会看到很多缓慢的海浪。缓慢是极其强大的。

格奥尔格·诺瑟夫(04:01):
然后你会看到许多其他的波浪,慢一些,快一些,你会看到各种不同的波浪。不同持续时间的波浪,很强的,很强的,不太强的等等。大脑有丰富的时间尺度。我们称之为内在神经时间尺度。基本上不同的大脑区域,不同的时间尺度。例如,我认为这是大脑典型的内在特征。你和我不同。你和我的时间表略有不同,因为你和我是在不同的环境中形成的。

Jeremie Harris (04:44):
不,不。这真的很有趣,因为开幕式上有一个人,我叫他 Nick Camerata。他是他们安全小组的成员,他自己也做过很多探索性的药物实验。他贴了很多关于这个话题的非常有趣的链接。我看到的其中一项研究谈到了这一点……有一种特征性的频闪效应,当你服用 LSD 或某些种类的药物时,人们称之为频闪效应,每个人似乎都会经历遵循特定频率或特征模式的感官知觉扭曲。那和这个有关系吗?或者我说的太离谱了?

格奥尔格·诺瑟夫(05:23):
不,不,不。你说得很对,因为这个例子表明,你的感知和认知强烈依赖于你的时间尺度。这些人中的许多人随后体验到时间变快或扭曲或变慢。这决定了你能感知什么,以及你如何感知它。这就像你有一栋有很多不同窗户大小的房子,透过每扇窗户你都能看到不同的东西。你可以看到树枝,也可以看到树干,但是如果不把所有的时间尺度放在一起,你就不能把它们放在一起。

杰瑞米·哈里斯(06:03):
是的。

格奥尔格·诺瑟夫(06:06):
我现在可以向你展示我的观点。三个窗口,每个窗口的大小,较小的和较大的一个,我感知完全不同的东西。但是我需要把它们放在一起。当前人工智能的一个问题是,尽管取得了进步和强化学习,但它们的时间范围非常有限。大脑是巧妙的。大脑显然并不聪明,它有很多局限性,但结合不同的时间尺度真的很好。当你听音乐时,你有各种各样的时间尺度,不同的层次。你可以把它们分开,但是你把它们放在一起。这时你会听到旋律。

Jeremie Harris (06:50):
所以,核心,我不想称之为大脑的神秘功能,但是大脑做的核心事情与大多数人工智能策略做的事情有很大不同,你会说这是它结合这些不同时间尺度的方式……顺便说一下,我不知道这句话对不对。其他感知模式,比如长度,是不是太简单了,如果我放大得太近,就像只见树木不见森林。差不多吧?

格奥尔格·诺瑟夫(07:18):
是的,没错。然后你看到了绝对的细节,但你没有看到整个森林。正是如此。你的大脑有人把它放在一起,这可能也是人类和非人类大脑的区别,他们有稍微不同的时标。正如我的博士后所说,卡拉佐基元帅指出了这一点。我们刚刚提交了一篇论文。它说不同物种之间的时间尺度有些重叠。这就是为什么我们可以和我们的狗交流。是啊。我每天早上跑步的时候都会看到,为了狗的主人,是吗?

杰里米·哈里斯(07:54):
是的。

格奥尔格·诺瑟夫(07:55):
但在另一端,这是一个微小的差异。也许我们有更精细、更慢的窗口、更大的时间窗口,这样我们就可以感知更多、整合更多,以不同的方式把事情放在一起。

杰里米·哈里斯(08:09):
是的。这真的让我产生了共鸣。在过去的几个月里,我围绕这个话题进行了很多奇怪的对话。举个例子…事实上,我很乐意让你来做这件事。当你看到一个长时间快进的植物视频时。当你看着一株植物时,它看起来是静止的,但一天下来,它实际上是在移动,它在世界上表达自己。如果你快进的话,它几乎看起来栩栩如生。然而我们似乎不认为植物是有生命的东西。你会说因为我们的时间尺度不相容,因为我们在更短的时间尺度上运作?

格奥尔格·诺瑟夫(08:44):
我们缺少时间表。我们缺少看到这一点的时间尺度。你看,我们认为它是静态的,并说,“好吧,这很好。”但也许只是因为我们的时间表。是一个很好的例子。另一个例子是在哲学中大量讨论的。你们中的一些人可能知道,托马斯·内格尔,做一个坏的什么是什么感觉[听不清 00:09:06]。他说,“好吧,坏罐工序。我不相信波,因为它的生物物理设备,最终它的时间尺度。我们不能。”好吧。那部分现实对我们来说仍然是一个黑洞。

耶雷米·哈里斯(09:22):
有意思。它真的为一些基本问题打开了大门,这些问题是关于有多少事情是我们有意识的,但我们可能没有意识到,或者无法接受。在我们深入讨论这个问题之前,我确实想先缩小一下,因为我让我的兴奋情绪占了上风。但是你会说,有更多的事情,比如,你的客人,有更多的事情是有意义的意识的,比我们想象的要多吗?

格奥尔格·诺瑟夫(09:50):
我当然认为其他物种也有意识,但范围略有不同/比如说可能只是感知小窗户,但在那里面他们有独立的意识。当然,我可能会说,你的时间尺度对你意识的延伸有很大的影响。如果你有一个更大的曲目,你有更大的可能性拥有更广泛的意识。我这里说的扩展指的是时间空间,然后你可以考虑不同种类的内容。如果我有更小的时间尺度,我可以考虑花在移动。但我不是。也许某个聪明的工程师明天会打电话给我说,“是的,诺瑟夫,我在你的大脑中以较慢的时间尺度打败了你,这样你就能感知花的运动。”这就是我想要人工智能的原因。文档。

杰里米·哈里斯(10:57):
嗯,这真的是……这让我想到了有意识的东西之间的区别,换句话说,就是有意识,能够对它做出反应。让你的大脑知道,“哦,看植物在动。”或者意识到 20 年时间跨度内的市场变动,否则我们不会注意到。但它似乎也潜在地不同于意识的概念,在某种意义上,我有这种体验,我不觉得我是一个非玩家角色,一个哲学僵尸,有时被称为。但是我觉得…在我眼睛后面这里,有东西在我眼睛后面。你认为这两件事有联系吗?你如何从一个地方到另一个地方?

格奥尔格·诺瑟夫(11:44):
我想是后一种情况,对我来说意识是非常基本的东西。你在世界上导航。

杰里米·哈里斯(11:52):
好的。

格奥尔格·诺瑟夫(11:53):
是的。你表现得很好。即使有变焦,我们也不在同一个房间,但至少在同一个城市。我导航,我们共享某个空间,当然在这种情况下是虚拟空间。这意味着我可以连接我内心的时间和空间坐标,将它们延伸到我之外的你身上。然后把照片放大作为一种奇妙的工具,因为你总是把自己看作更广阔场景的一部分,这就是我的意识。你在世界中航行。为了在这个世界中导航,你现在需要把自己定位为一个更广阔的背景的一部分。否则,你可以导航。如果你失去了那种能力,你只是站在那里,不知道该怎么办。在精神疾病中你可以看到这一点。

哈利斯(12:47):
什么样的失调?

格奥尔格·诺瑟夫(12:49):
例如,精神分裂症患者。他们经常会失去空间感。他们无法将自己定位为更广阔空间的一部分。然后他们不知道去哪里。他们只是站在那里。从认知上来说,他们知道那个地址到处都是,但是他们就是不能把这个和他们联系起来。

哈利斯(13:11):
好的。所以你是说某人的意识在一定程度上取决于他的精神状态与环境的相关性?这样说公平吗?就像精神分裂症患者一样,因为他们有这种关联是一种习惯?

格奥尔格·诺瑟夫(13:25):
对我来说,我不喜欢这种相关性的东西,因为这样看起来好像你有两个不同的东西。我是世界的一部分,我和你一起在这里导航,你现在可以阅读我的手的动作,你知道它是什么,所以我们现在真正共享一个特定的虚拟空间。你就住在里面。有了这个,你就可以和他们交流了。所以你多少意识到你是你的事物中的一部分。这和导航一样,没有覆盖现实。

Jeremie Harris (14:00):
本质上,有这样一个连续统一体。不清楚我在哪里结束,环境在哪里开始,反之亦然。

格奥尔格·诺瑟夫(14:05):
是的。

杰瑞米·哈里斯(14:06):
好的。如果我非常粗略地放置一个分隔符…假设我们真的可以放置一个分隔符,在这种情况下,说它是某种相关性是否公平?就像是我头脑中发生的事情反映了世界上正在发生的事情,以至于我意识到了这一点?

格奥尔格·诺瑟夫(14:26):
让我给你举个例子。如你所见,我试图回避这个问题。

哈里斯(14:31):
很公平。

格奥尔格·诺瑟夫(14:32):
让我给你举个例子。当你随着音乐跳舞时,你会做什么?很明显你和音乐的节奏同步。你可以在大脑中看到这一点,大脑的节奏与音乐的节奏同步。你可以测量一下。你可以测量一下。

杰里米·哈里斯(14:55):
通过脑电波还是?

格奥尔格·诺瑟夫(14:58):
脑电波。脑电波的开始总是与曲调的开始同步。

哈利斯(15:04):
好的。

格奥尔格·诺瑟夫(15:05):
是啊。是两个同步的波。你可以测量一下。你与音乐节奏同步得越好,你就越能感受到音乐的最佳状态。你越有感觉,“哇。这真的很好。我要死了。我真的感觉到了。”所有精神动力药物都能改善这种情况。大脑就是这么做的。我认为这是一个关键的区别,这种与环境节奏波动的同步。不仅仅是音乐,还有语言。

格奥尔格·诺瑟夫(15:43):
或者实际上,当我看到我的一些精神病患者时,他们马上会做和你一样的事情。他们与你同步。当我像这样移动我的手臂时,在几毫秒内,他们也这样做,反之亦然。当他们这样做的时候,我经常观察自己,我也在这样做。完全无意识。我导航,所以我同步。这就像[听不清 00:16:07]。然后你会觉得你和音乐同步得越好,给你的感觉就越好。

耶雷米·哈里斯(16:13):
你认为也有反例吗?比如说,我不知道……某人被丢进一个不熟悉的环境,然后顽固地拒绝加入新环境的仪式。新环境和他们自己的倾向之间的不和谐。那怎么会映射到这里?

格奥尔格·诺瑟夫(16:35):
好的。当然是非常不同的水平,但我真的同意。实际上,昨天我和一个学生进行了一次长时间的采访和讨论,他是在美国的第一代中国人。你可以清楚地看到他是如何在两种不同的价值体系之间挣扎的。在中国,你需要一些附庸风雅,你需要 100 岁,你非常正式。在美国,你必须说,“在这里,我是最伟大的,等等,等等。”它更加以自我为中心等等。你真的可以看到他是如何在这两者之间被撕裂。

格奥尔格·诺瑟夫(17:11):
这是一个非常无意识的层面。我们的大脑替我们做这项工作。我们不知道。我们无法接触到它。我认为这是人工智能可以从脑科学中学习的地方。不是这个认知水平高。AI 在这方面很棒。在强化学习,深度学习模型中,这是一个博弈,目标。比任何人类都好。但这里的问题是,他们只能在非常有限的任务中做到这一点,也就是你所说的[听不清 00:17:45]概括问题。大脑非常慷慨,可以做各种各样的任务,甚至可以学习新的任务。我认为这是我与,例如,时间尺度的东西相交的地方。

杰里米·哈里斯(18:00):
好的。好吧。那是有帮助的。也许在我们深入到人工智能方面的事情之前,只是因为我知道很多人在听,坦率地说也喜欢我,我真的不熟悉神经科学。我真的不熟悉意识理论。你能不能把这些东西放在一个角度看?还有其他的意识理论吗?你的理论符合什么情况?这样我们就能对这里的风景有所了解。

格奥尔格·诺瑟夫(18:24):
好的。神经科学,这是我的小背景,它专注于特定的内容。你感知这个,然后你观察大脑。当你感知到这些内容时,大脑在做什么?它以许多刺激输入为导向,这就是我们所说的认知神经科学。你从认知开始,你用内容感知,然后你看我看到这个内容的时候大脑发生了什么。然后我转移到这个内容。我现在向你们展示另一个关于大脑活动的例子。然后你寻找-

Jeremie Harris (19:01):
如果你看不到视频,Georg 拿着两支不同的笔。他说,当你看着这支笔时,发生的是你看着那支笔…对不起,我只是为人们做这些-

乔治·诺瑟夫(19:12):
我知道。在我做的那一刻,我变得-

哈利斯(19:12):
不,这很好。太好了。是啊。

格奥尔格·诺瑟夫(19:14):
那就是你要做的。这也适用于,好吧,你有某些想法,现在你寻找这些想法的神经关联。

耶雷米·哈理斯(19:26):
对。

格奥尔格·诺瑟夫(19:27):
然而,那只是大脑上部的 10%。许多关于意识的理论都集中在这个上面的表格上,例如,全球工作空间理论这是一个很好的理论,它将大脑视为一个全球神经元空间。传入的内容需要在整个大脑中处理和分配,然后你就有了意识。还有一个非常流行的理论,综合信息理论。该理论认为,你需要将这些内容与背景融为一体,然后你就很有可能产生后果。

格奥尔格·诺瑟夫(20:10):
但对我来说,那只是蛋糕上面的 10%。这只是它上面的樱桃,因为你有一整个更深的层,这不是关于意识的处理。是你的无意识。你有你的梦想。当你走进雪中时,你会想知道。你有一些梦或者其他什么,与你环境中的内容完全无关。这怎么可能呢?这就是精神分析所说的无意识。

格奥尔格·诺瑟夫(20:40):
还有更深的一层。在这个时间空间里,基本上你的时间尺度的数量,对你的大脑能够处理什么内容,然后感知什么内容有很大的影响。就像我最初画的那样。当你有一个非常…这个更深的层不允许我感知植物的缓慢运动。我永远无法意识到植物的运动和植物的运动。事实上,我不能感知,我不能同源,我不存在,但那不是真的。你说只有…你需要在设计中考虑这个更深的层次。大脑设计的不同时间尺度。

哈里斯(21:36):
有意思。每当我遇到意识理论时,我总会有一个恼人的问题,这是主观经验的概念吗?举例来说,当你谈论意识的神经关联时,基本上那意味着什么,据我所知,你有一个输入。有人把一支笔放在你面前,然后我们说,“好吧,神经元放电模式是什么?”所以我们实际上可以使用观测仪器或设备进行客观测量。然后我们研究移动笔和这些东西做什么之间的映射。基本上就像 neural link 在做的一样。

杰里米·哈里斯(22:10):
虽然这显然是描述性的,但你可以很好地描述客观世界。我仍然很难理解……这几乎让人觉得是一个奇怪的问题,不管你能对世界的方式做出多少真实的陈述,你永远也不会对世界应该如何做出陈述。有一个障碍,似乎这些世界不能融合。你如何看待主观世界和客观世界之间的联系,主观世界就像我们似乎经历了什么,而客观世界只是数学描述?我不知道。你对此有什么看法?

格奥尔格·诺瑟夫(22:46):
显然,这几乎是一个哲学问题,但也是一个工程问题。问题是,我认为用神经科学。它的视野非常有限。它只是从这种主观的东西接近。当然,当你说,“好吧。”你从一些主观的东西开始,然后测量默认情况下留下差距的相关性。弥合这一差距。我决定也许我应该反过来。没有错,只是太局限了。

格奥尔格·诺瑟夫(23:16):
所以我说,也许我可以反过来,我从下往上看,独立于所有这些认知,大脑自己在做什么。那是大脑的内在特征。这是我团队中一位聪明的博士后 Marhal Kolozaki 说的。这些都是大脑的内在品质。忘掉所有的感知,认知。我们只是想看看在此之前大脑本身做了什么。这让我想到了时间和空间。

格奥尔格·诺瑟夫(23:42):
令人惊讶的是,这一方面让我想到大脑的时间和空间是如何与环境中的时间和空间同步的,比如音乐。另一方面,至少也许我们的一些心理特征有一个时空结构。这就是为什么我们主张意识的时空理论。基本上你可以变得有意识,如果你有一定的体温持续时间。如果温度持续时间太短你的内容,你不能成为有意识的。

耶雷米·哈理斯(24:16):
哦,有意思。这就像是意识的连续体。你认为它是一个连续体还是像你说的有一个明显的分界线?

格奥尔格·诺瑟夫(24:23):
这就是链接。这是客观和主观之间的联系。如果你有一个更长的持续时间,比方说,如果你真的…再次,我再次呈现取决于,一段时间。你看到的越多,它到达你意识的可能性就越大。如果我只提出很短,你有一个非常缓慢的船。意思是内容是一样的,但是脾气背景是不同的,这对你的大脑很重要。你的大脑部分根据时间特征对内容进行编码。

杰里米·哈里斯(25:01):
这非常直观。这很有道理。我们可以看到,作为生物有机体,当然有一个最大的时间窗口。没有人处理信息的时间跨度超过 100 年左右。更短的时间跨度,我们会遇到像神经回路这样的工程限制。这两者之间的空间充满了人类意识。比方说你拿一只蚂蚁或者别的什么东西,甚至不是蚂蚁,一只寿命很短的阿米巴原虫,在这一生中,可能阿米巴原虫对发生在比我们更短的时间范围内的事情更敏感。你会说它的意识体验向光谱的那一端转移吗?也许意识不那么强烈,因为它没有那么宽广。

格奥尔格·诺瑟夫(25:51):
真的。

耶雷米·哈里斯(25:52):
好的。

格奥尔格·诺瑟夫(25:53):
我完全可以说,你有一系列不同程度的可能意识。这显然是一个时空谱。音阶,不同的音阶。尺度很重要。变形虫的时间尺度非常小。很明显,由于生物因素,蚂蚁的时间尺度非常小,但在这个小时间尺度内,它可能比我们更精细。你可以看到他们在社会组织中表现出色。所以他们必须有一个更精细的临时窗口,在他们的小窗口中有许多细分,因为他们在他们的上下文中非常敏感。我希望通过人工智能,我们可以扩大一些我们到达的时间范围。

耶雷米·哈里斯(26:44):
好的。太好了。这就把我们带到了人工智能的起点。我想通过问你一个问题来让我们到达那里,我希望这个问题能引发很多关于人工智能的对话。这就是底物依赖性的问题。人们经常认为有一场关于机器是否会有意识的辩论,因为它们是由硅树脂或其他材料制成的。我认为意识的底物独立性或底物依赖性,当你达到人类群体或 ed 群体的水平时,这已经是一个问题了。你可能会说,当你拉远观察很长一段时间。就像如果你看一个城市,一个快速前进的人类城市,它看起来像一个该死的动物,一些模式反映了一些怪异的生物。你会如何描述人类城市和人类文明的意识?那你对 AI 的底物独立性有什么看法?我认为这可能是一个值得探索的有趣领域。

格奥尔格·诺瑟夫(27:39):
是的。我先说最后一件事。在上世纪 80、90 年代,有很多关于功能主义与非功能主义的讨论,以及在没有基础的情况下,是否需要某些输入输出关系。作为一名神经科学家,这听起来很奇怪。我不应该说这个。我不认为这是基质的问题。重要的是你的时间表。时标显然是时标的放大,它依赖于时标的上下文。

格奥尔格·诺瑟夫(28:12):
显然,大脑提供了一个完美的[听不清 00:28:15]神经服务和我自己的亚麻布,等等,等等。是啊。但那只是一个模型。这并不意味着我们的模型是什么,对于安装所有这些时间尺度和意识也是必要的。我认为我们经常混淆我们的模型,我们的方法论与现实和真理。从我的观点来看,我对意识的时空理论的观点是完全独立的,因为重要的是时间尺度。

格奥尔格·诺瑟夫(28:49):
如果你给我生产一些具有相似时标数量的代理,现在不仅是时标的数量,还有时标的灵活性,因为这些时标是变化的。当您提供外部输入时,它们会以[听不清 00:29:05]的方式发生变化。我有另一个非常聪明的博士后工程师,他实际上已经造了一个机器人北欧野蛮人,他称这个机器人为技术对话。他是个搭桥的人。他直接将所有的认知操作转化为行为。你真的可以在机器人的行为中看到认知,这太棒了。

格奥尔格·诺瑟夫(29:36):
我讨论了很多,说:“是的。”但最终它并不灵活,这是事实。为了具有灵活性和动态性,适应环境,根据环境的持续需求改变其工作记忆输出,这是机器人做不到的。这就是为什么他来到我的小组,说,“也许我们可以转换。”我认为这就是我们可以从大脑中学到东西的地方。并不是说我们可以从大脑学习底物,我不这么认为。但是我们可以从大脑难以置信的适应性和灵活性机制中学习,同时保持它的连续性和独特性。

哈里斯(30:22):
有意思。好吧。这确实让我想到了关于城市、国家和文明的问题,因为我想这些图表显示了什么是最受欢迎的…抱歉。谷歌搜索次数最多的术语是在一个特定的州,例如,在美国。在不同的时间,你会对两周后或总统选举产生兴趣。这些尖峰很有趣。它们持续很长一段时间,在某些情况下,持续很短一段时间,其他情况视情况而定,或者随着环境的变化而定。在我看来,根据这个定义,我们可以认为,人类文明或者任何人类的集合,只要足够连贯,能够交流,有叙述和话语,就有资格成为有意识的。你同意这种描述吗,或者说这有点过了?

格奥尔格·诺瑟夫(31:14):
你看我是如何拼命地回避意识这个话题的。我希望在某个时候我们不需要它。这是一个常识术语。意识,是的,现在我们试图找到哲学家所说的意识的自然种类。一个叫做意识的实体。我认为我们在某些时候不需要它。记得我们说过遗传密码…当然,我们知道基因是什么,但最终我们现在知道它是 DNA,是以不同方式结合的四种不同的蛋白质。沃森和克里克就是这么做的。好吧。还有很多其他的例子。20 世纪初,存在生命能源的可能性。我们不再需要那个了。

格奥尔格·诺瑟夫(31:56):
就大脑而言,20、30 年前,我们应该听说过很多关于边缘系统的事情。现在是什么限制了它的拼接?它是一个海马体,杏仁核是这个和那个的整体。我也是。我认为意识只是我们缺乏知识,以为我们拼命在世界上或大脑中寻找一个叫做意识的实体。对我来说,这只是,好吧,我们在世界上航行,这可能是不同形式的连接世界,你描述了其中的一些是城市。你可以再次看到,这种波动和不同形式的同步。那我们就不再需要那个了。我们没有明智的研究。

杰瑞米·哈里斯(32:37):
好的。研究方面。有意思。好吧。你会说我们不需要它来对世界做出任意好的预测,这是我直觉上同意的吗?我们真的不需要一个意识的概念来拿起一堆亚当斯说,“它要做这个,或者它要做那个。”当我想到意识时,我最终会想到主观体验。这似乎是我可以用盒子围起来的东西,但也许我错了。是主观体验,你在这个语境下把它看做和意识一样吗?

格奥尔格·诺瑟夫(33:11):
意识是多种不同的含义。

耶雷米·哈里斯(33:14):
是的。

格奥尔格·诺瑟夫(33:15):
你不会想进入那种状态的。

耶雷米·哈里斯(33:16):
是的。

格奥尔格·诺瑟夫(33:19):
传统上它有很高的等级。认知。我不一样。我开始意识到自己,这是从哲学中传达出来的。大部分仍然在意识中是非常特殊的。非常特别,主要区别于任何无意识的事物。然而,神经科学在某种程度上超越了这一点,因为它仍然在寻找特殊的神经元特征,这些特征只是专用于意识,与我们的实验室不同。特殊的意识。我称之为专家的观点。然而,我会说,算了吧。那是一种错觉。你最好寻找什么是相似的,什么是大脑和意识共有的。那是我的时空物品。我称之为共同货币。

格奥尔格·诺瑟夫(34:07):
现在我们来看一下持续时间,或者说我感觉这个采访,这个问题持续了一分钟,但是只有 20 秒钟,因为它是……然后我会假设在我的大脑中,你有相应的一分钟的持续时间间隔,这是那个方向的频率。一旦你明白了这一点,好吧,就很清楚了。我可以预测。这是读数。就像内科一样。从我的血糖水平来看。我的天啊。糖分真的很高。你一定有很多症状。

杰里米·哈里斯(34:50):
是啊。

格奥尔格·诺瑟夫(34:51):
我也是。嗯,你一定很清楚这一点。

杰瑞米·哈里斯(34:55):
意识,无论是主观体验的还是其他的,都只是一种输出。这是一种你可以预测的症状,因此科学已经做到了这一点。这是公平的吗?

格奥尔格·诺瑟夫(35:06):
是也不是,但是科学,现在你可以说它不是【听不清 00:35:12】。它只是消除,它不相信。不,因为我说大脑构建自身神经元活动的方式本质上是主观的。那是时间和空间的东西。你给我一个 20 秒的间隔,我把它想象成一分钟。我的大脑增加了一些东西。我的大脑加上剩下的 40 秒。当然,这不太可能,但我还是要问一件事,那就是意识。

杰瑞米·哈里斯(35:44):
嗯,肯定有【相声 00:35:45】

格奥尔格·诺瑟夫(35:46):
加入任何东西,我都不会有意识。

杰里米·哈里斯(35:48):
好的。是啊。是啊。这和你之前说的非相关性是有道理的。我想称之为相关性,但是是的。完美。好吧。我认为这是一个开始我们关于人工智能的对话的好地方,因为我认为你正在探索的那些时间窗口和真正的深度学习系统的架构之间的映射有很多东西可以说,只是它们设置的方式。你介意从你的角度来探讨一下你如何看待意识和人工智能之间的交集吗?

格奥尔格·诺瑟夫(36:20):
最好让我们说说大脑和人工智能。我看着…我的照片调查了很多有趣的特征,大脑中不同的时间尺度以及它们之间的联系。它们被展开到大脑的空间。训练组织中的大脑有一定的地形组织。它有一定的组织,有一定的等级制度。这是一个时间层次。时间在空间中展开。现在你可以想象,比方说,如果我有一个代理人,我是一个精神病人,我想对我不正常的想法进行某种治疗,我总是听到声音。

Georg Northoff (37:06):
采访前一切就绪,我听到了你的声音。我们能做什么?也许代理人能帮我。也许我现在可以不断地记录我的脑电波,比方说,用脑电图仪或脑电图仪或扫描设备,FMI。那是在特定的时间范围内。也许现在我可以把它转给一个代理,这个代理可能有自己的时间表,并且比现在的代理有更多的曲目。

Jeremie Harris (37:44):
喜欢更长或更短的时标。

格奥尔格·诺瑟夫(37:45):
更长,更短,更多的可变性,更细的颗粒,更粗的颗粒,不仅仅是两三个时间尺度或有限的数量,而是展开的。然后也许那个代理人可以说,我们在幻觉期间把我的时间尺度输入代理人。然后,也许理想的代理,这是类似的行为,当我听到你的声音,而你不在时,我感到困惑。然后也许那个代理人也能告诉我,我需要如何改变我大脑中的时间尺度来使这些声音消失?因为我不能消除时间尺度。

格奥尔格·诺瑟夫(38:26):
我不能只是抑制,因为那意味着我改变了整个大脑。我需要和大脑本身一起工作。也许我稍微改变了这些时间表。我认为代理可以帮助我很多,因为代理还可以提供可能不同的阴影,不同程度的时间尺度,这是我的大脑不可用的,或者当我听到声音时,我的时间尺度曲目非常有限。也许我的代理人可以在我的曲目中提供一些反馈机制,这样我就不再需要听到声音了,因为我还有其他的时间表。相同的输入可以在另一个时间刻度上工作。

耶雷米哈里斯(39:11):
有趣。我们的希望是,你基本上可以让一个智能体成为一个模仿健康人类大脑行为的人工智能,这样你就可以用它来建立一个可比性,“好吧,这就是我们所缺少的。这是我们需要弥补和修补的。”

格奥尔格·诺瑟夫(39:27):
是的。我一直反对模拟人类。在日本和英国,有托尼·普雷斯科特、朱尼·唐尼的自我模型。这是一个非常好的模型。但它是否真实的问题是一样的。它经历过它们吗?总会有你提出的问题。我的代理人有意识吗?我认为这是徒劳的。对我来说,申请人更感兴趣的是什么,从这个意义上来说,我真的很满足,我说,“也许我们不能意味着……我不能代表曲目的某个时间表。也许我可以增强这个或者改变那个。”代理可以帮助你。这可能会改变我们的行为。

哈利斯(40:15):
对。实际上,我也发现了这个问题的有趣之处,有这么多轴线,人类是沿着这些轴线看不见的。有时间尺度的部分,有空间的部分,所有你谈论过的东西。此外,我想作为一名前物理学家,我想到了现在所有无形地流经我们身体的中微子,我们周围的红外线和紫外线,我们没有意识到,因为…嗯,我想这是一个有趣的问题。我们意识到我们意识到的事物,因为进化大概优化了我们,使我们能够意识到它们。

Jeremie Harris (40:46):
很明显,比如紫外线,虽然它可以长期导致癌症,皮肤癌,但它不是一种超级致命的疾病,也不是我们生活中的一个问题,所以我们对它视而不见。我们能够同样好地狩猎,同样好地制造而不浪费能量追踪紫外线。除了你已经讨论过的时间尺度和空间的东西,你认为获得那些看不见的实体的观点有价值吗,或者你认为时间尺度和空间更有前途?

格奥尔格·诺瑟夫(41:20):
这对我来说很难讲。我和物理学家李斯·斯莫林进行了很多讨论。我在那里给了一个谈话时间和大脑。这是一种乐趣,因为我基本上可以说出我所有关于时间和大脑的想法,因为物理学家是聪明的人,他们理解时间的东西。神经科学家对这段时间有真正的问题,因为他们不认为这是一个动态。对我来说很难讲出来。你深入到量子层次…我是所谓的无标度的忠实粉丝,这意味着你有不同的时间标度或嵌套在其他时间标度中。是啊。

格奥尔格·诺瑟夫(41:58):
这就像一扇俄罗斯的门。你有更小的,更大的,更大的时间尺度,它们都嵌套在一起。这个嵌套模型在特殊条件下可能是真的。那么当然,量子级应该会有影响。但这可能是由于我缺乏我要提到的知识。是啊。这就像我们对植物的了解。很难说。我认为我现在工作中最关注的事情是大脑的时间尺度和环境的时间尺度之间的趋同程度有多大?因为那个界面。

Georg Northoff (42:42):
我的时间刻度可以与你的时间刻度同步多少?你想知道。在我们的 Zoom 访谈中,你会无意识地将自己与我的时间表对齐,因为特别是在 Zoom 中,这并不总是很容易,因为你非常清楚。例如,我们在人工智能方面获得了英国和加拿大的一大笔拨款[听不清 00:43:11],我们正在研究时间尺度的联系,以及他所说的环境和大脑之间的三种能量交换,我们将其与时空动态联系起来。我认为这是关键。这是理解大脑和意识的关键,也是产生更好的人工智能的关键,人工智能更具适应性,并具有这些增强的能力。

Jeremie Harris (43:36):
你能详细说明一下吗?我个人并不熟悉那些意识理论。

格奥尔格·诺瑟夫(43:42):
让我给你举个气候变化的例子。气候变化当然是一个大话题。气候变化发生的时间极其缓慢,除了我们的生活方式之外,我们无法了解。但是当然时间尺度是非常重要的,因为许多气候现象是非线性的。我们需要过渡,这又是一个时间表。一个很长很长很长很长的时间尺度会突然变成很短的时间尺度。这就像冰涂抹地震,你有更长的一些构造系统起飞,突然你有大爆炸。

格奥尔格·诺瑟夫(44:22):
你需要了解正在发生的事情。你需要了解动力学,而我们没有模型。为什么?因为我们自己的大脑不涵盖这些时间尺度。我会说,也许我们可以创造一个与我们自己的时间表有些重叠的代理。如果我们知道不同时间尺度如何相互作用的原理,例如,它们如何放大。野蛮人,我组里做人工的那个学生……特工干的正是那个。这些时标是如何放大的?然后,也许我们可以创建一个代理,它有更大的时标,但仍然与我们连接,这样我们就可以…然后,如果我们知道时标如何相互转换,我们仍然可以读取代理的输出。这可能是一个很好的代理建模客户。

耶雷米哈里斯(45:14):
有趣。这里的要求是,至少我们能够与代理交互,在你的模型中,在时间尺度上必须有重叠,因为否则我们就不能交流。就像植物什么的,因为我们只是-

格奥尔格·诺瑟夫(45:27):
是的。

杰里米·哈里斯(45:27):
好的。

格奥尔格·诺瑟夫(45:28):
你与可怜的植物不同步。如果植物在想,我不知道它是否会想,“这些人类真是傲慢。”是啊。

杰里米·哈里斯(45:38):
是的。如果是看人好。是啊。是啊。我也发现这个很有趣,因为它确实在玩弄可预测性的概念。就像大卫·休谟有这个…我希望我没看错是大卫·休谟。但是你不能 100%确定,无论你如何研究过去,未来会发生什么。物理定律可能会改变。数学法则明天可能会改变。这将永远是一个艰难的上限,但有一些连续体,在那里我们接近那个极限,在那里我们只能访问在这个短时间内发生的事情,如你所说。这使得气候之类的事情看起来不可预测,而在现实中,如果我们缩小范围,我们可以看到整个事情,突然之间,这是一个可预测的过程。

格奥尔格·诺瑟夫(46:26):
是的。因为这样我们就能更好地了解一些现象的统计或随机分布。如果我们有最多的时间刻度,我们就有更多的时间点,所以我们可以做一个更好的模型。如果因为我们有限的时间窗口,你有非常有限的时间点,那么当然你有不确定性。这是默认的。这种纯粹统计层面上的不确定性…

格奥尔格·诺瑟夫(46:52):
实际上,我以前的一位博士后,现在在日本,日本人中尾孝(Takashi Nakao)向我展示了这也体现在心理层面上。你对某件事的心理不确定性和你大脑的不确定性有关系。这是怎么回事,你怎么能预测。这是一回事。如果我们的时间尺度与环境不匹配,你说的股票市场波动,地震地震波,气候变化,我们就有很多不确定性。你所说的不确定性并不是一个有趣的特征。只是我们缺乏时间尺度和知识。我们太蠢了,就这样。

杰里米·哈里斯(47:31):
是的。我对这个假设持开放态度。是啊。我确实有一个关于深度学习系统的问题,我猜它们是否可能是有意识的。当我们谈论时间尺度时,我想到的一件事是,是时间尺度真正重要,还是空间技能重要,或者是抽象层。我的意思是看自然语言模型。如果我给你一个句子,我们的大脑一次专注于一个单词,然后最终像孩子一样,我们学会把单词串在一起。然后我们学会了在句子层面,然后在段落层面理解事情。这实际上正是 GPT 三和其他语言模型所做的。

杰里米·哈里斯(48:16):
一开始他们完全不知道,然后他们开始看到一大堆单词。最终他们会明白,“哦,这就是香蕉这个词。”然后他们可以理解为,“哦,在香蕉上滑倒是这个意思。”然后他们可以把整个句子放在一起,你实际上可以看到这在自然语言人工智能的进化历史中发挥作用。起初,它们只适用于文本自动完成,下一个单词,猜测,这个单词可能是什么?现在我们让他们把连贯的多段文章放在一起。让我想到这两者可能有联系的一点是当你看时标的时候。

杰里米·哈里斯(48:49):
当我们看到生命中的一瞬间时,我们可以讲述这些故事。这几乎就像我们最终专注于与文字相似的细枝末节,但当你把事情拉长,最终我可以告诉你在过去五分钟或最后一天发生在我身上的故事。现在这个故事开始变得更加有力,看起来也更加抽象了。涉及到更多的抽象实体。最终我到达了 GPD 三,我在讲述一个很长时间的故事。你认为这两者之间有对应关系吗?或者你不同意其中的一部分?

格奥尔格·诺瑟夫(49:22):
不,我觉得这很有趣。对我来说,抽象并不重要。这个单词是障碍,因为你从上下文中孤立和抽象出来了。这可能也更符合大脑的工作方式。大脑在全球范围内快速运转。它着眼于整个事情。它观察整个空间,然后开始构建空间。它从整个复杂的句子开始,然后试图在时间上分割句子。已经证明了这一点。如果你的大脑进步是暂时的,那么它提取一些单词,一些其他区域提取单个句子,其他一些段落。你把它们放在一起,这给了你意义。

耶雷米·哈里斯(50:13):
哦,有意思。

格奥尔格·诺瑟夫(50:15):
你所谓的阻碍,你从外部感知它的方式,但可能确实有强大的…你的大脑有一个全球组织,地形辉光。就像地图这个词。当你看整个世界地图时,那么单一的大陆和国家就是整个世界的障碍。这就是大脑的工作方式。

耶雷米·哈里斯(50:39):
有意思。

格奥尔格·诺瑟夫(50:40):
这就是我们拥有大量信息的原因,它以一种压缩的方式对所有这些信息进行了统计编码。但是在随后的处理中,它提取某些东西。现在它提取非洲,好吧。下一个区域,提取非洲南部。下一个地区,提取南非。然后是另一个地区,纳米比亚等等。它变得越来越精细,越来越抽象,在空间尺度上也越来越有限。所以国家变得越来越小,时标也是如此。

杰里米·哈里斯(51:19):
有意思。好吧。我可能误解了自己的思维过程。但我想象,这几乎就像…我的感觉是,两个方向有时发生在不同的背景下。比如作为一个婴儿,如果听到杯子这个词,或者饿或者好。即使很好,也有人拍拍你的头说,“很好。”你得到了与“好”这个词联系在一起的奖励,所以你很早就构建了这些非常有限的、精细的实体。

Jeremie Harris (51:51):
最终,就像在生活经历中一样,你会经历一系列个人生活经历,有时你不得不缩小视野。然后有一个故事跃入眼帘,你会说,“哦,这是我可以从所有这些微观经历中吸取的重要教训。”然而,我也看到另一种情况,你从这个大的高层次的东西,然后你意识到,“哦,等等,但那是由于所有这些小的微观的东西。”然后你会变得更加精细。但是你会说,就像第一个例子是虚幻的,那是我告诉自己关于我的大脑实际上在做什么的错误故事吗?

格奥尔格·诺瑟夫(52:27):
不,回到你孩子的例子。宝宝说:“好的,太好了。”母亲说很好。但这在很大程度上取决于母亲的语气,她是如何轻拍婴儿的,当然是在什么样的背景下,因为你可以让同一个人用完全不同的语气说话。这是一种完全不同的情绪,在不同的背景下,用完全不同的拍法。

杰瑞米·哈里斯(52:55):
好的。

格奥尔格·诺瑟夫(52:57):
这决定了价值。有一个深层的生态社会因素。

杰里米·哈里斯(53:05):
有意思。

格奥尔格·诺瑟夫(53:08):
意思是如果你只是孤立了那件小事,你已经得到了回报,现在你应该高兴了,但是你为什么不高兴呢?

耶雷米·哈里斯(53:14):
对,对。

格奥尔格·诺瑟夫(53:14):
我母亲总是说:“是的,是的。现在你得到你的奖励。”

耶雷米哈里斯(53:18):
是啊。

格奥尔格·诺瑟夫(53:19):
那对婴儿来说不可行。婴儿对此非常敏感。[听不清 00:53:25]。

杰里米·哈里斯(53:26):
我笑是因为这真的让我意识到我的大脑在不知不觉中做了多少错误的计算,直到我说:“哦,这是回报。”那么你会说在人工智能中我们可能会希望看到一点范式的转变,比如从上到下而不是从下到上?

格奥尔格·诺瑟夫(53:46):
是的。我会说,首先,看看你的代理人必须运作的环境,这是你要做的第一件事。为此,你会说,好吧,如果你真的想让你的代理与上下文同步,看看你的上下文的时标。比方说,如果你想在一个充满背景音乐的环境中操作你的代理,看看它的时间尺度。现在你有一个学生,然后你说…好吧,你想让一个学生学习[听不清 00:54:19],我让它变得简单。然后,根据[听不清 00:54:30]的上下文,培训您的代理,在您的代理中设计时间表。

格奥尔格·诺瑟夫(54:31):
然后你就可以上场了。这就是你们工程师的聪明之处,这就是你们能做的。现在,您可以细化这些时间表,然后您可以去找您的学生,教他们将您的代理的时间表与您的学生的时间表联系起来。如果你制作一个具有前馈反馈效果的界面,那么你可以训练学生变得更加敏感,对[听不清 00:55:00]有更好的时间刻度。这当然是一个非常简单的例子。另一件事,正如我所说的,背景,看环境背景,看背景的时间尺度。你需要知道的。

格奥尔格·诺瑟夫(55:12):
这就是为什么我认为我们可以从大脑中学习,因为大脑非常聪明。大脑在很多方面都很笨,但是在那方面……简直不可思议。同样的窗口,我们可以处理各种各样的输入,并从中获得一些意义。目前的强化学习只有非常有限的时间范围,并且在一个特定的任务或几个任务中非常好,但是这种广泛的任务和人类,我们甚至可以适应和改变。难以置信。

Jeremie Harris (55:42):
这也很有趣,因为它也提出了大脑日常学习的差异。当你有了一个孩子…在我的例子中,我是这样的,“哦,假设一个孩子。”所以我们想象一个有大脑的婴儿,然后你正确地说,婴儿看着它的环境,然后从那里,它梳理出这些微观细节。我想这也是故事中缺失的一部分。至少我讲述这个故事的方式是,婴儿的大脑不是在真空中出现的。它是由进化在非常长的时间内编程的。我想,这个过程可能更像是 GPT 三人组的训练过程。这是一种进化算法。在那里,我们可以看到一些出现在大脑中的结构,它们是从更精细的颗粒开始的。这公平吗?

格奥尔格·诺瑟夫(56:32):
非常。我喜欢对这个问题的两个回答的评论。两个答案。一个神经的,一个心理的。很明显大脑中的某些时间尺度是进化保留下来的。不管我们愿不愿意,我们和老鼠有着相同的波动频率。甚至可能是恐龙,因为这是进化的一部分。进化对我和我认为我强有力的支持,它像一层,它像一个巢。这是一个层次的东西。毫无疑问,这是一种嵌套的新鲜感。例如,在心理上,这表现为跨代的创伤。我从我父母那里继承了他们无法承受的创伤。我有更多的经验证据来证明这一点。所以你对语义相关的线索非常敏感,而不是和你父母经历的创伤一样。

Jeremie Harris (57:33):
这是表观遗传吗,就像【相声 00:57:36】。

格奥尔格·诺瑟夫(57:38):
可能是遗传和某些事情,当然还有对你的时间尺度的钦佩,因为你对类似的环境线索很敏感。这里的上下文是关键,而不是安全本身。是啊。

杰里米·哈里斯(57:57):
有意思。是啊。这么多都是视角的改变,甚至只是为了思考这些问题,因为你开始意识到你的大脑自动填补了多少空白,随之而来的是多少假设?有时候有点吓人,也有点挑战性。我喜欢这次谈话。你有这么多有趣的见解。有什么地方人们可以查看吗…我认为你有一个有很多很棒内容的网站。你有什么特别推荐给那些想了解更多的人的吗?

格奥尔格·诺瑟夫(58:23):
是的。他们可以在网站上看看,www.georgnorthoff.com。你会看到很多 YouTube 上的谈话,诸如此类。然后还有我写的一本书,神经哲学和健康思维,2016,诺顿出版社面向更广泛的读者。最近意大利出版了一本书,时间和大脑,大脑的时间代码,也许你们中的一些人读过。不幸的是,它计划被翻译成英语,以及中文和日语。到目前为止,它上个月才以意大利语出版。只要看看我的网站,看看会谈。如果你愿意,你可以发邮件给我。

杰瑞米·哈里斯(59:02):
牛逼。我们会在博客中提供所有的链接。他们会附带一个播客。非常感谢。这真是令人兴奋。我喜欢这次谈话。

格奥尔格·诺瑟夫(59:09):
是的。很好。谢谢您们。

在生产中部署机器学习模型的注意事项

原文:https://towardsdatascience.com/considerations-for-deploying-machine-learning-models-in-production-89d38d96cc23?source=collection_archive---------3-----------------------

朱尔斯·s·丹吉迈克尔·加拉尼克

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

模型开发周期的各个阶段(图片由 Jules S. Damji 提供)

数据科学或机器学习研究人员或从业者中常见的抱怨是,将模型投入生产很困难。因此,一些人声称,很大一部分,87%的模型从未在生产中看到的曙光。

“我有一个模型,我花了大量时间在我的笔记本电脑上开发它。下一步是什么?我如何让它进入我们的生产环境?我应该为我的 ML 堆栈和工具考虑什么?”

这些问题经常出现在聚会或会议上,在关于机器学习操作(MLOps)的演讲之后。对于这个试图解决和补救这一关键问题的新兴领域,没有什么灵丹妙药或灵丹妙药。

然而,在考虑您的 ML 堆栈和工具时,有一些可接受的和常见的技术考虑和陷阱要记住。在将 ML 模型投入生产的系列文章的第一部分中,我们将讨论工具和最佳实践以及 ML 模型服务模式的一些常见注意事项和常见陷阱,它们是您从模型开发到在生产中部署的必不可少的一部分。

轻松发展

首先考虑你的开发环境。大多数数据科学家或 ML 工程师总是使用他们的笔记本电脑来开发、测试或调试代码。由于简单、易于访问和安装最新的 ML 库,从业者压倒性地倾向于使用笔记本电脑而不是集群进行开发。我们被 ide 和强调语法的编辑器宠坏了,这是有原因的。

Python 开发人员喜欢定制他们的环境来匹配他们的登台环境,使用 conda 或 Python 虚拟环境的库依赖。理想情况下,作为一种最佳实践,如果在他们的笔记本电脑上开发的相同代码可以在集群上的试运行或生产环境中以最小的改动运行,这将极大地提高端到端开发人员的工作效率。

考虑将您的笔记本电脑作为开发环境的首选,它有可能将您的代码扩展或同步到云中的集群环境。

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

克里斯汀·休姆在 Unsplash 上拍摄的照片

考虑因素#1 : 将笔记本电脑用于开发作为最佳实践

大规模训练和跟踪模型实验

与传统的软件开发周期不同,模型开发周期范式是不同的。许多因素会影响 ML 模型在生产中的成功。首先,模型的结果由它的度量来衡量,比如可接受的准确性。

第二,达到满足业务目标的准确性意味着在跟踪每个实验运行时,不仅仅使用一个模型或 ML 库,而是使用许多模型和 ML 库进行实验:度量、参数、工件等。准确性是至关重要的,开发人员选择 ML 库进行实验也是如此。

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

朱尔斯·s·丹吉的图片

第三,准确性与获取数据的质量直接相关:坏数据导致坏模型。如下图所示,数据准备-特征提取、特征选择、标准化或规范化特征、数据插补和编码-都是清理后的数据进入特征库之前必不可少的步骤,可用于模型训练和测试阶段或部署中的推理。

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

模型开发周期的各个阶段(图片由 Jules S. Damji 提供)

第四,选择一种编程语言,这种语言不仅为您的数据团队(数据分析师、数据科学家和 ML 工程师)所熟悉,而且还受到模型实验和培训阶段使用的许多 ML 库的支持。Python 似乎是事实上的选择。

除了选择编程语言,还可以选择 ML 框架来驯服计算密集型 ML 工作负载:深度学习、分布式训练、超参数优化(HPO)和推理,所有这些都是水平规模的,从您的笔记本电脑、单节点多核到多节点多核。

最后,能够在不同的环境中轻松地大规模部署模型:web 应用程序的一部分、移动设备内部、云中的 web 服务等。

考虑号#2:考虑使用模型生命周期开发和管理平台,如ml flowDVCWeights&bias,或SageMaker Studio。以及RayRay TuneRay Train(原 Ray SGD)py torchtensor flow用于分布式、计算密集型和深度学习的 ML 工作负载。**

管理机器学习功能

特征库是现代机器学习开发周期中新兴的关键组件。随着越来越多的数据科学家和工程师共同努力,成功地将模型投入生产,作为模型开发周期的一部分,拥有一个单一的存储来保存经过清理和特征化的数据变得越来越必要。

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

用于管理 ML 特性的特性存储(图像源,Apache 2.0)

功能存储解决了运营挑战。它们在训练和推理之间提供了一组一致的数据。它们避免了任何数据偏差或无意的数据泄漏。在训练时的特征提取过程中,它们提供了在批处理和流数据上编写特征转换的定制能力。并且它们允许在推断时使用历史数据来增加请求,这在大型欺诈和异常检测部署模型或推荐系统中很常见。

除了将模型投入生产的挑战和考虑之外,操作 ML 数据同样重要。模型的准确性取决于良好的数据,要素存储有助于管理预先计算和清理的要素,以便在模型服务期间进行模型训练和生产推理。

考虑因素#3:将特征库视为模型开发过程的一部分。看向 盛宴泰克顿萨格马克 数据块 进行特色店铺。**

大规模部署、服务和推理模型

一旦模型被训练和测试,并确信它满足模型准确性的业务需求,可伸缩模型服务框架要考虑的七个关键需求是:

框架不可知:一个服务选举框架的模型应该是 ML 框架不可知的。也就是说,它可以部署任何用通用 ML 框架构建的通用模型。比如 PyTorch,TensorFlow,XGBoost,或者 Scikit-learn,每个都有自己的算法和模型架构。

****业务逻辑:模型预测通常需要预处理、后处理或通过连接到特征存储或任何其他数据存储进行验证来扩充请求数据的能力。模型服务应该允许这作为其推理的一部分。

****模型复制:有些模型是计算密集型的或网络受限的。因此,选择的框架可以将请求分散到模型副本,在副本之间进行负载平衡,以支持高峰流量期间的并行请求处理。

****请求批处理:并非所有生产中的模型都用于实时服务。通常,模型在大批量的请求中被评分。例如,对于深度学习模型,将这些图像请求并行化到多个内核,利用硬件加速器来加快批量评分和利用硬件资源,这是值得考虑的。

****高并发和低延迟:生产中的模型需要低延迟的实时推理,同时处理突发的大量请求。这对于获得最佳用户体验以接收毫秒级预测请求响应至关重要。

模型部署 CLI 和 API:负责部署模型的 ML 工程师应该能够使用模型服务器的部署 API 或命令行界面(CLI)简单地将模型工件部署到生产中。这允许从现有的 CI/CD 管道或工作流中进行模型部署。

生产中的模型模式:随着人工智能应用在工业的各个领域越来越普及,为这些人工智能应用训练的模型变得复杂而复合。它们的范围从计算机视觉到自然语言处理,再到推荐系统和强化学习。

也就是说,模型不是孤立存在的。他们也不会单独预测结果。相反,他们通常以四种模式联合运作:管道、合奏、商业逻辑和在线学习。每种模式都有其目的和价值。

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

生产中的 ML 模型模式(图像源)

机器学习工程师采用两种常见的方法在生产中部署这些模型模式。一种是将模型嵌入 web 服务器,另一种是卸载到外部服务。就上述七个考虑事项而言,每种方法都有自己的优点和缺点。

考虑数#4:看向 谢顿 KFServing,或者 雷 Serve 对于这七个要求。**

生产中的观察和监控模型

作为模型开发生命周期的一部分,模型监控通常是一个被忽视的阶段,它对于模型在部署后生产阶段的生存能力至关重要。这通常是事后的想法,由 ML 工程师承担风险。

模型有来世的生存能力。生产中可行的生命需要一个持续的警惕或哨兵的眼睛。事实上,作为一个阶段的监控只是模型服务的延续,如下图所示。

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

生产中的 ML 模型监控(显然是 AI 的图像

为什么要考虑模型监控?出于许多实际原因,这一阶段至关重要。我们简单讨论一下。

****数据随时间漂移:正如我们上面提到的,我们的模型的质量和准确性取决于数据的质量。数据是复杂的,从来不是静态的,这意味着随着时间的推移,用提取的特征训练的原始模型可能不再重要。可能会出现一些需要考虑的新特征。比如季节性的数据变化。数据中的这种特征漂移需要重新训练和重新部署模型,因为变量的分布不再相关。

****模型概念随着时间而变化:许多从业者称之为模型衰退或模型陈旧。当训练模型的模式不再适用于漂移数据时,该模型将不再有效,因为其输入特征的关系可能不一定会产生模型的预期预测。因此,它的精度会降低。

****模型故障时间:模型故障原因不明:某系统故障或网络连接不良;超负荷的系统;错误的输入或损坏的请求。如果用户收到错误或伪造的结果,及早检测这些故障的根本原因或其频率可以减轻用户的不良体验或阻止对服务的不信任。

****系统因负载过重而降级:时刻警惕您部署的专用模型服务器或服务的健康状况,这与监控传输数据的数据管道或整个数据基础架构的关键组件(数据存储、web 服务器、路由器、集群节点的系统健康状况等)的健康状况同样重要。

这些前述的监控模型概念统称为模型可观测性。在 MLOps 最佳实践中,这一步现在是可接受的必要步骤。监视数据和模型的健康状况永远不应该是事后才想到的。相反,它应该是你的模型开发周期的一部分。

考虑数#5:对于模型的可观测性,显然要看. aiarize . aiArthur . aiFiddler.aihttps://valohai.com/model-monitoring/,或*why*

结论

让我们回顾一下。为了避免常见的抱怨模型不能投入生产或让你的模型在生产中看到阳光,如果你想让你的模型旅行到他们想要的目的地,并有一个可行的来世,请在心中考虑所有上述因素。

每种考虑都有其优点。每个考虑事项都有解决每个问题的开源解决方案或来自供应商的托管解决方案。评估每个工具如何最好地适应和满足现有机器学习工具堆栈中的所有考虑因素。

但是将它作为 ML 模型开发工具栈的一部分是至关重要的;这将显著提高您将模型投入生产的端到端成功率。

在以后的博客中,我们将研究如何实现考虑事项#1 和#2,重点关注我们建议的一些工具。

原载于https://www.anyscale.com**

选择机器学习模型时的考虑事项

原文:https://towardsdatascience.com/considerations-when-choosing-a-machine-learning-model-aa31f52c27f3?source=collection_archive---------5-----------------------

与许多人认为的相反,性能最佳的型号不一定是最佳选择

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

安娜斯塔西娅·切平斯卡在 Unsplash 上的照片

与许多人认为的相反,性能最佳的机器学习模型不一定是最佳解决方案。

在 Kaggle 比赛中,你需要的只是表现。在现实生活中,这只是另一个需要考虑的因素。

让我们从模型的性能开始,并回顾在选择模型来解决问题时要记住的其他一些考虑因素。

1.表演

模型结果的质量是选择模型时要考虑的一个基本因素。你要优先考虑能最大化性能的算法。

根据问题的不同,不同的指标可能有助于分析模型的结果。例如,一些最流行的指标包括准确性精确度召回f1-分数

请记住,不是每个指标都适用于所有情况。例如,在处理不平衡数据集时,精度并不合适。在我们准备开始模型选择过程之前,选择一个好的指标(或一组指标)来评估您的模型的性能是一项至关重要的任务。

2。可解释性

在许多情况下,解释模型的结果是至关重要的。不幸的是,许多算法像黑盒一样工作,无论它们有多好,结果都很难解释。

在这种情况下,缺乏可解释性可能会成为交易的破坏者。

当可解释性是一个问题时,线性回归和决策树是很好的选择。神经网络就没那么好了。

在选择一个好的候选模型之前,理解解释每个模型的结果有多容易是很重要的。

有趣的是,可解释性和复杂性通常在光谱的两端,所以让我们接下来处理复杂性。

3.复杂性

复杂的模型可以在数据中发现更多有趣的模式,但同时,维护和解释起来也会更加困难。

要记住几个松散的概括:

  • 更高的复杂性可以带来更好的性能,但也会带来更大的成本。
  • 复杂性与可解释性成反比。模型越复杂,就越难解释其结果。

将可解释性放在一边,构建和维护模型的成本是一个成功项目的关键因素。复杂的设置将在模型的整个生命周期中产生越来越大的影响。

4。数据集大小

选择模型时,可用的训练数据量是您应该考虑的主要因素之一。

神经网络非常擅长处理和综合大量数据。KNN(K-最近邻)模型具有较少的例子,要好得多。

除了可用数据的数量之外,一个相关的考虑因素是您真正需要多少数据来实现良好的结果。有时候你可以用 100 个训练例子构建一个很棒的解决方案;有时候,你需要十万。

使用关于您的问题和数据量的信息来选择能够处理它的模型。

5.维度

从两个不同的角度来看维度是很有用的:数据集的垂直大小代表我们拥有的数据量。水平尺寸表示特征的数量。

我们已经讨论了垂直维度如何影响好模型的选择。事实证明,水平维度也是需要考虑的重要因素:更多的特性通常会让您的模型提出更好的解决方案。更多的特征也会增加模型的复杂性。

维数灾难是理解维数如何影响模型复杂性的一个很好的介绍。

正如您可能想象的那样,对于高维数据集,不是每个模型的规模都相同。当高维数据集成为问题时,我们可能还需要引入特定的降维算法。PCA 是最流行的算法之一。

6.培训时间和成本

需要多长时间,训练一个模型要花多少钱?你会选择花费 10 万美元训练的准确率 98%的模型,还是花费 1 万美元训练的准确率 97%的模型?

当然,这个问题的答案取决于你的个人情况。

需要近实时整合新知识的模型无法承受长的训练周期。例如,需要随着每个用户的动作不断更新的推荐系统受益于廉价的训练周期。

设计可扩展的解决方案时,平衡时间、成本和性能至关重要。

7.推理时间

运行一个模型并做出预测需要多长时间?

想象一个自动驾驶系统:它需要实时做出决策,因此任何运行时间过长的模型都无法考虑。

例如,使用 KNN 开发预测所需的大部分处理都发生在推理时间。这使得运营成本很高。然而,决策树在推理时会更轻,在训练时需要更多的时间。

结论

许多人专注于他们最喜欢的模型。通常是他们最了解的人,在他们的上一个项目中给了他们很好的结果。

但是在机器学习领域没有免费的午餐。没有一个模型适用于所有情况,尤其是当我们考虑现实生活系统的约束时。

在选择一个好的模型时,理解一些不同的考虑对于确保一个成功的项目是至关重要的。作为总结,下面是我们刚刚讨论过的列表:

  1. 模型的性能
  2. 结果的可解释性
  3. 模型的复杂性
  4. 数据集的大小
  5. 数据的维度
  6. 培训时间和成本
  7. 推理时间

因果关系上的一致性

原文:https://towardsdatascience.com/consistency-causally-speaking-20dd78587370?source=collection_archive---------20-----------------------

为什么“一致性”在因果推断中很重要?

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

照片由 xespri拍摄 https://www . pexels . com/photo/photo-of-head-bust-print-artwork-724994/

一致性只是说你观察到的结果正是你认为你会观察到的结果。

C ausal 推论本周成为焦点:Joshua D. Angrist 教授和 Guido W. Imbens 教授因其在该领域的开创性工作刚刚获得诺贝尔奖。

正确进行因果推理所需的关键假设之一被称为一致性。(作为一名统计学家,我经常把这称为“因果一致性”,而不是“统计一致性”——一个非常不同的概念。)

一致性只是说你观察到的结果正是你认为你会观察到的结果。或者更准确地说,“一个人在她观察到的暴露历史下的潜在结果就是她观察到的结果。”(科尔和弗兰基斯,2009 年)

例如,假设 Y 是我一个月偏头痛的次数(即“偏头痛计数”),如果我服用一种标准药物来减轻偏头痛一个月,X=0,如果我服用一种新药,X=1。如果我服用标准药物,y⁰是我的潜在偏头痛计数,而如果我服用新药,y 是我的潜在偏头痛计数。

形式上,一致性声明 Y = X y + (1-X) y⁰,其中 y 是观察到的结果,y⁰是 X=0 时的潜在结果,y 是 X=1 时的潜在结果。所以如果我设置 X=1,我观察到的结果(Y)就是我认为我会观察到的结果(Y)。如果我服用新药(X=1),我观察到的偏头痛计数(Y)正是我认为我会观察到的偏头痛计数(Y)。

你想要确定你正在测量你认为你正在测量的东西。

我有一个基本问题…

一致性公式强调了一个事实,即在任何给定的时间点,我只能观察到一个或另一个潜在的结果。这就是所谓的因果推论的基本问题。我只能在任何给定的时间观察 y⁰或 y——所以仅仅使用一个月很难判断新药是否有效果。

如果我在没有其他偏头痛诱因的特别好的一个月后决定尝试这种新药,而我的偏头痛计数已经很低了,该怎么办?这种新药似乎并不比我的标准药物有更多的帮助,所以我停止使用它,因为它更贵。

我不知道的是,在有许多其他偏头痛触发因素的糟糕几个月后,它比标准药物更有效——当我不太可能尝试新药时,因为我不能拿我的健康和生活质量冒险一个月。我放弃得太早了,因为我只看到了一个可能的结果。(每月的偏头痛计数在这里被称为混杂因素。)

当然,我可以在两个月或两个月以上的时间里尝试标准药物和新药,一个接一个地交替使用——但这是另一个故事了,其中有一个转折😉

…但一致性不是其中之一?

这可能出错的一个关键方式(即“一致性”如何被违反)是在一项普通的临床研究中,该研究被称为随机对照试验 (RCT),类似于 A/B 测试

标准的 RCT 分析被称为意向性治疗 (ITT)。它说你必须比较每组研究参与者的结果,就像你随机分配他们一样——你“打算治疗”他们的方式。

假设你希望新药比标准药物更能降低平均偏头痛次数。你运行一个 RCT,取所有随机服用新药的人的平均偏头痛计数(X=1),并将其与所有随机服用标准药物的人的偏头痛计数(X=0)进行比较。这种比较理想地告诉你新药相对于标准药物的可能因果效应(X=1 对 X=0),通常定义为两组平均值之间的差异。

现在假设 A 医生和一群其他医生决定他们不喜欢根据研究方案他们应该实施的治疗。或者,也许病人 B 和一群其他研究参与者认为他们被分配的治疗可能没有帮助。在这两种情况下,结果都是一些病人接受了相反的治疗。这可能有很好的原因——但是这些治疗上的转变没有被记录下来。

如果你做一个 ITT 比较,你可能不知道,一些 X=1 的人实际上服用了标准药物,反之亦然。对于每一个像这样在治疗中“穿越”的人,他们的新方程实际上是 y = xy⁰+(1-x)y——违反了一致性!

这不仅仅是学术上的。如果新药确实比标准药物效果好得多,进行 ITT 分析将揭示新药(相对于标准药物)的较弱效果,因为尽管进行了随机治疗分配,但每组实际服用的药物是混合的:

  1. 由于一些参与者交叉,X=0 组的偏头痛计数实际上低于(即,人为地好于)应有水平,而 X=1 组的偏头痛计数实际上高于(即,人为地差于)应有水平。
  2. 这使得两组的偏头痛计数更加接近,从而缩小了实际测量的效果。

你可能被开错了药物剂量…[或者]你不小心一天吃了两片而不是一片。

还有一个更加平凡的违反一致性的行为。用药错误是一种临床不良事件,在这种事件中,临床医生或医疗服务提供者给患者开出了错误的药物或提供了错误的治疗。患者不依从是指患者没有按照预期服药或接受治疗。

例如,你可能被开错了治疗偏头痛的药物剂量;这是一个用药错误。或者一个朋友可能被告知如何不正确地使用医疗设备,类似于用药错误。如果你不小心一天吃了两片药,而不是遵医嘱吃了一片,那你就没有坚持治疗。

假设在一个月后你的下一次门诊,你的医生忘记了他们将剂量加倍的用药错误,或者你忘记了你吃了两片而不是一片。然后你讨论你上个月的偏头痛次数,看看新药是否有帮助。

你们两个都认为你们从预期疗法 X=1 中观察到了 y。但是,由于双倍剂量 X=2,你无意中观察到了 y——一个你们都没有预料到的潜在结果。真正的一致性公式是 Y = y I(X=2)+y I(X=1)+y⁰ I(X=0),其中 I(。)是指标功能。希望你们俩都能发现实际接受治疗的变化。这将帮助你解释正确的潜在结果。

这也发生在 RCT。在我们上面的例子中,A 医生和其他医生故意违反研究方案犯了用药错误。病人 B 和其他参与者没有坚持指定的治疗。

所以是的,知道因果一致性很重要。套用埃莉诺·j·默里教授的话(因果推理中值得信赖的声音,你应该听从),你要确保你在测量你认为你在测量的东西。

关于出版后的修改,请参见响应/评论“ 出版后的文字修改 ”。

承认

我感谢 Jennifer Weuve 教授通过这条推文激发了这些想法:

参考

关于作者

Eric J. Daza 博士是数字健康领域的数据科学统计学家。他获得了应用统计学硕士学位和生物统计学博士学位,在临床试验、公共卫生和行为改变研究方面拥有 18 年以上的工作经验。Daza 为用于个性化健康建议的个人内(即,n-of-1,单病例,独特的)数字健康研究开发因果推断方法。| ericjdaza.com🇺🇸🇵🇭@埃里克森 linkedin.com/in/ericjdaza|statsof1.org@ stats of@ fsbiostats

双线性上采样层的一致性

原文:https://towardsdatascience.com/consistency-of-bilinear-upsampling-layer-76458f52d817?source=collection_archive---------31-----------------------

实践教程

TensorFlow-Keras 2.5 和 Apple Core ML 的代码,通过训练和预测产生一致的结果

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

照片由詹姆斯·哈里逊Unsplash 上拍摄

介绍

深度学习狂热者中众所周知,TensorFlow 中的双线性上采样层存在像素偏移问题。通过在 TensorFlow 2.x 中为它们添加“align_corner”属性,这一问题已得到部分修复。但问题仍然存在,当通过各种版本将 TensorFlow 中的训练模型导出到另一个 DL 框架时,会导致计算流不一致。

在我的例子中,当使用 coremltools 3.4 将训练好的模型从 TensorFlow 2.5 转换为 Apple Core ML 时,具有双线性上采样层的神经网络模型显示出怪异的行为。在无数次的编码、尝试、删除-删除-删除之后,我几乎放弃了 TensorFlow 和 Core ML 之间的上采样层的一致结果。

我想在最新的 TensorFlow 2.5 中使用 Keras 进行 Windows PC 中的训练,我想使用以前的 coremltools 3.4 将训练好的模型转换为 macOS 笔记本电脑的 Core ML。这是因为 2.5 版有稳定的自动混合精度计算,也是因为我因为 macOS 中 anaconda 和 pip 的依赖错误而无法使用 TF 2.5 的 coremltools 4.x。

什么是像素偏移问题?

一些尊敬的程序员对 TensorFlow 中定义的这个(麻烦的)规范提供了很好的解释。它们对我有帮助,也许对你也有帮助:

待解决的问题

“coremltools 3.4 无法正确转换 TensorFlow 2.5 中的双线性上采样图层。”

这并不奇怪,只是版本不匹配其中 TensorFlow 2.5 可以对齐该层中的图像角,但 coremltools 3.4 使用原始方法,倾向于像 TensorFlow 1.x 一样移动图像。

然而,无论如何,我必须在我的 macOS 中使用 TensorFlow 从我训练过的 Keras 模型中获得一致的结果,不管它们的版本如何…

实现双线性上采样层

我只是在这里上传我的努力。它们是用于双线性上采样的 TF-Keras 和 Core ML 的自定义层。

在喀拉斯

这是一个简单的自定义层,没有任何可训练的参数。您必须实现 call() 来计算张量。我用TF . compat . v1 . image . resize _ bilinear()但是TF . compat . v1 . image . resize()会等价。注意,必须使用 align_corners=True 。您可以在 TensorFlow 中使用其他上采样或图像缩放方法。

在核心 ML 中(目标 C)

注: 我在 2021 年 7 月 2 日更新了核心 ML 实现。也请参考底部的最新内容。

在您基于 MLCustomLayer 的自定义图层类中,您必须实现encodecommandbuffer方法来激活 GPU。苹果的金属性能着色器提供了效果很好的mpscnnupsampling 双线性 ,结果似乎与 tf 的一致…上面 Keras 中使用的 image.resize_bilinear 。多亏了这个mpscnnupnupsampling bilinear,我不用自己写 METAL 代码了。

老实说,我用的是MPSImageBilinearScale,不是 MPSCNN…,起初。结果明显不稳定,出乎意料。在我的理解中,它们应该是相同的“双线性”和“上采样(=重新缩放)”,具有对齐的角,但它们不是。我猜**MPs CNN……是纯双线性上采样,因为结果也与 CPU 的裸代码一致。同时模拟…**可能有一些定制,以保持在重新缩放的图像好看。

额外的工作是evaluateonpuwithinputs改为使用 CPU。对于计算机无法使用或其中没有 GPU 的情况,您必须实现方法。我基于 Matthijs 的网站实现了双线性上采样代码(他的指导很有帮助)。

在转换器中(coremltools 3.4)

使用之前的 coremltools 3.4 无法将 TF-Keras 2.5 的一个训练好的模型直接 转换成核心 ML 模型coremltools…convert()keras…load_model() 方法不起作用。但是可以通过如下方式间接使用*😗

  1. 我从我的神经网络代码中新建了一个裸模型,该代码已用于最新的 TF-Keras 2.5 中的训练。注意,这个空模型我用的是纯 Keras 2.2.x,而不是 TF-Keras。
  2. 因为 pure Keras 2.2.x 和 coremltools 3.4 的版本匹配,所以裸模型可以被 coremltools 3.4 转换成核心 ML 模型。但是该模型没有经过训练的参数。
  3. 我用 keras_model.load_weights()将 TF-Keras 2.5 训练好的参数加载到 pure Keras 2.2.x 新建的模型中,这个效果很好,coremltools 3.4 可以从中创建一个训练好的核心 ML 模型。

最后,

我感到欣慰的是,我可以通过 TensorFlow 2.5 和 Core ML 使用 coremltools 3.4 实现双线性上采样层,保持一致的计算结果。

我希望这将对尝试这个问题的人有所帮助。

P.S .我正在为即将到来的 MacBook Pro 2021 攒钱…但是当它到来的时候呢?

更新[2021 年 7 月 2 日]

我发现了一些上面的mpscnnupsamplingb 双线性显示不一致结果的情况,即使一开始在其他情况下看起来是一致的。因此,我尝试了另一个金属性能着色器函数,mpsnresizebilinear来实现内核 ML 中的 Keras 对应函数,,并发现具有更好的结果。

下图显示了使用上述 Keras 代码,使用双线性上采样层训练的神经网络模型的分割结果。

红色区域是 CPU 代码的结果,红线是mpsnresizebilinear的结果,黄色是mpscnnupsamplingb 双线性

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

并且,我为核心 ML 更新了目标 C 代码,如下所示:

用 Python 实现约束逻辑回归

原文:https://towardsdatascience.com/constrained-logistic-regression-with-python-c694fcd7a029?source=collection_archive---------15-----------------------

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

照片由卡罗来纳·加西亚·塔维森Unsplash 拍摄

如何对逻辑回归的参数应用特定的约束

逻辑回归是一个基本但流行的分类模型。尽管简单,逻辑回归是一个强大的工具,在现实世界中使用。

这种方法的主要好处也许是它的可解释性,因为它的参数/系数很容易解释。因此,通过充分理解每个特性对模型的影响,人们可以从模型中获得洞察力。

在这篇博客中,我将分享如何对逻辑回归模型应用特定的限制。换句话说,如何在每个特征系数的给定范围内构建逻辑回归。

文章的其余部分将安排如下。

  1. 本文中使用的数据
  2. 动机:为什么我们首先需要对系数应用一些约束?
  3. 方法:如何实现逻辑回归的具体约束
  4. 后果:承认这样约束的效果

在我们继续之前,请注意,本文涉及的所有代码都可以在我的 GitHub repo 这里找到。

数据

我们将使用 IBM 电信客户流失数据。这个数据是关于一个虚构的电信公司的客户流失,基于各种可能的因素。该数据根据 Apache 自由软件许可证版本 2 [ 1 ]获得许可。因此,我们可以出于任何目的使用它,修改它,并分发它[ 2 ]。

数据可以从 IBM 社区网站这里下载。

我们将执行如下几个预处理步骤:

  1. 通过首先移除其值包含空白的行,将列TotalCharges转换为 float。
  2. 为简单起见,删除非重复值数量大于 2 的分类列。
  3. 此外,删除TotalCharges 列以防止与tenure 的多重共线性问题(验证您自己😉).

上面的代码应该会产生下面的数据片段。

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

图 1:预处理数据(图片由作者提供)

为了让你的生活更容易,我把干净的/处理过的数据集放在我的 GitHub 这里

动机

假设您的任务是基于数据集构建分类模型(re:预测客户流失)。

因为你是一个出色的数据科学家,你知道逻辑回归是可用的方法之一,所以你用 sklearn 库创建了一个。

您向您的利益相关者报告以下系数,以及相关的见解(关于系数的解释)。

产生的系数:

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

图 2:来自 sklearn 模型的系数(图片由作者提供)

本质上,你的见解可能是这样的:

  • 该模型表明 gender male, SeniorCitizen, Partner, PaperlessBillingMonthlyCharges 与用户流失可能性的增加相关联
  • Dependents, tenure,PhoneService 与用户流失可能性的降低相关联(这是一件好事)

但是,他们(利益相关者)向您提出了以下挑战:

“你的模型的大部分输出对我来说是有意义的。我同意Dependents, tenurePhoneService 应该有负系数(减少流失的风险)。

然而,根据我多年的经验和知识,我坚定地认为,有配偶(Partner)也应该减少流失的风险,因为逻辑类似于有家属;你需要更多的电话来联系他们,因此你不太可能流失。因此,系数不得为正(最大值为零)。"

你将如何适应这种限制?

克洛斯蒂克来救援了!

clogistic 是一个约束逻辑回归的 Python 实现,带有一个类似 scikit-learn 的 API。在引擎盖下,库使用凸优化来实现这个目标。

第一步是具体化约束。也就是说,我们指定每个特征的系数的下限和上限。为了更好的可解释性,我们将约束定义为 pandas 数据框架。

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

图 3:约束数据框架(作者图片)

从上面的constraint_df,我们知道:

  • 对于特征gender, SeniorCitizen, PaperlessBillingMonthlyCharges,我们不施加任何约束,即这些特征的系数可以是任何实数(从超大负数到超大正数)
  • 而对于特征Partner, Dependents, tenurePhoneService,我们要求系数永远不为正(最大值为零),如上限= 0 所示。

使用这个数据框架,我们可以使用 clogistic 进行模型训练。当然,先决条件是安装这个库(如果您还没有安装的话)。如果您使用的是 Google Colab Notebook,只需运行以下命令。

!pip install clogistic

我们现在准备训练模型。clogistic 中的 LogisticRegression API 与 sklearn 中的 API 非常相似,只是我们可以在训练模型时指定一个bounds参数,它可以适应我们希望应用的约束。

得出的系数如下所示。

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

图 4:来自逻辑模型的系数(图片由作者提供)

看啊!约束得到了很好的满足!现在特性Partner 有一个负系数(实际上为零)。其他三个约束特征(Dependents, tenure, PhoneService)也保持为负。你可以满怀信心地带着这个结果回到你的利益相关者那里。

接下来,出于本教程的目的,假设约束更新如下。

  • Partner, Dependents, tenure, PhoneService仍需非正
  • 但是现在Dependents and PhoneService得到下限要求Dependents > -0.2PhoneService > -0.5

别着急,我们需要做的只是更新约束数据框。

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

图 5:更新的约束(图片由作者提供)

之后,我们做同样的训练步骤。

接下来是检索模型系数。

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

图 6:带更新约束的系数(图片由作者提供)

请注意,模型已经满足了更新后的约束;我们有Dependents 系数= -0.2,和PhoneService 系数= -0.5。

霍雷。🎉

设置约束的效果

需要注意的重要一点是,通过施加约束,我们基本上是在一定程度的优化(模型性能)上进行权衡,以满足约束。如下所示,随着我们添加额外的约束,我们的模型在训练数据(F1 分数)中的性能下降。

F1 score on train set for sk_logreg model is 0.5593 
F1 score on train set for cl_logreg model is 0.5575 
F1 score on train set for cl_logreg_rev model is 0.5513

发生这种情况是因为约束会缩小适合作为解的系数值的可行区域。结果,与没有任何约束的原始(更大的)可行区域相比,评估度量(这里是 F1 分数)将是次优的。

在你走之前

恭喜你读到这里!

在本文中,我们学习了如何构建一个对系数有特定约束的逻辑回归模型。我们使用 clogistic Python 库实现了这一点。最后,我们承认在我们的模型性能上强加这样的约束的“副作用”。

作为一个友好的提醒,整个笔记本可以在我的 GitHub repo 这里获得,对于那些喜欢 GitHub 界面的人来说。

希望这篇文章在你遇到类似需求时有所帮助!总而言之,感谢您的阅读,让我们在 LinkedIn 上与我联系吧!👋

参考

[1]https://github . com/IBM/telco-customer-churn-on-ICP 4d # license。备注:IBM 在这个 GitHub 存储库中使用数据集,IBM 是数据集的所有者。整个存储库是根据 Apache 软件许可证版本 2 许可的,因此数据集也是如此。

[2]https://en . Wikipedia . org/wiki/Apache _ License # Apache _ License _ 2.0

用自然语言处理构建生物医学知识图

原文:https://towardsdatascience.com/construct-a-biomedical-knowledge-graph-with-nlp-1f25eddc54a0?source=collection_archive---------3-----------------------

实践教程

了解如何结合 OCR、命名实体链接、关系提取和外部丰富数据库来构建生物医学知识图

我已经演示了如何从维基百科页面中创建知识图表。然而,由于这篇文章引起了很多关注,我决定探索使用 NLP 技术构建知识图有意义的其他领域。在我看来,生物医学领域是一个很好的例子,当你经常分析基因、疾病、药物、蛋白质等之间的相互作用和关系时,用图表表示数据是有意义的。

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

显示抗坏血酸与其他生物医学概念关系的子图范例。图片由作者提供。

在上面的可视化中,我们有抗坏血酸,也称为维生素 C,以及它与其他概念的一些关系。例如,它表明维生素 C 可以用来治疗慢性胃炎。

现在,你可以让一组领域专家为你绘制药物、疾病和其他生物医学概念之间的所有联系。但是,不幸的是,我们中没有多少人能够负担得起聘请一组医生来为我们做这项工作。在这种情况下,我们可以求助于使用 NLP 技术来自动提取这些关系。好的方面是,我们可以使用 NLP 管道来读取所有的研究论文,坏的方面是,并不是所有获得的结果都是完美的。然而,鉴于我身边没有一组科学家准备好人工提取关系,我将求助于使用 NLP 技术来构建我自己的生物医学知识图。

在这篇博文中,我将用一篇研究论文来引导你完成构建生物医学知识图谱所需的所有步骤。

https://arxiv.org/abs/2110.03526

我将使用由穆罕默德·礼萨·艾哈迈迪撰写的皮肤再生和毛发生长的组织工程论文。文章的 PDF 版本在 CC0 1.0 许可下提供。我们将通过以下步骤来构建知识图:

  • 使用 OCR 阅读 PDF 文档
  • 文本预处理
  • 生物医学概念识别和链接
  • 关系抽取
  • 外部数据库丰富

在本文结束时,您将使用以下模式构建一个图。

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

生物医学图表。图片由作者提供。

我们将使用 Neo4j 来存储我们的图形,Neo4j 是一个图形数据库,具有带标签的属性图模型。每篇文章可以有一个或多个作者。我们将文章内容拆分成句子,并使用 NLP 提取医疗实体及其关系。我们将实体之间的关系存储为中间节点而不是关系,这可能有点违背直觉。这一决定背后的关键因素是,我们希望对从中提取关系的源文本进行审计跟踪。使用带标签的属性图模型,您不能让一个关系指向另一个关系。为此,我们将医学概念之间的联系重构为一个中间节点。这也将允许领域专家评估关系是否被正确提取。

在这个过程中,我还将演示使用构建的图来搜索和分析存储信息的应用程序。

让我们开始吧!

使用 OCR 阅读 PDF 文档

如前所述,研究论文的 PDF 版本在 CC0 1.0 许可下对公众开放,这意味着我们可以轻松地用 Python 下载它。我们将使用 pytesseract 库从 PDF 中提取文本。据我所知,pytesseract 库是 OCR 中比较流行的库之一。如果你想跟随代码示例,我已经准备了一个 Google Colab 笔记本,所以你不必自己复制粘贴代码。

文本预处理

现在我们已经有了文章内容,我们将继续从文本中删除部分标题和图描述。接下来,我们将把课文分成句子。

生物医学命名实体链接

现在是激动人心的部分。对于那些不熟悉 NLP 和命名实体识别和链接的人,让我们从一些基础知识开始。命名实体识别技术用于检测文本中的相关实体或概念。例如,在生物医学领域,我们想要识别文本中的各种基因、药物、疾病和其他概念。

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

生物医学概念抽取。图片由作者提供。

在这个例子中,NLP 模型识别了文本中的基因、疾病、药物、物种、突变和途径。如前所述,这个过程称为命名实体识别。命名实体识别的升级是所谓的命名实体链接。命名实体链接技术检测文本中的相关概念,并试图将它们映射到目标知识库。在生物医学领域,一些目标知识库是:

为什么我们要将医疗实体链接到目标知识库?主要原因是它有助于我们处理实体消歧。例如,我们不希望在图中用单独的实体表示抗坏血酸和维生素 C,因为领域专家会告诉你这是一回事。第二个原因是,通过将概念映射到目标知识库,我们可以通过从目标知识库获取关于映射概念的信息来丰富我们的图模型。如果我们再次使用抗坏血酸的例子,如果我们已经知道它的 CHEBI id,我们可以很容易地从 CHEBI 数据库中获取额外的信息。

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

CHEBI 网站上关于抗坏血酸的浓缩数据。网站上的所有内容都可以在 **CC BY 4.0 许可下获得。**图片由作者提供。

我一直在寻找一个体面的开源预培训生物医学命名实体链接有一段时间了。许多 NLP 模型只专注于提取医学概念的特定子集,如基因或疾病。更罕见的是找到一个模型,检测大多数医学概念,并将它们链接到目标知识库。幸运的是,我偶然发现了BERN【1】,一个神经生物医学实体识别和多类型规范化工具。如果我理解正确的话,它是一个微调的 BioBert 模型,集成了各种命名实体链接模型,用于将概念映射到生物医学目标知识库。不仅如此,它们还提供了一个免费的 REST 端点,因此我们不必处理让依赖项和模型工作的头痛问题。我上面使用的生物医学命名实体识别可视化是使用 BERN 模型创建的,因此我们知道它可以检测文本中的基因、疾病、药物、物种、突变和路径。

不幸的是,BERN 模型没有为所有概念分配目标知识库 id。所以我准备了一个脚本,首先查看是否为一个概念给出了一个不同的 id,如果没有,它将使用实体名称作为 id。我们还将计算句子文本的 sha256,以便在以后进行关系抽取时更容易识别特定的句子。

我检查了命名实体链接的结果,不出所料,它并不完美。例如,它没有将干细胞确定为一个医学概念。另一方面,它检测到一个名为“心脏、大脑、神经和肾脏”的单一实体。然而,在我的调查中,BERN 仍然是我能找到的最好的开源生物医学模型。

构建知识图表

在查看关系提取技术之前,我们将仅使用实体构建一个生物医学知识图,并检查可能的应用。如前所述,我准备了一个 Google Colab 笔记本,你可以用它来跟踪本文中的代码示例。为了存储我们的图表,我们将使用 Neo4j。您不必准备本地 Neo4j 环境。相反,您可以使用免费的 Neo4j 沙盒实例。

https://neo4j.com/sandbox/

在沙箱中启动空白项目,并将连接细节复制到 Colab 笔记本中。

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

Neo4j 沙盒连接详情。图片由作者提供。

现在,您可以在笔记本中准备 Neo4j 连接了。

我们将从将作者和文章导入图中开始。文章节点将只包含标题。

如果打开 Neo4j 浏览器,应该会看到下图。

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

图片由作者提供。

您可以通过执行以下 Cypher 查询来导入句子和提到的实体:

您可以执行以下 Cypher 查询来检查构建的图形:

MATCH p=(a:Article)-[:HAS_SENTENCE]->()-[:MENTIONS]->(e:Entity)
RETURN p LIMIT 25

如果您已经正确导入了数据,您应该会看到类似的可视化效果。

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

存储为图形的实体提取。图片由作者提供。

知识图应用

即使没有关系提取流程,我们的图也已经有几个用例了。

搜索引擎

我们可以用我们的图表作为搜索引擎。例如,您可以使用下面的 Cypher 查询来查找提到特定医疗实体的句子或文章。

MATCH (e:Entity)<-[:MENTIONS]-(s:Sentence)
WHERE e.name = "autoimmune diseases"
RETURN s.text as result

结果

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

图片由作者提供。

同现分析

第二种选择是共现分析。如果医疗实体出现在同一个句子或文章中,您可以定义它们之间的共现。我发现一篇文章[2]使用医学共现网络来预测医疗实体之间新的可能联系。

https://pubmed.ncbi.nlm.nih.gov/25160252/

您可以使用下面的 Cypher 查询来查找经常在同一个句子中同时出现的实体。

MATCH (e1:Entity)<-[:MENTIONS]-()-[:MENTIONS]->(e2:Entity)
WHERE id(e1) < id(e2)
RETURN e1.name as entity1, 
       e2.name as entity2, 
       count(*) as cooccurrence
ORDER BY cooccurrence
DESC LIMIT 3

结果

显然,如果我们分析成千上万或更多的文章,结果会更好。

考察作者专长

您还可以使用这个图表,通过检查作者最常写的医学实体来找到作者的专业知识。有了这些信息,你也可以建议未来的合作。

执行下面的 Cypher 查询,检查我们的作者在研究论文中提到了哪些医疗实体。

MATCH (a:Author)-[:WROTE]->()-[:HAS_SENTENCE]->()-[:MENTIONS]->(e:Entity)
RETURN a.name as author,
       e.name as entity,
       count(*) as count
ORDER BY count DESC
LIMIT 5

结果

关系抽取

现在我们将尝试提取医学概念之间的关系。根据我的经验,关系提取至少比命名实体提取难一个数量级。如果您不期望命名实体链接有完美的结果,那么您肯定会期望关系提取技术有一些错误。

我一直在寻找可用的生物医学关系提取模型,但没有发现任何现成的或不需要微调的模型。看起来关系抽取领域处于前沿,并且希望在未来我们会看到更多的关注。不幸的是,我不是 NLP 专家,所以我避免对自己的模型进行微调。相反,我们将使用基于论文的零触发关系提取器,探索 few rel【3】的零触发限制。虽然我不建议将这个模型投入生产,但它对于简单的演示来说已经足够好了。该模型在 HuggingFace 上可用,因此我们不必处理培训或设置模型。

使用零触发关系提取器,您可以定义您想要检测的关系。在这个例子中,我使用了关联的交互关系。我也尝试过更具体的关系类型,如款待、原因等,但结果并不理想。

使用这个模型,您必须定义您想要检测哪对实体之间的关系。我们将使用命名实体链接的结果作为关系提取过程的输入。首先,我们找到所有提到两个或更多实体的句子,然后通过关系提取模型运行它们以提取任何联系。我还定义了一个阈值 0.85,这意味着如果一个模型预测实体之间的关联概率低于 0.85,我们将忽略该预测。

我们存储关系以及用于提取图中关系的源文本。

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

存储在图中的提取关系。图片由作者提供。

您可以使用以下 Cypher 查询来检查实体和源文本之间的提取关系:

MATCH (s:Entity)-[:REL]->(r:Relation)-[:REL]->(t:Entity), 
      (r)<-[:MENTIONS]-(st:Sentence)
RETURN s.name as source_entity, 
       t.name as target_entity, 
       r.type as type, 
       st.text as source_text

结果

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

图片由作者提供。

如前所述,我用来提取关系的 NLP 模型并不完美,由于我不是医学博士,我不知道它遗漏了多少连接。然而,它检测到的似乎是合理的。

外部数据库丰富

正如我之前提到的,我们仍然可以使用外部数据库,如 CHEBI 或 MESH 来丰富我们的图表。例如,我们的图包含一个医疗实体大疱性表皮松解症,我们还知道它的网格 id。

您可以使用以下查询检索大疱性表皮松解症的网格 id:

MATCH (e:Entity)
WHERE e.name = "Epidermolysis bullosa"
RETURN e.name as entity, e.other_ids as other_ids

您可以继续检查网格以找到可用的信息:

https://id.nlm.nih.gov/mesh/D004820.html 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图。数据由美国国家医学图书馆提供。

以下是 MeSH 网站上关于大疱性表皮松解症的可用信息截图。如前所述,我不是医学博士,所以我不知道在图表中模拟这些信息的最佳方式。但是,我将向您展示如何使用 apoc.load.json 过程从 MeSH REST 端点获取信息,从而在 Neo4j 中检索这些信息。然后,您可以请领域专家帮助您对这些信息进行建模。

从 MeSH REST 端点获取信息的密码查询是:

MATCH (e:Entity)
WHERE e.name = "Epidermolysis bullosa"
WITH e,
    [id in e.other_ids WHERE id contains "MESH" | split(id,":")[1]][0] as meshId
CALL apoc.load.json("https://id.nlm.nih.gov/mesh/lookup/details?descriptor=" + meshId) YIELD value
RETURN value

作为机器学习数据输入的知识图

作为最后一个想法,我将快速向您介绍如何使用生物医学知识图作为机器学习工作流程的输入。近年来,在节点嵌入领域已经有了大量的研究和进展。节点嵌入模型将网络拓扑转化为嵌入空间。

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

版权 2017 Manan Shah,SNAP Group。图片在 https://github.com/snap-stanford/cs224w-notes的麻省理工学院许可下提供。

假设您构建了一个生物医学知识图,其中包含医学实体和概念、它们之间的关系以及来自各种医学数据库的丰富内容。您可以使用节点嵌入技术来学习节点表示,这是固定长度的向量,并将它们输入到您的机器学习工作流中。从药物再利用到药物副作用或副作用预测,各种应用都在使用这种方法。我发现一篇研究论文使用链接预测新疾病的潜在疗法【4】。

结论

生物医学领域是知识图表适用的主要例子。有许多应用程序,从简单的搜索引擎到更复杂的机器学习工作流。希望通过阅读这篇博文,你能对如何使用生物医学知识图来支持你的应用有所启发。你可以开始一个免费的 Neo4j 沙盒并从今天开始探索。

和往常一样,代码可以在 GitHub 上获得。

参考

[1]丁·金等人。“一种用于生物医学文本挖掘的神经命名实体识别和多类型规范化工具”,载于 IEEE Access ,第 7 卷,第 73729–73740 页,2019,doi:10.1109/Access。20007.686686666607

[2] Kastrin A,Rindflesch TC,Hristovski D .网状共现网络中的链接预测:初步结果。学习健康技术信息。2014;205:579–83.PMID: 25160252。

[3]塞托利,A. (2020)。探索 FewRel 的零射击极限。在第 28 届国际计算语言学会议记录(第 1447-1451 页)。国际计算语言学委员会。

[4]张(r .)、赫里斯托夫斯基(d .)、舒特(d .)、卡斯特林(a .)、菲兹曼(m .)、基利科格鲁(h .)(2021 年)。通过知识图谱完成实现新冠肺炎的药品再利用。生物医学信息学杂志,115,103696。

基于电影剧本构建矩阵互动网络

原文:https://towardsdatascience.com/construct-the-matrix-interaction-network-based-on-the-movie-script-738b4fa9b46d?source=collection_archive---------15-----------------------

结合网页抓取、OCR 和实体识别来构建和分析 Neo4j 中的矩阵交互网络

圣诞节即将来临,随之而来的是最新的《黑客帝国》电影。我想不出比对第一部《黑客帝国》电影进行网络分析更好的等到电影上映的方法了。

议程

这篇博文将介绍如何结合 web 抓取、OCR 和 NLP 技术来构建矩阵交互网络。

  • 用硒刮矩阵 fandom 页面
  • 使用 PyTesseract 阅读黑客帝国电影脚本 PDF
  • 使用空间的基于规则的匹配器提取每个场景中的角色
  • 构建并分析 Neo4j 中人物的共现网络

我已经根据《T2》哈利波特系列进行了类似的分析,这次我们将使用《黑客帝国》电影剧本。

和往常一样,我准备了一个谷歌协作笔记本,你可以用它来学习这篇文章中的例子。

用硒刮矩阵 Fandom 页面

我们将从抓取 Matrix Fandom 页面开始,获取电影中出现的角色列表。如前所述,我们将使用 Selenium 库来实现这一点。fandom 页面的内容在 CC BY 4.0 许可下可用。

第一步,我们将提取出第一部《黑客帝国》电影中出现的角色的名字和链接。

正因为可以,我们也会从人物的个人页面中提取详细信息。

在继续之前,我们将把角色信息存储到 Neo4j 中。如果你使用的是 Colab 笔记本,那么最简单的方法就是创建一个免费的 Neo4j 沙箱或者免费的 Aura 数据库实例来存储结果。

一旦你创建了沙盒或光环环境,只需将连接细节复制到笔记本中。

现在您已经定义了到 Neo4j 实例的连接,接下来您可以导入角色的信息。

为了感受我们刚刚存储在 Neo4j 数据库中的信息,我准备了以下在 Neo4j Bloom 中制作的可视化。

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

人物信息在 Neo4j Bloom 中的可视化。图片由作者提供。

此时此刻,数据库中没有任何连接,只有孤独和孤立的节点。如果您愿意,您可以重构一些节点属性,比如将配偶重构为一个关系。然而,我们将跳过这一部分,继续根据电影剧本构建共现网络。

使用 PyTesseract 阅读黑客帝国电影脚本 PDF

电影剧本可以在每日剧本网页上以 PDF 格式获得。虽然没有明确的许可声明,但网页上说这些脚本可用于教育目的,所以我们可以开始了。

我们将使用 PyTesseract 库将 PDF 转换成文本格式。

这个过程大约需要 15 分钟,所以你可以利用这段时间休息一下,也许还可以伸伸腿。

在进入角色提取步骤之前,我们将执行一个简单的文本清理,并按场景分割脚本。

既然我们已经预处理了文本,我们将继续识别在特定场景中出现的所有字符。既然我们已经知道粉丝收集过程中会出现哪些角色,我们将使用 SpaCy 的基于规则的匹配器来识别角色。

角色名可以以两种形式出现。首先,如果角色在说话,它的名字在文本中是大写的。第二种形式是有标题的版本,其中一个角色被其他人提到或在场景描述中提到。SpaCy 使得描述这两种模式变得非常容易。

我们还将从模式定义中省略两个字。例如,fandom 页面包含字符甲骨文。因此,我们将跳过单词,只搜索甲骨文模式**。**

下面的代码将构造 SpaCy 的 matcher 对象,用于下一步识别字符。

我们已经准备好了文本和实体匹配器。我们会对场景进行迭代,识别出里面出现的所有角色,一步到位直接把结果存入 Neo4j。

从电影脚本中提取信息并将输出存储到 Neo4j 中就是这么简单。

现在,我们将继续本博客的网络分析部分。首先,我们将评估所有没有出现在任何场景中的角色。

MATCH (n:Character) WHERE NOT (n)--()
RETURN n.name AS character

结果

12 个角色在任何一个场景中都没有被辨认出来。除了那个穿红衣服的女人,我不记得任何角色。可能她在文本中被称为红衣女子或类似的东西,所以我们的模式匹配器没有识别出她。当然,我们可以对模式进行微调,以包含这些类型的异常,但总的来说,主要角色似乎已经确定。

接下来,我们将检查在大多数场景中出现的角色。

MATCH (s:Scene)
WITH count(s) as countOfScenes
MATCH (n:Character)
WITH  n.name AS character,
      size((n)-[:IN_SCENE]->()) as scenes,
      countOfScenes
RETURN character,
       scenes,
       round(toFloat(scenes) / countOfScenes * 100, 2) AS scenePercentage
ORDER BY scenes DESC
LIMIT 5

结果

这里没什么令人震惊的。尼欧出现在超过一半的场景中,其次是墨菲斯和崔妮蒂。只有埃米尔·埃夫林出人意料地从这份名单中消失了。

我们可以将同现事件定义为出现在同一场景中的一对人物。在这种情况下,共现也可以理解为一种相互作用。角色阿朵出现的场景越多,他们在电影中的互动就越多。

我们可以通过执行下面的 Cypher 语句来评估哪些角色交互最多。

MATCH (n1:Character)-[:IN_SCENE]->()<-[:IN_SCENE]-(n2:Character)
WHERE id(n1) < id(n2)
RETURN n1.name AS character1,
       n2.name AS character2,
       count(*) AS count
ORDER BY count DESC
LIMIT 5

结果

大多数互动发生在尼奥、墨菲斯、三一和坦克之间。如果你看过这部电影,这一切都是有道理的。

最后,我们可以推断出字符之间的共现网络,并对其进行网络分析。我们将简单地计算一对角色之间的交互次数,并将信息存储为一个关系。

MATCH (n1:Character)-[:IN_SCENE]->()<-[:IN_SCENE]-(n2:Character)
WHERE id(n1) < id(n2)
WITH n1, n2, count(*) AS count
MERGE p=(n1)-[r:INTERACTS]-(n2)
SET r.weight = count
RETURN p

结果

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

矩阵共生网络。图片由作者提供。

图形数据科学图书馆

Neo4j 具有一个图形数据科学库,其中有 50 多种图形算法,包括中心性、社区检测和节点嵌入类别。

我们将使用 PageRank 来评估节点重要性,使用 Louvain 来确定推断的共现网络的社区结构。我们不是分别检查每个算法结果,而是存储结果,并构建一个网络可视化,以可视化节点重要性和社区结构。

首先,我们必须投影内存中的图形,以便能够在其上执行图形算法。请注意,我们将共现关系投影为无向关系。例如,如果 Neo 与 Trinity 互动,这直接暗示 Trinity 也与 Neo 互动。

CALL gds.graph.create("matrix", "Character", 
  {INTERACTS: {orientation:"UNDIRECTED", properties:"weight"}})

现在我们可以继续执行加权 PageRank 算法,并将结果存储回 Neo4j。

CALL gds.pageRank.write("matrix", {relationshipWeightProperty:"weight", writeProperty:"pagerank"})

最后,我们执行加权 Louvain 算法来推断社区结构,并将结果存储在数据库中。

CALL gds.louvain.write("matrix", {relationshipWeightProperty:"weight", writeProperty:"louvain"})

您可以使用 Neo4j Bloom 生成一个网络可视化,根据社区 id 为节点着色,并根据其 PageRank 得分计算节点大小。

查看官方文档了解如何在 Neo4j Bloom 中开发基于规则的可视化。

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

矩阵共生网络的网络可视化。节点的大小基于它们的 Pagerank 分数,颜色基于它们的社区。图片由作者提供。

结果比我预期的要好。黄色团体是尼布甲尼撒帮,尼欧、崔妮蒂和墨菲斯是最重要的成员。紫色社区由母体代理人组成,他们是尼布甲尼撒团伙的敌人。我们必须引入某种时间线来观察塞弗是如何从一个好人变成倒戈加入黑暗面的。最后,橙色社区由神谕、女祭司和勺子男孩组成,他们帮助尼奥超越了现实。

结论

我希望我们都同意,使用简单的假设作为共现交互可以产生令人难以置信的结果,可以帮助解释单一网络可视化中潜在的 150 页 PDF。所以今天就打开 Neo4j 沙盒自己试试吧。如果你在数据管道中发现任何能产生更好或更准确结果的调整,请告诉我。

节日快乐!

和往常一样,代码可以在 GitHub 上获得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值