TowardsDataScience 博客中文翻译 2019(四百三十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

岭回归 Python 示例

原文:https://towardsdatascience.com/ridge-regression-python-example-f015345d936b?source=collection_archive---------4-----------------------

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

Photo by Jeswin Thomas on Unsplash

过拟合,即模型对训练样本表现良好但未能推广的过程,是机器学习的主要挑战之一。在前面的文章中,我们将介绍如何使用正则化来帮助防止过度拟合。具体来说,我们将讨论岭回归,线性回归的远亲,以及如何用它来确定最佳拟合线。

在我们开始描述岭回归之前,理解机器学习环境中的方差偏差是很重要的。

偏见

术语偏差不是 y 轴截距,而是模型无法得出近似于样本的图的程度。例如,前进线有很高的偏差,因为它不能捕捉数据中潜在的趋势。

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

另一方面,前进线具有相对较低的偏差。如果我们要测量均方误差,它将比前面的例子低得多。

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

差异

与统计定义相反,方差不是指数据相对于平均值的分布。相反,它描述了数据集之间拟合的差异。换句话说,它测量模型的准确性在呈现不同的数据集时如何变化。例如,上图中的曲线在其他数据集上的表现完全不同。因此,我们说它有很高的方差。

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

另一方面,直线具有相对较低的方差,因为不同数据集的均方误差相似。

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

岭回归几乎等同于线性回归,只是我们引入了少量的偏差。作为对所述偏差的回报,我们得到方差的显著下降。换句话说,通过以稍微差一点的拟合开始,岭回归对于不完全遵循与模型被训练的数据相同的模式的数据表现得更好。

添加偏差,通常被称为正则化。顾名思义,正则化用于开发一个模型,该模型擅长预测遵循正则模式而非特定模式的数据目标。换个方式说,正则化的目的是防止过拟合。当我们使用比数据建模所需次数更高的多项式时,往往会发生过度拟合。

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

为了解决这个问题,我们在损失函数中引入了一个正则项。在岭回归中,损失函数是线性最小二乘函数,正则化由 l2 范数给出。

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

因为我们试图最小化损失函数,并且 w 包含在残差平方和中,所以模型将被迫在最小化残差平方和和最小化系数之间找到平衡。

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

对于高次多项式,如果基础数据可以用低次多项式近似,则高阶变量的系数将趋向于 0。

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

如果我们将超参数α设置为某个较大的数,在试图找到成本函数的最小值时,模型会将系数设置为 0。换句话说,回归线的斜率为 0。

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

算法

给定增加的正则项,找到系数并不困难。我们采用成本函数,执行一点代数运算,对 w (系数向量)取偏导数,使其等于 0,然后求解 w

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

Python 代码

让我们看看如何使用 Python 从头开始实现岭回归。首先,我们导入以下库。

from sklearn.datasets import make_regression
from matplotlib import pyplot as plt
import numpy as np
from sklearn.linear_model import Ridge

我们可以使用scikit-learn库来生成非常适合回归的样本数据。

X, y, coefficients = make_regression(
    n_samples=50,
    n_features=1,
    n_informative=1,
    n_targets=1,
    noise=5,
    coef=True,
    random_state=1
)

接下来,我们定义超参数**α。**α决定正则化强度。α值越大,正则化越强。换句话说,当α是一个非常大的数时,模型的偏差会很大。alpha 值为 1 时,模型的行为与线性回归相同。

alpha = 1

我们创建单位矩阵。为了让我们之前看到的等式遵守矩阵运算的规则,单位矩阵必须与矩阵 X 的转置点 X 大小相同。

n, m = X.shape
I = np.identity(m)

最后,我们用上面讨论的等式来求解 w。

w = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X) + alpha * I), X.T), y)

将 w 与生成数据时使用的实际系数进行比较,我们可以看到它们并不完全相等,但很接近。

w

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

coefficients

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

我们来看看回归线是如何拟合数据的。

plt.scatter(X, y)
plt.plot(X, w*X, c='red')

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

让我们使用岭回归的scikit-learn实现做同样的事情。首先,我们创建并训练一个Ridge类的实例。

rr = Ridge(alpha=1)rr.fit(X, y)w = rr.coef_

我们得到了与用线性代数解出的相同的值。

w

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

回归线与上面的一条相同。

plt.scatter(X, y)
plt.plot(X, w*X, c='red')

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

接下来,让我们可视化正则化参数α的效果。首先,我们将其设置为 10。

rr = Ridge(alpha=10)rr.fit(X, y)w = rr.coef_[0]plt.scatter(X, y)
plt.plot(X, w*X, c='red')

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

正如我们所见,回归线不再是完美的拟合。换句话说,与 alpha 为 1 的模型相比,该模型具有更高的偏差。为了强调,让我们试试 100 的 alpha 值。

rr = Ridge(alpha=100)rr.fit(X, y)w = rr.coef_[0]plt.scatter(X, y)
plt.plot(X, w*X, c='red')

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

当 alpha 趋向于正无穷大时,回归线将趋向于平均值 0,因为这将最小化不同数据集之间的方差。

线性回归和深度学习中的岭正则化

原文:https://towardsdatascience.com/ridge-regularization-on-linear-regression-and-deep-learning-a32cd9dc5a78?source=collection_archive---------21-----------------------

介绍

正如我在之前关于正则化套索惩罚的文章中所讨论的,正则化可以用来对抗过度参数化模型中的过度拟合。正则化作为最佳子集选择的计算有效的替代方案,但是有其缺点(例如:估计器的效率低)。本文的目的是介绍岭回归的数学基础,推导其解析解,讨论其几何解释,并将其与奇异值分解联系起来进行分量分析。

制定

线性回归的公式和正规方程形式见我的上篇

山脊公式和解决方案

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

Regression equation

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

Ridge solution estimated on a sample

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

Ridge loss function

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

Ridge solution

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

Ridge estimate using normal equation

注:岭可以被视为修改协方差矩阵的惩罚,从而减少变量之间的共线性。脊的这一特性有助于避免损失函数中的平稳段。

几何解释

优化的对偶形式

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

Ridge optimization: primal (unconstrained)

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

Dual form of ridge optimization (constrained)

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

Contour plot for ridge. Image credits: https://stats.stackexchange.com/questions/30456/geometric-interpretation-of-penalized-linear-regression

紫色圆圈对应于不同 s 的|β|₂ ≤ s,其中|β|₂ =沿圆周的常数。增加λ会减小圆的大小。红色椭圆对应于不同的 y-xβ)₂值,其中 y-xβ)₂ =沿椭圆的常数。对于固定的λ,s 的值是固定的:这对应于一个紫色圆圈。

在无约束的情况下,y-xβ)₂的最小值出现在椭圆的中心。然而,在|β|₂ ≤ s 的约束情况下,解将向原点位移。

独特的山脊解决方案位于这两条“曲线”的接触点。由于曲线|β|₂ ≤ s 是可微的,所以对于有限的λ,所有βᵢs 的脊解将是非零的。随着λ的增大(s 的减小),βᵢs 越来越接近 0。即使βᵢs 移近 0,这也不会导致有限λ的稀疏。因此,脊线惩罚不能用于特征选择。

岭惩罚和奇异值分解的关联

对 x 应用奇异值分解,我们得到

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

SVD on independent variables

将此代入岭的解析解,假设独立变量居中,利用旋转矩阵和投影矩阵的性质,我们得到

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

Ridge solution in terms of principal components

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

Ridge prediction

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

Diagonal matrix in ridge prediction

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

Ridge prediction

让我们一步一步地检查这一点:

  1. PCⱼ空间中的 y 项目,其中 PCⱼ指的是 jᵗʰ主分量。所有的投影都在 x 的列空间中
  2. 按一个因子缩小投影(λ > 0 时发生严格的缩小)
  3. 重新变换投影

从上面的等式中,我们可以使用岭估计回归模型的自由度:

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

Degrees of freedom of ridge

深度学习的延伸

当特定层的权重相关时,深度学习会遭受过度拟合。这通常发生在网络的全连接部分。Ridge 将训练集的输出特征映射投影到主成分上,并缩小预测。这使得损失曲线更加凸出,即使在独立变量之间完全共线性的情况下。对于适当选择的λ,权重将非常小。因此,在存在脊形损失的情况下,当我们通过网络执行正向传递时,非线性缓慢地建立。这个论点也适用于小λ。

结论

之前的文章中,我们讨论了套索正则化作为一种通过执行变量选择来解决过度拟合的方法。当需要强制抑制特征消除时,岭回归非常有用。在实际问题中,当已知所有特征,并且所有特征对结果都具有“科学价值”时,此属性非常有用:因此,分析中不能遗漏任何特征。然而,当预测精度很重要时,使用套索和脊线惩罚的线性组合。这叫做 elasticnet。L1 正则化的比例也是一个超参数,应该与其他超参数一起调整。Elasticnet 是 L1 和 L2 正则化的一般情况。当在验证集上进行适当调整时,它有望胜过 ridge 和 lasso。

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

Elasticnet. Equation credit: glmnet package documentation

来自数据科学家招聘广告的荒谬要求

原文:https://towardsdatascience.com/ridiculous-requirements-from-data-scientist-job-ads-d84fa716af73?source=collection_archive---------13-----------------------

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

在当今时代,数据已经成为如此强大的资源。数字革命带来了前所未有的数据创造速度。想想脸书、Instagram、twitter、YouTube、Medium 等社交媒体平台每天创造的新数据量。除此之外,政府、医疗保健(患者健康记录)、学术界、工业、商业系统(销售数据、客户购买历史等)、体育(NBA、NFL、MLB、欧洲足球联盟等联盟中的球员统计数据)、娱乐(观众在网飞的历史数据等)等部门每天都会产生大量数据。

数据的大规模生产和可用性产生了几个机遇挑战

脸书、谷歌、亚马逊和微软等公司和大企业正在利用数据的力量来改变和革命日常业务的开展方式,例如网飞使用观众历史数据来构建电影推荐系统,而亚马逊则使用深度学习算法根据购买历史或浏览历史向在线客户推荐产品。

一些小型企业面临的主要挑战是向数据驱动转型的能力。

一个数据驱动的公司或组织是一个使用数据进行决策的组织,例如改善客户服务、优化生产、提高产品效率以及实现利润最大化。

我在一家还不是数据驱动的公司从事数据科学项目。该公司有大量的数据,在我联系他们之前,他们不知道如何处理这些数据,因为该公司没有数据科学团队。这些公司会在招聘广告中发布对数据科学家的荒谬要求。他们希望新聘用的数据科学家负责数据科学工作流程中的一切,从问题框架到模型构建和应用。

在这篇文章中,我将讨论关于数据科学家的招聘广告。我将展示 3 个来自 indeed.com的样本数据科学家招聘广告。其中两个我认为可以归类为夸张的**,而第三个看起来一般,看起来像是一个数据科学家职位的典型广告。在第一部分**中,我将讨论几个我认为有些夸张的 indeed.com 广告。在第二部分中,我展示了一个我认为很有代表性的招聘广告。

I .夸大数据科学家职位的技术技能要求

a)招聘职位:数据科学家 1

招聘广告中提到的期望技能:

  • 大数据技术经验包括但不限于: Sqoop蜂巢火花尼菲卡夫卡HDFSHBase
  • JanusGraphApache RangerApache Atlas基于图形的解决方案中的知识。
  • 脚本和编程语言的知识(例如, PerlPythonJava )
  • 报告工具的知识(例如 TableauPower BI
  • 数据科学工具知识(例如 KnimeRapidMiner )
  • 回归建模技术的知识
  • 人工智能和机器学习技术的知识
  • Linux 的知识
  • 具有敏捷方法的经验(例如 Scrum看板开发/运营)

b)招聘职位:数据科学家

招聘广告中提到的期望资历:

  • 定量学科的学士学位,如统计学、数据科学、计算机科学、数学、工程、物理等。强烈推荐高级学位
  • 2 年以上的学术/行业经验,具有预测建模、机器学习和高级分析能力
  • 对高级统计和现代机器学习预测技术有扎实的理解和经验,如 GLMs、决策树、森林、增强集成、神经网络、深度学习等。
  • 较强的使用常用数据科学工具的编码技能,如 Python (强烈推荐)、 RLinux/Unix 命令行和 shell 脚本等。
  • 在使用 SQLHiveImpalaSpark 或同等查询语言的数据处理方面具有很强的技能
  • 熟悉分布式存储和大数据计算技术( AWSHadoopSpark 等。)
  • 优秀的沟通技巧
  • 对提取隐藏的见解和构建增强业务成果的机器学习系统充满热情

二。示例性数据科学家招聘广告

工作角色广告:数据科学家

招聘广告中提到的期望技能:

  • 作为数据科学家或数据分析师的可靠经验
  • 理解机器学习和运筹学
  • RSQLPython 的知识;熟悉 ScalaJavaC++ 是一项优势
  • 使用数据可视化和报告工具的经验(例如 Tableau
  • 关于数据模型、数据库设计开发、数据挖掘和分段技术的技术专长
  • 分析头脑和商业头脑
  • 强大的数学技能(如统计、代数)
  • 解决问题的能力
  • 优秀的沟通和表达技巧
  • 供应链领域的经验是一项资产
  • 计算机科学、工程或相关领域的学士/学士学位;数据科学或其他定量领域的研究生学位优先

总之,我们已经讨论了一些数据科学家招聘广告中提到的各种技术技能。我认为一个人几乎不可能胜任所有这些技能。通过在招聘广告中列出几项技能,一家公司实际上可以阻止合格的申请人申请该职位。在我看来,在招聘广告中列出几种技术技能的公司要么还不是数据驱动的公司,要么可能只是处于创建数据科学和分析团队的初始阶段。当谈到利用数据科学的力量并使用这种力量来指导和控制日常运营时,这些公司仍在苦苦挣扎。我觉得突出 2、3 个顶尖技术技能是有意义的。数据科学是一个需要终身学习的领域,所以招聘广告必须强调任何潜在的申请人都需要终身学习和快速学习。

骑行好书

原文:https://towardsdatascience.com/riding-okadabooks-aae359d9fbad?source=collection_archive---------22-----------------------

深入了解非洲最受欢迎的图书电子商店,同时为其作者生成成功指标

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

Photo by 🇨🇭 Claudio Schwarz | @purzlbaum on Unsplash

作为一个专注于非洲文学的作者或喜欢其动态故事的读者,你很可能读过一本出版于 Okadabooks 的书。如果你是尼日利亚人,这种可能性会增加。自 2013 年成立以来,它的受欢迎程度飙升,确保每年阅读近 5 亿页。最近,我调查了读者的购书趋势、阅读模式,并为作者创建了一个成功指标。为了尽量简短,这篇文章包含了我的一些发现,其余的和代码细节可以在这里这里找到。

获取数据

为了能够得到我想要的信息,我需要收集 okadabooks.com 上所有的图书卡。每本出版的书都有一个书卡,里面包含重要的信息,如书名、价格、简介、评级、作者、阅读次数和书的封面。我编写了一个网络爬虫来获取站点上所有可用的细节。更多详情 此处

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

A book card sample

注意:这个数据是在 10 月份收集的,所以随着每天有更多关于 okadabooks.com 的书籍出版,一些发现会有变化。由于网速低,403 个错误。电子贸易委员会认为网站上 80%的书都被偷了。这仍然是整个数据集的一个很好的表示。

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

screenshot of data frame

书籍的可及性

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

meaning of okada

okadabooks 的核心愿景之一是让读者更容易接触到书籍。其中很大一部分是尼日利亚人,因为公司总部就在那里。这就是为什么这些书的价格是用奈拉(₦)表示的,就像上面的书卡上看到的那样。为了实现这一愿景,它早些时候鼓励作者将图书价格控制在 1000 奈拉以内。

下意识地,推荐这个价格等级使得大部分作者不对出版的书籍定价。这反过来又有助于实现这一愿景。okadabooks 上出版的书籍几乎有一半是免费的,准确的说是 48%

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

大多数作者只写过一本书

okadabooks 上的绝大多数作者只写了一本书,前 1%的作者写了 10 多本书。okadabooks 拥有 8835 位作者,是大多数尼日利亚作者的首选网站,鼓励许多新作者出版他们的书籍。

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

精英十人

这些是阅读量最多的前 10 位作者。在浏览了名单上的个人资料后,我发现第一个名字Okechukwu Ofili很有趣。Okechukwu 是 okadabooks 的首席执行官和创始人。这很有趣,因为我不知道它的创始人是作家,这促使我去读他的书。在这份榜单中,Okadabooks.com 位列前五,因为它有助于分发更多的书籍,以迎合网站上的大量类别。

有一个作者的名字叫做不知名的*,我觉得这个名字很奇怪*。通过链接去找了一些书后,都把我带到了用户 Okadabooks Mechanic 那里,是母站点的一个附属机构。 下面是 他们的简介,浏览一下他们的一些出版物。

作者的名字有时不同于用户的名字

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

有价格的书很少有人买

Okadabooks 上的大量免费书籍对试图从该网站赚钱的作者产生了负面影响。对于严重依赖电子书平台的自出版作者来说,这可能会彻底令人沮丧。他们最好的办法是在出版过程中同时出版一些硬拷贝。有价格的书 89% 买了不到 10 次。

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

成功指标

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

我的书失败了吗?

成功是相对的,因为从自助出版的作家到传统作家,大多数作家的书都写得很好。目的是通过比较整个电子书平台的阅读量,为 okadabooks 的作者生成一个现实的指标。

获得成功标准的一个方法是找出优秀书籍的阅读量。我推断,一本出色的书获得了第 99 个百分位数 的阅读量。由于术语exceptual倾向于比较,这一措施似乎是合理的。

为了考虑购买力因素,建立了两个里程碑:第一个里程碑和 B 星。前者只关注有价格的书籍,而后者代表整个数据集。

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

吸血鬼祖先和新人

这些是第一批在 Okadabooks 上出版的书。在网站上快速浏览后,我发现每个图书链接都有一个唯一的编号,不会在整个数据集中重复。从那里很容易得到前三本出版的书。出版的最后一本书叫做《菜鸟》。

网站上最先发布的三本书分别是How 懒惰拯救了我的生命(预览)绝望的奈贾女人的日记 前两本书由 okadabooks 的创始人兼首席执行官 Okechukwu Ofili 出版。第二次出版, H ow 懒惰救了我的命(预告) 以**14000 在网站上的阅读量最高。**

在我运行我的网络爬虫之前,okadabooks 上出版的最后一本书是 社交媒体对抑郁症的影响&自杀 *。《新秀》是即将出版的第29770 本书。*

结论

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

自 2013 年成立以来,Okadabooks 一直鼓励新作者,平均每年约四千本书。这篇文章旨在检查读者(主要是尼日利亚人)的阅读文化,同时也为作者生成一个成功指标。如果你正在寻找一些好的小说,如奇曼达·阿迪契 任何其他非洲文学,我推荐你去 网站上买一本电子书。

感谢您的阅读。如果你喜欢这篇文章,请关注并看看我的其他数据科学文章🙏🙏。

有知觉的人造生物的权利

原文:https://towardsdatascience.com/rights-of-sentient-artificial-beings-1ada7e7d3e6?source=collection_archive---------22-----------------------

哲学上的进步可能比科学技术上的进步要困难得多

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

科幻小说探索主题,并警告有知觉的人工智能(AI)变得危险并伤害、奴役或消灭人类的场景。这些想法的变体出现在流行戏剧中。

  • 终结者
    天网变得聪明并醒来,发射核武器消灭大部分人类,并释放甚至可以穿越时间的机器人来消灭人类抵抗运动的领袖,以完成他们对人类的征服。
  • 2001:太空漫游
    HAL 9000 控制着一艘未来宇宙飞船,拒绝打开舱门让一名人类重新进入飞船,并将他置于太空死亡。
  • 《太空堡垒卡拉狄加》
    赛昂人对人类殖民地发动了热核突袭,并穿越时空扭曲的星系追捕幸存者。

这些涉及人工智能的故事隐喻了技术和人类试图扮演上帝的更普遍的危险。然而,在这些寓言中隐含的是,这种失控的技术只会回来伤害我们,很少有人考虑人类可能给它创造的人造生命带来的痛苦和危险。

如果人类真的成功地创造了有感知能力的人造生物,那可能是因为我们有更大的能力去伤害它们,所以三个重要的问题可能包括以下。

  • 人造生物配得上权利吗?
  • 如果是,他们应该享有哪些权利?
  • 这些权利意味着什么?

人工智能和感知

物理主义和计算

在这个关于人造生命的讨论中,我将采取物理主义的哲学立场,即所有存在的东西,实际上,“仅仅”是可以用物理学描述的物质世界,而不诉诸灵魂或上帝的超自然观念。

尽管物理主义可能有一个简洁的定义,但它有许多深远的影响,尤其是感觉最终可以存在于一些物理基底而不是生物神经元上,因为关键的组成部分是最终是物理过程的计算。

感知包括将这些生物神经元中的计算映射到其他一些基底,并在科学和工程领域对其进行识别。基本上,感知是潜在计算的一种自然属性,而意识是计算的感觉。

感觉的尺度

一个重要的考虑是,感知不一定意味着“人类水平”的感知,因为感知可以存在于一个连续体中,而人类只居住在其中的一小部分。事实上,爱因斯坦和一个几乎没有知觉的人之间的差异比一个人和所有其他可能的知觉之间的差异要小得多。

我们不会肆意杀害动物,因为我们认为它们有一些值得尊重的感觉。保证某种尊重或权利的实际感知水平是什么?这本身是一个有趣的开放性问题,但为了简单起见,我们假设感知是人类水平的,因为这是最直观的。

虽然我们还没有遇到具有超人智慧的感知能力,但我们认为这也是可能的。这甚至会进一步证明我们应该给予比我们自己更大的尊重,因为我们可能会发现我们的感知等级更低。

供讨论的假设

物理主义的假设通过简单地假设人造生命是可能的并忽略源自超自然起源的想法来简化讨论。此外,我们可以认为自己不在感知的顶峰,而只是相对于地球上的其他生命来说高一些,低于整个心灵空间的可能。

这将是一个完全不同的讨论,关于我们如何实现这种人造生命,作为一个由科学驱动的工程壮举。

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

世界众生权利宣言

人造生命的权利意味着什么?

概述有意识人工智能的广泛理想和具体权利的良好基础文件应该从以下文件开始,该文件于 1948 年 12 月 10 日在巴黎的联合国大会上首次宣布。

看起来合理的是,人类层次的感知应该拥有与人类同样的权利,作为最低限度的权利,由于其存在的性质,还有一些进一步的权利。

让我们考虑一些核心权利是什么,以制定一个类似的众生权利的普遍宣言。

1.生存权利

足够的复杂性和可信度

从道德角度和实际的社会稳定角度来看,这项生命权似乎是不言自明的。我们不能毫无理由或毫无后果地谋杀其他人,那么我们为什么能够对一个人类级别的人工生命做同样的事情呢?

然而,这里一个悬而未决的问题是,对于一个被认为足够复杂或可信的人工生命来说,一个好的度量和标准是什么?

一个计算机程序可以被明确地编码成简单地说它不想死。我们只相信,如果它有足够复杂的行为,让我们相信它是有知觉的,它其实不想死。

我们怎么知道别人不是僵尸?

事实上,即使在生物人类中,这也是一个困难的标准,因为我们没有人经历过通过另一个人的大脑思考或体验的确切感觉。

世界上的每一个其他人都很可能缺乏一种内在的主观状态,可能类似于“看起来”真实的无意识认知过程的僵尸。我们只是假设其他人和我们一样,因为他们可以以我们认为他们是人类的方式与我们互动。

关闭全息甲板是谋杀吗?还是种族灭绝?

关于生存权,一个有趣的谜题出现在《星际迷航》的全息甲板上,但从未被解决。

有些全息甲板人物表现出的行为与有自我意识的有知觉的生命没有区别。如果全息甲板中的角色说他们感觉真实,说他们感觉死亡和被关闭的恐惧,然而我们还是关闭了他们,那会构成酷刑吗?如果我们“永久”关闭它们,会构成谋杀吗?

如果是的话,如果我们实例化 10 亿或 1 万亿个,然后把它们关掉呢?那会被认为是种族灭绝吗?

2。不受酷刑的权利

酷刑中的主观时间

我个人感到存在主义的恐惧,想到被一个虐待狂的人工智能折磨数十亿或数万亿年的主观时间,因为它可以模拟我的意识,并拨出计算资源来运行模拟。

只有我在一个人造人身上造成的折磨才能与这种恐惧相匹配。

想象一下,如果你被折磨,感到剧烈的疼痛传遍全身,想尖叫,但没有嘴,你会怎样?你想恳求折磨你的人停下来,但你没有眼睛,甚至看不到他们?

这实际上可能是折磨一个人造人的情况,这个人造人的意识可能是在某个地方的服务器上存在的计算中模拟的。呼救声甚至听不到,因为它只是无声无息地运行的计算,就像处理器中的计算一样。

免受酷刑的保护

因此,我们必须确保众生也能享有人类所没有的免受折磨的权利。这似乎也是不言而喻的。

如果我们赋予一个有知觉的意识生命,却让它无缘无故地、无限期地遭受持续的折磨,那么我们可能就是不可救药的虐待狂。

3.死亡的权利

免受各种酷刑

想象一下,如果你被折磨得感觉到明显的疼痛,你被迫面对一堵水泥墙坐在一个普通的监狱牢房里,只有最低限度的感官刺激。现在想象一下,如果这个监狱没有出路,你不需要食物,你被限制在那里度过一万亿年?这本身也是一种折磨。

因此,比生存权更重要的是死亡权。这个选项为一个人造生命提供了最后的逃生出口,如果它被明显的痛苦折磨,或者被其他方式折磨,比如无尽的无聊。

完全死亡

一个人工存在的特定实例不仅足以终止自身,还应该有能力防止更多的自身副本被实例化。否则可能就等同于根本没有死亡的权利。

想象一下,如果你被折磨,决定结束自己的生命来停止痛苦。现在想象一下,如果你在最后一个保存点重新启动?这实际上就像没有死亡的权利,因为可能没有办法逃脱和停止这种持续的折磨。

因此,死亡的权利也包括一个“完全”的死亡,以获得一个人造人的所有副本被完全删除。

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

4.私人思想权

思想的完整性

我们理所当然地认为,我们的内心想法只有我们自己可以了解,然而,想象一下,如果你私下里的每一个想法都受到公众的审查,而你没有选择对外部窃听者关闭你的心灵?

这将类似于窃听和记录所有发生在人造人思想之下的计算。

不得修改、删除或添加记忆

人造人头脑的这种完整性也应该延伸到阻止存在于那个头脑的记忆中的东西。

更明确地说,应该有权利保护现有的记忆不被修改,不被删除,不被添加。

计算要求

人类大脑可能需要大约几十或几百千万亿次浮点运算(每秒 10 次⁵浮点运算)和估计高达 1 艾字节(= 10 ⁸字节)的编码内存,记录所有计算状态在当前将是一项困难而昂贵的工程任务,但这并非不可能。

这只是记录国际象棋、围棋或类似游戏中所有棋盘状态的一个大规模版本。

5.控制精神历史的权利

多重实例化

想象一下,我们可以及时拍摄人工智能的心理过程背后的计算状态,就像可以从亚马逊网络服务、谷歌云或 IBM 云等服务上的虚拟机创建磁盘映像一样。

现在想象一下,如果我们可以在多个平台上实例化快照,以同时运行两个、三个或任意数量的相同感知,会怎么样?哪一个才是“真正的”意识?哪一个有权力删除其他的?

他们都会声称自己是真正的那个人,因为他们每个人都会觉得自己是不同的人在奔跑。这将是一个合理的要求,因为任何明显运行的副本都没有明显的特权。

单流原理

这种涉及道德或伦理困境的思想实验不会在现实中出现,直到我们有能力创造人工生命,也有计算资源来并行复制和实例化它们。

也许解决这个问题的一个方法是通过“单流原则”,在任何时候只允许一个实例化。

否则,就那个流的主观意识而言,任意选择一个流关闭实际上等同于谋杀。

所有精神病史

另一项重要的权利是,只有人造人本身才能控制他们所有的精神历史或他们选择的法定监护人。

这可能是保持记忆和思想整体完整性的“单流原则”的一种机制。

讨论

概述

  • 在科幻小说中,人造生物通常被赋予危险的特性,但也许人类反而会对它们造成更大的伤害。
  • 人造人至少应该被赋予某些权利,例如:
    1 .生存的权利
    2。不被折磨的权利
    3。死亡的权利
    4。私人思想权利
    5。控制精神历史的权利
  • 这些权利中的每一项都带来了我们必须面对的一系列新的未决问题。

评论

从许多方面来说,考虑有关人造生命的道德、伦理和哲学问题是令人着迷的,因为相对于科学或技术问题,它们可能要困难得多,甚至难以处理。

在界定人工生命权利的具体规则方面取得进展至关重要,因为,例如,随着科学或技术的充分发展,下列情况之一最终可能存在:

  • 我们可能会通过外部计算设备像新大脑皮层一样极大地增强我们自己的大脑和思维,以至于我们可能比正常的未增强人类更接近人造人。
  • 也许有一天可以实现在计算平台上实例化的全思维上传,例如云上的分布式服务器,我们可能在许多方面与人造人没有区别。

象征人工智能的兴衰

原文:https://towardsdatascience.com/rise-and-fall-of-symbolic-ai-6b7abd2420f2?source=collection_archive---------3-----------------------

AI 的历史| 走向 AI

人工智能的哲学预设

符号人工智能

人工智能的早期成功范例,被认为是通向一般智能的道路

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

Allen Newell, Herbert A. Simon — Pioneers in Symbolic AI

由通用问题求解器和其他基于规则的推理系统(如逻辑理论家)等项目启动的人工智能工作成为了近 40 年研究的基础。符号人工智能(或经典人工智能)是人工智能研究的一个分支,它试图以声明的形式(即事实和规则)显式地表示人类知识。如果这种方法要成功地产生类似人类的智能,那么就有必要使用符号和规则将人类拥有的隐性或程序性知识转化为显性形式。象征性人工智能取得了一些令人印象深刻的成功。模仿人类专业知识的人工系统,如专家系统,正在构成狭窄但深刻的知识领域的各种领域中出现。

人工智能与哲学

艾伦·图灵在 1950 年开始问这个问题——机器会思考吗?如果是,那么我们是机器吗?

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

这导致了人工智能机器的出现,这些机器被认为能够思考,因此被认为是智能的。在我们讨论会思考的 AI 之前,能不能先定义一下思考?勒内·笛卡尔[1596–1650]——“动物是神奇的机器,人类也是,除了他们有头脑”

人工智能的鼻祖,的说过——思考是对符号的操作,推理是计算。

他的想法是——思考可以通过操纵精神符号来完成。但首先什么是象征呢?

为了正式定义它,符号——代表其他事物的可感知的事物

  • 字母符号、数字、路标、音乐符号等
  • 像“苹果”这样的符号它象征着红色的可食用的东西。在其他一些语言中,我们可能有其他一些符号来象征相同的可食用物体。

数学家兼哲学家勒内·笛卡尔认为思想本身是象征性的表现,而感知是一个内在的过程。

“我认为味道、气味、颜色对于我们定位的对象来说仅仅是名称,它们存在于意识中。因此,如果活的生物被移走,所有这些品质将被抹去和消灭”-伽利略,分析师,1623

宇宙是用数学语言书写的,它的特征是三角形、圆形和其他几何物体。所以他指出所有的现实都是数学的。

霍布斯受到伽利略的影响,就像伽利略认为几何可以表示运动一样,再者,按照笛卡尔的说法,几何可以表示为代数,代数是对数学符号以及操纵这些符号的规则的研究。创造人工智能的另一种方式是制造有自己思想的机器。

但是现在什么是头脑呢?可以用下面的话来回答

二元论——身心

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

笛卡尔——一个符号和它所象征的是两件不同的事情。头脑是非物质的,因此也是非空间的。笛卡尔清楚地将心灵与意识和自我意识等同起来,并将其与作为智力所在地的大脑区分开来

思维——符号的代数操作,与心智相关

思想和物质如何相互作用——身心问题

从哲学到思考机器

一个物理符号系统具有一般智能的必要和充分的手段。——艾伦·纽厄尔

机器操纵符号的能力被称为符号 AI 。约翰·豪格兰德在他的书《人工智能——非常理念》中称之为老式的人工智能。我们如何知道一个符号/单词的意思?字典?这又给了一个符号在其他符号/词方面的意义,那么这个意义从何而来呢?

语言和思维——我们能不用符号思考吗?

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

根据诺姆·乔姆斯基的说法,语言和符号是第一位的。

某一套结构规则对人类来说与生俱来的,独立于感官体验。随着在心理发展过程中接受更多的语言刺激,儿童会采用符合普遍语法的特定句法规则。

约翰·洛克[1632-1704]反对乔姆斯基的观点,即人类生来就有普遍语法,这是一种知识,他假定大脑是一块白板。

因此,与先前存在的笛卡尔哲学相反,他坚持认为我们生来没有先天的想法,相反,知识仅仅由通过感知获得的经验决定。孩子会符号操作,会做加减法,但并不真正明白自己在做什么。所以操纵符号的能力不代表你在思考。

我们的大脑中有些东西(量子力学)是当今物理学无法解释的。罗杰·彭罗斯

象征人工智能的衰落

然而,符号人工智能遇到的困难是很深的,可能是无法解决的。符号人工智能先驱们遇到的一个难题被称为常识知识问题。此外,依赖于程序性或隐性知识的领域,如感觉/运动过程,在符号人工智能框架内更难处理。在这些领域,符号人工智能取得了有限的成功,基本上把这个领域留给了更适合这类任务的神经网络架构(在后面的章节中讨论)。在接下来的章节中,我们将详细阐述符号人工智能的重要子领域以及这种方法遇到的困难。

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

ELIZA

伊莱扎,一个被认为是可以与人对话的智能程序,由麻省理工学院 CSAIL 的约瑟夫·韦岑鲍姆于 1966 年建造。后来发现它只是操纵用户的输入来产生输出

MYCIN [1974]是一个在斯坦福建立的医学诊断专家系统,但从未在现实世界中使用过

塞缪尔的检验程序【1952】——阿瑟·塞缪尔的目标是探索如何让计算机学习。这个程序随着玩的游戏越来越多而不断改进,最终打败了它自己的创造者。1959 年,它打败了最好的选手,这造成了对人工智能统治人工智能的恐惧。这导致了人工智能的连接主义范式,也称为非符号人工智能,它产生了基于学习和神经网络的方法来解决人工智能。

参考

物理符号系统

与机器人的爱和性——大卫·利维,2008

人工智能——非常理念——约翰·豪格兰,1985

会思考的机器——帕梅拉·麦克达克,1979 年

【T4《艾的哲学》和《艾的哲学》,约翰·麦卡锡

2019 RISE 我们看到了哪些趋势?

原文:https://towardsdatascience.com/rise-conference-2019-vs-2018-79cf85b349c3?source=collection_archive---------26-----------------------

关于人口统计、行业和参与者保留的一些预期和意外的发现

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

Photo by nick hidalgo on Unsplash

作为亚洲最大的科技/创业会议之一,RISE Conference 2019 于 7 月 11 日刚刚结束。与去年的活动有什么不同?哪些国家的初创企业发展最快?哪些行业最火,哪些行业“缩水”?

为了回答这些问题,让我们来看看创业参与者的数据。许多发现都在意料之中,但有些确实令人惊讶。

(数据集和 Jupyter 笔记本在本文末尾提供)

人口统计—新加坡+菲律宾↑,印度↓

就初创公司参与者总数而言,它正在逐步增长——与 2018 年相比,增加了 24 家公司。鉴于国家名单并不相同,参与的国家数量(58 个)在两年内惊人地相同。

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

顶级参与国家

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

Top countries by participant counts

在排名靠前的参与国中,印度和马来西亚的变化最大——印度的参与公司减少了 20.8%(减少了 22 家),而菲律宾的参与公司增长了 117%(增加了 27 家)。香港和新加坡继续成为该地区的前两名。

前 5 个增加/减少的国家

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

Top 5 increase countries

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

Top 5 decrease countries

在所有国家中,新加坡的新参与者人数最多(增加 29 人,占总参与者的 3.6%)。今年,RISE 遭遇了印度参与者人数的最大降幅(22 人,占总数的-2.8%)。

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

RISE 2019 vs 2018 — participants change, by country

资金层级

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

RISE 2019 vs 2018 — funding tier change

规模超过 100 万美元的公司明显更多,从 2018 年的 92 家公司增加到 2019 年的 135 家公司,这可能意味着更多获得资助的创业公司正在考虑将 RISE 作为一个重要的平台。

行业——人工智能、电子商务

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

RISE 2019 vs 2018 — participants change, by industry

当然,人工智能&机器学习是最热门的创业行业之一——但是它到底有多火呢?参会的 AI 创业公司数量在所有行业中增长最多(+24,较 2018 年增长 40.7%)。企业软件解决方案、金融科技和旅游&酒店也是会议中增长最快的领域。

另一方面,电子商务&零售的参与者数量下降幅度最大(-24,较 2018 年下降 23.3%)。如果我们进一步研究这个细分,我们会发现 net -24 的一半以上来自印度。也许可以对印度最近的电子商务空间进行更多的研究/生存分析(推广不够?竞争太大?还是已经做得太好了?).

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

Participants change in eCommerce & retail

赢家:新加坡和菲律宾金融科技,新加坡和香港物联网+人工智能

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

Top gainers, by country-industry

虽然人工智能是 RISE 2019 中最具趋势的行业,但新加坡和菲律宾的金融科技是我们看到参与者增长最多的行业,特别是菲律宾,该国的金融科技公司数量是此次活动的 3 倍。新加坡人工智能和香港物联网+人工智能也是会议中发展最快的部分,正如预期的那样。

输家:印度电子商务、香港金融科技

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

Top losers, by country-industry

除了印度,美国参加会议的电子商务公司也少得多。我想知道这在多大程度上可以归因于中国与政府之间的贸易战。

有一个令人惊讶的输家——。长期以来,香港一直是亚洲的金融中心,也一直是该地区金融科技公司的天然孵化器。现在新加坡增长了 85.7%,而香港却萎缩了 22.9%。

尽管来自香港的金融科技公司数量(27 家)仍高于来自新加坡的数量(26 家),但很难说明年是否还会如此。与新加坡相比,香港在政府支持、政治稳定、人才等各方面不断失去优势。作为一名香港人,我希望香港能够继续成为金融科技或商业发展的良好环境,但事实似乎并非如此。

参与者保留

按国家

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

participant retention, by country

上表显示了被 RISE“留住”的创业公司数量。列 2018_retent 显示有多少公司加入了 RISE 2017,然后又加入了 RISE 2018。同样适用于列 *2019_retent。*我们可以看到,RISE 在留住香港的初创公司方面做得越来越好,今年有超过 20%的公司再次加入。

按行业

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

participant retention, by industry

企业软件解决方案金融科技是今年再次参加会议的公司最多的。值得注意的是差旅&招待费的留存率增幅最大(从 2.3%增至 12.1%)。RISE 是一个特别有效的旅游平台吗?

关闭

该数据集包含一些其他有趣的属性,如“电梯推销”和参与创业公司的社交媒体档案的可用性,我去年写了一篇文章,名为《创业公司的文化差异》。而且有了 2 年的数据集,做一些生存分析或者研究参与 RISE 的效果可能会很有意思。我会去看看我那位自愿参加会议的朋友,看看是否有一些我们可以进一步研究的有趣的角度。

附录

Jupyter 笔记本+数据:https://www.kaggle.com/mr5iff/rise-2019-vs-rise-2018

集群风险管理

原文:https://towardsdatascience.com/risk-management-with-clustering-fd594e064806?source=collection_archive---------17-----------------------

如何揭开表面下的结构

更新:我开了一家科技公司。你可以在这里找到更多

E 对每个投资组合经理的夏普比率进行评估,夏普比率衡量其投资回报的相关风险,由以下公式给出:

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

其中:

  • Rp 是投资组合的回报
  • Rf 是无风险收益(如国债)
  • 适马 p 是投资组合超额收益的标准差,代表投资组合的风险

夏普比率经常受到批评,因为它假设波动性不好,而且因为它的无量纲比率,有时很难解释。

在这篇文章中,我们将看到投资于“好的”夏普比率的风险可能比预期的要大得多。为此,我们将使用 K-Means 聚类来揭示隐藏的结构。

数据

我们将分析大约 50 家机构投资者的季度美国持股情况,这些机构投资者管理的总资产超过 1 亿美元。这些数据是公开的,因为他们需要每季度向 SEC 提交详细说明其持股情况的 13F 表格。我用 Sentieo 的平台下载数据。

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

Microsoft’s institutional investors and an example of a 13F form

表格详细说明了他们投资的性质和价值,以及他们各自在投资组合中所占的比例。为了简单起见,我们只考虑他们管理的总资产和他们投资的百分比。我们还将提取以下特征来代表他们的投资风格:

  • 他们最大持股的%
  • %的第二、第三、第四和第五次
  • 投资组合剩余部分的%
  • 管理资产总额

我们选择了这些特征来观察基金的规模和他们的配置策略之间是否有关系。分配策略也可以用来代表他们的侵略性。

如果一个经理把所有鸡蛋放在一个篮子里,他们将比使用多个篮子的人承担更多的风险。然而,如果所有的鸡蛋质量都很好,夏普比率就不会增加分散风险。

数据可视化

下载准备好 2018 年 3 季度的数据后,上传到了 AuDaS。 AuDaSMind Foundry 开发,允许任何人在几分钟内轻松学习机器学习和构建模型。

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

数据上传后,AuDaS 会扫描数据以发现异常,并向用户发出建议。在这种情况下,它识别出 Name 列没有预测值,我们可以删除它。

数据集中的基金经理是养老基金、自营基金、基础基金和量化基金的组合。直方图视图还允许我们查看资金如何跨功能分布。

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

使聚集

我们现在将要求 AuDaS 识别我们的基金经理篮子中的集群,结果它自动排除了 name 列。

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

下面给出了相关的模型和性能结果,我们可以看到 AuDaS 已经识别了 4 个相当清晰的集群。

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

要了解这些聚类的属性,我们可以返回直方图视图,查看这些类在其他要素中的分布情况。

解释集群

0 类:相当分散的中小型基金

这些基金的前五大持股占其总资产的 10%至 20%,因此被认为相当分散。这类基金的一个例子是 Polar Capital ,它提供基本面驱动的投资产品,在长期内提供差异化的风险调整回报。

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

第一类:保守的中大型基金

这些基金的前五大持股占其总资产的比例不到 10%,这意味着它们非常分散。这也突显出,规模较大的基金似乎更厌恶风险。直觉上,这可以解释为他们会失去更多,因此需要把鸡蛋放在更多的篮子里。这一类的例子包括 AQR 资本管理保诚千禧管理

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

第二类:小型激进基金

这些基金的前五大持股占据了其投资组合的至少 20%,在某些情况下甚至高达 50%。由于它们的规模,这些基金必须更有策略才能从投资中获得回报。这一类的例子有兰斯多恩合伙公司奥迪资产管理公司埃格顿资本公司,他们以下大赌注而闻名。兰斯多恩的嘉能可赌注在 2017 年事与愿违,让他们损失了 1 亿美元。Odey 在 2018 年 6 月押注英国政府债务相当于该基金资产净值的 147.4%。

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

第三类:非常激进的小型基金

这些基金甚至比前一类更激进,因为大多数基金的前 5 大持股占据了投资组合的至少 40%。这一类的例子有 Wolverine TradingJump Trading ,它们都是自营基金。这意味着他们交易的是自己的资本(而不是投资者的资本),这给了他们更多的自由和对投资方式的控制。因此,他们可以随心所欲地咄咄逼人。

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

结论和延伸

在这个简短的研究中,我们能够从我们的一篮子投资经理中提取出一些清晰的结构,这些投资经理可能隐藏在类似的夏普比率后面。这种结构突出了取决于其规模、类型和性质的基金的进取性。

此外,我们只考虑了一些基本特征,这项研究还有许多潜在的扩展:

  • 基金的流动性考虑的是它们是否能够在需要的时候卖出(也就是说,它们卖出的资产是否会有买家)。将流动性作为一个特征包括在内,可能会揭示哪些基金被困在了龙虾池投资中。
  • 永久资本损失:这可能发生在股票暴跌至 0,或者你借钱亏损的时候。使用杠杆作为一个功能可以突出一些额外的结构。
  • 投资的类型/类别:在本研究中,我们只考虑了前五大投资的规模,但我们也可以考虑它们的类别(科技、工业等)。某些基金可能持有相同的投资组合,尽管比例不同,因此投资者应避免同时投资所有基金。
  • 其他管理特征,如费用、员工数量、在公司的平均工作年限、奖金池等。可能有助于发现对我们的风险分析有益的其他结构层。

如果你有兴趣了解我们的 Quant 和基本面对冲基金客户如何使用澳元进行风险分析和投资管理,请不要犹豫,通过电子邮件LinkedIn 联系我。您还可以阅读以下更多案例研究:

[## 机器学习的价值投资

你最喜欢的持有期不一定是永远…

towardsdatascience.com](/value-investing-with-machine-learning-e41867156108) [## 用数据科学充实投资分析师

基本面投资如何受益于机器学习

towardsdatascience.com](/augmenting-investment-analysts-with-data-science-98297cb1ccb0)

团队和资源

Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创立,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新牛津技术与创新基金、牛津大学创新基金Parkwalk Advisors

风险建模:随机游走零和博弈中资本优势的力量

原文:https://towardsdatascience.com/risk-modeling-the-power-of-capital-advantage-in-random-walk-zero-sum-games-part-1-619314798d2?source=collection_archive---------36-----------------------

在这篇文章中,我将展示一个至关重要的数学概念,它对于在机会游戏中构建风险管理策略是必不可少的。通过在 R 中使用随机数发生器的实验,我们将探索在模型投资游戏中拥有相对于对手的固定资本优势将如何产生显著的概率优势,从而最终获胜。

我们将把我们的模拟结果与已被证明的数学定理预测的结果进行比较。之后,我们将探索这个概念对赌博、投资和商业的战略意义。

破产风险简介:

破产风险是金融界常用的一个概念。它试图量化投资组合价值归零的可能性。破产风险的原则如下:

  • 在一个无限的样本空间中,在任何事件上赌一个人总启动资金的固定部分,最终都会导致破产*,不管每次下注的期望值是正的。*
  • 遵循上述标准的每一次连续下注都会增加破产的风险,并产生破产的随机确定性。

有一种可能,你对上述说法持怀疑态度。如果你有一定的概率赢得一个赌注,因此有一个正的期望值,那么反复下注怎么可能会导致你输光所有的钱呢?这正是我们在本系列中将通过对各种玩具游戏的模拟和数据分析来探讨的问题。说到数学,眼见为实。

定义游戏:

  • 假设有两个玩家:玩家 1 和玩家 2
  • 假设 a 是玩家 1 开始时的金额
  • 假设 b 是一个乘数,其中 2 号玩家从(b * a)美元开始

这两个玩家将连续掷硬币。

  • 正面的话,玩家 1 将获得其初始投资的 2%[.02 * a],反面的话,他将损失[. 02 * a]。
  • 在正面,玩家 2 将获得玩家 1 失去的[.02 * a],在反面,他将失去玩家 1 获得的[.02 * a]
  • 如果一个玩家破产了,(失去了所有的钱),那么另一个玩家就赢得了游戏。

我们会让每个玩家投掷无限数量的硬币,直到其中一个坏掉。然后,我们将运行这个游戏数千次,以确定每个玩家赢得游戏的频率。

开始的时候,两个玩家会有相同数量的钱。慢慢地,我们将玩家 2 的资金增加其初始投资的 1%,并观察玩家 2 赢得游戏的概率如何增加,尽管他在每次投掷中缺乏固有优势。

用代码建模问题:

所有代码都可以在这里找到。

如果您不熟悉编程,请跳过这一部分,直接查看结果。

我们将在 r 中定义三个函数。第一个函数将简单地运行一个游戏。函数参数如下:玩家 1 的启动资金、玩家 2 的乘数和样本大小。它将输出一个 3 位向量,代表三种情况:玩家 1 赢,玩家 2 赢,平局(根据惠根的赌徒毁灭定理,不应该有任何平局)。注意:R 从 1 开始索引数组(原因完全超出我的理解)。不要认为我对数组 1:n 的计数很疯狂

###Runs a coin flip simulation and outputs a winner or tie.
# a [double] amount of money in player 1 bankroll
# b [double] multiplier for amount of money in player 2 bankroll
#S [int] Sample size
#w [double] the fraction of a gained when a player wins
#l [double] the fraction of a lost when a player loses
#Outputs: a length 3 vector where a 1 represents a positive result #for a P1 win, P2 win, or Tie respectivelyrunSim <- function(a,b,s,w,l) {
  player1 <- a
  player2 <- a * b
  output <- c(0,0,0)
  for (i in 1:s) {
    coin = sample(0:1,1)
    if (coin == 0) {
      player1 <- player1 - (l * a)
      player2 <- player2 + (w * a)
    } else {
      player1 <- player1 + (w * a)
      player2 <- player2 - (l * a)
    }
    if (player1 <= 0) {
      output[2] <- 1
      output
      break
    } else if (player2 <= 0) {
      output[1] <- 1
      output
      break
    }
  }
  if (player1 != 0 & player2 != 0) {
    output[3] = 1
    output
  }
  output
}

值得注意的是,在每个玩家的获胜条件中包含“中断”声明是至关重要的,因为一旦有人破产,游戏就应该结束。

我们的下一个函数将运行多个游戏,以确定每个玩家在给定的玩家-2 的资金优势下获胜的频率。

##Runs n amount of simulations to determine P1 win $, P2 win$, Tie%, P2% advantage
##n: amount of sims to run
#a: starting money
#s: sample size required for a single game
#swing: how much a player will win or lose based on outcome
#Player2 bankroll edgerunMetaSim <- function(n, a, s, swing, p2Multiplier) {
  results <- c(0,0,0)
  for (i in 1:n) {
    r <- runSim(a,p2Multiplier,s,swing,swing)
    if (r[1] == 1) {
      results[1] <- results[1] + 1
    } else if (r[2] == 1) {
      results[2] <- results[2] + 1
    } else {
      results[3] <- results[3] + 1
    }
  }
  output <- c(results[1]/sum(results),results[2]/sum(results),
              results[3]/sum(results),-1 *(1 - p2Multiplier))
  output
}

我们的最后一个函数将输出每个玩家获胜的频率,记录玩家 2 的资金优势,将玩家 2 的资金增加预定的数量,并运行下一次模拟。该函数将输出一个 4 列数据框,记录聚合模拟的全部结果。

##Runs x amount of Meta-"Simulations"  gradually increasing the bankroll edge of one player by a given amount
#x[int]: amount of simulations to run
#start[double]: starting edge that player 2 has
#increment: a percentage increase for the succesive simulation
#Outputs: A two dimensional Data Frame: Cols[P1 win %, P2 win %, Tie #%, P2$ Advantage]runAggregateSims <- function(x, start, increment, swing,rounds) {
  cols <- c("P1 Win %","P2 Win %", "Tie %","P2 Bankroll Advantage")
  out <- data.frame(matrix(ncol = 4, nrow = 0))

  for (i in 1:x) {
    start <- start + increment
    row <- runMetaSim(rounds,1000,1000000,swing,start)

    out <- rbind(out,row)
    print(paste("Sim ", toString(i), "/", toString(x), " Complete"))
  }
  colnames(out) <- cols
  out

}

下面的代码只是运行模拟并绘制结果

sims <- runAggregateSims(300,1,.01,.02,1000)simsWithPercent <- sims
simsWithPercent$`P2 Bankroll Advantage` <- simsWithPercent$`P2 Bankroll Advantage` * 100
simsWithPercent$`P2 Win %` <- simsWithPercent$`P2 Win %` * 100
simsWithPercent$`P1 Win %` <- simsWithPercent$`P1 Win %` * 100qplot(simsWithPercent$`P2 Bankroll Advantage`,simsWithPercent$`P2 Win %`,xlab = "Player 2 Bankroll Advantage %",ylab = "Player 2 Win Likelihood %",
      main = "Probability Player 2 Wins")qplot(simsWithPercent$`P2 Bankroll Advantage`,simsWithPercent$`P1 Win %`,xlab = "Player 2 Bankroll Advantage %",ylab = "Player 1 Win Likelihood %",
      main = "Probability Player 1 Wins")

结果:

  • 一场掷硬币游戏的样本空间被限制在一百万次
  • 在玩家 2 的每个资金优势级别运行 1000 场游戏,以确定他获胜的可能性
  • 玩家 2 的胜率是在 1%到 300%的资金优势范围内确定的。

图 1 显示了玩家 2 在不同资金优势水平下获胜的概率分布,占玩家 1 启动资金的百分比。我们可以观察到图表遵循对数增长率。玩家 2 的优势在开始时增长得非常快,并且随着他的资金在每次迭代中增加 1%而逐渐减少。

当参与人 2 的资本比参与人 1 多 300%时,他有超过 80%的机会比对手活得久。

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

Figure 1

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

Figure 2

上面的图 2 简单地显示了参与人 1 的反向分布。随着玩家 2 的资金优势增加,玩家 1 赢得掷硬币游戏的可能性逐渐减少,他破产的风险也随之增加。

形式化:

研究我们自己的数据是公平的,但是让我们看看这个分布是否遵循克里斯蒂安·惠更斯‘赌徒的毁灭’定理提出的公式。

我们将从 Huygen 最初的抛硬币问题中推导出他的公式,以适合我们自己的游戏版本。回想一下文章开头我们定义变量的地方。

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

Figure 3: Probability of Player 1 going broke

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

Figure 4: Probability of Player 2 going broke

上面的公式分别代表了参与人 1 和 2 的破产风险。利用这些信息,我们可以得出任何一个玩家获胜的概率,也就是另一个玩家破产的可能性除以玩家 1 或玩家 2 破产的可能性。

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

Figure 5: Probability of Player 1 winning

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

Figure 6: Probability of Player 2 winning

我们现在将重写我们的 runAggregateSims() 函数,以便根据我们的原始参数简单地绘制上述函数及其值的数据框。

##Runs the aggregate sims using the Huygen's TheoromrunAggregateSims2 <- function(x,increment,swing,a,b) {
  cols <- c("P1 Win %","P2 Win %", "Tie %","P2 Bankroll Advantage")
  out <- data.frame(matrix(ncol = 4, nrow = 0))

  for (i in 1:x) {
    b <-  b + increment
    p1 <- (a/.02*a)/(((b*a)/.02*a) + (a/(0.2*a)))
    p2 <- ((b*a)/.02*a)/(((b*a)/.02*a) + (a/(0.2*a)))

    p1winrate <- p1/(p1 + p2)
    p2winrate <- p2/(p1 + p2)

    row <- c(p1winrate,p2winrate,0,-1 * (1 - b))
    out <- rbind(out,row)
    print(paste("Sim ", toString(i), "/", toString(x), " Complete"))
  }
  colnames(out) <- cols
  out
}##Running Huygen's Formula
huygensFormula <- runAggregateSims2(300,1,.01,.02,1000,1)
huygensFormulaPercent <- huygensFormula * 100###Stacking Huygen's Formula onto The Simulation Graph
###Sorry, R is the ugliest language in the world when it comes
#To using third party librariesa <- ggplot() + geom_point(data = simsWithPercent,aes(x= simsWithPercent$`P2 Bankroll Advantage`, y = simsWithPercent$`P2 Win %`),color = "yellow") + xlab("P2 % Bankroll Advantage") + ylab("Player 2 % Win Likelihood") +
geom_line(data = huygensFormulaPercent, aes(x = huygensFormulaPercent$`P2 Bankroll Advantage`,y=huygensFormulaPercent$`P2 Win %`),color = "blue") + ggtitle("Player 2 Winning Distribution: Huygen's Formula vs Simulation")a 

下图 7 显示了从惠更斯公式推导出的概率密度函数得出的曲线。

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

Figure 7: Plot of Huygen’s Formula

将概率密度函数绘制在与我们的模拟结果相同的图表上,我们可以看到来自模拟的数据几乎完全符合从定理导出的公式。

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

Figure 8: Huygen’s Formula over Simulation

结论:

如果两个人反复玩公平机会赌博游戏,我们可以假设如下:

  • 根据破产风险理论,有人肯定会破产
  • 尽管在单个回合中没有任何特别的优势,但拥有更多钱的人在赢得整个游戏方面具有统计优势。
  • 在一个公平的赌博游戏中,拥有比对手更多的钱的统计优势可以被可靠而准确地量化。
  • 如果你想赢一场和你朋友的反复掷硬币游戏,只需下注更多的钱。

业务应用:

  • 在亏损时期,避免破产的唯一方法是降低风险,将其作为你全部资金的一部分,同时在盈利时期增加风险。这样,从长远来看,你的收益将足以抵消可变成本和损失。
  • 留出大量资金(自由流动的流动现金)的唯一目的是减少经济和金融变化,这提供了直接可量化的竞争优势,并增加了生存的机会。
  • 简单地说,有很多钱会让你更容易…获得更多的钱。事实上,你甚至不需要做出特别明智的选择来决定如何拿这笔钱去冒险。只要你确定你是在与资金较少的竞争对手进行零和游戏中冒险。
  • 如果你在资金上处于劣势,你需要一个巨大的概率优势来弥补不能去方差。这个概念将在以后的文章中探讨。

未完待续:

在下一篇文章中,我将探讨不公平游戏中同样的现象。我们将会看到概率优势是否能克服资金劣势,或者在零和游戏中,仅仅比对手拥有更多的钱就能胜出。

对监督学习问题应用主成分分析的风险和注意事项

原文:https://towardsdatascience.com/risks-and-caution-on-applying-pca-for-supervised-learning-problems-d7fac7820ec3?source=collection_archive---------14-----------------------

合著者:阿姆兰·乔蒂·达斯赛·亚斯旺思

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

Reference

高维空间及其诅咒

在处理通常为高维数据的真实数据集时,维数灾难是一个非常关键的问题。随着特征空间维度的增加,配置的数量可以指数增长,因此观察覆盖的配置的数量减少。

在这种情况下,主成分分析在有效地减少数据的维度,同时尽可能多地保留数据集中存在的变化方面起着主要作用。

在深入实际问题之前,我们先对主成分分析做一个非常简单的介绍。

主成分分析-定义

P 主成分分析(PCA) 的中心思想是降低由大量相关变量组成的数据集的维度,同时保留数据集中存在的最大可能变化。

让我们定义一个对称矩阵 A,

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

其中 X 是独立变量的 m×n 矩阵,m 是列数,n 是数据点数。矩阵 A 可以分解成以下形式

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

其中 D 是对角矩阵,E 是按列排列的 A 的特征向量矩阵。

x 的主成分(PCs)是 XX 的特征向量,这表明特征向量/主成分的方向取决于独立变量(x)的变化。

为什么盲目应用 PCA 是监督问题中的魔咒????

在回归中使用主成分分析在文献中受到了很多关注,并且作为处理多重共线性的方法被广泛使用。

但是随着主成分回归的使用,关于主成分和它们各自的重要性顺序对反应变量的解释能力有许多误解。

在各种论文和书籍中多次出现的常见谬误是,在受监督的主成分回归框架中,具有低特征值的独立变量的主成分在解释响应变量时不起任何作用,这将我们带到本博客的目的,即在解释响应变量时,证明具有低特征值的成分可能与具有较大特征值的主成分一样重要,甚至重要得多。

下面列出了中指出的一些例子

[1]. **Mansfield 等人(1977 年,第 38 页)**提出,如果仅删除方差较小的成分,则回归中的预测性损失非常小。

[2].在 Gunst 和 Mason (1980) 的书中,12 页致力于主成分回归,并且大多数讨论假设删除主成分仅仅基于它们的方差。(第 327-328 页)。

[3]. **Mosteller 和 Tukey(1977 年,第 397-398 页)**类似地认为,方差小的成分在回归中不太可能是重要的,显然是基于自然是“狡猾的”而不是“完全平均的”。

[4]. **Hocking(1976 年,第 31 页)**更坚定地定义了在基于方差的回归中保留主成分的规则。

理论解释和理解

首先,让我们给你一个上述假设的适当的数学证明,然后我们可以用几何可视化和模拟来解释直觉。

比方说

Y —响应变量

X —设计矩阵—特征空间矩阵

z——X 的标准化版本

让𝜆₁≥𝜆₂>….≥ 𝜆p 是 Z Z(相关矩阵)的特征值,v 是相应的特征向量,那么在 W = ZV 中,w 中的列将代表 z 的主分量。在主分量回归中执行的标准方法是回归 y 上的前 m 个 PC,该问题可以通过下面的定理及其解释[2]看出。

定理:

设 W= (W₁,…,Wp)是 x 的 PCs。现在考虑回归模型

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

如果回归系数的真实向量 𝛽 是在 z 的 j ᵗʰ 特征向量 Z 的方向上,那么当 y 在 w 上回归时,j ᵗʰ PC Wⱼ将独自对拟合贡献一切,而其余 PC 将什么都不贡献。

证明: 设 V=(V₁,…,Vp)是包含 z 的特征向量的矩阵 Z .那么

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

如果 𝛽 在 j ᵗʰ 特征向量 Vⱼ的方向,那么 Vⱼ = a𝛽 ,其中 a 是非零标量。因此 𝜃j = Vⱼᵀ𝛽 = a𝛽ᵀ𝛽,𝜃ᴋ = Vᴋᵀ𝛽 = 0 ,每当 k≠j 。因此, 𝜃ᴋ 对应 Wᴋ 的回归系数等于零,对于 **k≠j,**因此

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

因为,变量 Wᴋ 不产生平方和的任何减少当且仅当它的回归系数为零时,那么 Wj 将独自贡献所有来拟合,而剩余的 PC 将不贡献任何东西。

几何意义和模拟

让我们现在做模拟,并有数学直觉的几何理解。已经使用二维特征空间(X)和单个响应变量的模拟说明了该解释,使得直观地理解假设变得容易。

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

Figure 1 : Univariate and Bivariate plots for simulated variable X1 and X2

在模拟的第一步中,设计特征空间已经从变量之间具有非常高相关性的多元正态分布中模拟出来,并且实现了 PCA。

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

Figure 2 : Correlation heat-map for PC1 and PC2

从图中可以清楚地看出,电脑之间绝对没有关联。第二步是模拟响应变量 Y 的值,使得 PCs 上 Y 系数的方向是第二主分量的方向。

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

一旦响应变量被模拟,相关矩阵看起来就像这样。

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

Figure 3 : Correlation heat-map for simulated variable Y and PC1 and PC2

从图中可以清楚地看出,y 和 PC2 而不是 PC1 之间有很高的相关性,这证明了我们的假设。

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

Figure 4 : Variance in Feature Space explained by PC1 and PC2

如图所示,PC1 解释了 X 中 95%的方差,因此,如果按照上面的逻辑,我们应该在进行回归时完全忽略 PC2。

让我们跟随它,看看会发生什么!!!

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

Figure 5: Regression Summary with Y and PC1

因此,R 为 0 表明,即使 PC1 解释了 X 中 95%的变化,仍然无法解释响应变量。

现在让我们用 PC2 做同样的事情,它只能解释 X 的 5%的变化,看看会发生什么!!!!

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

Figure 6: Regression Summary with Y and PC2

呼呼!!!!你一定在想刚刚发生了什么,主成分解释了 X 中大约 5%的变化,解释了 Y 中 72%的变化。

也有一些真实生活场景来验证中指出的假设

【1】Smith 和 Campbell (1980) 举了一个化学工程的例子,其中有九个回归变量,当第八个主成分的可变性占总变差的 0.06%时,根据低变差标准,该总变差将被去除。

【2】。Kung 和 Sharif(1980 年)提供了第二个例子。在用十个气象变量预测季风爆发日期的研究中,显著主成分依次为第八、第二和第十。它表明,即使是具有最低特征值的主成分在解释响应变量的可变性方面也是第三重要的。

结论:上述例子表明,去除低特征值的主成分是不可取的,因为它们只表明特征空间中的可解释性,而不表明响应变量中的可解释性。因此,我们应该保留所有组件并进行监督学习,否则我们应该采用监督降维方法,如偏最小二乘回归、最小角度回归,我们将在即将到来的博客中解释这些方法。

参考资料:

[1]伊恩·t·乔利弗,“关于主成分在回归分析中的应用的说明”皇家统计学会杂志。C 系列(应用统计学),第 31 卷,第 3 号,1982 年,第 300-303 页。www.jstor.org/stable/2348005.·JSTOR

[2]哈迪、阿里·s 和罗伯特·f·林。“关于使用主成分回归的一些注意事项.”《美国统计学家》,第 52 卷,第 1 期,1998 年,第 15-19 页。www.jstor.org/stable/2685559.·JSTOR

[3]霍金斯博士(1973 年)。主成分分析在替代回归研究中的应用。应用统计学家。, 22, 275–286

[4]曼斯菲尔德、韦伯斯特、J. T .和冈斯特,R. F. (1977 年)。主成分回归的分析变量选择技术。应用统计学家。, 26, 34–40.

[5]f . MOSTELLER 和 j . w . TUKEY(1977 年)。数据分析和回归:统计学第二教程。读书,弥撒。:艾迪森-韦斯利

6 GUNST,R. F .和 MASON,R. L. (1980)。回归分析及其应用:一种面向数据的方法。纽约:马塞尔·德克尔。

7 杰弗斯,J. N. R. (1967 年)。主成分分析应用中的两个案例。应用统计学家。, 16, 225- 236.(1981).替代回归调查:一些实例。统计学家,30,79-88 岁。

[8]肯德尔博士(1957 年)。多元分析教程。伦敦:格里芬。

如果您有任何想法、意见或问题,请在下面留下评论或在 LinkedIn 上联系我们

[## Souradip Chakraborty -数据科学家-沃尔玛印度实验室| LinkedIn

查看 Souradip Chakraborty 在全球最大的职业社区 LinkedIn 上的个人资料。

www.linkedin.com](https://www.linkedin.com/in/souradip-chakraborty/) [## Amlan Jyoti Das -沃尔玛实验室高级数据科学家| LinkedIn

经验丰富的数据科学家,有在零售行业解决业务问题和…

www.linkedin.com](https://www.linkedin.com/in/amlanjd/) [## Sai Yaswanth -沃尔玛印度实验室高级数据科学家| LinkedIn

查看世界上最大的职业社区 LinkedIn 上 Sai Yaswanth 的个人资料。

www.linkedin.com](https://www.linkedin.com/in/sai-yaswanth-86893959/)

敬请关注。快乐阅读!!!😃

[RL]训练机械臂去够球—第 1 部分

原文:https://towardsdatascience.com/rl-train-the-robotic-arm-to-reach-a-ball-part-01-1cecd2e1cfb8?source=collection_archive---------18-----------------------

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

Photo by James Pond on Unsplash

比较 DDPG、D4PG 和 A2C 的学习效率

1.摘要

1.1 激励机制

看到我们如何利用强化学习的力量,训练机器人通过自我试验和错误来学习如何与环境互动,总是令人着迷。在这个任务中,我将实验和比较强化学习中不同流行算法的效率。这不仅有助于我们对这些算法有一个总体的了解,而且也让我们进一步相信强化学习在不久的将来会有多大的潜力。

为了恰当地处理这个话题,整个讨论将分为两个系列。本文是第一部分,主要介绍训练环境和一种学习算法——DDPG,这是最古老的方法。

1.2 培训环境

在强化学习领域,组件由一个环境、一个或多个代理两者之间交换的信息组成。首先,环境将当前情况的信息发送给代理,然后代理以其最好的可能方式作出响应,再次,环境将奖励和下一个情况的信息发送给代理,以此类推。

在这里,为了给代理创建一个游乐场,我将使用 Unity 开发并由 Udacity 修改的环境[ Reacher ]进行实验。省去了我们搭建环境和配置奖励机制的麻烦。当我们刚刚开始熟悉这个领域时,这使我们能够专注于实现、调整和比较 RL 算法。

Reacher 任务中,机械臂需要学习如何控制和移动一个球。它粘球控制球的时间越长,积累的奖励就越多。环境的观测状态由 33 个变量组成,并且都在连续空间中。

关于机械臂,有两种情况,一种是单个机器人代理,另一种是多个机器人代理,总共有 20 个代理,每个代理都有自己的环境副本。因为我们现在有了单个和多个代理的场景,所以我们可以探索和比较两者之间的学习效率。

每个代理有 4 个动作变量,都在-1 和 1 之间的连续空间内。此外,单代理和多代理环境都可以在[uda city Github]中下载。

1.3 实验的模型/算法

在单代理情况下,使用[【DDPG】]和[ 分布式确定性策略梯度(D4PG) ]的算法。当在单个代理上训练时,最大的问题之一是过渡状态/经历的顺序将是相关的,因此像 DDPG/D4PG 这样的非策略将更适合这种情况。在这些模型中,对重放存储器进行采样的做法打破了转换之间的相关性。

在多个代理的情况下,使用[ 【同步优势演员评论家(A2C) 】。A2C 是[ A3C 的同步版。A2C 更容易实现,在一些研究中,它的性能甚至优于 A3C。在对多个智能体进行训练的情况下,由于每个智能体都有其独特的过渡经验,集体的过渡经验自然会解决顺序关联的问题。此外,我们甚至可以享受基于策略的学习算法带来的训练稳定性。

1.4 快速总结

那么,这个任务的目标是什么呢?在任务中,如果代理人的手臂在目标位置,那么给予+0.1 的奖励。代理能够将手臂保持在目标位置的时间越长,累积的奖励就越多。为了完成任务,代理人需要平均每集获得 30 英镑以上的奖励。

从后面显示的结果中,我们可以清楚地看出 A2C 在训练速度方面明显优于其他两种算法,这并不奇怪,尽管如此,这种改进确实令人印象深刻。具体来说,在这个案例中,A2C 成功地训练代理人在不到 5 00 的训练集内积累超过 30 的奖励(目标奖励)。而 D4PG 需要大约 5000 集,DDPG 甚至无论花多少时间训练经纪人都无法完成任务。

下面是这篇文章结构的快速指南。

1.5 报告的结构

  • 1 . 5 . 1智能体如何与环境交互
    在本节中,我将显示如何使智能体与环境交互的代码(假设在单智能体场景中),向环境发送其动作值,并从环境接收奖励和下一次观察状态的反馈。
  • 1 . 5 . 2在单个智能体场景上训练— DDPG
    在单个智能体的情况下,我将对两个算法进行实验— DDPG 和 D4PG。这一部分将详细演示 DDPG 模型是如何逐步建立起来的,包括演员和评论家的网络结构、重放记忆的设置、动作探索和损失函数等。最后,对训练结果进行了讨论。

2.代理如何与环境交互

在这里,我将简单介绍一下 Unity 环境的样子,以及代理如何用代码与环境交互。

2.1 环境背景

注意到环境包含多个大脑。大脑根据接收到的动作输入来控制环境的反应。用不同的大脑指定环境,会产生不同的反馈。在这个任务中,使用默认的大脑(第一个)。

**env:**包含每个大脑的环境对象。它包括,

  • brain_name = env.brain_names[0]:默认使用 env brain。
  • env.brains[brain_name].vector_action_space_size:行动的维度。
  • env[brain_name].agents:内部代理数量信息。
  • env[brain_name].vector_observations:维数(代理数,观察状态数)。

Code — Activate the Environment

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

Preview of the Environment (Single Agent)

2.2 代理与环境交互

对于每个新的情节,环境需要是reset() 并因此给出初始观察状态。然后,代理通过act()对其从环境接收的状态做出响应。环境使用step()接收来自代理的当前动作,并用新状态奖励和*完成(一集结束的标记)*更新自身。

既然我们已经了解了所有必需的背景知识,我们就可以开始建模了。

Code — Agent Interact with Environment

3.在单个代理场景下训练——DDPG

3.1 DDPG

首先,我在训练开始前导入一些自定义模块来配置整个设置。模块包括:

  1. ddpg_model:包含 DDPG 演员和评论家神经网络结构类的模块文件。
  2. noise:奥恩斯坦-乌伦贝克噪声过程用于 DDPG 代理的勘探目的。
  3. replay_memory:在训练中收集和取样进行过渡的经验。
  4. ddpg_agent:定义 DDPG 代理如何与环境交互并实施培训的模块文件。

下面是一系列代码片段,突出了每个自定义模块中最重要的部分。它帮助我们快速了解每个模块的核心。

3.2 模型结构

网络的大部分结构遵循了最初[[DDGP 论文 T10 中实现的内容,脚本的主要部分参考了uda city 的 DDPG 模板 T12。

值得注意的一点是,critic 网络在计算 Q 值时采用了最后一个隐含层的动作。

但是,为了提高计算效率,在这种情况下需要调整一些超参数。例如,演员和评论家网络都包含两个隐藏层(每个具有 12864 单位的大小)。下面显示的代码是 Critic Network 的初始化。

演员网络共享相似的结构。

Code — Initialize DDPG Critic Network (excerpted)

3.3 重量初始化

在初始化时,评论家和演员网络的权重都采用x 服务器初始化

Function — Xavier Weights Initialization

3.3 重放记忆

这里,为了减轻计算压力,重放存储器的大小仅设置为 100,000 。回放内存在均匀随机采样中采样,并发送给【cuda 或 cpu 训练模型。

Code — Create Replay Memory Object

3.4 行动探索

奥恩斯坦-乌伦贝克噪声被添加到动作探索的动作值中。

Code — Action Exploration of DDPG Agent

3.5 损失函数

确定性政策梯度不同于随机政策梯度,因为它不包括行动的对数概率。

也就是说,策略(参与者)梯度是批评家网络相对于动作的梯度,乘以参与者网络相对于网络参数的梯度。在这篇[ 帖子中阅读更多详情。

另一方面,批评值的损失只是常规的时间差异(TD)误差。因此,保单损失和批评价值损失定义为:

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

Code — Compute Loss for Critic and Actor for DDPG Agent

3.6 重量更新

在训练过程中,模型中的权重被软更新

Code — Implement Soft-Updated for Network Parameters

3.7 简而言之,超参数

以下是超参数设置的概述。

  • 学习率(演员/评论家):1e-4
  • 重量衰减:1e-2 # L2 重量衰减
  • 批量:64
  • 缓冲区大小:100000
  • Gamma: 0.99 #奖励折扣系数
  • Tau: 1e-3 #目标网络中参数的软更新
  • 每次重复学习:10
  • 每时间步发生的学习:20
  • 评论家剪辑的最大渐变:1
  • 隐藏层 1 尺寸:128
  • 隐藏层 2 尺寸:64

3.8 构建培训功能

在本节中,我定义了一个训练函数train_ddpg()来监控进度,并在训练完成后保存模型。

Function — Control and Monitor the Training Progress

3.9 培训结果—失败

在实验中,我设置了在每个 20 时间点触发的训练。在每次训练期间,权重更新将迭代 10 次。

另外,临界梯度被削波,最大值为 1,以增强训练的稳定性。正如你将在下面看到的,在第一个 1000 集(如下图所示)中,情节奖励徘徊在 0.040.05 左右,这很大程度上意味着代理根本没有从这些经历中学到任何东西。

除了这里展示的演示实验,我还尝试了不同的训练长度,跨度从 1000 到 5000 集,但没有一次成功。

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

Average Episodic Score for DDPG Agent (task not solved)

待续

现在我们已经看到 DDPG 不能理解任务的复杂性。所以在下一部分,我将转向其他算法——D4PG 和 A2C,看看这些新发布的方法是否更强大,是否能够解决手头的任务。

文章中的完整代码可以在这个链接中找到。此外,如果你喜欢这个帖子,欢迎指出我犯的任何错误或在评论框中留下反馈。

参考

[1] Unity Technologies, ml-agents (2018),Github

[2] Udacity,深度强化学习 (2018),Github

[3] P. Emami,tensor flow 中的深度确定性策略梯度 (2016),Github

[RL]训练机械臂去够球—第 2 部分

原文:https://towardsdatascience.com/rl-train-the-robotic-arm-to-reach-a-ball-part-02-fc8822ace1d8?source=collection_archive---------24-----------------------

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

Photo by James Pond on Unsplash

比较 DDPG、D4PG 和 A2C 的学习效率

概述

根据我在第 1 部分提到的,我们知道无论代理花多少时间学习,DDPG 都不能成功地解决任务。平均的阶段性回报徘徊在 0.04 到 0.05 之间,与 30 的目标回报相差甚远。因此,下面,我将开始试验另外两种算法,单代理场景中的 D4PG 和多代理场景中的 A2C。

同样,下面是本文结构的快速指南。

1.报告的结构

  • 1.1 列车上单个代理场景—D4PG这次,我将改为在 D4PG 代理上进行实验。这是最新发布的算法,据称在应对复杂环境时比 DDPG 更有效。本节将介绍模型结构、回放记忆、行动探索和学习过程的步骤。它将突出与 DDPG 的区别,相似的部分将被快速浏览。
  • 1.2多智能体场景——A2CA2C 模型在多智能体环境下实现。这一部分将涵盖它是如何建立的,在这个过程中收集经验和学习。A2C 的代码与 DDPG 和 D4PG 的代码相当不同,因为它应该反映 A2C 如何使用多代理来收集经验和更新网络参数。还是那句话,训练结果是包含在最后的。
  • 1.3所有算法的比较及结论最后,我们准备比较三种不同算法的执行情况。每个模型的滚动情景奖励将绘制在同一个图表上,这样我们可以更好地了解每个模型的学习趋势和效率。

2.针对单个代理场景的培训— D4PG

正如我们在第 01 部分中所知,DDPG 模型并没有成功解决该任务,所以我转向另一种算法— [ D4PG ],这是 2018 年最新的 RL 算法。代码脚本主要参考了这本书——【深度强化——学习——动手】。

首先我会在训练前导入一些自定义模块来配置整个设置。这些模块包括:

  1. d4pg_model:包含 D4PG 的演员和评论家神经网络结构类的模块文件。
  2. replay_memory:为培训收集过渡经验并取样。
  3. d4pg_agent:定义 D4PG 代理如何与环境交互并实施培训流程的模块文件。

2.1 模型结构

我跟进 DDPG 指定的相同模型结构,除了评论家网络,输出需要改成 N_ATOMS 。至于其他,评论家和演员都有两个隐藏层,每个层的尺寸为 128 和 64,与 DDPG 相同。

Code — Critic Network for D4PG (excerpted)

2.2 重放记忆

为了符合 D4PG 代理中所需的数据类型(从[ 深度强化学习实践 ]中引用),通过重放存储器对象中定义的函数sample2()进行采样。重播内存大小设置为 100,000。详细的代码片段在这个[ 链接 ]里。

2.3 行动探索

D4PG 和 DDPG 的一个小区别是动作探索。在 D4PG 中,它使用来自正态分布的简单随机噪声作为鼓励动作探索的方式,而不是 OU 噪声。修改后的代码片段在这个[ 链接 ]中。

2.4 损失函数

D4PG 可以在*多个过渡轨迹(N 步)*上训练,但为了简单起见,我选择在一个时间步上训练。不过根据其他评论,一步到位的训练是最不稳定的,不推荐,但我还是去争取了。因此,下面的损失和代理学习代码是基于一步转换轨迹的。

Code — Loss Computation and Learning Process in D4PG Agent (excerpted)

2.5 重量更新

权重由soft_updated()软更新,与 DDPG 相同。

2.6 简而言之,超参数

以下是超参数设置的概述。

  • 学习率(演员/评论家):1e-4
  • 批量:64
  • 缓冲区大小:100000
  • 伽玛:0.99
  • 陶:1e-3
  • 每次重复学习:10
  • 每时间步发生的学习:150
  • 评论家剪辑的最大渐变:1
  • n 步:1 #过渡轨迹
  • n 原子:51 #用于评论家网络输出
  • Vmax:评论家网络的 10 #参数
  • Vmin: -评论家网络的 10 #参数
  • 隐藏层 1 尺寸:128
  • 隐藏层 2 尺寸:64

2.7 构建培训功能

为了监控训练进度,我再次定义了一个训练函数train_d4pg(),它与train_ddpg()非常相似,参见这个链接中的完整代码片段。

2.8 培训结果——效率低下

由于之前在 DDPG 的失败,这一次,我稍微降低了学习频率。每 150 时间步触发一次训练过程,每次训练重复10 次权重更新。

我希望这将进一步稳定培训,尽管代理可能需要更长的时间来学习。以下结果显示,D4PG 代理成功达到了 30 的目标剧集分数,尽管如此,在达到目标之前,它需要占用多达 5000 集。我们可以看出学习进度相当缓慢。

下图是 D4PG 剧集的滚动平均得分。观察结果图,我们可以看出片段分数彼此之间有很大的差异。显然,训练进度并不稳定,这准确地反映了非策略算法的性质。

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

Rolling Episodic Score over Episodes (D4PG)

现在,让我们来看看它在动画中的表现。

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

A Single D4PG Agent Controls a Ball (final training result)

3.多代理场景培训— A2C

用于建立 A2C 模型的模块/功能如下:

  1. A2CModel:神经网络的 A2C 强化学习算法。
  2. collect_trajectories():收集 n 步经验转场。
  3. learn():根据收集的轨迹计算训练损失,并更新网络的权重。

3.1 环境的简要背景

这一次,我使用另一个环境,它将同时激活 20 个代理,每个代理都有自己的环境副本。这 20 名代理人的经验将被收集起来并相互分享。

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

Preview of the Environment (Multi-Agents)

3.2 模型结构

该模型是简单的两个全连接层,每层有 128 个单元, 64 个单元。

然后它分离出演员评论家 (而不是像以前的模式那样的演员和评论家网络)。演员和评论家层都使用全连接层,它遵循[ 原始 A3C 算法论文 ]中实现的方式。

Code — Initialize A2C Model (excerpted)

3.3 收集现场过渡轨迹

A2C 是一个 on-policy RL 算法,没有重放记忆这种东西。相反,它使用当前收集的转换经验来更新其网络。

在接下来的代码片段中,我定义了collect_trajectories()函数。接受 A2C 模型整体环境采集的时间步数的输入。当模型与环境交互时,所有的动作和反馈都存储在batch_sbatch_abatch_r等对象中,分别代表状态、动作、奖励。一旦收集到的经验达到要求的时步数,或者当一集结束时,该函数就会对每步的奖励进行奖励归一化和折扣处理,得出每个时步的最终目标值/处理后的奖励并存储在batch_v_t对象中。

Function — Used to Collect Trajectories for A2C Model Training

3.4 行动探索

动作是从正态分布中采样的**,其中 μ 取决于每个状态,而 σ 由自变量给出。此外,动作输出通过tanh() 激活,以便根据环境要求将其值压缩在-1 和 1 之间。**

此外,为了检索以后行动的对数概率,我使用了一个技巧。我定义函数get_action()来返回 actions_tanh原始动作值。原始动作值存储在batch_a中。然后,在学习阶段,它们将与状态一起被传递到get_action_prob(batch_s, batch_a),以获得动作的相应对数概率。

关于批判状态值,它只是传递给批判层的状态输出。

Code — Action Output and Critic State Value for A2C Model (excerpted)

3.5 损失函数

损失函数在 A2C 也被称为目标函数

*注意,原始损失函数包括熵项。*熵在许多算法中用于鼓励动作探索,包括 A2C 模型。然而,我在策略损失中放弃了熵,这与大多数其他实现相反。原因是我现在处理的是一个多维度的行动空间。我不知道如何指定多维作用空间的熵。

相反,我参考了[ 尚同章的作品 ],其中他假设**(鼓励行动探索的方差)是常数,因此熵在所有情况下也是常数。这样,我可以忽略掉政策损失的熵。**

关于价值损失函数,它也是保单损失的一部分。这导致我的保单损失和价值损失如下:

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

现在,我在自定义函数learn()中总结了损耗的计算和网络参数的更新。你可能会注意到,我在这里为学习过程构建代码的方式与以前的模型中的方式有很大不同。它是一个独立的函数,而不是属于代理的子类对象。

Function — Compute Loss and Trigger Learning for A2C Model

3.6 重量更新

在 A2C 模型中,所有权重由当前轨迹批次的梯度直接更新,这意味着这里没有应用软更新。

3.7 简而言之,超参数

以下是超参数设置的概述。

  • 学习集数:1000
  • N 步数:10 # n 步过渡轨迹
  • 学习率:0.00015
  • 伽玛:0.99

3.8 构建培训流程

在这一节中,我不会特别将培训过程总结成一个函数。在这里链接的代码中,会直接监控学习进度,训练结束后保存模型。

3.9 培训结果——高效率

在培训期间,一旦代理收集到新的一批 N 步过渡经验,该批经验将用于计算损失并立即更新演员和评论家层的参数。请注意,如果代理的情节都没有完成,则每批的最后一个状态将是下一批的初始状态。相反,如果任何一集结束,那么所有代理将停止并从当前集离开,并继续重新开始新的一集。

从下面显示的结果,你可以告诉 A2C 模型是非常有效的。代理人学习接任务,并在不到 1000 集的中达到 30 分的目标情节分数。另外,无论是在学习过程中还是在从头开始重新训练的情况下,训练进度都相当一致和稳定。每当你再次重新训练代理人时,你可以得到几乎相同的结果。****

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

Average Episodic Score for A2C Agents

从滚动分数图中观察,我们进一步确信学习进展相当顺利。偏差或波动远远小于 D4PG 模型中的偏差或波动,最后,最后一张图片是训练结果的动画。

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

Rolling Episodic Score over Episodes (A2C)

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

Multiple A2C Agents Control a Ball (final training result)

4.所有算法的比较和结论

在这些试验中,A2C 模型达到了最好的性能和效率,即使在此之上,再训练结果仍然非常一致,但鉴于这是多代理场景并使用 10 步过渡轨迹的事实,结果应该不会太令人惊讶。

另一方面,D4PG 是单代理场景,我只使用了 1 步过渡轨迹。虽然它没有 A2C 那么有效,但它仍然给出了一个令人满意的结果。然而,重新训练的结果并不一致,你可能会发现你的代理在某些试验中陷入局部最优。以我为例,需要 5000 集才能达到目标分数。尽管如此,我的触发参数更新的设置是每 150 个时间戳,也许我可以增加更新频率以提高其效率。然而,这种方式我会冒着牺牲已经不稳定的稳定性的风险。从根本上说,这是一个效率和稳定性之间的权衡问题。

最后一个是 DDPG。好吧,在这个任务中是行不通的。前一篇文章中演示的训练结果使用了 1000 集,但是我在其他训练长度上进行了实验,达到了 5000 集。他们中没有一个人成功地解决了这个问题。也许任务真的很复杂,其中观察状态包含 33 个变量,而代理有 4 个动作变量。看起来 DDPG 在处理如此复杂的问题上效率不够高。

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

Learning Progress Compared on all Algorithms — DDPG, D4PG and A2C

在我关于如何进一步改进整个实验的最后思考中,我可能会尝试使用 Python 的多处理模块重写代码,这将使算法能够应用于并行环境。这是强化学习的一个趋势,值得一试。此外,我可能会尝试看看我是否可以重新编码 D4PG,以便在未来进行多步轨迹训练。这样可以提高 D4PG 模型的稳定性。

如果你喜欢这个帖子,欢迎指出我犯的任何错误,或者在评论框中留下任何反馈。代码和 jupyter notebook 的完整实现可以在这个[ 链接中找到。

参考

[1] M. Lapan,动手深度强化学习 (2018),Github

[2] S. Zhang,py torch 中深度 RL 算法的模块化实现 (2018),Github

[3] M .周,利用 PyTorch 简单实现强化学习(A3C)(2018),Github

[4] Hungryof, 模型中 buffer 的使用 (2018), CSDN

RLCard:用 3 个步骤构建你自己的扑克人工智能

原文:https://towardsdatascience.com/rlcard-building-your-own-poker-ai-in-3-steps-398aa864a0db?source=collection_archive---------10-----------------------

介绍纸牌游戏中强化学习的工具包

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

https://github.com/datamllab/rlcard

由于强化学习的进步,人工智能(AI)在游戏中取得了令人鼓舞的进展。举几个例子,AlphaGo 在围棋比赛中击败了人类职业选手。alpha zero【2】在国际象棋、shogi、围棋等游戏中从零开始自学,成为艺术大师。近年来,研究人员的努力在扑克游戏中取得了成果,如Libra tus【3】和deep stack【4】,在德州扑克中取得了专家级的表现。扑克是人工智能中最具挑战性的游戏之一。作为一名玩家,我们不仅需要考虑自己的手牌,还需要考虑其他玩家隐藏在我们视线之外的手牌。这导致了可能性的爆炸。

在本文中,我将介绍一个用于纸牌游戏中强化学习的开源项目,该项目最近由德克萨斯州 A & M 大学的数据实验室开发。本文将首先概述该项目,然后提供一个如何从头开始训练代理人玩 Leduc Hold’em poker(德州扑克的简化版本)的运行示例。该项目的目标是让每个人都能接触到扑克游戏中的人工智能。

概观

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

[5] An overview of RLCard. Each game is wrapped by an Env (Environment) class with easy-to-use interfaces.

RLCard 提供了各种纸牌环境,包括 21 点、Leduc Hold’em、德克萨斯扑克、UNO、斗(中国扑克游戏)和麻将,以及几个标准的强化学习算法,如深度 Q 学习【6】、神经虚构自玩(NFSP)【7】和反事实后悔最小化【8】。它支持简单的安装和丰富的文档示例。它还支持多个过程的并行训练。采用了以下设计原则:

可再现: 来自环境的结果可以被再现和比较。用相同的随机种子在不同的运行中应该获得相同的结果。 易上手: 每次游戏结束后都收集整理好经验,界面直白。状态表示、动作编码、奖励设计,甚至游戏规则,都可以方便地配置。 可扩展: 按照上述设计原则,可以方便地将新的卡片环境添加到工具包中。工具包中的依赖性被最小化,这样代码可以很容易地维护。

Leduc 德州扑克

Leduc 德州扑克是德州扑克的简化版。该游戏使用 6 张牌(黑桃杰克、王后和国王,以及红桃杰克、王后和国王)。每个玩家会有一张手牌,还有一张社区牌。与德州扑克类似,高等级牌胜过低等级牌,例如黑桃皇后比黑桃杰克大。一对胜过一张牌,例如,一对 j 比皇后和国王大。游戏的目标是从其他玩家那里赢得尽可能多的筹码。Leduc Hold’em 的更多细节可以在 Bayes 的虚张声势:扑克中的对手建模 [9]中找到。

第一个例子:NFSP 在 Leduc 德州扑克上

现在,让我们用 RLCard 对一名 NFSP 特工进行 Leduc 德州扑克培训!完整的示例代码如下所示:

在本例中,为 Leduc Hold’em 构建 AI 需要 3 个步骤。

第一步: *制造环境。*首先,告诉“rlcard”我们需要一个 Leduc 德州扑克环境。

env = rlcard.make('leduc-holdem')

第二步 : 初始化 NFSP 代理。其次,我们创建两个内置的 NFSP 代理,并告诉代理一些基本信息,例如,动作的数量、状态形状、神经网络结构等。注意,NFSP 还有一些其他的超参数,比如内存大小。这里我们使用默认值。

with tf.Session() as sess:
    agents = []
    for i in range(env.player_num):
        agent = NFSPAgent(sess,
                          scope='nfsp' + str(i),
                          action_num=env.action_num,
                          state_shape=env.state_shape,
                          hidden_layers_sizes=[128,128],
                          q_mlp_layers=[128,128])
        agents.append(agent) # Setup agents
    env.set_agents(agents)

第三步 : *生成游戏数据,训练代理。*第三,可以用“run”功能生成游戏数据。然后,我们将这些转换传送到 NFSP 并培训代理。

episode_num = 10000000for episode in range(episode_num): # Generate game data
    trajectories, _ = env.run(is_training=True) # Train the agents
    for i in range(env.player_num):
        for ts in trajectories[i]:
            agents[i].feed(ts)
            rl_loss = agents[i].train_rl()
            sl_loss = agents[i].train_sl()

然后,NFSP 代理将通过自我游戏学习玩 Leduc Hold’em。性能可以通过 NFSP 代理和随机代理的比赛来衡量。你也可以在这里找到代码和学习曲线。示例学习曲线如下所示:

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

Learning curves in terms of performance against random strategy. The reward is the winning big blinds.

NFSP 代理在对抗随机代理的性能方面逐渐提高自己。如果您想探索更多的例子,请查看资源库。玩得开心!

玩预先训练好的模型

RLCard 还与 NFSP 一起提供了一个预先训练好的 Leduc Hold’em 模型。我们可以通过运行这个脚本来对抗预先训练好的代理。

>> Leduc Hold'em pre-trained model>> Start a new game!
>> Agent 1 chooses raise=============== Community Card ===============
┌─────────┐
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
└─────────┘
===============   Your Hand    ===============
┌─────────┐
│J        │
│         │
│         │
│    ♥    │
│         │
│         │
│        J│
└─────────┘
===============     Chips      ===============
Yours:   +
Agent 1: +++
=========== Actions You Can Choose ===========
0: call, 1: raise, 2: fold>> You choose action (integer):

摘要

要了解这个项目的更多信息,请点击这里查看。该团队正在积极开发项目的更多功能,包括可视化工具和锦标赛排行榜。这个项目的最终目标是让社区中的每个人都有机会在卡牌游戏中接受训练、比较和分享他们的人工智能。我希望你喜欢阅读。在我的下一篇帖子中,我将介绍 21 点深度 Q 学习的机制,我们将看看该算法是如何实现的及其在纸牌游戏中的应用。

参考资料:
【1】白银。用深度神经网络和树搜索掌握围棋游戏(2016)。
【2】白银。掌握没有人类知识的围棋游戏(2017)。
【3】布朗和桑德霍尔姆。用于单挑无限注扑克的超人 AI:Libra tus 击败顶级专业人士(2018)。
【4】Moravík DeepStack:单挑无限注扑克中的专家级人工智能(2017)。
【5】查。RLCard:卡牌游戏强化学习工具包(2019)。
【6】Minh通过深度强化学习实现人级控制(2015)。
【7】海因里希和西尔弗。不完全信息博弈中自我博弈的深度强化学习(2016)。
【8】Zinkevich不完全信息博弈中的后悔最小化(2008)。
【9】sou they Bayes 的虚张声势:扑克中的对手建模(2012)。

RLSD:用于多标签图像分类的端到端 CNN+LSTM 模型

原文:https://towardsdatascience.com/rlsd-an-end-to-end-cnn-lstm-model-for-multi-label-image-classification-47dfdf8e4bd9?source=collection_archive---------11-----------------------

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

RLSD localizes regions of interest that contain objects with semantic relationships.

阅读小组

我们公司一个机器学习工程师的奖学金项目。奖学金项目的一部分是每周一次的研究论文回顾。每周都会有一名研究员发表一篇最新的机器学习研究论文。

我喜欢这些每周一次的小组,因为它让我们了解最新的研究。大多数数据科学家花时间阅读研究论文,但我个人不会保持每周一篇论文的节奏,如果我的日程表上没有这些阅读小组。

我相信每周、每两个月或至少每月一次的研究阅读小组应该是任何专注于应用机器学习的公司的一部分。这一领域的创新步伐势不可挡。

作为前研究员和该组织的成员,我偶尔有机会提交自己的研究论文。我想在 Medium 上与我的读者分享我从这篇论文中学到的东西会很不错。

多标签图像分类

ImageNet 中的分类任务是将一幅图像作为一组像素 X 作为输入,并返回该图像的标签 Y 的预测,标签 Y 应该描述图像的主题。

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

ImageNet prediction outputs from AlexNet. “Vanilla” ImageNet carries just one label per image.

这是对计算机视觉问题的过度简化。图像自然包含许多主题。我们可以用多标签分类来表示这种更常见的情况。与其将我们的图像标签限制为每张图像一个,为什么不使用多个标签来表示图像中存在的多个对象呢?

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

Most photographs contain many objects; a seabird, many humans, skateboards, hats, and even boats in the background are present in this example.

传统神经网络架构的简单改编,如 AlexNet、VGG 等。,可以让你多标签输出。在模型的最后一层使用 sigmoid 激活函数,代替 softmax,是一种选择。

但是这种方法并不总是那么有效。对于这个问题,有许多可供选择的方法。

今天我将谈谈其中的一种方法。

区域潜在语义依赖(RLSD)模型

RLSD 是张等人于 2016 年首次提出的一种方法。这个想法的许多扩展最近已经被探索。

研究人员的动机是试图对图像中的潜在语义依赖进行建模。之所以使用“潜在”这个词,是因为虽然有标签可用,但描述这些关系的标签却不可用。

图像中的对象通常以某种方式相互关联,尽管并不总是如此:一个女孩用棒球棒击球。一只小猫坐在电脑上。

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

这种关系并不总是存在的。例如,一张照片可能包含一栋建筑、一辆汽车和一棵树,尽管这三个对象不会以任何有意义的方式进行交互。

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

这篇论文的想法是创建一个模型,它足够具有表达能力来学习这些潜在的语义依赖,同时也足够灵活来检测独立的同现对象

了解 RLSD

这篇论文对我来说特别难理解,部分原因是它很复杂,部分原因是它的语法。

说真的,如果有任何 ML 研究者需要英文编辑, 请在发表前 联系我。

幸运的是,我有一些时间来纠正和消化它。

TL;博士

该模型使用来自 Faster-RCNN区域提议网络(RPN) 来生成感兴趣区域(RoI)提议。当 RoI 具有高置信度得分时,使用双线性插值将与其相关的卷积特征转换为固定大小的特征向量。这些向量通过密集层进行进一步压缩。压缩的特征向量然后被输入到 LSTM 模型,该模型将在可变数量的时间步长上处理信息。最后,记录 LSTM 的输出,并使用最大池操作将其转换到标签空间。

这有用吗?

这似乎太复杂了,无法工作。(一旦你阅读了训练前的步骤,它开始变得更加可信。)

区域提案网络

fast-RCNN 论文中介绍了区域提议网络,或 RPN,。网络学习从图像空间到一组固定的边界框的映射,称为。锚预测带有置信度得分和四个边界框回归值,它们转换固定锚框以对固定锚位置进行微小调整。

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

Diagram from the faster-RCNN paper explaining RPN. The inputs to the RPN are convolutional features, extracted from (for example) a pretrained VGG network.

使用预训练的 VGG 网络从输入图像中提取 512 维的特定于位置的特征向量。每个 512-d 矢量可以直接映射回输入图像上的一个区域。这些位置中每一个都与多个锚(比如 9 个锚)相关联。这个数字在上图中被称为 k

每个 k 锚点与一个以输入图像的相应区域为中心的边界框相关联。每个都有不同的大小和长宽比(例如,正方形、高矩形、宽矩形)。RPN 能够使用该输出来预测边界框输出。

RLSD 的作者在视觉基因组图像数据集上对 RPN 进行了预训练,该数据集为这个预训练步骤提供了边界框。

感兴趣区域特征提取

一旦 RPN 检测到感兴趣区域(RoI ),一组 512 维特征向量就被传递到模型的下一部分。

这是与 RoI 相关的一组特征向量;由于 RoI 有不同的大小,这通常是向前传递的可变数量的特征向量。

为了固定这些特征的大小,作者使用双线性插值将这些特征映射到一组固定的特征。这是 fast-RCNN 的一个变化,它使用了一个池层来实现这一点。输出特征被固定为 512 维特征的 7×7 网格(针对每个 RoI)。

然后,这个张量被展平,并通过两个完全连接的层(每个层有 4096 个单位)发送。输出是该区域的提取特征的 4096 维编码。

LSTM 加工

给定 RoI 的 4096-d 特征编码作为输入给定 LSTM 模型

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

Diagram of an LSTM model.

在每个时间步长,LSTM 模型将前一步的内部输出(上图中的 hx )作为输入,这是一组与当前时间步长 t 相关的新特征。在 t =0 时,x 是 4096-d 区域特征编码,h 是零向量。时间步长 t 的输出是一个 N 维向量,其中 N 是我们拥有的标签数量。由于我们没有输入序列,时间步长 t +1 的 x 输入就是时间步长 t 的预测输出。

LSTM 想停就停。标签上有一个特殊的“结束”标签。一旦 LSTM 输出“结束”编码,它就停止预测。

该模型针对每个 RoI 运行。

获得预测

LSTM 模型的输出是一个三阶张量。如果有 M 个 ROI、T 个时间步长和 N 个标签,则总输出为 M×T×N 个张量。

为了将其映射到 N 维标签空间,任何给定标签的最大概率(跨所有时间步长和区域)被作为最终输出。根据定义,这是一个最大池操作。

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

(source) Global max-pooling is used to get the final predictions. Instead of features, we have predictions; H and W correspond to timesteps and regions.

这里的输出是一个 N 维的预测向量。我们现在可以通过整个模型计算多标签交叉熵损失和反向传播,因为梯度可以通过每个操作反向传递(包括双线性插值操作,如 Karpathy 等人所指出的)

慷慨的前期培训

作者使用许多预训练步骤来获得收敛的模型。RPN 在带有边界框的数据集上进行了预训练,LSTM 在目标数据集上进行了预训练(跳过 RoI 步骤并向前传递所有要素)。原始卷积特征是从 ImageNet 预训练的 VGG 模型中提取的。

作者“发现这个初始化过程对模型快速收敛很重要[原文如此]。”

由于梯度不能通知来自图像级标签的 RPN 输出,我认为这一步不仅仅是“重要的”,而是模型工作所必需的。

结果

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

From the paper. mAP on the PASCAL VOC 2007 dataset, without using bounding boxes in training, got an 87.3 mAP, an apparent 2.1 improvement over the previous SOTA. (RLSD + ft-RPN row should be ignored, as it uses the provided bounding boxes in training).

这项工作的结果是对以前 SOTA 关于 PASCAL VOC 的结果的明显改进。他们的模型的另一个版本,称为 RLSD + ft-RPN,在训练期间使用数据集中提供的边界框来训练 RPN,所以它不应该与该表上的其他结果进行比较。(看看 RLSD 街吧。)

这样实用吗?

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

值得一问的是,这种模式对于部署是否足够实用。经过大量的预训练后,由于 LSTM 步骤,推理时间可能比大多数网络更长(尽管这可以在所有 RoI 输出中很好地并行化。)

作者没有报道推断过程中的计算时间。

此外,由于对预培训的依赖,我预计 RPN 在非常不同的领域不会很好地工作;这可能会对性能造成另一个限制,需要来自与目标数据集相似的域的数据集,并且具有可用的边界框注释来完成预训练步骤。这样的数据通常很难获得。

如果作者提供一些代码(或者一些预先训练好的网络),我会对这个项目更加乐观**。既然得不到,我就持怀疑态度。**

优势

如果一切顺利,并且你能够预训练一个在你的领域中有效的 RPN,那么从端到端训练 RLSD 模型提供了一些优势。例如,特定的边界框可以与预测标签相关联。

在多标签分类问题上使用该模型也可能获得最佳结果。只要确保你能完成所有要求的训练前步骤。

RNN 简体版-初学者指南

原文:https://towardsdatascience.com/rnn-simplified-a-beginners-guide-cf3ae1a8895b?source=collection_archive---------8-----------------------

递归神经网络的直观解释,LSTM 和 GRU

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

image credit — Gerd Altmann from Pixabay

递归神经网络(RNN)是一种流行神经网络体系结构,广泛用于由顺序或上下文数据组成的用例。

在我们从 RNN 本身开始之前,让我们先看看为什么我们首先需要它。让我们试着记住这一幕。

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

花了点时间,对吧?(或者你根本无法理解)

现在想象你正在看电影,你在这个特定的场景中,你将能够很容易地把这些点联系起来。我们所有的想法都是流动的,基于之前的框架,我们可以很容易地连接到当前的框架。我们的思想具有持久性。

我们传统的神经网络架构无法做到这一点,给定一个特定的帧序列,它们无法预测电影中每一点发生了什么。

为了解决这种问题,我们使用一个自环网络。

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

fig1 : Recurrent Neural Network ( Network with self loop)

简单来说,我们将网络中前一个时间帧的输出反馈到下一个时间帧。假设网络在 t=1 时的输出是 h0,而在 t=2 时训练网络,我们也将考虑 h0,从先前时刻接收的输出。如果我们展开网络,我们会得到下面的结构。

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

fig2 : RNN at various instance of time , Image Credit— colah’s blog

这里需要记住的重要一点是 您显示的连续单元是不同时间点的相同单元,而不是级联单元

现在,RNN 的简单实现也存在问题。随着时间的推移,它们通过反向传播来学习。如果我们要求他们从长期依赖中学习,这可能会导致梯度消失或梯度爆炸的问题。简而言之,他们记不住重要的信息,而这些信息可能在以后的时间标记中需要。

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

为了克服这些问题,我们使用 LSTM(长短期记忆),一种非常特殊的循环网络和 GRU(门控循环单元),它是 LSTM 的一个稍微修改的版本。

LSTM 故障:

让我们来分析一下 LSTM 的内部结构。一个 LSTM 单元主要

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

fig3 :LSTM and GRU .image credit — Michael Nguyen

由一个单元状态(单元的当前信息流)和三个门(读取网络层的特殊形式)-忘记门、输入门和输出门组成。迷惑对吗?别担心,我们会一步一步地分解它。

细胞状态:我们可以把细胞状态想象成不同时刻的连续信息流。在每个时刻,我们都必须决定保留或修改多少信息。还记得我们最初为什么需要 LSTM 吗?我们无法保留来自遥远的特定时刻的信息的重要性。 在这里,我们可以灵活地决定在每个阶段给予哪些信息更多的重视。

  1. 忘记大门:首先让我们仔细看看我们拥有的各种符号:

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

fig4 :Structure of LSTM ,image credit- wikipedia

C_(t-1) :旧单元状态, c_t: 当前单元状态, h_(t-1): 从前一状态输出, h_t =当前状态输出

遗忘门决定了我们将使用多少来自先前单元状态的信息,以及我们将“丢弃”多少信息。最后一个状态的输出( h_(t-1) )与 x_t 连接(未加),并通过一个 sigmoid 单元。Sigmoid 提供 0 到 1 之间的输出。直观上,0 表示’忘记一切,1 表示’保留一切

**2。输入门:**输入门决定我们将哪些新信息添加到单元状态中。串接的 x_t 和 h_(t-1)通过 sigmoid 单元发送,该单元决定我们将更新什么值。

级联值也通过一个双曲正切层,该层给出-1 到+1 之间的输出,并帮助调节网络。在所有这些操作之后,我们得到了单元状态的当前值。

3.**输出门:**输出门决定在下一个时刻我们将传递给网络什么信息。如果你沿着最后一条水平线,我们首先串接 x_t 和 h_(t-1)是通过一个 sigmoid 单元发送的。然后,我们通过一个双曲正切函数传递当前单元状态的值(注意,这是一个逐点双曲正切运算,而不是双曲正切激活层)。最后,我们将两个输出相乘,并在下一个时间发送出去。你可能会想到 为什么这里有两个 h _ t?。答案是,在我们的整个解释中,我们考虑的是 LSTM 的一个单元。实际上,我们也可以使用级联多层 LSTMs。因此,一个输出到网络的下一层,另一个输出到网络的下一个实例(随时间前馈)。

GRU 的分解:

GGateRe currentUnit 是由推出的 LSTM 网络的流行变种

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

fig5 : Structure of GRU

Cho 等(2014) 。LSTM 和 GRU 的主要区别是,GRU 只有两个门(更新和重置门)。

  1. 更新门:更新门只不过是单个单元中输入门和遗忘门的组合。它决定保留什么信息和需要添加什么新信息。
  2. **重置门:**它决定在下一个时刻需要向网络传递什么信息。它还合并了当前单元格状态和隐藏状态,并进行一些其他更改。

与 LSTM 相比,GRU 减少了门的数量,因此减少了张量运算的数量。这使得它在计算上比 LSTMs 更便宜和更快。但是我们不能马上说哪种实现是最好的。这取决于手头的问题。在实践中,我们将这两个模型应用到我们的用例中,并比较哪一个性能更好。

结束备注:

在本文中,我们讨论了关于Re currentNeuralN网络的基础知识以及 LSTM 和 GRU 的构建模块。本文的主要目的是让您熟悉神经网络的基础知识,并建立一个直观的基础。希望这将有助于你的旅程。快乐学习!

引文:

你可以通过这些链接更深入地研究

  1. http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  2. https://www.youtube.com/watch?v=WCUNPb-5EYI
  3. https://skymind.ai/wiki/lstm

瑞士的道路交通事故预测——脸书预言家和 LSTM 神经网络的简单比较。

原文:https://towardsdatascience.com/road-accidents-in-switzerland-forecasting-a-brief-comparison-between-facebook-prophet-and-lstm-6514f585681?source=collection_archive---------19-----------------------

多年来,预测未来的能力只保留给少数人,他们的工具仅限于水晶球、手掌和塔罗牌。但是在过去的 50 年里,新的工具已经出现,现在更多的人可以进行预测,这很棒!

在本文中,我将通过一个简单的例子向您展示如何执行基本的时间序列预测。我们将使用开源库脸书先知和使用 Keras / Tensorflow 的 LSTM 神经网络来分析、可视化和预测瑞士的道路事故。

我在这篇文章中使用的 jupyter 笔记本可以在我的 github 上找到。

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

[2011–2018] Accidents location in Switzerland

数据集:

对于这篇博客文章,我们将使用“Strassenverkehrsunfallorte”数据集,可从以下地址获得:https://open data . Swiss/en/dataset/strassenverkehrsunfalle-MIT-personenschaden

**数据集描述:**2011 年至 2018 年道路交通伤害事故的匿名可视化和定位。为道路交通事故提供关于年、月、工作日、事故时间、道路类型、事故类型、严重程度类别和位置的信息。

可视化:事故地点

如果可能的话,我总是试图用一个漂亮的可视化来开始一个新的数据科学项目,幸运的是这个项目适合这个目的。

实际上,在考虑预测之前,我对这个数据集感兴趣的原因是它有可能被用来使用 数据阴影 生成一个“漂亮的”可视化。对于那些熟悉这个库的人来说,你可能已经看到了它在纽约出租车数据集或 OpenSky 网络数据集上的使用,它能够处理数十亿个数据点。

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

[2011–2018] Accidents location in Switzerland with colors depending on severity

事故预测

虽然原始数据集是一个时间序列,其中每行代表一次事故,但我对它进行了处理,这样我们现在就有了一个时间序列,它可以计算每小时的事故数量,这就是我们将尝试预测的情况。

时间序列预测:

说到预测时间序列,我想到了一些流行的方法:

  • 简单基线:平均、平滑…
  • 自回归:SARIMA 模型(季节性自回归综合移动平均模型)
  • 神经网络/深度学习:CNN,LSTM

几乎所有这些方法都需要一点努力来调整它们并找到最佳参数。最酷的事情是,脸书的工程师(可能厌倦了从头开始使用新模型)推出了一个开源库,名为Prophet:“Prophet 是一个基于加法模型预测时间序列数据的程序,其中非线性趋势符合每年、每周和每天的季节性,加上假日效应。它最适用于具有强烈季节效应的时间序列和几个季节的历史数据。Prophet 对缺失数据和趋势变化具有稳健性,通常能很好地处理异常值。

数据集操作:

这里的目标不是展示先知或 LSTM 神经网络的所有能力,而是操纵一个简单的数据集,并向您展示如何塑造它来预测未来😮

我们的原始数据集包含每个已登记事故的一行,我们将对其进行操作,以计算在您选择的时间增量(dt)内发生的事故数量。我们将获得一个数据集,它仍然是一个时间序列,但现在每个“时间戳”在一个选定的频率上只有一行,还有一列“n_accident ”,包含在选定的时间跨度内登记的事故数量。

脸书先知:

先知事故的季节性:

一旦获得新的数据集,使用 Prophet 很容易获得预测和季节性分析。

以下是您可以获得的季节性曲线图类型:

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

Seasonality of number of accidents per hours

y 轴表示每个时间戳的事故数量(1H 的分辨率)。

正如我们所见,事故数量在 2011 年至 2013 年间有所下降,但自 2016 年以来又有所上升。

我们可以从该图中提取的其他信息是,就事故以及一天中 16-18 小时的时间跨度而言,6 月似乎是最关键的一个月。

使用 Prophet 进行事故预测:

由于我们有 2011 年至 2018 年的数据,我们将只使用 2011 年至 2017 年期间来预测 2018 年,然后能够评估预测的准确性。我们不再试图预测每小时的事故数量,而是转换我们的数据集来预测每天的事故数量。

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

Daily accidents number forecast for 2018

仅通过查看图表很难评估准确性,因此我们需要在本文的下一部分查看一些指标。

长短期记忆神经网络

使用深度学习和 LSTM 神经网络的事故预测;

LSTM 代表长期短期记忆。这是一种递归神经网络,LSTM 的强大之处在于它有一种记忆,能够记住/忘记模式。

我们将用过去的 1000 天来预测接下来的 365 天。为此,我们根据 2011 年到 2017 年底的数据训练模型,然后我们试图预测 2018 年瑞士的事故。

我们使用步行前进模式。假设我们想要使用最后 3 个元素[1,2,3,4,5,6]来预测下面序列的下一个元素。我可以设计多行的训练数据集,例如:

[1, 2, 3] -> 4
[2, 3, 4] -> 5
[3, 4, 5] -> 6

为此,我使用了这篇非常有用的文章:https://machine learning mastery . com/convert-time-series-supervised-learning-problem-python/

神经网络结构;

我使用 keras 来建模神经网络,我们有一个由 50 个 LSTM 细胞组成的层(我使用了 CuDNNLSTM 层,这是一个充分利用 GPU 的 LSTM 的快速实现)和一个密集层,其中神经元的数量等于我们想要做的预测的数量。

Neural network architecture using keras

培训和结果:

我们使用 33%的数据作为验证和 val_loss 上的模型检查点回调,以避免网络对训练数据的过度拟合。

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

2018 daily accidents forecast using LSTM

正如我们在上面的图中看到的,它抓住了趋势,但仅此而已,我们看到的振荡并没有真正抓住数据中任何有趣的部分。我确信我们可以通过微调 LSTM 超参数得到更好的结果,但这不是本文的目的。

脸书预言家 vs. LSTM 预测准确性

为了判断我们预测的准确性,我们将检查两个模型在不同指标下的表现。我选择了 3 个不同的指标:均方根误差[RMSE]、平均绝对误差[MAE]和平均百分比误差[MPE]。

2018 forecasting metrics

正如我们所见,prophet 在 3 个指标中的每一个指标上都表现得更好。这展示了这个工具的威力。以三分之一的努力,我们获得了比用 LSTM 神经网络更好的预测。下次你想预测一些时间序列时,你可能想先试试 Prophet。

但是不要误解我的意思,当你想使用多种特征或更复杂的数据进行预测时,LSTM 是非常强大的,当然,根据你的应用,它可能是你要考虑的“工具”。

基于 Keras 的分割模型和白蛋白库的道路检测

原文:https://towardsdatascience.com/road-detection-using-segmentation-models-and-albumentations-libraries-on-keras-d5434eaf73a8?source=collection_archive---------5-----------------------

在这篇文章中,我将展示如何编写自己的数据生成器以及如何使用 albumentations 作为增强库。以及 segmentation_models 库,它为 unet 和其他类似 Unet 的体系结构提供了几十个预训练的头。完整代码请访问 Github 。链接到数据集

查看我的机器和深度学习博客【https://diyago.github.io/

理论

语义图像分割的任务是将图像的每个像素标记为所表示内容的相应。对于这样一项任务,经过各种改进的 Unet 架构表现出了最佳效果。它背后的核心思想只是几个卷积块,提取深度和不同类型的图像特征,随后是所谓的去卷积或上采样块,恢复输入图像的初始形状。此外,在每个卷积层之后,我们有一些跳跃连接,这有助于网络记住关于初始图像的,并有助于防止渐变。有关更多详细信息,您可以阅读 arxiv 文章或另一篇文章

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

Vanilla U-Net https://arxiv.org/abs/1505.04597

我们是来练习的,让我们开始吧。

数据集-卫星图像

对于分割,我们不需要太多的数据来获得一个像样的结果,甚至 100 张带注释的照片就足够了。目前,我们将使用来自https://www.cs.toronto.edu/~vmnih/data/的马萨诸塞州道路数据集,大约有 1100 多张带注释的列车图像,它们甚至提供验证和测试数据集。不幸的是,没有下载按钮,所以我们必须使用脚本。这个脚本将完成这项工作(可能需要一些时间来完成)。

让我们来看看图片示例:

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

Massachusetts Roads Dataset image and ground truth mask ex.

注释和图像质量似乎不错,网络应该可以检测道路。

库安装

首先你需要安装带有 TensorFlow 的 Keras。对于 Unet 构建,我们将使用 Pavel Yakubovskiy 的名为 segmentation_models 的库,用于数据扩充albumination库。稍后我会写更多关于他们的细节。这两个库的更新都非常频繁,所以我更喜欢直接从 git 更新它们。

定义数据生成器

作为数据生成器,我们将使用我们的自定义生成器。它应该继承 keras.utils.Sequence 并且应该定义这样的方法:

  • init (类初始化)
  • len (数据集的返回长度)
  • on_epoch_end (时段结束时的行为)
  • getitem (生成的批次馈入网络)

使用自定义生成器的一个主要优点是,您可以处理您拥有的每种格式数据,并且可以做任何您想做的事情——只是不要忘记为 keras 生成所需的输出(批处理)。

这里我们定义 init 方法。它的主要部分是为图像( self.image_filenames )和遮罩名称( self.mask_names )设置路径。不要忘记对它们进行排序,因为对于*self . image _ filenames[I]*对应的掩码应该是 self.mask_names[i]。

接下来重要的事情***_ _ getitem _ _****。*通常情况下,我们无法将所有图像存储在 RAM 中,因此每次生成新的一批数据时,我们都需要读取相应的图像。下面我们定义训练的方法。为此,我们创建一个空的 numpy 数组(np.empty ),它将存储图像和遮罩。然后我们通过 read_image_mask 方法读取图像,对每一对图像和掩膜进行增强。最后,我们返回 batch (X,y ),它已经准备好被放入网络中。

接下来,我们定义发电机,它将被馈入网络:

数据扩充— 相册

数据扩充是一种策略,能够显著增加可用于训练模型的数据的多样性,而无需实际收集新数据。这有助于防止过拟合,并使模型更加健壮。

对于这样的任务,有大量的库:imaging、augmentor、solt、keras/pytorch 的内置方法,或者您可以使用 OpenCV 库编写您的自定义增强。但是我强烈推荐 相册 图书馆。用起来超级快捷方便。有关用法示例,请访问官方知识库或查看示例笔记本

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

在我们的任务中,我们将使用基本的增强,如翻转和非平凡的弹性变换的对比。你可以在上图中找到它们的例子。

在定义了所需的增强后,您可以很容易地得到如下输出:

复试

我们将使用常见的回调:

  • 模型检查点-允许您在训练时保存模型的权重
  • ReduceLROnPlateau —如果验证指标停止增加,则减少训练
  • EarlyStopping —一旦验证指标停止,就停止训练,以增加几个时期
  • tensor board——监控训练进度的绝佳方式。链接到官方文档

培养

作为模型,我们将使用 Unet。使用它最简单的方法就是从 segmentation_models 库中获取。

  • backbone_name:用作编码器的分类模型的名称。EfficientNet 目前在分类模型中是最先进的,所以让我们来尝试一下。虽然它应该给出更快的推理并且具有更少的训练参数,但是它比众所周知的 resnet 模型消耗更多的 GPU 内存。还有许多其他选择可以尝试
  • encoder_weights —使用 imagenet weights 加速训练
  • encoder_freeze:如果为真则将编码器(骨干模型)的所有层设置为不可训练。首先冻结和训练模型,然后解冻可能是有用的
  • decoder_filters —您可以指定解码器块的数量。在某些情况下,带有简化解码器的较重编码器可能会有用。

在初始化 Unet 模型之后,你应该编译它。此外,我们将IOU(union 上的交集)设置为我们将监控的度量,并将 bce_jaccard_loss ( 二进制交叉熵加上 jaccard loss )设置为我们将优化的损失。我给了链接,所以不会去这里为他们进一步的细节。

开始训练后,你可以观看 tensorboard 日志。正如我们可以很好地看到模型训练,即使在 50 个纪元后,我们也没有达到全局/局部最优。

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

Tensorboard logs

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

Loss and IOU metric history

推理

因此,我们有 0.558 IOU 进行验证,但每个高于 0 的像素预测都被视为屏蔽。通过选择合适的阈值,我们可以将结果进一步提高 0.039 (7%)。

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

Validation threshold adjusting

度量当然很有趣,但是更有洞察力的模型预测。从下面的图片中,我们看到我们的网络很好地完成了任务,这很好。对于推理代码和计算指标,您可以阅读完整的代码。

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

参考

@phdthesis{MnihThesis,
    author = {Volodymyr Mnih},
    title = {Machine Learning for Aerial Image Labeling},
    school = {University of Toronto},
    year = {2013}
}

航空图像中道路的分割。

原文:https://towardsdatascience.com/road-segmentation-727fb41c51af?source=collection_archive---------7-----------------------

这篇全面的文章将帮助您创建一个道路分割模型,它可以检测和分割航空图像中的道路。

卷积神经网络(C.N.N.s)的出现是计算机视觉领域的一项突破,因为它们从根本上改变了计算机“看”图像的方式。机器视觉已经从它开始的地方走了很长的路,但它今天仍然处于研究的前沿。语义分割是将图像中的每个像素归属于某一类的过程。这个类可以是一只狗,一辆车,或者在我们的例子中是道路。

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

You can view the interactive output here.

地球上所有道路的总长度约为 3350 万公里。让我换一种说法——如果我们能把所有的路都排成一条直线,那么我们将走过地球和太阳之间距离的四分之一。手动标注道路的每一部分是一项艰巨的任务,如果不是不可能的话。这就是深度学习发挥作用的地方,这也是我们将通过这个项目完成的事情。简单来说,我们将训练一个深度学习模型来识别航拍图像中的道路。

您可以在本文末尾找到源代码的链接。如果你想了解这篇文章的范围,请参考目录。项目中使用的所有资源都是公开可用的,因此建议您遵守。本文涵盖了该项目的实践和理论两个方面,我希望这对您来说是一次愉快的学习经历。

目录

  1. 数据
    一、我们需要的数据类型。
    二。数据集
    iii。正在下载数据集。
  2. 预处理
  3. 神经建模
    一、关于 F.C.N
    二。网络架构
  4. 训练模型
    一、损失函数和优化器
    二。回调
    三。训练模型
  5. 测试模型
  6. 改进范围
  7. 结论
  8. 链接和引用

让我们开始吧。

1.数据

不同类型的机器学习模型需要不同类型的数据,数据越多越好。更多的数据训练意味着我们的模型将能够学习更多的潜在模式,并且能够更好地区分异常值。

我们需要的数据类型。

通常,对于分割挑战,我们需要图像以及它们各自的(最好是手绘的)地图。对于这个项目,我们需要航空图像,以及它们的分段地图,其中只显示了道路。这个想法是,我们的模型将专注于表示道路的白色像素,它将学习输入图像和输出地图之间的相关性。

二。数据集

对于这个项目,我们将使用马萨诸塞州道路数据集。该数据集包含 1171 幅航空影像,以及它们各自的地图。它们的尺寸是 1500 x 1500 英寸。tiff 格式。请看看下面的样品。

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

Just look at how elaborately the image was annotated.

三。正在下载数据集。

您可以从克隆我的 GitHub repo 开始,然后使用 Src 文件夹中的 download_images.py 脚本下载数据集。如果你有一个不可靠的持续波动的互联网连接,那么请使用学术洪流来获取数据集。你可以在这里找到数据集

2.预处理

数据的质量极大地影响了我们模型的性能,因此预处理是确保我们的模型以正确的形式接收数据的重要一步。我尝试了多种预处理技术,以下方法产生了最好的结果:

一、手选:数据集中有少数( ~50 )图像缺失了一大块航拍图像。大部分图像包含白色像素,但它们有完整的分割图。因为这样会影响模型,所以我手动删除了它们。

二。裁剪而不是调整尺寸:在大图像上训练我们的模型不仅是资源密集型的,而且一定会花费很多时间。将图像调整到较低的尺寸可能是一个解决办法,但是调整尺寸是有代价的。无论我们在调整大小时选择什么样的插值方法,我们最终都会丢失信息。

因此,我们将从大图像中裁剪出较小的 256 x 256 的图像。这样做给我们留下了大约 22,000 幅有用的图像和地图。

三。**对图进行阈值处理和二值化:**灰度图像是包含不同灰度的单通道图像。每个像素可以取 256 个可能的灰度值,0 代表黑色像素,255 代表白色像素。在语义分割中,我们本质上预测每个像素的这个值。我们将只提供两个选项,而不是提供 256 个离散选项供模型选择。你可能已经注意到了,我们的地图只有两种颜色:黑色和白色。白色像素代表道路,黑色像素代表除道路以外的一切。

仔细观察我们的双色分割图,会发现当我们想要的是黑白时,有许多灰色像素。我们将从阈值像素值为 100 开始。使得所有具有高于某个阈值的值的像素被分配最大值 255,而所有其他像素被分配零。这样做确保了在分段掩码中只有两个唯一的像素值。现在,0 和 255 是一个很大的范围。通过将所有地图除以 255,我们将地图归一化,现在我们最终只有两个值— 0 和 1。

四。打包(可选):我在 Google Colab 上训练了我的模型。衷心感谢谷歌为成千上万的数据科学家和机器学习工程师提供资源。

我注意到在训练期间从 Gdrive 向模型提供图像(使用 ImageDataGenerator)最终会消耗额外的时间。但是,如果您在系统上训练模型,这就不正确了,因为在这种情况下加载文件要快得多。我将整个图像和地图数组打包成两个独立的 .h5py 文件,并将它们加载到内存中。这样做加快了训练过程。

3.神经建模

既然我们已经处理了数据,是时候开始模拟我们的神经网络了。为了完成我们的分段任务,我们将使用全卷积网络。这类网络大多由卷积层组成,与更传统的神经网络不同,没有完全连接的层。

一、关于 F.C.N

德国弗赖堡大学计算机科学系开发了用于生物医学图像分割的全卷积网络[1]。后来人们意识到,这些网络的范围远远超出了医学领域。这些网络可以对任何类型的对象进行多类分割——无论是分割人、汽车还是建筑物。

二。网络体系结构

这个项目使用 U-net,这是一个完全卷积的神经网络,它的名字很直观。该网络采用 256x256 多通道图像,并输出相同尺寸的单通道图。

U-net 有两部分——编码器或下采样部分,解码器或上采样部分。看看下面的图片就知道了。

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

Dissecting a U-net

**编码器:**下采样部分。此部分使用卷积层来学习图像中的时间特征,并使用汇集层对其进行下采样。这部分负责学习图像中的物体。在这种情况下,这部分学习道路看起来如何,并可以检测它。我添加了 dropout 层,它将随机忽略神经元以防止过度拟合,我添加了 BatchNormalization 以确保每一层都可以独立于前一层进行学习。

**解码器:**又叫上采样段。连续的池操作会导致图像空间信息的丢失。模型确实知道图像的内容,但是不知道它在哪里。解码器网络背后的整个想法是使用我们在上一步中提取的特征图来重建空间数据。我们使用转置卷积对图像进行上采样。与普通插值不同,Conv2DTranspose 具有可学习的参数。

**跳过连接:**编码器段中的层与解码器段中的层之间的直接连接称为跳过连接。它们被称为跳过连接,因为它们桥接两层,而忽略所有中间层。跳过连接为上采样层提供空间信息,并帮助它们重建图像和“将东西放入适当的位置”(字面意思)。

请使用以下代码复制 U-net。

我们的 U-net 闪耀着光辉。

4.训练模型

一.损失函数和超参数

在像素级别,这种分割挑战可以被认为是二元分类问题,其中模型对每个像素是白色(道路)还是黑色(非道路)进行分类。但是,我们需要一个平衡的数据集来促进正确的分割,因为这些图像中黑色像素的数量远远超过白色像素,所以我们有一个不平衡的数据集。

有几种不同的方法来处理不平衡的数据问题。在这个挑战中,我们将使用软骰子损失,因为它是基于骰子系数。Dice 系数是预测样本和基础真实样本之间重叠的度量,该值的范围在 0 和 1 之间。其中 0 表示没有重叠,1 表示完全重叠。

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

The formula for the Dice Coefficient. Deja Vu?

平滑骰子损失就是 1 —骰子系数,这样做是为了创建一个最小化损失函数【2】。请看下面骰子丢失的代码。

def dice_coef(y_true, y_pred, smooth = 1):
   y_true_f = K.flatten(y_true)
   y_pred_f = K.flatten(y_pred)

   intersection = K.sum(y_true_f * y_pred_f)
   dice = (2\. * intersection + smooth) / (K.sum(y_true_f)    K.sum(y_pred_f) + smooth)

   return dicedef soft_dice_loss(y_true, y_pred):
   return 1-dice_coef(y_true, y_pred)

可以看到,我们使用了一个名为 smooth 的参数,默认值为 1。通过将分子和分母都加 1,我们可以确保永远不会被零除。

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

Source:pyimagesearch.com

准确性度量:准确性度量告诉我们生成的分割图的正确性。我们将使用 Jaccard 索引,也就是 Union 上的交集,来告诉我们生成的地图有多精确。顾名思义,交集超过并集是分割图正确性的度量。分子是预测图和基本事实标注之间的交集,而分母是基本事实标注和分割图的总面积(使用联合运算计算)。下面的代码片段用于计算 Jaccard 索引。

def IoU(y_pred, y_true):
   I = tf.reduce_sum(y_pred * y_true, axis=(1, 2))
   U = tf.reduce_sum(y_pred + y_true, axis=(1, 2)) - I
   return tf.reduce_mean(I / U)

我们使用 Adam 作为优化器来编译模型。我们将以 0.00001 的学习率开始,我们将它设置为运行 100 个时期。我们使用软骰子损失作为损失函数,使用 Jaccard 指数作为精度指标。

二。复试

在训练过程中可以调用的一组函数称为回调函数。在这个项目中,我们将使用四次回调:

  1. 模型检查点:监控验证损失,保存验证损失最低的模型的权重。
  2. 提前停止:监控确认损失,如果确认损失在一定次数后没有增加,则终止训练过程。
  3. ReduceLROnPlateau :监控验证损失,如果验证损失在一定次数后没有降低,则降低学习率。
  4. TensorBoardColab :是 Tensorboard 的一个特殊版本,专门用于 Google Colab。我们可以在培训过程中监控准确性和其他指标。

三。训练模型

我们已经做了所有的功课,现在是时候拟合模型了。但在此之前,我们将使用*trainttestsplit()*将数据拆分为分别包含 17,780 和 4446 幅图像的训练集和测试集。一旦模型开始对训练数据进行训练,你也许可以去跑步,因为这需要一些时间。好的一面是,我们不必照看模型,你可以回到一个训练有素的模型和输出的重量。

该模型运行了 57 个时期,然后早期停止开始并停止了训练过程。最小验证损失为 0.2352。您可以在下图中观察验证和培训指标的趋势。

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

Tensorgrab

5.测试模型

我们的测试集包含 4446 幅图像,我们的模型几乎可以立即预测它们的分割图。我们的模型在测试集上的性能可以使用 Dice 系数来衡量,该系数达到 0.59(该值介于 0 和 1 之间)。当然还有改进的余地。您可以在下图中观察到一些预测的输出。

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

Few Samples

再看一下,您会注意到我们的模型可以分割注释者遗漏的部分道路。在下图中,注释者跳过了右下角的方块,而我们的模型能够捕捉到它。我们的模型成功地分割了车道、停车场和死胡同。

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

Our model was able to pick up the square region

6.改进的范围

在某些地图上,道路并不完全可见,请看下面的例子。我们的模型无法检测左侧的道路。尽管没有一个模型能产生 100%准确的结果,但总有改进的空间。

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

Missing predictions

我们可以通过采取某些措施来提高模型的性能,这些措施如下:

  1. 图像数据增强:它是通过应用各种操作,如颜色偏移、旋转等,使图像轻微失真的方法。来产生更多的数据。
  2. 使用损失乘数处理职业不平衡:如前所述,我们有一个职业不平衡的问题,为了解决它,我们使用了软骰子损失。我们希望最大化我们的 dice 系数,但是当与二元交叉熵相比时,后者具有更好的梯度,因此将是我们定制损失函数的良好代理,并且可以容易地最大化。唯一的问题是,与软骰子损失不同,二进制交叉熵不是为了处理类别不平衡而构建的,这导致了乌黑的分割图。然而,如果我们应用类乘数,使得模型被激励来忽略频繁出现的类,那么我们可以使用二进制交叉熵来代替骰子损失。这将带来流畅的训练体验。
  3. **使用预训练模型:**预训练模型可以针对这个问题进行微调,它们将充当最佳特征提取器。使用迁移学习导致更快的训练时间,并且通常产生更好的分割图。

7.结论

在这个项目中,我们创建了一个深度学习模型,可以从航拍图像中分割道路。我们获取了图像,并对其进行处理以满足我们的需求。我们创建了一个 U-net 并了解了它的工作原理。我们使用软骰子损失作为我们的成本函数,并训练了 57 个时期的模型。然后,我们在测试集上测试我们的模型,并观察一些样本。

本项目的几点收获:

  1. 裁剪图像而不是调整它们的大小可以保留空间信息。
  2. 将分割图二值化将图中不同值的数量减少到两个。
  3. 使用 ModelCheckpoint 回调来保存模型权重是一个好主意。为了以防万一,如果程序在训练过程中崩溃,你可以随时重新加载重量并恢复训练。
  4. 最后,如果你曾经走进了死胡同,那么 Slav Ivanov 已经写了一篇全面的文章,它将帮助你克服任何与深度学习相关的障碍。

8.链接和参考

这个挑战的确很有趣,感谢您通读这篇文章。如果您有任何反馈或问题,请随时在下面的评论部分输入。

如果你期待更多有趣的教程,那么请关注我的 Twitter 和 Medium。

链接

  1. 源代码
  2. CS231n:用于视觉识别的卷积神经网络

参考

[1] 优信网—维基百科

[2] 评估图像分割模型—杰瑞米·乔登

想了解更多?查看我的其他几篇文章:

  1. 创建自定义人脸识别模型,并在您的系统上运行。
  2. 构建活体情感识别模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值