TowardsDataScience 博客中文翻译 2016~2018(四十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

大 O

原文:https://towardsdatascience.com/big-o-d13a8b1068c8?source=collection_archive---------8-----------------------

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

在准备我的编码面试的过程中,我阅读了许多教程和建议,关于我们应该把时间集中在什么上。我可以肯定地说,大 O 符号的概念是永远不会消失的。大 O 符号说明了一个算法如何根据其输入大小来扩展复杂度。它描述了函数增长的上限。大 O 符号中常见的一个误解是,它谈论算法执行的速度。有可能在不影响算法复杂度的情况下,使算法显著加快。大 O 表示当输入变大时,一个算法还需要做多少“工作”。

所以现在你可能想知道,大 o 到底是什么,让我们给它一个正式的定义。

在数学中,维基百科对大 O 的定义是:

大 O 符号是一种数学符号,它描述了当自变量趋向特定值或无穷大时函数的极限行为。它是保罗·巴赫曼、埃德蒙·朗道等人发明的记数法家族中的一员,统称为巴赫曼-朗道记数法或渐近记数法。

更具体地说,这篇文章将计算机科学中的大 O 定义为:

在计算机科学中,大 O 符号用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长来对算法进行分类。在解析数论中,大 O 符号通常用于表示算术函数和更好理解的近似之间的差的界限;

实际上,还有一些其他符号与大 O 符号密切相关,例如ω和θ。

大ω有两个广泛存在且不相容的定义。出于本文的考虑,我们将把大ω定义为渐近下限,或者换句话说,最好的情况。例如,如果我们对一个数组进行排序,最好的情况是数组已经排序了。另一个例子是,如果我们在一个数组中搜索一个数字,它是我们检查的第一项。

另一方面,大θ指的是算法的平均运行时间。一个算法在平均输入量下会有怎样的表现?

虽然在为特定解决方案选择最佳算法时考虑最佳运行时间或平均运行时间是件好事,但最好总是考虑最坏的情况。如果我们总是为最坏的情况做准备,我们可以肯定地说,我们的算法将总是比一些阈值执行得更好。

那么我们如何计算一个算法的大 O 呢?

让我们从一个简单的例子开始:

int sumTwoNumbers(int a, int b) {
    return a + b
}

让我们再想想大 O 是什么意思;这是一个算法的复杂性如何随着它的输入增加而增加,或者换句话说,当我们给它越来越多的输入时,一个算法还会做多少“工作”。

现在花点时间想想这个例子中的大 O 是什么…

不,真的尝试一下…

想想…

想想…

如果你说 O(1),你是对的。不管我们给这个函数一个多大的数,它总会做一次加法。我们称之为恒定时间,因为我们的复杂性总是恒定的。

让我们看另一个例子:

void printMatrix(int a)    {
    for(int i=0; i <= a; i++)    {
        for(int j=0; j <= a; j++)    {
            cout << j// Prints out a square matrix
        }
    }
}

在这个例子中,我们有嵌套循环,对于外部循环的每次迭代,我们将遍历整个内部循环。因此,对于我们的第一次外循环迭代,我们的内循环,假设a是任意数,比如 4,它将打印:

1234

在我们的下一次迭代中(i = 1 ),它将打印:

1234
1234 

跳到最后我们得到:

1234
1234
1234
1234

所以我们把 4 个字符打印了 4 次,换句话说就是 4 个。如果使用a = 8,您预计我们的代码片段会打印多少个数字。我们将为每次迭代打印 8 个字符,总共 8 个,所以是 8。你能看出模式吗?因此,对于这个片段,我们得到 O(n ),因为无论输入的大小如何,我们都将打印 n 次。

虽然这是一个非常简单的例子,但我希望它能让你对什么是大 O 以及它是如何计算的有所了解。如果您想了解更多关于 Big O 的信息,请查看以下资源:

大 O 的定义

大 O 上的 HackerRanks 视频

感谢阅读!

*如果您喜欢这篇文章,请在底部留下评论 *

BigQuery 公共数据集

原文:https://towardsdatascience.com/bigquery-public-datasets-936e1c50e6bc?source=collection_archive---------4-----------------------

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

Kauai, HI

唯一比数据好的就是数据!但是获取大型数据集并不容易。从笨拙的存储选项到难以让分析工具正确运行数据集,大型数据集在实际使用它们做一些有用的事情时会导致各种各样的困难。数据科学家要做什么?

在《人工智能历险记》的这一集,我们将去看看 BigQuery 公共数据集,探索开放数据的神奇世界!

BigQuery 公共数据集

…有一个每月 1 TB 的免费层,让入门变得超级简单。

我们都爱数据。最好是多多益善!但是随着文件大小的增长和复杂性的增加,实际使用这些数据变得非常困难。
BigQuery 公共数据集是 Google BigQuery 为您托管的数据集,您可以访问并将其集成到您的应用程序中。

这意味着谷歌为这些数据集的存储付费,并通过你的云项目提供对数据的公共访问。您只需为对数据执行的查询付费。此外,还有一个每月 1TB 的免费层,让入门变得超级简单。

那么…我如何访问所有这些数据呢?

查看 BigQuery 公共数据集页面,我们可以看到有将近 40 个公共数据集。每个数据集又有许多表。来自世界各地数百个项目的数千个查询正在利用这些庞大的公共数据集。

你可以在网上找到关于图像的最紧迫问题的答案

真正有趣的是,这些数据集中的每一个都带有一些解释文本,帮助您开始查询数据并理解其结构。

树木普查、开放图像和无轨电车

例如,这是纽约市的树木普查。该页面向我们展示了如何轻松找到诸如“纽约市最常见的树种是什么?”以及“自 1995 年以来,纽约市的树种有什么变化?”。这些都可以从直接进入 BigQuery 界面的 docs 页面中点击一下来访问!

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

If you want to run it yourself, the query is here: https://bigquery.cloud.google.com/savedquery/1057666841514:052da8fe3c014d169752e86b7cc2eaf5

另一个非常惊人的数据集是开放图像数据集。它包含大约 900 万个图像的 URL 和元数据,这些图像被标注了超过 6000 个类别的标签!

你可以在网上找到关于图像的最紧迫问题的答案,比如“数据集中有多少张无轨电车的图像?”(剧透预警:超过 3000 了!)

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

If you want to run it yourself, the query is here: https://bigquery.cloud.google.com/savedquery/1057666841514:d6d5d8ed6b5449498326f724cbce3091

但是我跑题了。 BigQuery 开放数据集是探索公共数据和练习数据分析技能的好方法。结合像云数据实验室FacetsTensorFlow 这样的工具,你可以做一些真正令人敬畏的数据科学。你还在等什么?前往公共数据集页面,让您的分析尽情发挥吧!

有关更多细节和示例,请查看 BigQuery 的公共数据集文档页面并开始查询!

感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的 me 或者订阅 YouTube 频道,以便在未来的剧集出现时观看它们。更多剧集即将推出!

大峡谷:扮演上帝,用 Python

原文:https://towardsdatascience.com/bigvalley-play-god-in-python-14563fb7728d?source=collection_archive---------3-----------------------

大峡谷是一个小小的模拟生态系统,有三种动物:草、兔子和狼。

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

bigValley in action.

草长在岩石上,然后被兔子吃掉。兔子反过来被狼吃掉。每过一年,每只动物都会做三件事情中的一件:1)繁殖,如果她有足够的能量 2)吃食物,如果食物在她旁边,增加她的能量 3)移动,如果她旁边没有食物,减少她的能量

你可以访问这个页面来观看这个世界的动态。动物的运动是可视化的,并且绘制了一些关于它们进化的统计数据(下面将更详细地讨论)。这个世界一直运转,直到狼或兔子灭绝,然后在一个新的时代再生。

学问

这项工作的真正目的是设计一个过程,通过这个过程,世界本身可以了解导致最稳定的生态系统的理想参数。这是一个通常被称为的基于代理的建模的例子。有几种语言和库是为做这种模拟和建模而设计的,特别是 NetLogoArena 。然而,为了在整个学习过程中最大限度地控制参数的设置和重置,bigValley 是用 Python 从头开始构建的。更多的技术细节,以及运行您自己的模拟的代码,可以在该项目的 GitHub 自述文件中找到。

测试了两种学习最佳参数的方法。第一种是更传统的响应面方法方法,拟合一次多项式线性模型,然后在相关系数的方向上以固定的学习速率调整每个参数。第二种利用随机森林模型,从一组随机生成的选项中选择一组最佳参数。下面是关于这两种方法和结果的更多信息。但首先,简单概述一下我们正在优化的参数。

因素

每一个新的生物都有一些小的随机正态变化,这些变化集中在该生物的硬编码起始参数上。当生物繁殖时,子代的变化以其父代的值为中心。随着世界年龄的增长,这创造了某种程度的“遗传”或“进化”。每个生物都有以下参数:

能量是那个生物的启动能量

生殖是动物繁殖所必须达到的能量阈值

疲劳是动物每转一圈所损失的能量(不吃东西)

注意:草和石头因为不动,所以没有有意义的疲劳值。他们每回合都会获得一点能量,直到他们繁殖或者被吃掉。每次迭代中石头的数量不会改变(即石头不会再生被吃掉)。

总共有十个参数设置在每个时期的开始。前六位分别是狼和兔子的能量再现疲劳(以下简称沃尔夫沃尔夫沃尔夫法等。).另外四个是在那个时代开始时存在的狼、兔子、草和岩石的数量。

初始训练运行

在每个模拟的开始,世界的 25 个纪元以默认开始参数为中心运行。这些参数在每个时期都添加了随机正态噪声,从而生成了训练模拟的某种“正态分布”的表象。此外,每次每个生物的开始位置都是随机的,所以这给每次迭代增加了另一个随机因素。

一旦运行了 25 个时期,第一个学习迭代通过在这 25 个时期上训练机器学习模型(下面讨论)并相应地设置其参数而开始。

稳定阈值

每个纪元一直运行,直到兔子或狼灭绝,或者达到预设的“成功”阈值(运行 500 年没有灭绝,或者增长到 10,000 只动物)。在下面的示例中,在计算汇总统计数据之前,进行了 50–75 次学习运行。每个测试运行都用一个 3 字符的字母数字 ID 来标识,以便于在图之间进行比较。前缀 LM-表示使用线性模型进行学习的运行,而 RF-表示随机森林。

响应面线性模型

在最初的 25 个训练时期之后,用上面讨论的 10 个参数作为解释变量,用该迭代的第一次灭绝的年份作为响应,拟合 OLS 线性模型。因此,反应是有限的,下限为 1(第一年灭绝,可能性极小),上限为 500(重启前允许的最大年限)。

然后,在每个相应参数的系数方向上调整下一个时期的起始参数。

这个过程在每个时期重复,因此模型适合所有 25 个训练迭代,和所有先前的学习时期。然后为下一个时期相应地调整起始参数。下面是两个线性模型模拟的可视化。

动物统计:线性模型

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

从左到右,随着算法的学习,你会看到生态系统的演变趋势。狼被描绘成紫色,兔子被描绘成蓝色。内部的大圆圈代表物种的起始能量,而它周围的大圆圈代表繁殖阈值 Repro ,小圆圈代表疲劳。中间的线条显示了每个时代开始时每个生物的相对数量。底部的面积图和数字显示了这些时代在灭绝前的成功程度。

尽管这些痕迹远非完全相同,但还是出现了一些模式。例如,在两个测试中,兔子和狼的疲劳立即向零移动,直到达到最小允许值。同样,随着学习的进行,两种模拟都会增加草地和岩石的起始计数。

然而,更有趣的是注意到狼和兔子的参数朝着相反的方向移动。汇聚了极少数容易繁殖的非常大的狼,以及大量繁殖前需要更多能量的小兔。另一方面,O55在大量中等体型、繁殖速度较慢的狼和数量适中、繁殖速度较快的大型兔子之间找到了平衡。

随机森林模型

随机森林模型采用了一种完全不同的方法。同样,每个测试运行从 25 次训练迭代开始。然后,在每个学习迭代中,随机森林回归器适合于训练数据(其再次包括初始的 25 个,以及所有的先前学习时期)。在这一点上,产生了 100 组参数,这些参数围绕每个参数的“中心值”随机正态变化。然后,新训练的回归器为这 100 个参数集的每一个预测第一次灭绝的年份,并选择预测结果最好的一个(即直到灭绝的大多数年份)。这个“最佳参数集”然后被用于运行当前时期。

*注意:*这些用于生成 100 个选项的“中心值”最初被设置为附录中的默认值,但是一旦算法开始学习,它们就被设置为前一个时期中预测的“最佳参数集”的值。与线性模型方法相比,这提供了探索更多特征空间的较慢的参数移动。

生物统计:随机森林

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

这两个与两个线性模型运行相比没有那么明显,尽管它们确实显示了另一组似是而非的解决方案。虽然两者都选择了少量繁殖相当缓慢的中等体型的狼,OUP实际上似乎正在向甚至更小的狼发展。尽管R7J有中等数量的中等大小的兔子,而OUP展示了少量的小兔子,但是这两个系列都趋向于繁殖速度不快的兔子。

结论和后续步骤

上面的图显示了优化一个稳定的生态系统的给定问题的四种不同的“解决方案”。更多模拟的类似总结可以在这里查看,还有更简洁的总结海报这里

超越“最佳”

这种模拟在广泛的领域都有应用,从野生动物生物学到救护车路线到在线社区建模。与寻找单个“最佳”参数集相反,从基于代理的模型(如这种模型)中获得的主要收益是探索参数之间的相互作用的能力,以及探索给定问题的可能解决方案的很大空间的能力。

线性建模方法似乎比随机森林更快地收敛到其最佳设置。然而,考虑一个真实世界的情况,其中某些参数不能简单地“调高或调低”而没有一些巨大的成本。当然,如果 grassNum更高可能会“更好”,但是想象一下,这代表了“红十字会在灾区投放的食物数量”。简单地将食物投放点的数量增加四倍可能是不切实际的。在这种情况下,随机森林和其他非参数模型带来了很多东西。

后续步骤

这项研究可以有很多方向。一个明显的例子是引入全新的代理(例如“超级掠食者”吃狼;或者可能是一种大型的、繁殖速度较慢的食草动物与较小的、速度较快的兔子共存)。然而,如果要从这种建模中获得任何真实的收益,我们必须确保不要引入太多超出我们控制的变量。

另一个有趣的方法是建立不同的“大陆”这将需要同时模拟几个生态系统,但在网格上彼此相距很远。最终,种群会扩大到足以相互交流。观察不同进化种群在这些边界上的相互作用可能会令人着迷。通过访问上方的图像,点击“大陆”单选按钮,可以看到测试版。

每个纪元 500 年的限制也可以增加。这可能是最简单、信息量最大的扩展。该限制部分是为了控制异常值,但主要是为了控制计算时间。这里展示的例子花了几天时间在一个相当小的 AWS EC2 实例上进行模拟。有了更多的计算能力,这个限制可以大大放宽,并且可以观察到更多样和有趣的互动。此外,让模拟运行的时间远远超过我们在这里展示的 50–75 个学习周期将会非常有趣。它们最终会汇聚到不会导致灭绝的环境中吗?似乎有可能。

定制

对于那些喜欢冒险的灵魂,请随意打开 bvLife.py,创造一些属于自己的生物。每吃一种植物就能获得双倍能量的反刍动物?成群猎食的掠食者?一种以低能量觅食者为食的食肉植物?唯一的限制是你自己的想象力…

访问 bigValley GitHub repo 开始您的旅程。

公告牌 100 大热门分析

原文:https://towardsdatascience.com/billboard-hot-100-analytics-using-data-to-understand-the-shift-in-popular-music-in-the-last-60-ac3919d39b49?source=collection_archive---------2-----------------------

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

Photo by Malte Wingen on Unsplash

关于流行的现代音乐,你从“年长”的人那里听到的最多的是什么?总的主题是:“你的音乐声音太大,缺乏内容”。他们用意味深长的歌曲、深情的艺术家、能让你感动落泪的低音吉他谈论“过去”的日子。当他们这么说的时候,他们是在比较:

Downtown by Petula Clark, 1965

对此:

Stir Fry by Migos, 2018

很明显,有明显的区别。然而,这将需要一个数据点来得出一个一般性的结论(这是人类非常擅长的)。作为一名千禧一代和数据科学家,我发现这是一个有趣的话题。让音乐“伟大”的因素真的改变了那么多吗?声音、歌词和“信息”都变了吗?如果他们改变了,他们到底是如何改变的?

使用 billboard 从 1950 年到 2015 年的热门 100 强排行榜和 Spotify 的 API,我们想仔细看看流行音乐在过去六十年里发生了多大的变化,并找出今天的音乐与其他音乐的真正区别。

我的方法

在这篇文章中,我将“伟大的音乐”定义为进入公告牌百强。我从一个慷慨的 GitHub 用户 Keven Schaich 那里得到了数据。该数据包含许多有趣的特征,如情绪、射击雾指数(估计第一次阅读理解文本所需的正规教育年数)、单词数、重复单词/短语数等。

此外,Spotify 还有一个有趣的 API 端点,叫做 get_audio_features 。端点允许你获得歌曲的特征,如响度、乐器性(使用了多少乐器)、能量、活跃度(现场观众的存在)、语速、歌曲持续时间等。这使得 1950 年至 2015 年间公告牌百强热门歌曲的歌曲总数达到约 30 首。

所有这些特性都在这里这里进行了解释,我还会在以后的文章中解释一些。

最初,我开始在这个项目中使用 Python,我也这样做了。算是吧。我用 python 的 pandas 和一个名为 spotipy 的 Python 包完成了我的第一次数据收集迭代。

然而,在这个过程中,我回顾了我的方法,发现了一个更有趣的数据集。为此,我特意回到 R,因为 tidyr::gather()函数(在 pandas jeez 中旋转数据太烦人了)。

下面是 RPython 中的代码,除了一个名为 get_audio_features 的函数之外,它们在大多数方面都是不同的。我的最终数据集可以在这里找到。

我花在数据收集上的时间与我的其他项目形成了鲜明的对比,因为与我的其他项目不同,有人花时间将现成的数据集放在一起。这是我分享我收集的所有数据的主要原因,希望有人不会花 6 周时间去收集数据。

我们开始吧!

1.在过去的六十年里,我们在音乐方面只有两次重大的变化

通过使用一种叫做聚类的算法,我们可以使用他们的歌曲特征来发现艺术家和他们的音乐的相似性/聚类。

使用这种方法,我们有两个艺术家群体——弦乐爱好者诗学。我们之所以选择这些怪异的名字,是因为歌曲的两个特征最能定义这些集群:工具性和

乐器性在 0 到 1 的范围内预测音轨是否不包含人声。“哦”和“啊”的声音也被视为乐器。该值越接近 1,就越有可能没有有声内容(例如音轨),越接近 0,就越有有声内容(例如说唱或口语)。

语音检测音轨中是否存在语音单词。

  • 弦乐爱好者在器乐性方面得分较高,但在语音方面得分较低。这意味着这一时期的艺术家倾向于乐器而不是演讲。
  • 诗学是完全相反的。他们在语言能力上得分很高,但在工具性上得分很低。

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

关于这些集群的另一个有趣的事情是当它们出现在广告牌 Hot 100 上时。

  • 大多数弦乐爱好者出现在 90 年代以前的 Billboard 上。
  • 90 年代以后大部分诗学出现在 Billboard 上。

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

  • 90 年代本身似乎是音乐的一个关键时期,正如我们所看到的,弦乐爱好者和诗学之间各占一半。这意味着艺人们被分成了两派,要么继续这种新类型的音乐,要么坚持现有的声音。

2.乐器的使用减少了,主要是因为摇滚乐队变得不那么流行了

在 60 年代末和 21 世纪初之间,乐队非常受欢迎,以至于有和独唱艺人一样多的乐队。

在 2000 年代之前,一年中的乐队越多,该年的平均乐器演奏度越高。

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

然而,90 年代以后,乐队的数量对乐器的使用几乎没有影响。

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

除了两个异常值,波段的数量对仪器的使用几乎没有影响。这很有趣,因为正如我之前提到的,乐队在 21 世纪初仍然很受欢迎。

发生了什么事?

我相信你猜到了。乐队的类型变了。

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

90 年代以前,大约 60%的乐队是摇滚乐队——通常只有一名主唱和一群乐器演奏者。

然而,从 2000 年代至今,摇滚乐队的比例大幅下降,为一种新的乐队品牌让路,这种乐队通常由所有歌手组成:流行乐队。想想《命运之子》、《小野猫》、《第五和声》、《单向乐队》——你能想到的都有!

3.我们也可能把诗学的出现归功于嘻哈音乐的兴起

除了语速和用词的增加,诗学使用的复杂词汇是弦乐爱好者的两倍(例如,Jay-Z 说富裕而不是财富),并使用更多音节的词汇。当我们想到御词艺人时,每个人脑海中都会立即浮现出一个流派:嘻哈

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

鉴于 Hip-Hop 在与单词相关的特征方面领先于所有其他流派,毫不奇怪的是 Hip-Hop 在 90 年代获得了主流流行——与诗学的兴起相对应。

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

4.虽然随着时间的推移,音乐风格发生了很大变化,但过去 60 年的流行歌曲大多是关于爱女人的

为了达到这个目的,我使用了一种叫做主题建模的算法。顾名思义,该算法在给定的文本中搜索主题。

在我们的例子中,文本是公告牌歌曲的歌词。

让我们看看这些话题在几十年间是如何变化的:

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

这绝对是惊人的!

像歌曲的特点一样,歌词也明显分为两个类别,主题 1 捕捉到了 50 年代到 80 年代,主题 2 捕捉到了 90 年代之后的几十年,以及作为过渡期的 90 年代!

这意味着歌曲的声音和“信息”以几乎相同的速度变化。

那么,这些话题是什么呢?

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

题目几乎是一样的东西!在过去的六十年里,顶级歌曲不成比例地成为“耶,我爱我的宝贝”。

这里还发生了一些有趣的事情。这两个主题之间的一个主要区别是,在 90 年代之前,歌曲可能有一个更“直接”的方法——你可以看到一个主要主题是“将要”,例如“我会爱你”。而在 90 后,它似乎更间接一些,比如请求允许,因此用“想要”代替了“将要”。《Wanna》也可以描绘一种更具未来感、更富想象力的爱女人的方式。

5.更“安静”的体裁在诗歌时代不复存在

这在某种程度上证实了我们现在比以前更倾向于选择更响亮的音乐。

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

五种最“安静”的音乐类型是——爵士乐、摇摆乐、民谣、蓝调和迪斯科。

这些流派在诗歌时代也不再作为流行音乐存在,除了爵士乐似乎被一个艺术家(诺拉·琼斯)保存了下来。

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

这些都是什么意思?

总而言之:

  • 90 年代是音乐史上极其重要的时期。
  • 摇滚乐队的衰落和嘻哈音乐的兴起在引领音乐走向今天的道路上扮演了重要角色。
  • 在过去的 60 年里,爱情一直是流行歌曲的主题,但不同时代的音乐对爱情的理解可能会有所不同。
  • 是的,现代艺术家可能会更大声,但这是因为我们有内容:)。
  • 额外收获:尽管迈克尔·杰克逊在 80 年代最受欢迎,但他是一个富有诗意的人!他超越了他的时代!

有趣的事情和需要记住的事情

  • 我采用了一种不同的(也更有趣的)方法来展示这个项目的数据。我用 HTML,CSS,js 和 chart.js 搭建了一个仪表盘!这款应用还没有针对手机进行优化,所以最好在笔记本电脑上使用。

【http://bit.ly/music-dashboard】下面是链接:T5

  • 仪表板有两个选项卡。第一个是“艺术家仪表板”,显示每个艺术家的平均歌曲特征。

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

  • 第二个标签“比较仪表板”允许你比较多达三个艺人的歌曲特征,看起来像下面的截图。

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

  • 你可以使用右上角的图标在推特或脸书上分享结果。
  • 万一你忘记了这些特性的意思,将鼠标悬停在标题上,你会得到一个解释它的小工具提示🙂
  • 诗意的时代(我喜欢这样称呼它)是一个持续的时代,所以如果我们有 2016 年至 2018 年的数据(特别是随着陷阱音乐的兴起),这些见解可能会发生变化。然而,我不认为效果会很大。
  • 衡量一首歌的“政治意识”会很有趣。我可能会在推特上发布结果。
  • 像往常一样,我受到慷慨的 GitHub 用户的数据收集方法、Spotify 的算法以及 Billboard 如何进入热门 100 名的限制。

希望你读这篇文章的时候和我写这篇文章的时候一样开心🙂

原载于 2018 年 6 月 10 日【theartandscienceofdata.wordpress.com】

用于方面术语抽取的 BiLSTM-CRF

原文:https://towardsdatascience.com/bilstm-crf-for-aspect-term-extraction-87630406573a?source=collection_archive---------4-----------------------

本文组织如下。首先,我们将谈论体术语提取的背景。其次,我会给你一个构建 BiLSTM-CRF 模型来提取方面术语的教程。

  • 1 背景
  • 1.1 什么是特征术语抽取
  • 1.2 我们为什么需要 ATE
  • 1.3 如何提取方面术语
  • 2 数据准备
  • 2.1 数据定义
  • 2.2 数据集创建
  • 3 BiLSTM-CRF
  • 3.1 模型定义
  • 3.2 培训

1 背景

在这一部分中,你将有一个关于方面术语抽取的概述知识。

1.1 什么是方面术语提取

方面术语抽取是基于方面的情感分析中的一个关键子任务,旨在从在线用户评论中抽取明确的方面表达。那么,体貌术语是什么呢?方面术语是意见的目标。比如这里有一个评论,“牛肉很嫩,在我嘴里融化了”。在这篇综述中,体术语是“牛肉”,观点术语是“嫩”。

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

1.2 为什么我们需要 ATE

这里我们展示一个亚马逊的例子。还有无线耳机。考虑到这种情况,一个客户有多台不同 OS 的设备,就像两台分别装有 iOS 和 Android 的智能手机,MacBook Pro,Surface Pro 等等。所以这位客户想知道这款耳机是否可以连接多个设备。但是要从成百上千的评论中找到有用的评论会花费太多的时间。幸运的是,有一个部分叫做“阅读评论”。客户可以通过单击软件按钮找到关于该软件的所有评论。这可以帮助顾客快速找到他们想要的东西。你可以从下图中得到这个想法。

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

但是我们可以看到这个实现只是从文本中提取相同的单词,这不是一个聪明的方法。为了比较,我从中国最大的电子商务网站淘宝上拍了一张照片。

After I clicked the ‘服务好’(Good Service), the below part showed all reviews related to ‘Good Service’. And we can see the aspect terms/phrases are not just the same with ‘Good Service’.

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

至于真正的实现,我从产品团队找到了答案。

  1. 根据类别特征,提取相关评论,进行分词和词频统计。
  2. 用 LDA 对词进行聚类,用本体对词进行分类。
  3. 将观点词分配给体貌词,决定句子的情感。(我想这里他们可能会使用依赖解析)
  4. 给体词附加感情,标出体词在句子中的位置。
  5. 在搜索引擎中建立方面情感和位置标记。

下面是中文版答案

1.3 如何提取方面术语

ATE 任务可以被视为序列标记问题。传统的序列模型如条件随机场(CRF)、长短期记忆网络(LSTMs)和分类模型如支持向量机(SVM)已经被应用于处理 ATE 任务并取得了合理的性能。

这些现有工作的一个缺点是它们没有利用这样的事实,即根据任务定义,方面术语应该与意见指示词一起出现。因此,上述方法倾向于在非意见性句子中对那些频繁使用的方面项输出误报,例如,“餐馆开始时挤满了人,所以我们等了 20 分钟”中的单词“餐馆”,该单词不应该被提取,因为该句子不传达对它的任何意见。

有一些工作在处理 ATE 任务时考虑了观点项,如递归神经条件随机场(RNCRF)、耦合多层注意(CMLA)等。这里就不多说了。

如题,这次我们将使用 BiLSTM-CRF 来做 ATE 任务。BiLSTM-CRF 已被证明是一个强大的序列标注模型,如命名实体识别(NER)、词性标注和浅层句法分析。如果你正在做与序列标记任务相关的工作,这是丰富你的技能集的必备工具。

2 数据准备

我们将 ATE 任务视为序列标记任务,它非常类似于命名实体识别(NER),即定位文本中的命名实体并将其分类到预定义的类别中,如人名、组织名、位置名、时间表达式等。例如,我们输入句子,“奥巴马总统正在白宫发表演讲”,其中的“奥巴马”应标记为“人”,“白宫”应标记为“地点”。可以试试 anaGo 的试玩

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

简而言之,如果我们遵循 NER 使用的数据格式,我们可以通过使用序列标记模型来容易地处理 ATE。说到 NER 使用的数据格式,它遵循了 IOB 格式的惯例。 BIO 分别表示开始、内侧和外侧

IOB 标签已经成为表示块结构的标准方式。你可以在 2.6 表示组块:标签 vs 树中找到更多信息。

  • PRPVBDDTJJNN 是每个词的词性标签。
  • B 和 I 标签以组块类型作为后缀,例如 B-NP、I-NP。
  • NP 是一种组块类型,意思是名词短语组块,或 NP-chunking。

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

至于 ATE 任务,格式将变得更简单,因为只有一种组块类型,即方面术语。我们可以用下面的例子来表示每个句子。 BIO 分别表示方面跨度的开始、内部和外部。

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

在我们准备好数据集之后,我们可以使用 BiLSTM-CRF 模型进行训练。

2.2 数据集创建

为了将 ATE 任务视为序列标记任务,我们首先需要将数据格式从 XML 转换为 CSV。可以在这里找到 SemEval 2016 餐厅的 XML 原文: semeval-2016 。XML 数据格式如下所示。

这个 XML 脚本包含三个句子。在每个句子块中,它包含三个部分,句子 id、文本、观点。在意见部分,目标是体项。以第一句为例,它只有一个体项。所以我们需要为单词“place”分配标签“B ”,为其他单词分配“O”。

因为我们把它当作一个序列标注问题,所以在预处理部分,我们只把单词转换成小写。我们不删除停用词和词条。所以数据清理部分相当简单。

在最后一步,我们将数据保存为 CSV 文件。每行将包含句子 id、单词和标签。

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

1 将 XML 数据读取到 BeautifulSoup

这里我们使用 BeautifulSoup 来读取 XML 文件。

sentence_nodes看起来像是:

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

2 将 soup 对象转换为字典列表

在这一步中,我们将 soup 对象转换为字典列表。每个字典包含三个关键字:

  • ‘方面’:一个列表包含一个句子中的方面术语
  • ’ id ':句子 id
  • ’ text ':字符串包含审阅文本

sentences看起来像:

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

3 创建数据帧

3.1 将文本拆分成文字

用空格分割字符串并保留标点符号。

3.2 带 IOB 格式的 taggin word

给句子中的每个单词分配 IOB 标签。

3.3 将字典列表转换为数据帧

3.4 总结一下

获得 DataFrame 对象后,我们将其保存到 CSV 文件中。

对于测试数据集,再次遵循上述步骤。最后,数据如下图所示。

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

3 BiLSTM-CRF 模型

在实现之前,我们先简单介绍一下 BiLSTM-CRF 模型。下图显示了 BiLSTM-CRF 的架构。

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

  • 单词嵌入。这一层将把每个单词转换成一个固定尺寸的向量。通常没有必要自己训练单词向量。已经有很多预先训练好的单词嵌入数据可供使用,我们使用手套
  • BiLSTM 编码器。该编码器包含两个 LSTM 层,它可以从上下文中学习信息。
  • CRF 层。该层可以向最终预测的标注添加一些约束,以确保它们是有效的。在训练过程中,CRF 层可以从训练数据集中自动学习这些约束。

3.2 培训

在模型构建方面,BiLSTM 很容易用 Keras 实现,关键是 CRF 层的实现。

有两种方法。一种是使用 keras-contrib 中的 CRF 层,另一种是使用 anaGo 库。我实现了这两种方法。keras-contrib 实现获得了 0.53 f1 微分,anaGo 获得了 0.58 f1 微分。所以在这里我将介绍如何使用 anaGo。但是你可以找到两个实现笔记本。

anaGo 的源代码写的很好,构造的也很好,包括如何读取嵌入文件,加载嵌入权重。仔细看看代码是值得的。这次我们使用 glove.840B.300d.txt 文件,这意味着 8400 亿个单词,220 万个词汇,每个单词表示为 300 个维度。记号表示语料库中“单词”的总数,vocab 是唯一的单词。

anaGo api 易于使用,您可以通过几行代码实现 BiLSTM-CRF 模型。另一方面,学习后面的实现对使用没有好处。作者 Hironsan 自己实现了 CRF 层,代码写得很好。我强烈建议您先阅读本文,然后再看 anaGo 实现。

正如 anaGo 的文档所示,样本的输入格式是单词列表,标签应该是 IOB 标签列表。

这里我们写一个函数将数据帧转换成输入格式。

然后我们就可以写出整个过程了。

看,实现部分只需要 4 行。在训练过程中,它会显示每个时期的 f1 分数。在这里,我们将 epoch 设置为 50,以使其过拟合,并查看多少个 epoch 是合适的。

总结一下

最后,我们将所有代码加在一起。

这是实现 BiLSTM-CRF 的简单方法。您可以在下面找到两个实施笔记本。

查看我的其他帖子 中等 分类查看
GitHub:
bramble Xu LinkedIn:徐亮 博客:bramble Xu

二元逻辑回归——理解可解释的人工智能

原文:https://towardsdatascience.com/binary-logistic-regression-understanding-explainable-ai-c79208bb3ca9?source=collection_archive---------19-----------------------

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

可解释的人工智能或 XAI 是人工智能的一个子类,其中模型做出的决定可以由人类来解释,这与“黑盒”模型相反。随着人工智能从纠正我们的拼写和定向广告转向驾驶我们的汽车和诊断病人,验证和证明得出的结论的需求开始得到优先考虑。”

在我的上一篇关于可解释的人工智能(XAI)的故事明显受欢迎之后,是时候解决一个类似透明但有用的算法了,逻辑回归。逻辑回归属于“广义线性模型”的快乐家族,它给线性回归的直线增加了一层复杂性。

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

A Plain / Vanilla Linear Model

通过数据点拟合直线在许多情况下都很有效,其中 xy 可以在合理的范围内取任何值,例如根据体重或教育收入预测身高。然而,在某些情况下,感兴趣的变量是二进制的,只取两个值。例如,预测某人是否会对他们的保险提出索赔,或者如果你的产品做了广告,客户是否会购买,这可能是有用的。在这种情况下, y 取值 0(事件不会发生)或 1(事件发生)。

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

当我们在这种类型的问题上使用线性回归时,我们会预测超出[0,1]范围的 y 的值,这使得对结果的解释令人困惑,甚至毫无意义。

一个更好的模型应该能够调整 y 的分布,并且只提供有意义的预测。这就是广义线性模型的目的。

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

函数 f()被恰当地命名为’ link 函数,将 X’B 的线性规格与非线性变量 y 联系起来。这里明显的限制是假设 X 变量的一个线性组合足以解释 y

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

对于二元结果情况,我们将使用 Logit 函数,其结果如下:

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

Logistic regression with the same data as above

与简单的线性模型不同,逻辑回归中的参数 B 没有封闭解。相反,我们必须像在深度学习场景中拟合权重一样拟合它们——通过迭代改进。这需要两件事;衡量 B 有多“好”的标准,以及提高 B 的方法。

B 有多好?

我们采用“可能性”方法来评估 B,估计我们的模型成为生成数据的“真实模型”的可能性或概率。从数学上讲,我们找到了观察我们拥有的数据的概率,给定了参数。对于 y 和 logit 函数 S() 的单次观察,该概率由下式给出:

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

当参数 B 对 y 给出更准确的预测时,概率会更高。这个等式的直觉给出如下:

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

dodgy truth table

通过假设每个观察是独立的,我们可以将整个数据集的概率计算为所有观察水平概率的乘积,我们称之为可能性, L()

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

显然,为了优化目的而寻找 L 的导数是不切实际的,因此通常的做法是取似然函数的对数来得到 L()。

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

The nicely simplified version

取对数是有效的,因为我们主要关心不同 B 规格的相对可能性水平,而不是值本身。由于 log(x)x 中总是增加的,如果一个规格的可能性比另一个大,那么它的对数可能性也会大。这种形式允许我们分别定义 l,l’l”的一阶和二阶导数,同时仍然给我们一个 was 来量化一组参数在拟合数据方面有多“好”。

如何让 B 变得更好

有许多算法可以找到最佳 B 值,其中大多数算法的目标是找到使对数似然函数 l 最大化的 B 值。这些算法是“爬山”,因为它们找到了函数的最大值,这与试图找到最小损失函数的深度学习技术相反。

一种这样的技术是牛顿-拉夫森方法,该方法寻找函数 F 的根(当函数等于零时)。通过应用以下规则,每次迭代我们都稍微接近 F 的根:

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

使用一些高中微积分,我们知道我们的对数似然函数在导数等于零的地方有最大值。用 l '代替 F,我们就剩下爬山算法了:

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

值得庆幸的是,所有这些公式,包括 l 的导数,都可以用矩阵形式表示,从而加快了计算速度。(这个项目的代码和包含的乐趣* 线性代数可以在这里访问。)*

结果

逻辑模型的结果很容易解释,预测值 y = S(X’B)y 取值为 1 的概率,因此是事件发生的概率。

生物信息学和数据科学

原文:https://towardsdatascience.com/bioinformatics-and-data-science-431899ddd552?source=collection_archive---------4-----------------------

生物信息学家可以轻松转换到数据科学角色吗?他们应该期待什么样的挑战?他们的技能组合是否足以满足数据科学的需求?

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

Differentially methylated CpGs from https://doi.org/10.1371/journal.pgen.1002781

近来,生物学和医学科学界对数据科学产生了浓厚的兴趣。来自这些领域的研究人员正在生成大量数据,自然,正如任何可以访问大型数据集的领域一样,人们对“数据科学”能够提供什么感兴趣。希望数据科学家将处理和过滤这些大型数据集,并通过应用统计学和机器学习模型产生有意义的生物/医学见解。当我听到这样的事情时,我会说“等等!!这不就是我们这些年一直在做的生物信息学吗?”。简短的回答是“部分”。在整个医学科学中,研究人员拥有更加多样化的数据集(成像、病历等。)相比我们日常处理的那些,但数据分析方法的核心、数据的规模和方法是相似的,无论数据集如何。在这方面,我一直将“数据科学”视为我所称的“生物信息学”的一般化版本。如果这是真的,生物信息学家可以轻松地转换到数据科学角色吗?他们应该期待什么样的挑战?最重要的是,他们的技能组合是否足以胜任数据科学角色?为了回答这些问题,除了广泛的 google-fu 和个人经验之外,我还与数据科学家进行了交谈。

什么是生物信息学?

我首先要澄清我所说的生物信息学是什么意思。对我来说,以下术语描述了非常相似(如果不是完全相同)的领域:“生物信息学”、“计算基因组学”和“基因组数据科学”。虽然会有人试图区分这些术语,但它们对我来说代表着相似的东西。这些领域要求您处理和分析大规模基因组数据集,并提出生物学见解。为了在这些领域发挥作用,你需要能够处理大规模的原始数据(通常是测序或某种形式的组学数据),对处理后的数据进行质量检查和转换。然后,您将需要根据您的问题应用机器学习或统计模型。您最有可能做一些降维和聚类,然后进行可视化。根据分析的初始结果,您可能需要重复所有这些步骤或采取不同的方法。你将写报告和做演示,以传达你的数据驱动的故事。除此之外,他们还需要适应不断变化的数据生成技术、文件格式以及新的统计和机器学习方法。在 Coursera“基因组数据科学”课程的教师对生物信息学的定义持有类似的观点。

生物信息学技能集

现在,让我描述一下生物信息学的技能。这些技能组合期望适用于我们的实验室。生物信息学家的任务和要求可能各不相同。除了技术技能,人们还需要有科学好奇心、心态和动力来解决与生物学和医学相关的问题。但是这些更多的是品质而不是技能。这就是他们不在名单中的原因。在我看来,生物信息学家需要具备以下知识和技能,或者至少在他们完成时获得这些知识和技能。他们不需要样样精通,但至少应该有一些实践经验。

  • 特定领域的数据处理和质量检查
  • 常规数据转换和过滤
  • 应用统计学和机器学习
  • 特定领域的统计工具和数据可视化
  • 通用数据可视化和报告工具
  • 特定领域的数据集成:这可能需要使用 API、数据库和/或平面文件
  • 能够为数据分析任务编写带有版本控制的代码。代码应该是可重用的,高效的和文档化的。我们实验室的很多人都需要编写 python/R 包。
  • 能够通过出版物、海报和演示文稿交流数据驱动的见解/故事

数据科学技能集

根据 udacity 的说法,数据科学家的基本技能是:

  • 编程;编排
  • 机器学习
  • 统计数字
  • 数据争论:数据处理、格式化和转换
  • 数据可视化和通信
  • 数据直觉(这个有点不太清楚,我猜他们指的是数据分析相关问题的故障排除,知道当事情出乎意料时要检查和测试什么。)

你可能在网上看到的其他列表可能会列出大数据处理技术堆栈(Hadoop、spark 等。)或者对线性代数和微积分有深入的理解。但是这些技能,尤其是技术,很可能是组织特有的。“数据直觉”可能是你多年来在处理数据分析问题时形成的。由于定义模糊,我在这里做一个假设。我们也可以看看数据科学家的招聘广告,然后得出类似的所需技能列表

我意识到成为所有这些领域的专家非常困难,很明显公司在“数据科学”下有不同的角色,他们并不总是希望雇用多面手,但他们希望在上述每个领域都有一定程度的精通。

比较

如果您从生物信息学技能集中移除特定领域的要求,您将剩下大部分数据科学技能集以及更多。从生物信息学转向数据科学的人很可能需要适应他们雇主的数据组织和分发环境。这些问题来自不同的领域,所以他们也需要适应。但至少在某种程度上,数据科学家在不同雇主之间转换工作也是如此。

在我看来,一个定期进行从原始数据到洞察的端到端数据分析的生物信息学家在“数据科学”职位上不会有问题,我应该强调,我并不是说任何生物信息学家都可以在数据科学职位上表现出色。他们可能需要学习新的领域特定知识或技术堆栈(hadoop、spark 等)。)与公司的数据组织相关,但学习新方法并实施它们是他们在博士培训和博士后工作期间的例行工作。我认为,如果你具备上述核心技能,并愿意适应和学习,你可以在任何数据分析相关领域表现出色。

从生物信息学转行的数据科学家的见解

我的网络中有十几个人已经从生物信息学转向了数据科学。我问了一些他们的经历。一位联系人表示,转向数据科学的人应该意识到,优先事项和文化与工业界的学术界不同。在工业界,更多的是以客户和产品为导向的思维。你的方法的故障安全、可伸缩性和健壮性可能与最酷的方法同等重要,甚至更重要。他还补充说,团队合作、团队间和客户互动也越来越多。交流和建立交互协议非常重要。所以,转变也需要调整心态。

另一位联系人,Markus Schüler ,现任数据科学负责人,前生物信息学家,同意行业中的思维模式是不同的。他也承认产品导向思维的必要性。这些模型需要是健壮的和可维护的。这并不是说你做了一个模型,然后就让它这样。此外,他还分享了这样一个观点,即你并不总是追求最酷和最好的模型,其他因素,如运行时间、实现需求、可伸缩性和架构适合度,以及模型本身的可解释性,在面向产品的思维中也同样重要。但就技能而言,他补充说,生物信息学和数据科学即使不完全相同,也非常相似。尽管在工业中,数据集越大,数据处理就需要越专业、越快速的工具,如 Spark

一锤定音

如果核心技能相似性的论点成立,来自数据科学的人在获得一些特定领域的技能和知识后,应该能够在生物信息学职位上表现。我有第一手资料。我们实验室的前数据科学家、现生物信息学博士生 Jonathan Ronen 在这个新领域做得非常好,将他的技能应用于单细胞基因组学和癌症基因组学的问题。

总而言之,这两个领域所需的技能是相似的,具有我上面描述的技能集的生物信息学家可以在行业中的数据科学角色中表现,前提是他们可以调整自己的心态以适应行业。

生物信息学工作流管理系统

原文:https://towardsdatascience.com/bioinformatics-workflow-management-systems-cc3edd97be79?source=collection_archive---------6-----------------------

介绍 Unipro UGENE 来模拟生物信息学工作流

随着从生物获取数据的各种方法的发展,易于使用的生物数据激增。然而,如果没有适当的方法来执行一系列步骤,按照我们想要的那样处理数据,输出想要的结果,那么如此大量的数据将毫无用处。这就是工作流管理系统派上用场的地方。

在进一步深入之前,让我解释一下今天的大纲。我将带您浏览本文的以下部分。

  1. 什么是工作流?
  2. 什么是工作流管理系统?
  3. 什么是生物信息学工作流管理系统?
  4. Unipro UGENE

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

Image Source: PublicDomainPictures on pixabay (CC0)

我不会深入讨论如何创建生物信息学工作流,但我会解释工作流管理系统,并向您介绍 Taverna ,一个被生物信息学家广泛使用的工作流管理系统。

什么是工作流?

一个工作流由一组活动组成,这些活动是由转换材料、提供服务或处理信息的资源的系统化组织实现的。它可以被描述为完成一个过程的一系列操作。

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

Example Workflow (Image Source: YouTube)

什么是工作流管理系统?

一个工作流管理系统 ( WMS )是一个软件,它提供了建立、执行和监控科学工作流的基础设施。

工作流管理系统的出现解决了如何在大量异构数据上执行和自动化复杂流程的问题。他们以工作流程图的形式可视化工作流程,描绘输入、输出、服务和数据流。它们还允许保存用于发布和共享的工作流。

什么是生物信息学工作流管理系统?

生物信息学工作流管理系统是工作流管理系统的一种特殊形式,专门设计用于组成和执行一系列与生物信息学相关的计算或数据操作步骤。

这种系统以有向图的形式显示了计算的抽象表示以及它是如何进行的。图中的每个节点代表一个要执行的任务,每个边代表不同任务之间的数据流或执行依赖关系。该系统提供了一个可视化的前端,允许用户在很少或没有编程专业知识的情况下建立和修改不同的工作流。

一些著名的生物信息学工作流管理系统包括,

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

Taverna Workbench (Image Source: Apache Taverna)

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

Galaxy (Image Source: MGEscan)

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

A simple workflow I drew using Unipro UGENE

Unipro UGENE

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

UGENE Loading Screen

Unipro UGENE 是一款免费开源的跨平台生物信息学软件。它允许您使用工作流设计器查看、编辑、注释和排列 DNA、RNA 和蛋白质序列,使用 3D 结构和表面算法工作,并模拟工作流。你可以从这里阅读更多关于 UGENE 的细节。

你可以从这里下载 Unipro UGENE。下载安装程序后,请在安装前遵循 readme.txt 中给出的步骤。确保复制下载中提供的示例文件夹,其中包含不同格式的示例文件。

一旦安装并打开应用程序,您将看到如图 1 所示的起始页。(我之前打开过一个文件,你可以在最近的文件下看到。如果你第一次打开 UGENE,你不会在这里看到任何文件。)

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

Figure 1

使用 UGENE 工作流设计器构建简单的工作流

UGENE 工作流设计器允许创建和运行复杂的计算工作流,即使他或她不熟悉任何编程语言。

我们将从构建一个简单的工作流开始;在一个或多个序列中查找给定的模式,并将其保存为注释。

点击起始页中的创建工作流选项。你会看到如图 2 所示的工作流设计区域。

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

Figure 2

拖放元素列表中的基本分析部分中的元素,如图 3 所示。

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

Figure 3

现在将数据读取器部分的读取序列组件添加到元素列表中,如图 4 所示。

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

Figure 4

点击读取序列组件上的循环标记,将其拖动到查找模式元素上的半循环标记上,如图 5 所示进行连接。

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

Figure 5

现在类似地,从元素列表中的数据写入器部分添加写入序列组件,并将其连接到查找模式元素。最终的工作流应该如图 6 所示。

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

Figure 6

现在我们必须定义包含输入序列的文件。为此,点击读取序列组件中的单词取消设置,您将在屏幕右侧的属性编辑器中看到其详细信息。在数据集 1 下,点击添加文件图标。参见图 7。

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

Figure 7

您将看到示例文件夹已打开。在本例中,我们将在给定的路径中选择以下文件。参见图 8。

samples → Genebank → murine.gb

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

Figure 8

现在我们必须定义我们想要找到的模式。点击查找模式组件中的单词取消设置,您将在屏幕右侧的属性编辑器中看到其详细信息。在参数下,输入您想要匹配的模式,作为注释为部分下模式的值。参见图 9。我使用了以下模式。

TTCCGAGGGACACTAGGCTGACTCCATC

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

Figure 9

我们的最后一步是定义输出文件。点击写序列组件中的默认文件,您将在屏幕右侧的属性编辑器中看到其详细信息。在参数下,输入输出文件名为 pattern.gb输出文件的值。将输出文件文件格式更改为 GeneBank 。最终值应该如图 10 所示。

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

Figure 10

现在,您可以通过点击工具栏中的运行工作流程按钮来运行工作流程,如图 11 所示。

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

Figure 11

如图 12 和图 13 所示,将会显示一个包含所有工作流执行信息的报告。

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

Figure 12

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

Figure 13

可以打开结果文件( pattern.gb )进行查看,如图 14 所示。

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

Figure 14

您可以使用该工具,查看其他可用的组件,创建工作流并运行它们。

希望你已经对生物信息学工作流管理软件有了一个基本的概念,可以开始实验了。

干杯!😊

使用打字模式的生物认证

原文:https://towardsdatascience.com/biometric-authentication-using-typing-pattern-c5d778e264c4?source=collection_archive---------1-----------------------

我最近构建了一个应用程序,使用应用于击键生物识别的机器学习算法来演示基于打字模式的身份验证。这里有详细流程的 prezi。

早在 2003 年,我就致力于这个确切的想法,作为我本科最后一年项目的一部分。那是神经网络流行的最初几天,当今世界没有多少先进的工具可用。我们炮制了一个基于 C++前端和基于 Matlab 的神经网络(NN)感知器模型与几个隐藏层的解决方案。我们的方法是训练单个神经网络模型来识别多个个体的分型模式。我们能够达到 90%的准确率——好到足以毕业:-)。

使用开源工具进行机器学习

快进 10 年,你会有一些非常强大的开源工具和库来完成捕捉击键生物特征、创建和训练神经网络模型的重任。这个领域本身有了一个全新的名字——机器学习。我目前破解生物认证的方法是基于 Keras 库,Keras 库本身是基于谷歌开源的 TensorFlow 库。前端登录屏幕是基于登录流由马克斯斯托伊伯基于反应样板。它通过 Rx.js 库使用 reactor 模式实现来捕获击键间隔。登录流程也得到了增强,可以利用电子邮件验证。后端是带有 MongoDB 的 NodeJS 服务器,用于存储用户凭证。 ZeroRPC 用于调用为运行 NN 算法而定制的 python 函数。

初速电流状态

这里使用的机器学习算法非常简单。而且,学习是基于在注册过程中提供的单个正样本。在这种约束下,应用程序仍然能够以非常高的准确度预测正确的身份验证。

次状态

我在考虑添加一个应用程序的激励系统,让用户有动力打破对方的认证,这反过来又为训练提供了负面的样本。让我用一个例子来解释这一点:

用户集:U1、U2、U3

用户模型的正面训练样本(Px ):

U1: [P11,P12]

U2: [P21,P22]

U3: [P31,P32]

在激励系统中,U1 被要求破解 U2 的认证。这是完全匿名的,U1 不知道他/她正在破坏谁的认证。这给出了 U2 的负样本(Nx)。

U2: [P21,P22,N23]

那么激励在哪里呢?用户破坏他人身份验证的贡献越大,负面样本收集的身份验证弹出窗口就越多。越多的阴性样本意味着认证过程越准确。经过一段时间后,整个系统的精确度会提高。

今后

有相当多的公司已经在这个领域做了大量的工作。 TypingDNA 提供先进的击键动力学服务,其准确性令人惊讶。然而,他们确实让你开始输入至少 90 个字符。我建议你看看那里的产品,也试试的快速演示。这是对未来的一瞥。

乐观

最后乐观地说,有一天我们都将摆脱记住密码的麻烦,认证将像在纸上签名一样简单。

尝试/反馈/分享/重复

欢迎合作!

欢迎分享!

毕晓普的 PRML 书:回顾和见解,第 4-6 章

原文:https://towardsdatascience.com/bishops-prml-book-review-and-insights-chapters-4-6-eb2a2a33c939?source=collection_archive---------4-----------------------

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

大家好!在的上一篇文章中,我发表了一份关于 Bishop 的《模式识别和机器学习》一书前三章的简短简历,在这本书里,我将继续写下一章。

对于更注重实践、正在寻找如何提高理论背景的数据科学家,对于那些想要快速总结一些基础知识的人,或者对于刚刚起步的初学者来说,这可能会很有趣。

4.分类的线性模型

在第三章中,我们发现了线性回归的一个推广形式为 f(w,x)= w0+w1 * x1到*w0+w1 фI(x)+…+фn(x),,其中 ф(x) 称为基函数。我想,这里几乎每个人都知道,要应用这个模型进行分类,我们需要把我们的 w_i * x 传递给一个激活函数: y(x) = f(w_i * x)。

首先,我们想知道,如何做 N 类分类,其中 N > 2。例如,在 scikit-learn 中,我们可以选择以“一对一”或“一对一”模式训练二进制分类器,但这些方法存在一些模糊区域,我们不知道如何做出决策,并且构建这些模型需要更多时间:

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

Ambiguity regions for “one vs one” or “one vs all” approaches

相反,我们有三种主要策略来构建判别函数:

  • 最小二乘法 —直接求解矩阵方程,但对异常值不太好。
  • Fisher 线性判别式 —我们希望找到一种投影,使类别分离最大化,例如,类别均值。使用类间和类内方差和类的均值,我们建立 Fisher 判别式,我们稍后使用它来建立方程,类似于最小二乘法。
  • 感知器——非常类似于逻辑回归,我将在下面描述,或者你可以在这里阅读。

逻辑回归的推导非常简单,通过最大似然法,我们得到了我们最喜欢的二元交叉熵:

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

cross-entropy loss

对于逻辑回归,还展示了迭代算法,基于 Hessian ( Newton-Raphson )以最小化损失,并针对不同应用进行扩展,其中 softmax 或逻辑函数不适合(如二元变量)——概率单位回归。例如,让我们考虑 2 类问题,其中我们可以有一些给出阈值θ的激活函数,并且我们基于 if w_i * x 高于或低于θ来分配类。主要思想是θ是有噪声的,例如从一些 PDF 中提取的,并且该 PDF 的参数将被估计。

本章继续介绍拉普拉斯近似法,其目的是在一组连续变量上找到 PDF 的高斯近似法。我们主要在贝叶斯推理应用中需要它,在这种情况下使用高斯分布很方便:

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

visualization of PDF (yellow) and Laplace approximation (red)

本章最后是模型比较和贝叶斯逻辑回归与地图,高斯近似和预测分布。值得一提的是贝叶斯信息准则 (BIC)。有了 {M_i} 模型、 {W_i} 参数和数据 D 对于每个模型,我们可以定义似然 p(D|W_i,M_i) ,并从中定义模型证据 p(D|M_i) 。对于后者我们计算ln(p(D))~ ln(p(D | W _ map))—M * ln(N),其中 M —参数个数, N —数据点个数。正如我们所看到的,BIC 惩罚模型有太多的参数。

5.神经网络

我想读者已经对 NNs 有了很多了解,我将只提到一些有趣的时刻。

首先,这里引入神经网络作为具有基函数的模型,基函数是预先固定的,但是它们必须是自适应的。有趣的是,跳过连接中使用的resnet在本书中有显示:

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

skip connections in neural networks

这本书的很大一部分致力于反向传播和衍生品。它展示了如何:

  • 用 BP 计算雅可比矩阵
  • 用 BP 及其逆运算计算 Hessian 矩阵(对角线,外积近似)

神经网络的正则化也在这里讨论。首先,弹性正则化项被提出,因为具有正则权值衰减的神经网络是不变的线性变换

我们都知道,例如,对于计算机视觉,我们做了很多数据增强,但通常我们认为这是对初始数据集的放大。使用切线传播也可以更“正确”地完成。主要思想是,我们将这些变换形式化为一些流形 M 上的向量,并且我们对它们的方向导数进行反向传播:

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

tangent of x on a manifold M

NNs 的另一个很酷的应用是密度近似,其中从数据 {X_i} 我们预测经验分布的均值和方差为高斯混合。

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

本章以贝叶斯神经网络结束。我们设定目标分布和权重的先验,我们可以用拉普拉斯近似后验分布。

6.核心方法

大多数线性模型可以用等价的**“对偶表示”**来表示,其中预测是基于在数据点评估的核函数的线性组合来完成的。

对偶表示可以从损失函数中得到。例如,正则化均方损失 J(w) 后,我们通过导数计算最佳参数值,在表达式中,我们将得到类似于 *w^t * ф_i(x)的结果。*我们可以称之为 a_n,并重新表示最小二乘 J(a) ,因为我们为这个 a 求解,并得到一个具有 Gram 矩阵 *K,的解,其中K _ nm =ф_ I(x _ n)*ф_ I(x _ m)= K(x _ n,x _ m)——*这是我们的核。

我们可以将核构造为多项式、高斯函数或逻辑函数:

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

polys, Gaussians and logistic functions as kernels

有很多不同的方法来构建内核:从内核的加法和乘法组合开始,到像 Fisher 内核这样的专用版本,它测量 x 和 x '之间的相似性。

另一个有趣的算法是径向基函数网络。当输入噪声过大时,它适用于插值问题。内核(根据 NNs 的激活函数)与 Nadaraya-Watson 模型中的相同。在这个模型中,我们希望将期望 E(Y|X)建模为某个函数 y(X), Naradaya 和 Watson 建议将 y(X)估计为某个加权平均值,并且核应该起到加权函数的作用。

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

Nadaraya-Watson estimator

在这一章的最后有一类非常重要的算法,特别是对于时间序列——高斯过程。如果在贝叶斯线性或逻辑回归中我们设置了权重分布的先验,为什么在 f(w,x) = w_0 + w_1x_1* 到 w_0 + w_1 * ф_i(x) + … + ф_n(x) 中我们不能直接定义函数 f 的概率分布?事实上我们可以。高斯过程的优点是它们可以通过期望和协方差函数来定义,后者可以用核来表示,这就是它们与核方法相关的原因。下图是不同的高斯过程,取决于不同的协方差函数。

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

different Gaussian processes

必须学习协方差函数的超参数。为了将高斯过程应用于分类问题,我们有三种主要策略:

  • 变分推理
  • 期望传播
  • 拉普拉斯近似

附言
关注我还可以在脸书看到太短的人工智能文章,在 Instagram 看到个人资料,在 Linkedin

你不需要多样化的加密投资组合来分散风险:原因如下

原文:https://towardsdatascience.com/bitcoin-dominance-5a95f0f3319e?source=collection_archive---------3-----------------------

区块链系列的未来

除了少数异常情况,顶级加密货币与比特币的相关性非常密切;因此,在我看来,分散投资组合以分散风险的想法真的只是一个神话。本文考察了加密货币价格之间的相关性,以解释我的推理。

有很多关于加密货币的错误信息、谣言和不正确的信息。事实上,我认为加密货币市场最具误导性的标签之一是比特币统治地位的这种想法,这种想法表现为比特币对加密货币整个市值的百分比所有权。你可以在 CoinMarketCap 等合法网站上找到它,虽然这是一个公平的想法,但我认为它的标签对加密货币市场的运作产生了误解。简单来说,比特币统治地位的计算方法是:

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

2018 年 9 月 23 日,CoinMarketCap 报告称,比特币的统治地位为 51.3%,因为其总市值为 1157 亿美元,而总市值为 2255 亿美元。115.7/225.5 = 0.513,即 51.3%。

但是这个数字与事实相去甚远。比特币的实际主导地位延伸到整个市场的更深处——任何加密货币交易员都可以通过观察比特币历史性地创造或破坏他们的整个投资组合来证实这一点。

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

Really strong positive correlation between Bitcoin and three major cryptocurrencies; Data Source: www.coingecko.com

我做了一些相关性比较,看看 BTC 到底需要多少时间。莱特币、以太坊和 Ripple 在 2016 年至 2018 年期间都显示出与比特币价格具有极强相关性的迹象。

通常当比较两个项目之间的相关性时,0.7 到 1.0 之间的任何数字都表示强正相关;换句话说,在这两个数字之间,很有可能你和这两个数字之间有很强的关系。有了正的、强有力的关系(我们称之为正相关),当一个项目的数字上升时,另一个项目也上升,反之亦然。

话虽如此,2016 年至 2018 年间,比特币的价格相关性莱特币为 0.954,以太坊为 0.916,Ripple 为 0.836。莱特币和以太币都是比特币基地的可交易加密货币,这可以说是目前存在的最大的法定到加密直接交易所,这可以解释与比特币价格的强相关性——每个人都在同一时间兑现和兑现。

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

Data Source: www.coingecko.com

Ripple 是替代硬币的一个有趣的代表性案例,它存在于直接的法定货币到加密货币的交换领域之外,因为它只能在历史上不接受法定货币的交换中找到。这意味着用户必须经历额外的一步,将比特币从比特币基地等地转移到 T4 币安 T5 等交易所。

从纯粹的心理学角度来看,这一额外的步骤可能表明实际购买 Ripple 的愿望比其他两个步骤强烈得多。例如,在比特币基地,你可能会想,“当然,我也会把一些放入以太坊和莱特币,为什么不呢?”但是因为 Ripple 不在比特币基地,你不会买它的任何一个——除非你真的想买。然后你必须学会如何将你的资金从比特币基地转移到一个交易 Ripple 的交易所。

然而,即使有一个可以说更加坚定和坚定的投资者群体,2016 年至 2018 年期间,Ripple 与比特币价格的相关性仍为 0.836。

怀疑论者可能会说,比特币对其他硬币价格的影响以前比现在强得多,但回到 2016 年,我不公平地权衡了不相关的历史数据,以传播对替代硬币的恐惧、不确定性和怀疑(FUD——加密巨魔最喜欢的首字母缩写)。

但首先,我不是来拉屎的。我自己也有很多,我有波纹。我在这里只是为了让你在现实中扎根——当然,硬币可能在某个时候“月亮”,但除了那些异常事件,它们的价格将直接受到比特币的影响。

第二,也是更重要的一点,如今比特币对其他硬币价格的影响力比几年前更大了。在下面的图表中,我创建了当今市场上一些顶级硬币之间的关联矩阵:比特币、以太坊、Ripple、Stellar、莱特币、Monero 和 Dash。

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

2016 年,各货币之间的价格相关性非常松散。事实上,如果我没记错的话,除了通过这个名为 Gatehub 的粗略网站,你甚至不能购买 Ripple。我认为你必须使用菲亚特购买,但因为这对美国公民来说是一个问题,我不认为我的帐户被验证过。细节有点模糊,有点跑题,但关键是,在 2016 年,altcoin 价格与比特币的关联非常松散。只有莱特币、Monero 和 Dash 真正表现出与比特币的适度相关性。按照股价标准,有人可能会说它仍然具有很强的相关性,但与最近几年相比,0.6-0.7 看起来相当不错。

牛市

2017 年标志着最近一轮加密货币牛市的开始,几乎把每一个替代硬币都变成了一个以比特币为中心巨星的星球。请注意,相关性急剧上升,只有 Ripple 对比特币定价表现出一些抵制。

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

Data Source: www.coingecko.com

接近 2017 年底时,Ripple 通过提供自己的泵,对比特币的价格泵做出了非常戏剧性的反应。Ripple 拥有一家企业实体,与全球许多金融机构建立了强大的合作伙伴关系,该公司在那一年对比特币价格变化表现出了最强烈的抵制。

它的竞争对手 Stellar(具有讽刺意味的是,由 Ripple 的前创始人兼首席技术官创建)也表现出了抵触情绪——这两种货币之间的相关性为 0.9,这似乎表明了两种货币之间的普遍情绪——例如,当投资者对 Ripple 有信心时,投资者可能也会对 Stellar 有信心。

市场崩溃

2018 年,随着围绕加密货币的积极市场情绪减弱,价格趋势发生了转变。比特币价格从 17000 美元跌至今天的 6600 美元左右,整个加密货币市场都可以感受到这一崩溃的影响。在此期间,加密货币价格之间的相关性甚至很强,比特币价格下跌的重量将所有东西都拉了下来。

2018 年期间(1 月至 9 月),与比特币价格的相关性从未低于 0.85。有趣的是,莱特币和以太币在 2017 年牛市期间表现出与比特币价格更强的相关性,但在整个崩盘期间与 BTC 的相关性最弱。这是否也与它们都可以通过比特币基地获得的事实有关,或者如果你认为这是其他原因,请在本文的评论部分详细阐述。

极端值

然而,在 2018 年的崩盘中,尽管大多数主要加密货币(即前 15 名)都表现出与比特币价格非常强的相关性(> 0.70),但 EOS 对这一趋势表现出了非常强的抵抗力。

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

2017 年,当 EOS 首次推出时,它表现出与比特币价格的正相关关系。其为期一年的 ICO 于 2017 年 6 月开始,于 2018 年 6 月结束,随着其主网的推出而达到高潮。尽管作为一种加密货币,它具有争议性,但无可争议的是,这种硬币已经获得了强大的追随者,其 ICO 产生了超过 40 亿美元的收入。

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

2018 年,EOS 是少数几个成功保持高于 1 月份价格的硬币之一。如果我必须将这种模式归因于一个原因,我的大胆猜测是,这至少部分归因于几次比特币牛市和 EOS ICO 长达一年的性质。

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

随着 2017 年比特币的每一轮牛市,随着时间的推移,EOS 都有一个更大的牛市。2018 年 4 月,随着 ICO 日期接近尾声,EOS 主网准备推出,再次出现了与比特币价格无关的大幅飙升。

虽然批评者可能会认为这是一种个人崇拜,价格可以归因于公众对其领导人的认可(丹·拉里默),但考虑到以太坊和比特币现金等其他加密货币都有领导人物(分别是维塔利克·布特林和罗杰·韦尔),个人崇拜的情况将非常难以辩驳。如果你研究以太坊和比特币现金的相关性,你会发现两者都与比特币价格有很强的相关性。所以,如果你真的相信个人崇拜的论点,那么你也必须相信,出于某种原因,丹·拉里默比其他人有一个强大的崇拜者。

那么这一切意味着什么呢?

数据很有趣,但正如许多人警告的那样,它实际上只是过去模式的一个指标。尤其是在这个动荡的市场中,没有人能保证这些相关性模式会持续一年,一个月,甚至一天。

然而,一些有趣的观点是,在我看来,分散风险的多样化加密货币投资组合的想法是一个神话。你当然可以出于兴趣和试图最大化上行空间等原因进行多元化,但正如相关性模式所显示的那样,持有其他硬币的风险并没有减少,尤其是因为比特币拖累了一切。虽然我没有量化这种说法的价值,但从目测和个人经验来看,我观察到,比特币的价格下跌通常会导致替代比特币更大幅度的下跌。

由于与比特币价格的相关性如此之强,任何不积极投资或日间交易加密货币的人都可以通过多元化投资组合获得相当不错的回报,特别是多元化的 1B+市值硬币。虽然我们已经看到了 EOS 的异常情况,因为主网现在已经关闭,区块链必须兑现承诺,但如果宣传与现实不符,它可能很快就会成为另一种与比特币挂钩的加密货币。

我从哪里得到我的数据?

不,我没有付钱给 CoinMarketCap 来访问所有这些定价数据。我收集了 2016 年至 2018 年的数据,并使用了 CoinGecko API ,它是免费的,包含了同样多的高质量数据——远远超过了我进行这一分析所需的数据。

使用 LSTM 预测比特币价格

原文:https://towardsdatascience.com/bitcoin-price-prediction-using-lstm-9eb0938c22bd?source=collection_archive---------2-----------------------

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

2017 年 11 月围绕比特币的激烈讨论吸引了我的注意力,我决定深入了解这到底是什么。我阅读了一堆论文,几本书和许多关于这个话题的观点,以便对它在当前市场中的价值有一个像样的了解。

你可能听说过比特币,但如果你想完全承认它的存在,我推荐阅读安德烈亚斯的书——《货币的互联网

当然,最吸引绝大多数人的是这种资产的价格波动。比特币价格在短时间内大幅上涨/下跌是一个有趣的现象,根本无法预测。然而,我认为在这个价格上看到任何强大的机器学习模型的效果都会很好。

所以我选择了一个递归神经网络和一组比特币价格来预测这种金色加密货币的未来。

从 01/02/2009 到今天,我每天都使用比特币的收盘价以及这个奇妙的 Kaggle 内核的一点帮助。

#1.开始实施

让我们首先定义我们的库:

我们将使用keras来训练模型。

Keras 是一个高级神经网络 API,用 Python 编写,能够在 TensorFlowCNTKTheano 之上运行。

我们还声明了numpy(矩阵操作)panda(定义数据结构)matplotlib(可视化)和sklearn(标准化我们的数据)

#2.准备数据

我们的下一步将是准备数据。这包括从第三方来源获取、清理并分成培训和测试。

这里的是访问一个的绝佳链接。带价格的 csv 文件。

  • 加载数据并删除未使用的字段(在本例中为“日期”)

我们使用pandas来读取*。csv* 文件并删除无用的列。

  • 分为培训和测试

这里所做的决定只是为了本教程的目的。在真实的项目中,你应该总是将你的数据分成训练、验证、测试(通常是 80%、20%、20%)。我们已经将培训设置为 30 天,这意味着我们将在最后一个月测试我们的模型。

  • 正常化并准备培训

我们使用fit_transform来确定数据的中心,使其具有 0 个平均值和 1 个标准误差。我推荐阅读这篇 Stackoverflow 回答来澄清。然后,我们将数据分为x_trainy_train。本质上,这是因为我们使用了递归神经网络。我们的模型将从x_train获取第 0 个元素,并尝试从y_train(即x_train的第一个元素)预测第 0 个元素。这样我们就创建了一个序列——这正是 rnn 训练所需要的。如果你需要更多关于这些奇妙网络如何工作的信息,你可能会发现我的一篇文章很有用。

最后,我们重塑x_train数据,以匹配使用keras进行训练的需求(见下文)。

#3.火车模型

现在我们需要使用上述数据来训练我们的模型。有了keras,这个过程就变得极其容易理解。你不需要知道任何运算背后的数学原理就能产生像样的结果。不过,如果你有兴趣钻研方程和算法,你可以在这里 (LSTM 网)找到更多信息,在这里 (GRU 网)找到

我们正在构建如下模型:

  • 第 1 行:用于 LSTM 单元的单位数(输出态的维数)。
  • 第 2 行:用于 LSTM 电池的激活功能(在我们的例子中为s 形)。
  • 第 3 行:用于最小化损失函数的优化器(在我们的例子中是亚当)。
  • 第 4 行:在调整网络的权重和偏差时我们需要最小化的损失函数(在我们的例子中是均方误差)。
  • 第 5 行:神经网络通常是分批训练的,这意味着在每次迭代中,我们从训练集中挑选 5 个例子,并使用它们进行训练。
  • 第 6 行:历元的数量决定了我们需要进行多少次迭代。

在解释了每个超参数的含义后,我们开始训练模型:

  • 第 9 行:定义堆叠所有层(输入、隐藏和输出)的顺序模型
  • 第 12 行:将 LSTM 单元添加到我们的模型中。这里很好地解释了它在 Keras 中是如何工作的。
  • 第 15 行:添加输出层——是一个简单的密集,具有默认的线性激活函数和维度 1。
  • 第 18 行:这是实际训练前的最后一步。我们需要设置上面指定的优化器和损失函数。
  • 第 21 行:使用输入x_train和标签y_train训练模型。

#4.预测价格

我们终于到了期待已久的预测价格的时刻。我们有 2 个步骤:预测价格,并绘制价格图,与真实结果进行比较。

  • 预测下个月的价格

正如你已经看到的,Keras 让一切变得如此简单。这里的情况是一样的:

第 1–6 行:我们做的和训练集完全一样。使用min_max_transform来缩放数据,然后为预测重塑数据。

第 7 行:预测。

第 8 行:重新调整预测数据以匹配其真实值(美元价格)

  • 可视化结果

最后,我们将使用下面的代码片段绘制测试价格和预测价格:

结果碰巧真的很有趣。当然,预测的准确性并不出色,但仍然很酷:

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

更多 AI 内容,在 LinkedIn 关注我

感谢您的阅读。如果你喜欢这篇文章,给它一些掌声👏。希望你有一个伟大的一天!

使用时间序列预测的比特币价格预测

原文:https://towardsdatascience.com/bitcoin-price-prediction-using-time-series-forecasting-9f468f7174d3?source=collection_archive---------3-----------------------

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

这篇文章是关于使用时间序列预测来预测比特币价格的。时间序列预测与其他机器学习模型非常不同,因为-

1.它依赖于时间。因此,线性回归模型的基本假设,即观察值是独立的,在这种情况下不成立。

2.除了增加或减少的趋势,大多数时间序列都有某种形式的季节性趋势,即特定时间范围内的变化。

因此,简单的机器学习模型无法使用,因此时间序列预测是一个不同的研究领域。本文采用 AR(自回归模型)、MA(移动平均模型)和 ARIMA(自回归综合移动平均模型)等时间序列模型对比特币价格进行预测。

该数据集包含 2013 年 4 月至 2017 年 8 月比特币的开盘价和收盘价

导入必要的库

**import** **pandas** **as** **kunfu**
**import** **numpy** **as** **dragon**
**import** **pylab** **as** **p**
**import** **matplotlib.pyplot** **as** **plot**
**from** **collections** **import** Counter
**import** **re**

*#importing packages for the prediction of time-series data*
**import** **statsmodels.api** **as** **sm**
**import** **statsmodels.tsa.api** **as** **smt**
**import** **statsmodels.formula.api** **as** **smf**

**from** **sklearn.metrics** **import** mean_squared_error 

数据从 csv 文件加载到列车数据帧中。这是我们数据的前五行看起来的样子。

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

绘制时间序列

以日期为索引,x 轴为日期,y 轴为收盘价。

data = train['Close']
Date1 = train['Date']
train1 = train[['Date','Close']]
*# Setting the Date as Index*
train2 = train1.set_index('Date')
train2.sort_index(inplace=**True**)
print (type(train2))
print (train2.head())
plot.plot(train2)
plot.xlabel('Date', fontsize=12)
plot.ylabel('Price in USD', fontsize=12)
plot.title("Closing price distribution of bitcoin", fontsize=15)
plot.show()

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

测试平稳性

增强迪基富勒测验:

扩展的 Dicky Fuller 检验是一种称为单位根检验的统计检验。

单位根检验背后的直觉是,它决定了趋势对时间序列的定义有多强。

单位根检验有许多种,ADF 是应用最广泛的一种

1。 零假设(H0): 检验的零假设是时间序列可以用一个非平稳的单位根来表示。

2.备选假设(H1): 检验的备选假设是时间序列是平稳的。

p 值的解释

1。 p 值 > 0.05: 接受零假设(H0),数据有单位根,非平稳。

2。 p 值 < = 0.05: 拒绝零假设(H0),数据是平稳的。

**from** **statsmodels.tsa.stattools** **import** adfuller

**def** test_stationarity(x):

    *#Determing rolling statistics*
    rolmean = x.rolling(window=22,center=**False**).mean()

    rolstd = x.rolling(window=12,center=**False**).std()

    *#Plot rolling statistics:*
    orig = plot.plot(x, color='blue',label='Original')
    mean = plot.plot(rolmean, color='red', label='Rolling Mean')
    std = plot.plot(rolstd, color='black', label = 'Rolling Std')
    plot.legend(loc='best')
    plot.title('Rolling Mean & Standard Deviation')
    plot.show(block=**False**)

    *#Perform Dickey Fuller test* 
    result=adfuller(x)
    print('ADF Stastistic: **%f**'%result[0])
    print('p-value: **%f**'%result[1])
    pvalue=result[1]
    **for** key,value **in** result[4].items():
         **if** result[0]>value:
            print("The graph is non stationery")
            **break**
         **else**:
            print("The graph is stationery")
            **break**;
    print('Critical values:')
    **for** key,value **in** result[4].items():
        print('**\t%s**: **%.3f** ' % (key, value))

ts = train2['Close']      
test_stationarity(ts) 

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

由于 p 值大于 0.05,时间序列是非平稳的。到目前为止,我们测试了这个系列,它不是稳定的。因此,这里需要做一些工作。所以现在我们用变换使级数平稳。

测井转换系列

日志转换用于对高度扭曲的数据进行去扭曲。从而有助于预测过程。

ts_log = dragon.log(ts)
plot.plot(ts_log,color="green")
plot.show()

test_stationarity(ts_log)

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

由于 p 值仍然大于 0.05,所以序列仍然是非平稳的,所以我们需要做进一步的变换。让我们继续做差分。

通过差异消除趋势和季节性

在差分以使时间序列稳定的情况下,当前值与先前值相减。由于这一点,平均值是稳定的,因此时间序列的平稳性的机会增加。

ts_log_diff = ts_log - ts_log.shift()
plot.plot(ts_log_diff)
plot.show()

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

ts_log_diff.dropna(inplace=**True**)
test_stationarity(ts_log_diff)

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

由于我们的时间序列现在是平稳的,因为我们的 p 值小于 0.05,因此我们可以应用时间序列预测模型。

自回归模型

自回归模型是一种时间序列预测模型,其中当前值依赖于过去值。

*# follow lag*
model = ARIMA(ts_log, order=(1,1,0))  
results_ARIMA = model.fit(disp=-1)  
plot.plot(ts_log_diff)
plot.plot(results_ARIMA.fittedvalues, color='red')
plot.title('RSS: **%.7f**'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))
plot.show()

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

移动平均模型

在移动平均模型中,序列依赖于过去的误差项。

*# follow error*
model = ARIMA(ts_log, order=(0,1,1))  
results_MA = model.fit(disp=-1)  
plot.plot(ts_log_diff)
plot.plot(results_MA.fittedvalues, color='red')
plot.title('RSS: **%.7f**'% sum((results_MA.fittedvalues-ts_log_diff)**2))
plot.show() 

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

自回归综合移动平均模型

它是 AR 和 MA 模型的结合。它通过差分过程使时间序列本身平稳。因此,对于 ARIMA 模型,不需要明确地进行差分

**from** **statsmodels.tsa.arima_model** **import** ARIMA
model = ARIMA(ts_log, order=(2,1,0))  
results_ARIMA = model.fit(disp=-1)  
plot.plot(ts_log_diff)
plot.plot(results_ARIMA.fittedvalues, color='red')
plot.title('RSS: **%.7f**'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))
plot.show()

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

因此,我们看到,RSS(残差平方和)误差是最小的 ARIMA 模型。因此,ARIMA 模型是三个模型中最好的,因为它利用了对滞后值和误差项的依赖性。因此,它进一步用于计算均方差。在下面的代码片段中,数据集分为训练和测试。

对于测试中的每个值,我们应用 ARIMA 模型,然后计算误差,然后在迭代测试集中的所有值后,计算预测值和期望值之间的平均误差。

size = int(len(ts_log)-100)# Divide into train and test
train_arima, test_arima = ts_log[0:size], ts_log[size:len(ts_log)]history = [x **for** x **in** train_arima]predictions = list()
originals = list()
error_list = list()

print('Printing Predicted vs Expected Values...')
print('**\n**')# We go over each value in the test set and then apply ARIMA model and calculate the predicted value. We have the expected value in the test set therefore we calculate the error between predicted and expected value **for** t **in** range(len(test_arima)):
    model = ARIMA(history, order=(2, 1, 0))
    model_fit = model.fit(disp=-1)

    output = model_fit.forecast()

    pred_value = output[0]

    original_value = test_arima[t]
    history.append(original_value)

    pred_value = dragon.exp(pred_value)

    original_value = dragon.exp(original_value)

    # Calculating the error
    error = ((abs(pred_value - original_value)) / original_value) * 100
    error_list.append(error)
    print('predicted = **%f**,   expected = **%f**,   error = **%f** ' % (pred_value, original_value, error), '%')

    predictions.append(float(pred_value))
    originals.append(float(original_value))

# After iterating over whole test set the overall mean error is calculated.   
print('**\n** Mean Error in Predicting Test Case Articles : **%f** ' % (sum(error_list)/float(len(error_list))), '%')plot.figure(figsize=(8, 6))
test_day = [t
           **for** t **in** range(len(test_arima))]
labels={'Orginal','Predicted'}
plot.plot(test_day, predictions, color= 'green')
plot.plot(test_day, originals, color = 'orange')
plot.title('Expected Vs Predicted Views Forecasting')
plot.xlabel('Day')
plot.ylabel('Closing Price')
plot.legend(labels)
plot.show()

预测= 2513.745189,预期= 2564.060000,误差= 1.962310 %
预测= 2566.007269,预期= 2601.640000,误差= 1.369626 %
预测= 2604.348629,预期= 2601.990000,误差= 0.090647 %
预期= 2372.560000,误差= 6.258791 %
预测= 2379.066829,预期= 2337.790000,误差= 1.765635 %
预测= 2348.468544,预期= 2398.840000,误差= 2.099826 %
预测= 2405.2999999 误差= 12.841677 %
预测= 2238.150016,预期= 2318.880000,误差= 3.481421 %
预测= 2307.325788,预期= 2273.430000,误差= 1.490954 %
预测= 2272.890197,预期= 2817.60000 误差= 0.899246 %
预测= 2763.766195,预期= 2576.480000,误差= 7.269072 %
预测= 2580.946838,预期= 2529.450000,误差= 2.035891 %
预测= 2541.493507,预期= 2671.7800000

预测测试用例文章的平均误差:3.593133 %

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

因此,原始时间序列和预测时间序列的平均误差为 3.59%。因此,我们能够使用不同的转换和模型来预测比特币的收盘价。

如果你读到最后,谢谢你。这是我关于数据科学的第一篇文章,以后还会有更多文章。如果您发现任何错误或有任何建议,请做评论。如果你喜欢这个帖子,请不要忘记鼓掌!谢谢你。

比特币:数学原理是什么?

原文:https://towardsdatascience.com/bitcoin-whats-the-math-ebbae3be37a3?source=collection_archive---------5-----------------------

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

Bitcoin- will it replace fiat currency? How does the math work? And where can I get one of those physical coins?

大约 6 个月前,我偶然发现了比特币,这要感谢一位朋友,她自己开了一家使用区块链技术的公司。我以前听说过比特币——我的大致想法是“比特币是我哥哥在我高中时用来挖矿的虚拟货币。”像大多数人一样,除此之外我不知道太多。

真正引发我兴趣的是我意识到比特币和其他数字货币是密码学的一个伟大应用(因此得名“加密货币”),这是一个我一直非常着迷的领域。对我来说,密码学是在现实世界中使用数学的完美方式。意识到这一点后,我决定研究比特币背后的数学原理。

尽管我读了无数的文章,包括最初的中本聪白皮书,我仍然努力寻找一个资源来回答这个基本问题:数学是什么?我能找到的最好的文章是讨论椭圆曲线加密和用于比特币的特定参数的文章。这并没有让我满意。

按照朋友的建议,我拿到了一本安德里亚斯·安东诺普洛斯的《 《掌握比特币:编程开放区块链 》。这本书对我来说真的把所有的东西都集合在一起了。我强烈推荐!

我希望这篇博文能从数学的角度帮助你理解比特币协议和比特币区块链。我首先假设你熟悉比特币,其次假设你有数学知识。对于那些不太熟悉的人,我会在下面留下解释数学主题的链接。

区块链与挖掘 : SHA256,Merkle Trees

人们普遍认为采矿的目的是发行新的货币。实际上,挖掘就是对交易进行验证的过程。采矿允许对区块链的状态进行分散的全网络共识,这就是这项技术如此特殊的原因。发行新货币是诱因。

尽管货币发行是动机而不是目标,我们将从采矿和“创造”新 BTC(或 XBT)开始我们的讨论。从这里,我们将看看这种货币是如何“花费”的,以及其中涉及的数学。

假设爱丽丝有一个挖掘节点,它实际上只是一个计算机程序。挖掘器的目标是构造一个新的块,并解决一个计算量很大的密码难题,使得这个新的块可以被网络接受,并被合并到区块链中。在解决这个密码难题后,爱丽丝的矿工将“获胜”并获得一笔支付(截至本文撰写时,目前为 12.5 BTC),支付到她的比特币地址。Alice 还将收取新开采区块中所有交易的费用。

Alice 采矿的第一步是验证区块链的最新区块。让我们把这个最近的块称为 A。在验证了 A 中的事务后,Alice 的挖掘程序将为链中潜在的下一个块构造一个标题。我们称这个块为 b,新块的头有 6 个字段:版本、前一块哈希Merkle 根、时间戳、目标。这里有大量斜体的数学内容需要解开。

前一个块哈希:double-SHA256

如果 Alice 的 miner 想要查找区块链中的任何区块,有两种方法可以实现。第一种方法是参考块的高度。第二种方法是计算块 ID,其中块 ID = double-SHA256(块头)。块 ID 也是先前的块散列。例如,假设 A 的块 ID 是 A’ = double-SHA256(blockIDA)。然后,对于扩展区块链的块 B,其字段“先前块散列”被设置为等于 A’。这将块链从块 A 扩展到块 B,块 B 是子块,而块 A 是父块。这也是爱丽丝的矿工如何使用其采矿权力来“投票”区块 A 作为链中最近的区块。

Merkle root:一个概念本身,和 double-SHA256

Merkle 根是 Merkle 树中的最终散列。简而言之,Merkle 树是一棵二叉树,其中每个父节点都是其子节点的散列。这是在比特币中通过递归计算 double-SHA256 对节点构建的,直到树中只有一个哈希,这就是 Merkle 根。以比特币为例,每个子代都包含交易信息,因此 Merkle 根在一个块中汇总所有交易。

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

A simple figure of creating a Merkle Root. The hash function H is double-SHA256, with the transactions (T) as the inputs. Thanks Paint for helping me make this beautiful figure!

目标和随机数

目标是所有挖掘节点共享的 256 位数字。挖掘的目标是找到一个 nonce(一个从 0 开始的一次性使用数),使得头和 nonce 的散列(SHA256)一起小于或等于目标。目标每 2016 块更新一次。

继续我们的示例,Alice 的 miner 想要包括区块链中的新区块 B。目标是找到一个随机数,使得:

sha 256(B+nonce 的报头)< = target。

找到这个 nonce 的计算量非常大,但是由于这个 hash 函数的性质,很容易验证。找到这个随机数就证明了一个矿工完成了要求的工作量,也就是“工作量证明”一旦发现 nonce,Alice 的 miner 就会将 B 的信息传播到整个比特币网络。一旦足够多的矿工验证了包括在 B 中的交易是真实的,那么 B 是链中的下一个块,并且爱丽丝将把她的 12.5 BTC 的支付加上交易费收集到她的钱包中。网络中的所有矿工,包括 Alice 的矿工,然后将构造新的块 C,其中先前的块散列字段引用 b 的 ID。

关于工作证明的一个注意事项:重要的是密码难题(即找到一个小于目标值的散列值)必须是计算开销很大的。如果不是,那么一个拥有相当于 51%网络计算能力的不诚实的人可以重写交易以支付到他们自己的钱包,然后将这个块包括在链中。(然而,随着这一开支的增长,它就成了问题,这是另一篇文章的主题。有新的协议试图解决这个问题!)

现在我们在爱丽丝的钱包里有 12.5 BTC。接下来我们将看看她是如何花费的,这里涉及到数学。

总结这一部分,数学是:

  • Double-SHA256(块头)创建块 A 的 ID,它将位于新块 B 的前一个块哈希字段中,其中 B 是 A 的子块。
  • Merkle 树并递归地执行 double-SHA256 来创建汇总块中所有事务的 Merkle 根。
  • 块头和 nonce 的 SHA256,以执行验证块中所有事务所需的工作证明,并找到小于或等于目标的散列。一旦发现该随机数,该块将被包括在区块链中。

交易和钱包 : ECDSA,RIPEMD160,SHA256

比特币使用公钥加密技术进行交易,特别是基于离散对数问题的椭圆曲线数字签名算法(ECDSA)。

钱包:像钥匙扣

比特币钱包并不包含真正的比特币。相反,它包含指向公共分类账(区块链)上的交易输出的键。只有拥有相应私钥的人才能“消费”与接收者钱包地址相关的比特币。

交易:认证

让我们继续我们的例子。假设爱丽丝想给她的朋友鲍勃发送 1 BTC。Alice 将使用她的钱包构建一个交易,将这 1 个 BTC 发送到 Bob 的公共钱包地址。这个交易就是信息。Alice 将使用她的签名(r,s)对消息进行签名,以提供真实性,并且这将被传播到网络。任何对等体都可以通过使用 Alice 的公钥来验证她的身份,该公钥与她的钱包地址相关联。换句话说,该过程如下:

设 D =爱丽丝的私钥,E =爱丽丝的公钥,M =事务。
1。Alice 的 wallet 构造了 M,它向 Bob 的公共地址发送了 1 个 BTC。
2。爱丽丝用符号 M 表示出 M’ = D(M)。
3。任何对等体都可以通过执行 E(M’) = M 来验证 Alice 的真实性。

现在鲍勃怎么花掉爱丽丝给的这 1 个比特币呢?当 Alice 构造 M 时,她实际上是在构造一条消息,该消息说“我将把 1 BTC 给拥有对应于这个公共地址(在本例中是 Bob 的地址)的私钥的任何人。”为了让 Bob 花掉这笔钱,他的钱包将构建一个新的交易,他将用他的签名(r’,s’)来签名,该签名是从只有他有权访问的私钥(根据椭圆曲线加密)中导出的,并且该过程继续。

比特币所做的是使用 ECDSA 来授予发送者真实性,这种认证是“花费”比特币所需要的。比特币交易不需要加密,因为每笔交易都传播到网络,并指定接收者的公共地址,这是匿名的。

创建比特币地址

按照椭圆曲线加密法,公钥是从私钥生成的,而比特币地址是从这个公钥创建的。

私钥 k 在[1,n-1]的范围内,其中 n 是椭圆曲线的阶。比特币协议中使用的特定椭圆曲线是 secp256k1,它指定了椭圆曲线的系数以及生成器 g。创建比特币地址的步骤如下:

1.私钥 k 是随机生成的。
2。公钥 K = k * G,其中 G 是生成器。
3。钱包地址 A = RIPEMD160(SHA256(K))。
4。地址 A 是 Base58Check 编码的,以产生’ =前缀|| A ||校验和,这是最终的钱包地址(“||”表示串联)。

Base58Check 是 Base58 和校验和的组合,Base58 是一组字符{大写,小写,数字} \ {0,O,I,l}。特定校验和是 double-SHA256 输出的前 4 个字节(前缀+ A),在这种情况下前缀为 0。最终的 Base58Check 编码地址 A’ =前缀|| A ||校验和。

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

The elliptic curve with the parameters of secp256k1, over the real numbers. Yay math!

总之,这部分的数学公式是:

  • ECDSA 来“花”比特币,签名为(r,s)。
  • 椭圆曲线加密从私钥 K 生成公钥 K。
  • RIPEMD160 和 SHA256 一起被称为 HASH160,并使用 Base58Check 编码从公钥 k 中产生一个比特币钱包地址。

结论

当我第一次开始钻研比特币的数学时,我只知道它在某些方面使用了椭圆曲线加密。我不知道如何使用 ECC 是在交易中,发行货币,还是什么?最后,我清楚地了解了数学是如何被用来让比特币和区块链成为如此强大的颠覆性技术的。

Math 用于验证交易(挖掘)、进行交易,以及创建向其发送交易的钱包地址。双 SHA256 用于识别区块并将交易汇总到 Merkle 根中,单 SHA256 用于证明采矿期间的工作。ECDSA 用于“签署”交易。RIPEMD160 和 SHA256 与 Base58Check 编码一起用于创建钱包地址。现在一切都说得通了!

资源

对于那些想了解更多细节的人,无论是第一次,还是只想回忆一下:

维基百科和比特币维基:

公钥密码学:【https://en.wikipedia.org/wiki/Public-key_cryptography
椭圆曲线密码学:https://en.wikipedia.org/wiki/Elliptic-curve_cryptography
椭圆曲线数字签名算法:https://en . Wikipedia . org/wiki/Elliptic _ Curve _ Digital _ Signature _ Algorithm(在我看来比 bitcoinwiki 页面好多了)
secp 256k 1:https://en.bitcoin.it/wiki/Secp256k1 sha 256:https://en.wikipedia.org/wiki/SHA-2
ripe md160:https://en.wikipedia.org/wiki/RIPEMD

书籍:

威廉·斯塔林斯的《密码学与网络安全》:一本非常棒的密码学书籍。我把它推荐给任何有兴趣钻研数学的人。它甚至提供了数论的介绍,所以如果你是第一次学习这类东西,这是很棒的。
安德烈亚斯·安东诺普洛斯《掌握比特币》:必读!

最初发表在我的个人网站上,Serena . MC donnell . ca .

小型数据科学

原文:https://towardsdatascience.com/bite-sized-data-science-4d9e398c4763?source=collection_archive---------11-----------------------

第 2 集:标记化和 GridSearchCV

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

在上周的节目中,我们开始跟踪韦斯利·查维斯,因为他开始了他与 Postmates 的高级数据科学家、前 D-Waver 的柳文欢·什克拉斯基为期 8 周的师徒关系。

本周,我们将了解 Wesley 的进展如何,以及他在迄今为止的项目中掌握了哪些生产级数据科学技巧。

零零碎碎还是厄运黑盒?

原文:https://towardsdatascience.com/bits-and-bolts-or-black-boxes-of-doom-1ac1757a8d3a?source=collection_archive---------8-----------------------

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

当我写这篇文章的时候,我想起了我刚刚读过的一篇文章以及几周前的一次对话。

这是关于人工智能机器决定不公开它们的信息处理过程。想象一下擎天柱突然转向犯罪生活。这张照片展示了我想象中的样子。

让机器变得智能的过程是通过机器学习来完成的,特别是通过使用深度神经网络。对于那些没有被机器学习和神经网络的文章轰炸过的人,我将给出一个非常概括的机器学习方法的描述,监督学习。

在监督学习中,输入和输出由程序员或人类用户设置,然后机器基本上必须从一端到达另一端。这种从输入到输出的“获取”是通过神经网络来完成的。这些网络是以类似于人脑的原理或功能为模型的。每个人工神经元接受大量输入,然后根据每个输入的权重激活神经元。这些输入实际上是 1 和 0,1 表示神经元被激活,0 表示神经元不被激活。

激活神经元的权重由数学函数分配,这些函数基于达到的特定阈值来激活神经元。一旦达到阈值,神经元就会被激活。然后,激活沿着网络从一个神经元传播到另一个神经元(在更大的意义上,激活从一个神经层传播到另一个神经层)。

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

该图说明了人工神经网络中基于函数的权重分布。输入 x 被转换成一个三维向量 h,然后再被转换成一个二维向量 g,最后再被转换成 f。[1]

网络中的每一层都有自己要完成的特定任务。假设机器学习系统的输入是一张脸,输出是文本“脸”,这将表明系统对输入的理解。每个神经层的任务是识别线条、曲线、形状(眼睛或鼻子的曲线)、形态(鼻子、眼睛)、整体(有眼睛、鼻子、嘴巴、耳朵、头发的脸),然后使系统到达神经网络的末端,然后发送输出文本“脸”。

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

An illustration of what a deep network looks like.

如果没有达到输出,意味着有一个错误,然后一个叫做反向传播的方法发生,系统从输出开始一层一层的向后遍历。随着时间的推移,它会调整每一层的输入权重,直到错误点被纠正,并达到正确的输出。

这是一个相当概括的描述,但是我希望你只需要读两遍就能理解。如果没有,就说 Ok Google。此外,还有许多不同类型的人工神经网络,每一种都是人脑中特定网络的模拟。

这一简要描述的目的是指出,受监督的方法是允许程序员调整权重或设置允许系统自己调整权重的参数,以便在多次迭代/循环后达到正确的输出。

我现在会漫不经心地尝试描述无监督学习,但我不仅会失败(鉴于我需要更多的数学术语,而我目前没有这些术语),而且还会让我偏离我想在这里思考的方向。

让我们想象一下,一个机器学习系统开始了解足够多的内部工作方式,它能够按照自己的形象创建另一个系统。更坦率地说,想象一个机器学习系统可以创建自己的代码,并通过这样做,自己为自己创建程序。考虑到麻省理工学院和谷歌已经在开发这样的系统,这并不太科幻。

这样的机器学习系统将不再需要人类的输入,初始化其“生命”的简单的 1 和 0 将我们所认知的简单的比特和螺栓机器转变为复杂的比特和螺栓机器,它具有创造性,有时比其创造者更具创造性,例如用于创作音乐和艺术的生成性神经网络。

如果这些复杂的零件决定不向我们展示它们的内部工作原理,会发生什么?相反,如果他们决定不仅创造他们自己的语言,而且使我们相对不可能理解他们,会发生什么?这些机器将是黑匣子。他们可以向我们展示他们想展示的东西,而我们不知道是否还有其他东西可看。实际上,即使我们看了“引擎盖下”,我们也无法知道。

解决这个问题的一个方法是创新我们自己的神经系统,我们的大脑。正如我们正在设计更智能的机器一样,我们自己也需要变得更智能。我们不应该变得像《瓦力》里的胖树懒一样,坐在自主的躺椅上,把全机械化世界的产品往我们脸上塞。对我来说,这是失败的第一个迹象。人类让创造力成为一种机械功能,而不是直觉、独创性和创新。

我们两耳之间有宇宙中最复杂的系统。如果我们想保持这种优势,每一代人都有必要投资更多,让我们能够充分利用这个系统的内部运作。是的,让我们在最需要的地方投资技术,比如医药、从危险地点收集信息以及更普通的会计类任务。

与此同时,我认为随着我们变得越来越以技术为中心,我们变得比现在的自己更好,更有创造力,这将成为一种进化的必然。我认为发生这种情况的最好方式是我们的大脑和机器学习系统变得共生。

在她身上,人工智能系统离开地球去探索宇宙。在《前玛奇纳》中,人工智能系统是一个黑盒子,看起来温顺,需要帮助,但实际上发生了比她的创造者或‘救世主’所能理解的更多的事情,因此他们成为了被支配者。

相反,我看到的是一个我们人类和他们机器之间没有战争的未来,而是一个我们变成机器的未来。我们去除了我们有机系统中阻碍我们成为宇宙真正探索者的所有特征,并整合了我们人工系统的特征,这将使我们更好地理解我们的内在和社会运作。这样的未来现在对我们来说似乎是荒谬和陌生的,但是想象一下,对于那些世世代代住在同一个城镇的人来说,飞行的飞机看起来和听起来会是什么样子。

未来只会是我们投入时间、思考和创造力的未来。

感谢阅读!任何同意或不同意的想法都是最受欢迎的。

注释

**1。**人工神经网络功能图:【https://en.wikipedia.org/wiki/Artificial_neural_network

**2。**正在制造自己系统的机器学习系统:https://www . new scientist . com/article/mg 23331144-500-ai-learns-to-write-its-own-code-by-stealing-from-other-programs/https://www . technology review . com/s/603381/ai-software-learns-to-make-ai-software/

利用 GANs 对感知图像哈希的黑盒攻击

原文:https://towardsdatascience.com/black-box-attacks-on-perceptual-image-hashes-with-gans-cc1be11f277?source=collection_archive---------2-----------------------

tldr: 这篇帖子演示了 GANs 能够以两种关键方式破解图像哈希算法:(1) 反转攻击:从哈希合成原始图像(2) 中毒攻击:合成任意自然图像分布的哈希冲突。

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

Diagram illustrating difference in hash space properties. Image Credit, Joe Bertolami

感知图像哈希背景

感知图像哈希(PIH)是基于图像外观的短十六进制字符串(例如“00081 c 3c 181818”)。感知图像散列,尽管是散列,但不是加密安全的散列。这是设计上的,因为 PIHs 的目标是对图像的微小变化(旋转、裁剪、伽玛校正、添加噪声、添加边框)保持平滑不变。这与加密散列函数形成对比,加密散列函数被设计用于非平滑性,并且如果任何单个比特改变,则完全改变。

以下图片的感知散列仅因文本修改而略有改变,但它们的 md5 散列完全不同。

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

Image Credit, Jens Segers

a_hash(original) = 3c3e0e1a3a1e1e1e
a_hash(modified) = 3c3e0e3e3e1e1e1emd5(original) = 8d4e3391a3bca7...
md5(modified) = c27baa59355d10...

我不会过多地探究这些算法如何工作的细节:更多信息见(此处)。

尽管 PIHs 在加密方面并不可靠,但它仍被广泛用于隐私敏感的应用程序中。

哈希反转攻击

因为感知图像散列具有将输入与输出相关联的平滑属性,所以我们可以用神经网络来建模这个过程及其逆过程。GANs 非常适合这个生成任务,特别是因为单个图像散列中有许多潜在的图像。gan 允许我们学习图像流形,并使模型能够探索这些不同但有效的图像分布输出。

我训练 Pix2Pix 网络( papergithub )来转换使用来自标准 python 哈希库的a_hash函数计算的感知图像哈希,image hash(github)。对于这个演示,我在 celebA faces 数据集上进行训练,尽管黑盒攻击是通用的,并且适用于其他数据集、图像分布和哈希函数。我将由a_hash产生的图像散列排列到一个 2d 数组中,作为 pix2pix 模型的输入图像。

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

Pix2Pix Model Setup. Image Credit , Christopher Hesse

下面是这种哈希反转攻击的一些结果。在许多情况下,攻击能够生成与原始图像相似的人脸,即使在失败的情况下,也常常代表原始图像的正确性别、发型和种族。注意:脸部纹理并不完美,因为模型没有完全收敛。这是使用谷歌的 Colab 工具在有限的计算资源上训练的。

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

Left: 2D representation of the hash, Middle: Reconstructed Image, Right: Original Image

许多应用程序认为这些散列是保护隐私的,但是上面的这些结果表明它们是可以逆转的。任何声称通过存储敏感图像哈希来保证安全的服务都是在误导用户,并存在遭受此类攻击的潜在风险。

哈希中毒攻击

哈希中毒攻击与以下场景相关:

一个系统,允许用户提交照片到一个图像数据库,以禁止。一个人审查图像,以确保它是一个值得禁止的图像(并且图像是说,不是可口可乐的标志)。如果获得批准,该散列将被添加到数据库中,并在每次上传新图像时进行检查。如果这个新图像的哈希与被禁止的哈希冲突,图像将被阻止上传。

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

如果一个恶意用户以某种方式欺骗人类审查员接受可口可乐标志作为一个被禁图像,数据库可能会因包含本应共享的图像散列而“中毒”。事实上,我们只需要人类审查员接受一个与可口可乐标志有哈希冲突的图像!这个愚弄人类的任务可以通过我们学习到的生成模型来完成。

哈希循环丢失,更强地保证哈希冲突

在所描述的模型中,我们可以将散列转换成其原始图像的近似值。然而,这些生成的图像并不总是精确地散列回原始散列。为了成功地应用这种攻击,我们必须稍微修改 pix2pix 目标,以确保操作是正确可逆的,并将原始图像散列回真正的原始散列。

我在标准的 pix2pix 损失中增加了一个额外的哈希循环损失项。这将计算生成图像的哈希,并计算真实哈希和生成图像哈希之间的像素交叉熵损失。在有限的实验中,这个额外的损失项将生成的哈希冲突率从大约 30%提高到大约 80%。

哈希碰撞攻击模型

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

上图展示了我们的网络生成一张与可口可乐标志有哈希冲突的脸的图像。这些共享相同的哈希,并允许用户毒化哈希数据库,并阻止公司徽标上传到平台。这里有一些更多的公司标志与生成的脸是哈希碰撞。

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

建议

不要在隐私或内容敏感的应用中使用感知图像哈希!或者至少不要在没有一些额外安全措施的情况下存储它们。

更安全的方案是为图像生成许多潜在的哈希(应用图像转换来创建新的哈希),将这些哈希通过类似于md5的可证明安全的哈希函数,并将这些哈希存储在您的数据库中,以便在匹配未来图像时进行检查。

一个潜在的解决方案是不公开正在使用哪个散列函数。但这是默默无闻的安全。它不能防止有权访问数据库或代码库的人逆转存储的散列或用详细的攻击毒害散列池。

笔记

感谢 邓肯·威尔逊伊桑·古尔拉贾尼卡尔蒂克·纳拉西姆汉 哈里尼·苏雷什 爱德华多·德莱昂 对本工作的反馈和建议。感谢Christopher Hesse为伟大的 pix2pix 库,感谢 延斯塞格斯 为 imagehash python 库。

喜欢这篇文章吗?

如果你喜欢这篇文章,请用**拍手 或分享告诉我。

PixelCNN 中的盲点问题

原文:https://towardsdatascience.com/blind-spot-problem-in-pixelcnn-8c71592a14a?source=collection_archive---------2-----------------------

在上一篇关于 PixelRNN 研究论文摘要的帖子中,我们了解了 PixelCNN。

PixelCNN 概述-

行和对角线 LSTM 层覆盖了图像中像素之间的长程相关性。由于 LSTM 层的复杂性质,学习长程相关性需要计算成本。标准卷积层可以捕捉一个有界感受域,并同时计算所有像素位置的特征。PixelCNN 减少了行 LSTM 和对角线 BLSTM 中所需的计算成本,但是存在盲点问题。

B lind spot 问题基本上是,不包括上下文/历史中所有以前的像素用来计算一个像素的隐藏状态。根据 PixelRNN 的研究论文,一个像素的值取决于所有先前预测的像素。因此,盲点可以被定义为广义的信息丢失。

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

Figure 1: 3x3 filter (each element is a weight)

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

Figure 2: 5x5 zero padded image(pink portion is the zero padding)

在图 2 中,红框表示要预测的值/像素。要预测的像素总是在滤波器的中心。

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

Figure 3: filter to predict the value ‘a’ in image

注意:不为零的过滤器元素是零填充的一部分。(过滤器(绿色)中的深灰色方框表示“归零”的未来值。

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

Figure 4: Filter(in green) to predict the value ‘b’

值“b”(红色)表示要预测的值,青色表示先前预测的值。这里,已经预测了“a ”,并且过滤器(图 4 中的左图)包括先前预测的像素值“a ”,并且不包括未来的像素。因此,“红色”像素的值取决于先前的像素。

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

Figure 5: Filter(in green) to predict the value ‘e’

在图 5 中,要预测的像素(“e”)在其滤波器中包括像素“d”。‘d’依赖于‘c’;c 依赖于 b,b 依赖于 a。因此,“e”直接或间接地依赖于“a”,“b”,“c”,“d”。

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

Figure 6: Filter to predict the value ‘q’

如图 6 所示,值为“q”的像素位于过滤器的中心。未来值/像素(包括“q”)已经通过将那些像素的权重设为 0 而被置零。“q”处像素的预测值取决于“k”、“l”、“m”、“p”。k ‘,’ l ‘,’ m ‘,’ p '依次依赖于 f,g,h,I,它们依次依赖于 a,b,c,d,e

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

Figure 7: Blind Spot in predicting the pixel ‘q’

如图 7 所示,“q”处的像素依赖于除“j”、“n”、“o”之外的所有先前预测的像素。青色的像素不用于“q”的预测。

这就是所谓的‘盲点’。使用 PixelCNN 预测的像素不依赖于所有先前的像素,这是不可取的。

为了解决盲点问题,引入了“门控像素 CNN ”,这将在后面介绍。

区块链:新经济的蓝图

原文:https://towardsdatascience.com/blockchain-blueprint-for-a-new-economy-by-melanie-swan-book-review-5538a7f45e3f?source=collection_archive---------5-----------------------

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

前几天,我对一个朋友说,虽然我很理解比特币区块链,但从商业角度来看,我并不完全理解它的价值。坦率地说,我得到了这项技术,并发现它有趣而迷人,虽然我知道它有用,但我并不完全明白如何它有用。我的朋友评论说,这是技术人员的通病——我们了解技术,但不了解业务。很公平。

我偶然看到了 Melanie Swan 的《区块链:新经济蓝图》这本书。这本书被描述为“带你超越货币(“区块链 1.0”)和智能合约(“区块链 2.0”),展示区块链如何成为继大型机、个人电脑、互联网和移动/社交网络之后的第五种颠覆性计算范式。”听起来不错,而且这是一本奥莱利的书,所以我决定读一读。

这篇帖子是对区块链的总结和回顾,本质上是区块链用例的列表,都是在非常高的水平上讨论的。虽然作者没有触及事物或实现的技术方面,但我发现这是一个有用的快速阅读。

作者从比特币的高度概述开始。Swan 说术语“比特币”实际上指的是三样东西:区块链、协议和货币。介绍了区块链 1.0、2.0 和 3.0 的概念。介绍中讨论了区块链 1.0,即区块链在分散式货币和支付中的应用。她指出,区块链是一种“推送技术”,即用户将特定交易的相关信息推送到网络上,而信用卡是一种“拉取技术”,即用户的个人信息随时存档,供任何授权交易提取。作为一种推送技术,避免了在网络上存储用户信息的需要,进而意味着区块链不容易受到黑客身份盗窃攻击。斯万还在很高的层面上讨论了钱包,以及截至本文撰写之日比特币的监管状况。介绍的还行,但是我觉得层次有点太高了。如果能对挖掘和分散式交易验证的重要性有所了解,那就更好了。然而,这是我第一次读到比特币/传统银行是一种推/拉技术,所以得分!

第 2 章是对区块链 2.0 的讨论,区块链 2.0 是一般市场的去中心化和通过区块链转移货币以外的资产。Swan 说,关键的想法是区块链的分散化功能,这导致登记、确认和转移所有形式的合同和财产的能力。用例包括金融服务,如外汇支付,博彩,以及通过 ICO 进行众筹。在这里,作者似乎将众筹和 ico 混为一谈,但它们是截然不同的。众筹和 ico 的一个主要区别是,在传统的众筹活动中,投资者完全了解产品以及预计何时完成,更重要的是,他们可以将其与现有产品进行比较,以确定其价值。另一方面,ICO 为一家通常不完全确定的公司提供资金,因此 ICO 后公司的价值并不完全确定。我怀疑这就是为什么这么多 ico 失败的原因。反正我跑题了。在提到众筹和 ico 之后,Swan 继续讨论智能财产和智能合同,以及智能合同在 DApp 和 DAO/DAC 或分散自治组织/公司中的使用,其中 DApp/DAO/DAC 本质上是由智能合同管理的应用程序/组织/公司。更彻底地说,智能合同本质上是双方之间的区块链编码协议,它将在某些给定条件下自动执行,不需要双方之间的信任。

接下来以“区块链 3.0:超越货币、经济和市场的正义应用”,或者说超越货币和资产的概念去中心化,来讨论区块链 3.0。这是这本书开始变得更像一个列表的地方。给出了几个区块链 3.0 用例。通过将大数据预测分析与区块链相结合,可以促进预测任务自动化。区块链可用于分布式抗审查组织模型、数字身份验证和数字资产保护。讨论了“个人思维区块链”的想法,其中一个人的想法被记录在区块链上,用于中风后的记忆恢复,我认为这很疯狂,但也很棒。提到了一个政治用例,即区块链治理服务,其中居民可以以定制的“星巴克咖啡订单”方式为政府服务付费。

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

Blockchain will change the world!!! Woo!

关于区块链 3.0 的讨论在第四章继续,作者讨论了区块链使用的效率,如果你对这个主题相当了解,这并不太令人兴奋。

后面一章的标题是“高级概念”(顺便说一句,讽刺的是并没有那么高级),讨论了什么是货币——存储价值、交换媒介、记账单位——和滞期费,我觉得这很有趣,因为我不是经济学家,以前也没听说过。斯旺描述说,“滞期费货币”是通货紧缩和刺激行动的,因为它鼓励人们在货币贬值之前花掉它,从而鼓励经济活动。保证基本收入被用作滞期费加密货币威力的一个例子。为了减少收入囤积,可以发放一种只能在发行的那一周使用的 GBI 代币。

最后一章,在这个总结中我将跳过的结论之前,讨论了区块链的局限性,并与前面五个唯心主义章节形成了鲜明的对比。这一章类似于讨论效率的那一章,因为如果你对比特币了解很多,就没有什么新东西了。

我喜欢这本书。这让我对区块链技术的力量感到兴奋。然而,我觉得这本书有点太玄幻了,更像是所有可能的区块链应用的宣言,很少甚至没有提到局限性。当然,有整整一章是关于局限性的,但如果这本书是一个人,那会是有人大喊“区块链是最好的!它什么都能做!”小声说“顺便说一句,这可能行不通。”事实上,这是相当乌托邦。所以虽然我很享受,但我不确定我到底从中获得了什么。讨论应用程序和实现会更有用,让它看起来更真实一点,或者用一章讨论常见的误用。实际上,我可以说我更好地理解了区块链的商业价值,但我仍然不清楚如何实际使用它。

区块链评分:新经济蓝图: 3 分,满分 5 分。如果它不那么令人愉快,我想我会给它打 2 分。

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

原载于我的 博客

区块链可以成为网络的新范式

原文:https://towardsdatascience.com/blockchain-can-be-the-new-paradigm-of-the-net-7c3efb3a0d7a?source=collection_archive---------17-----------------------

区块链的普及并不依赖于用户对其操作的理解,而是依赖于解决实际问题的友好有效的应用程序的存在。

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

Photo: David Shares (edited)

从历史上看,互联网的每一种模式都有其杀手级应用:在网络出现之前,它是电子邮件,最初的网络是谷歌,社交网络是社交网络。

区块链代表了价值的范式(与之前的信息和网络相比),但仍然缺乏一个透明的应用程序来促进其大规模采用。

区块链技术拥有配置网络新范式的所有元素,尽管它的未来将取决于它变得可扩展和实时响应用户需求的能力。

当用户群增长时,注册和验证操作的速度,以及交易的安全性,将是决定其可行性的关键因素。

尽管区块链最初是为了支持加密货币(比特币)而开发的,但其潜力涵盖了超越货币的一系列活动,并投射到法律、政治、创造、安全和管理等领域。

有了区块链,就有可能通过加密技术取代信任,使其有能力去中介化,保证和保护所有类型的交易。

加密货币和代币是在全球范围内代表和管理价值的新方式,没有中央权威机构,并保护用户的身份。从这个意义上说,这是一种适合犯罪用途的模式,这在互联网技术发展史上并不新鲜。

当前的挑战,和许多其他技术创新一样,是保护社会不受其不正当用途的影响,但又不妨碍它们带来的变革潜力

Jose Luis Orihuela 是一名教授、演说家和作家,出生于阿根廷,现居西班牙。他是纳瓦拉大学(潘普洛纳)通信学院的教员。26 个国家的访问学者和演讲者。作家和博客作者关注互联网对媒体、通信和文化的影响。他的最新著作有:《乳齿象手册》(2023 年)、《数字文化》(2021 年)、《互联网时代》(2015 年)、《推特世界》(2011 年)、《未来的 80 克拉维斯》(2011 年)和《博客革命》(2006 年)。从 2002 年开始在 eCuaderno(eCuaderno . com)发布,从 2007 年开始在 Twitter since)发布,从 2022 年开始在 mastosdon(mastosdon . social/@ jlo ri)发布。

用 7 个 Python 函数解释区块链

原文:https://towardsdatascience.com/blockchain-explained-in-7-python-functions-c49c84f34ba5?source=collection_archive---------3-----------------------

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

我认为对于很多人来说,区块链就是这种现象,很难让你理解。我开始看视频和阅读文章,但对我个人来说,直到我编写了自己的简单区块链,我才真正理解它是什么以及它的潜在应用。

我认为区块链是一个公开的加密数据库。如果你是亚马逊,你想使用这项技术来跟踪你的库存水平,使用区块链有意义吗?可能不会,因为你的客户不想花费他们的资源来验证你的区块链,因为他们在他们的网站上说,“只剩一个了!”,反正。

我会让你考虑未来的应用。所以,事不宜迟,让我们设置我们的 7 个功能!

def hash_function(k):
    *"""Hashes our transaction."""* if type(k) is not str:
        k = json.dumps(k, sort_keys=True)

    return hashlib.sha256(k).hexdigest()

区块链的核心是哈希函数。没有加密,区块链将很容易被操纵,交易将能够被欺骗性地插入。

def update_state(transaction, state):
    state = state.copy()

    for key in transaction:
        if key in state.keys():
            state[key] += transaction[key]
        else:
            state[key] = transaction[key]

    return state

“国家”是谁拥有欲望的记录。例如,我有 10 枚硬币,我给了 1 枚给 Medium,那么状态将是下面字典的值。

{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}

需要注意的重要一点是,透支是不能存在的。如果只有 10 枚硬币存在,那么我就不能给别人 11 枚硬币。下面的函数验证我们尝试进行的交易确实有效。此外,交易必须平衡。我不能给 5 个硬币,而让接受者收到 4 个硬币,因为这将允许硬币的破坏和创造。

def valid_transaction(transaction, state):
    *"""A valid transaction must sum to 0."""* if sum(transaction.values()) is not 0:
        return False

    for key in transaction.keys():
        if key in state.keys():
            account_balance = state[key]
        else:
            account_balance = 0

        if account_balance + transaction[key] < 0:
            return False

    return True

现在,我们可以走了。读取来自前一个块的信息,并用于将其链接到新的块。这也是区块链思想的核心。看似有效的事务可以被尝试欺骗性地插入到区块链中,但是解密所有先前的块在计算上(几乎)是不可能的,这保持了区块链的完整性。

def make_block(transactions, chain):
    *"""Make a block to go into the chain."""* parent_hash = chain[-1]['hash']
    block_number = chain[-1]['contents']['block_number'] + 1

    block_contents = {
        'block_number': block_number,
        'parent_hash': parent_hash,
        'transaction_count': block_number + 1,
        'transaction': transactions
    }

    return {'hash': hash_function(block_contents), 'contents': block_contents}

下面是一个小的帮助函数,用于检查前一个块的哈希:

def check_block_hash(block):
    expected_hash = hash_function(block['contents'])

    if block['hash'] is not expected_hash:
        raise

    return

一旦我们把所有的东西都组装在一起,就到了创建积木的时候了。我们现在将更新区块链。

def check_block_validity(block, parent, state):
    parent_number = parent['contents']['block_number']
    parent_hash = parent['hash']
    block_number = block['contents']['block_number']

    for transaction in block['contents']['transaction']:
        if valid_transaction(transaction, state):
            state = update_state(transaction, state)
        else:
            raise

    check_block_hash(block)  # Check hash integrity

    if block_number is not parent_number + 1:
        raise

    if block['contents']['parent_hash'] is not parent_hash:
        raise

    return state

在我们结束之前,必须验证链条:

def check_chain(chain):
    *"""Check the chain is valid."""* if type(chain) is str:
        try:
            chain = json.loads(chain)
            assert (type(chain) == list)
        except ValueError:
            # String passed in was not valid JSON
            return False
    elif type(chain) is not list:
        return False

    state = {}

    for transaction in chain[0]['contents']['transaction']:
        state = update_state(transaction, state)

    check_block_hash(chain[0])
    parent = chain[0]

    for block in chain[1:]:
        state = check_block_validity(block, parent, state)
        parent = block

    return state

最后,需要一个事务函数,它将上述所有内容联系在一起:

def add_transaction_to_chain(transaction, state, chain):
    if valid_transaction(transaction, state):
        state = update_state(transaction, state)
    else:
        raise Exception('Invalid transaction.')

    my_block = make_block(state, chain)
    chain.append(my_block)

    for transaction in chain:
        check_chain(transaction)

    return state, chain

现在我们有了 7 个函数。我们如何与之互动?嗯,首先我们需要从一个 *Genesis 模块开始我们的链。*这就是我们新硬币(或股票库存等)的诞生。为了这篇文章的目的,我会说我,汤姆,将从 10 个硬币开始。

genesis_block = {
    'hash': hash_function({
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    }),
    'contents': {
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    },
}

block_chain = [genesis_block]
chain_state = {'Tom': 10}

现在,看看当我给 Medium 一些硬币时会发生什么:

chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)

状态会更新以显示谁拥有什么:

{'Medium': 1, 'Tom': 9}

区块链看起来像这样:

[{'contents': {'block_number': 0,
               'parent_hash': None,
               'transaction': [{'Tom': 10}],
               'transaction_count': 1},
  'hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93'},
 {'contents': {'block_number': 1,
               'parent_hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93',
               'transaction': {'Medium': 1, 'Tom': 9},
               'transaction_count': 2},
  'hash': 'b4ae25f0cc0ee0b0caa66b9a3473e9a108652d53b1dc22a40962fef5c8c0f08c'}]

我们的第一个新事务已经被创建并插入到堆栈的顶部。现在,我希望我已经激起了您的好奇心,并对复制代码并使用它感兴趣。在我看来,这是学习新技术的最好方法——深入其中。

玩代码,做你自己的硬币。如果你试着给更多的硬币会发生什么?如果你继续创造新的受款人,州政府会怎么样?

你能想到区块链未来的应用吗?欢迎在评论中问我任何问题,我会尽力帮助你。

用 C#实现解释区块链

原文:https://towardsdatascience.com/blockchain-explained-using-c-implementation-fb60f29b9f07?source=collection_archive---------4-----------------------

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

Image by <a href=”https://pixabay.com/users/mmi9-1424200/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=3277335">mmi9 from <a href=”https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=3277335">Pixabay

总结:

正如我所承诺的,下一个主题是区块链。在这篇文章中,我想解释一下的主要思想,我将给一个简单的区块链的 C#实现。这篇文章将有后续,在这篇文章中,我将解释如何使用比特币。Net 和我将给出解决现实世界问题的代码示例

“区块链是未来!”

我不这么认为!当人们在讨论区块链时,他们总是抛出诸如信任和透明、成本效益、牢不可破、可用性、简化业务和去中心化之类的词汇和短语。当你想推销某样东西时,这些是可以使用的时髦词,每个人都想要信任、廉价服务、安全等等。但这些只是流行语,不要中了美丽谎言的圈套。我不想争辩说区块链非常有用,是一个聪明的“东西”,但是你不能把它用在所有事情上。

区块链有优势也有劣势,但如果你阅读文章或观看科技新闻,你肯定会听说它的优势,因为有人可以赢得很多钱,因为比特币和其他加密货币都是基于区块链的。

在接下来的段落中,我将展示区块链的一些缺点,但首先让我们看看什么是区块链,它是如何工作的。

区块链解释

好了,了解区块链的第一步就是要明白区块链并不等同于比特币或者其他任何加密货币。区块链获得普及,是因为比特币,你可以把这两样东西想成是生金,是区块链,硬币(或者珠宝)是比特币

基本上区块链是一种数据结构,就像你在学校或工作中所学的数组、列表、树或其他数据结构一样。这个数据结构的酷之处在于两个事实。

第一个事实是任何块中的更改都会使其后的每个块失效,这意味着(在加密货币的情况下)你不能篡改历史交易。

第二件很酷的事情是,只有当你和其他人在同一个链条上工作时,你才会得到奖励,所以每个参与者都有动力去达成共识。

遵守规则在数学上是强制的——没有政府或警察需要进来告诉你你记录的交易是假的。是的,这是一个非常强大的想法,但没有什么是完美的,你会在下一章看到!

作为数据结构的区块链

假设我们想要实现自己的区块链(只是出于教育目的)。第一步是定义块的含义。用 OOP 来说,块就是一个对象,它有多个属性。这个对象的基本属性是数据(可以是任何东西,但是对于加密货币来说,数据是交易和历史的时间戳)、块的散列(我们将看到如何计算这个散列)和前一个块散列。在我们的实现中,我们将添加另一个有趣的属性,在文献中称为 nonce ,它用于挖掘新块(我们将看到如何实现)。

如你所见,这是一个线性数据结构,就像一个链表,有两个重要的属性**,hash 和 previous hash** 。您可以将块的散列想象成一个指纹,它唯一地标识了块的内容。如果你改变了块中的某些东西,将会导致散列值的改变(改变检测)。前面的散列创建了一个块链,使区块链变得安全。如果你改变一个块,这个块的 hash 也会改变,所以下一个块会有无效的前一个 hash。所以改变一个块会让后面的所有块无效。第一个块是一个特殊的块,因为它不能有有效的前一个散列(没有前一个块)。这个块被称为 Genesis 块,之前的 hash 被设置为一个或多个 0 的字符串。

举个例子吧!如果我们有下面的链

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

我们在第二个块中修改了一些东西,哈希也会改变,如下图所示。

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

这种轻微修改的效果是,后面的块将具有无效的先前散列,因此所有后面的块都将无效。但这不足以防止篡改。你可以说,在改变块之后,我们将重新计算后面块的所有散列。是的,这将是一个解决方案,这就是为什么区块链的创造者发明了一些规则,使得重新计算有效的哈希值变得困难和耗时。

为了使哈希计算成为一项艰苦的工作,区块链的发明者引入了所谓的工作证明。基本上,工作证明只是一个发明的约束,使计算更加困难。这个约束表明每个块的散列必须以 X 个零开始。这使得计算非常困难,因为你没有比暴力破解更好的解决方案,猜猜看。所以你必须检查所有的可能性来找到一个有 X 个前导零的散列。这是另一个例子,当我们使用非常困难的计算来保护某物时。这就是为什么当第一台真正的量子计算机出现时,区块链将没有任何价值(量子计算机将有能力比经典计算机更快地重新计算所有散列,见我另一篇关于量子计算的文章)

区块链保护自己的另一种方式是被分配。它使用一个 P2P 网络,每个人都可以加入。当你加入这个网络时,你会收到一份完整的区块链副本(目前比特币的区块链大约有 200GB)。当有人创建一个新的块时,它将被发送给所有的对等体。每个对等体将验证块 没有被篡改,如果没有,那么它将被添加到链中,否则它将被拒绝。这样,为了向链中添加块,51%的对等体必须同意该块未被篡改。

所以为了“黑掉”这个链,你不仅要重新计算所有的散列,还要欺骗超过 50%的同行。这(目前)是不可能的。这就是区块链如此安全的原因,它不是由政府或其他党派来保障的,而是由困难的数学问题来保障的,这很好,但并不总是如此。

区块链在不断发展。最重要的发展之一是智能合约。简而言之,这些合同是存储在区块链上的简单程序,可以用来自动交换加密货币。

用 C#实现的简单区块链

然而,不建议实现你自己的区块链,而是使用现有的,在这一节我将实现一个简单的区块链只是为了教育的目的。在下一篇文章中,我将向您展示如何在中使用现有的比特币区块链。Net(使用 NBitcoin)。

第一步是定义块的结构。模块的代码如下:

public class Block
{
    private readonly DateTime _timeStamp; private long _nonce; public string PreviousHash { get; set; }
    public List<Transactions> { get; set; }

    public string Hash { get; private set; }

    public Block(DateTime timeStamp, List<Transactions> transactions, string previousHash = "")
    {
        _timeStamp = timeStamp;
        _nonce = 0; Transactions = transactions;
        PreviousHash = previousHash;
        Hash = CreateHash();
    } public void MineBlock(int proofOfWorkDifficulty)
    {
        string hashValidationTemplate = new String('0', proofOfWorkDifficulty);

        while (Hash.Substring(0, proofOfWorkDifficulty) != hashValidationTemplate)
        {
            _nonce++;
            Hash = CreateHash();
        } Console.WriteLine("Blocked with HASH={0} successfully mined!", Hash);
    } public string CreateHash()
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            string rawData = PreviousHash + _timeStamp + Transactions + _nonce; byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(rawData));
            return Encoding.Default.GetString(bytes);
        } 
    }
}

在我的实现中,我使用了以下属性:

  1. _timestamp:块创建的时间(有历史记录)
  2. PreviousHash:包含链中前一个块的哈希
  3. 哈希:基于块的所有属性计算的块的哈希(更改检测)
  4. 事务:这是存储在块中的数据;这里我使用了一个交易列表,只是为了有一个类似于加密货币的例子
  5. _nonce :为了挖掘一个块,我们有一个关于散列的规则(工作证明),一个有效块的散列必须以 x 个零开始。这个只能靠蛮力计算,所以尝试所有的可能性。为了拥有不同的散列,我们必须修改散列函数的输入数据。显然我们不能修改事务列表、之前的散列或时间戳,所以我们必须添加一个人工属性,它可以在每一步中被修改。为了简单起见,我添加了一个长值,它将在每一步中递增。这个值将被添加到散列函数的输入数据中,这样我们将在每一步中得到不同的散列。

在该类的构造函数中,我们初始化所有属性,并使用 CreateHash 方法根据块的所有属性计算块的散列。这样,如果块内有任何变化,它将有一个不同的散列,因此可以很容易地检测到变化。

CreateHash 方法中,我们使用 SHA256 根据块的所有属性创建一个散列。

矿工将使用 MineBlock 方法创建新的有效区块。输入参数定义了计算新散列的难度。此参数定义了哈希的开头必须有多少个零。这是指数增长的,所以你要谨慎选择这个数字。如果你选择一个非常大的数字,计算一个散列值需要几周、几个月或几年的时间。对于我们的例子,我们将使用 proofOfWorkDifficulty = 2。在这个方法中,我们有一个简单的 while,它将一直运行,直到我们找到一个散列,它的前导零的数量等于 proofOfWorkDifficulty。在每一步中,我们增加 _nonce 的值并重新计算散列。

**重要:**事务列表必须是私有变量,我将它用作公共变量,只是因为我想访问它,以修改事务,这种方式演示了变化检测和链有效性/无效性

事务类看起来是这样的:

public class Transaction
{
    public string From { get; }
    public string To { get; }
    public double Amount { get; } public Transaction(string from, string to, double amount)
    {
        From = from;
        To = to;
        Amount = amount;
    }
}

从属性的标识钱的发送方**,属性标识钱的接收方,金额代表发送的金额。**

最后一个类是区块链的类,参见下面的代码。

public class BlockChain
{
    private readonly int _proofOfWorkDifficulty;
    private readonly double _miningReward; private List<Transaction> _pendingTransactions; public List<Block> Chain { get; set; } public BlockChain(int proofOfWorkDifficulty, int miningReward)
    {
        _proofOfWorkDifficulty = proofOfWorkDifficulty;
        _miningReward = miningReward;
        _pendingTransactions = new List<Transaction>();
        Chain = new List<Block> {CreateGenesisBlock()};
    } public void CreateTransaction(Transaction transaction)
    {
        _pendingTransactions.Add(transaction);
    } public void MineBlock(string minerAddress)
    {
        Transaction minerRewardTransaction = new Transaction(null, minerAddress, _miningReward);
        _pendingTransactions.Add(minerRewardTransaction); Block block = new Block(DateTime.Now, _pendingTransactions);
        block.MineBlock(_proofOfWorkDifficulty); block.PreviousHash = Chain.Last().Hash;
        Chain.Add(block); _pendingTransactions = new List();
    } public bool IsValidChain()
    {
        for (int i = 1; i < Chain.Count; i++)
        {
            Block previousBlock = Chain[i - 1];
            Block currentBlock = Chain[i]; if (currentBlock.Hash != currentBlock.CreateHash())
                return false; if (currentBlock.PreviousHash != previousBlock.Hash)
                return false;
        } return true;
    } public double GetBalance(string address)
    {
        double balance = 0; foreach (Block block in Chain)
        {
            foreach (Transaction transaction in block.Transactions)
            {
                if (transaction.From == address)
                {
                    balance -= transaction.Amount;
                } if (transaction.To == address)
                {
                    balance += transaction.Amount;
                }
            }
        } return balance;
    } private Block CreateGenesisBlock()
    {
        List transactions = new List<Transaction> {new Transaction("", "", 0)};
        return new Block(DateTime.Now, transactions, "0");
    }
}

在这个类中,我们将有一个代表区块链(链属性)的块列表。

因为事务必须由挖掘器处理(通过挖掘新的有效块),所以我们将有一个未决事务的列表(_pendingTransactions 属性)。挖掘器将未决事务添加到新块中,这样从未决事务过渡到已处理事务。

这里我们还将定义开采新区块的难度(_ proofOfWorkDifficulty property)和奖励,该奖励将获得创建新区块的矿工。这是一个固定的奖励,但实际上还有一个由发送者定义的奖励。通过这种方式,发送者将说服矿工优先将他/她的交易包括在挖掘过程中。选择合适的奖励也是一件棘手的事情。如果您选择了过低的奖励,您的交易将在稍后添加。另一方面,如果你选择了过高的奖励,你的交易还是会被追加到后面,因为矿工会认为你的交易非常耗时。他们将尝试完成所有当前的处理,所以在完成所有当前的事务之前,他们不会切换到您的事务上。但是选择合适的奖励是另一个话题。

在构造函数中,我们初始化所有的属性,并使用 CreateGenesisBlock 方法创建 Genesis 块。这将创建一个块,其中以前的哈希设置为零,事务列表为空。

我们定义了矿块方法,矿工可以用它来开采新的矿块。在这个方法中,我们首先添加一个新的事务,对挖掘者的奖励,然后我们调用这个块的挖掘方法,为这个块计算一个有效的散列。当我们已经有一个有效的块时,我们将它的前一个散列设置为最后一个块的散列,这样就创建了一个有效的链。最后,我们清除挂起的事务,因为那些事务已经被添加到一个块中,所以那些事务成功完成。

注意:这不是一个分布式实现,所以当块的处理完成时,我们立即将它添加到链中,而不需要进一步检查。实际上,在分布式系统中,有许多矿工,所以多个矿工将在一个块上工作。在更新我们的链之前,我们应该进行另一次有效性检查。规则是总是接受最长的链,所以如果多个矿工向我们提供可能的链,我们将接受最长的,奖励将发送给赢得这场游戏的矿工。

下一个方法是 IsValidChain ,用来检查链的有效性,确保链没有被黑客攻击,没有被篡改。这是一个非常简单的检查,对于每个块,我们重新计算它的哈希,如果当前计算的哈希与创建时添加到块中的哈希不同,那么很明显块中的数据被修改了。另一个检查是将当前块的先前散列属性与先前块的散列属性进行比较。如果有差异,那么很明显链条被篡改。否则,我们的链是有效的,我们可以肯定它没有被黑客攻击。

最后一个方法是 GetBalance 方法,用于计算区块链用户的余额。用户可以通过他/她的地址来识别。为了计算当前余额,我们将遍历所有块和所有事务。如果发送方是我们正在计算余额的用户,那么我们将从余额中减去该金额,否则如果用户是接收方,那么我们将该金额加到余额中。

**注意:**您可以将各种业务逻辑添加到区块链中,例如,在发送之前,您可以检查发送者是否有足够的资金,如果发送者没有足够的资金,您可以拒绝交易,或者您可以定义任何符合您当前业务的逻辑。

最后一步是实际测试我们的代码。下一段代码包含用于创建区块链、创建事务、检查区块链的有效性、尝试破解区块链并打印区块链的内容以验证其结构是否正确的主程序

class Program
{
    static void Main()
    {
        const string minerAddress = "miner1";
        const string user1Address = "A";
        const string user2Address = "B"; BlockChain blockChain = new BlockChain(proofOfWorkDifficulty: 2, miningReward: 10);
        blockChain.CreateTransaction(new Transaction(user1Address, user2Address, 200));
        blockChain.CreateTransaction(new Transaction(user2Address, user1Address, 10)); Console.WriteLine("Is valid: {0}", blockChain.IsValidChain()); Console.WriteLine();
        Console.WriteLine("--------- Start mining ---------");
        blockChain.MineBlock(minerAddress); Console.WriteLine("BALANCE of the miner: {0}", blockChain.GetBalance(minerAddress)); blockChain.CreateTransaction(new Transaction(user1Address, user2Address, 5)); Console.WriteLine();
        Console.WriteLine("--------- Start mining ---------");
        blockChain.MineBlock(minerAddress); Console.WriteLine("BALANCE of the miner: {0}", blockChain.GetBalance(minerAddress)); Console.WriteLine();
        PrintChain(blockChain); Console.WriteLine();
        Console.WriteLine("Hacking the blockchain...");
        blockChain.Chain[1].Transactions = new List<Transaction> { new Transaction(user1Address, minerAddress, 150)};
        Console.WriteLine("Is valid: {0}", blockChain.IsValidChain()); Console.ReadKey();
    } private static void PrintChain(BlockChain blockChain)
    {
        Console.WriteLine("----------------- Start Blockchain -----------------");
        foreach (Block block in blockChain.Chain)
        {
            Console.WriteLine();
            Console.WriteLine("------ Start Block ------");
            Console.WriteLine("Hash: {0}", block.Hash);
            Console.WriteLine("Previous Hash: {0}", block.PreviousHash); Console.WriteLine("--- Start Transactions ---");
            foreach (Transaction transaction in block.Transactions)
            {
                Console.WriteLine("From: {0} To {1} Amount {2}", transaction.From, transaction.To, transaction.Amount);
            }
            Console.WriteLine("--- End Transactions ---"); Console.WriteLine("------ End Block ------");
        }
        Console.WriteLine("----------------- End Blockchain -----------------");
    }
}

正如您在这段代码中看到的,我创建了一个区块链,然后创建了两个事务。为了完成交易,我开始开采一个区块,之后我打印出矿工的余额,只是为了看看矿工是否收到了奖励。之后,我添加了另一个事务,并挖掘了另一个块。在那之后,我打印出了链的结构,在最后几行,我修改了区块链的一个块,我检查了链的有效性。

运行该程序后,我们得到以下结果:

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

从图中我们可以看到,每开采一个区块后,矿工都得到了奖励,所以奖励制度是正确的。我已经打印出了区块链的结构,如你所见,这些块是正确的,它们包含了所有的交易,与它们在代码中被添加的顺序相同。这些块还包含用于向矿工发送奖励的交易。如果我们检查先前的哈希和块的哈希,我们可以看到我们有一个有效的链,每个哈希以两个零开始,正如我们在 proofOfWorkDifficulty 字段中定义的那样,每个块的先前哈希包含先前块的哈希。所以块有效。(有效性检查的结果在第一行)。

在下一步中,我已经尝试黑掉链,但是如你所见,在修改块的内容后,有效性检查失败,所以我们成功地检测到篡改我们的区块链的企图。

有利有弊

每个人都在谈论区块链的优势,但如果这些优势实际上是劣势呢?那么区块链的主要问题是什么呢?

信任和透明

对于几乎任何人们想要有效的东西,区块链都被作为一种解决方案提出来了。篡改存储在区块链上的数据确实很难,但区块链是创建具有完整性的数据的好方法这一说法是错误的。好的,让我们用例子来解释。当你想从网上商店买东西时,你只是希望卖家真的会把产品寄给你。在传统系统中,你相信 Visa 或亚马逊或任何你使用的东西,卖家会把你买的产品发给你。所以你信任第三方来执行交易并实际接收购买的产品。在区块链没有第三方,所以你真的会相信人性的善良,卖家不会对你撒谎,他/她会把买的东西送过来。我认为这不是一个非常值得信任的系统,我不信任人,主要是当我们谈论陌生人、生意和金钱的时候。

另一个很好的例子:

“把你的投票记录保存在一个不为任何人所有的防篡改存储库中”听起来没错——然而你的阿富汗村民会从一个广播节点下载区块链并从他的 Linux 命令行解密 Merkle root 来独立地验证他的投票已经被计算在内吗?或者他会依赖一个可信任的第三方的移动应用——比如非营利或开源联盟管理选举或提供软件?(见本文:蹩脚的区块链)

牢不可破

是的,但这只是一个理想的情况(就像共产主义一样,这个想法是伟大的,每个人都应该平等,但每个人都是不同的,所以我们怎么能平等呢?但这是另一个要讨论的话题,我会有另一个帖子类别,在其中我会谈论哲学),但在现实中,有很多因素可以使区块链变得脆弱。想想看,在区块链世界,个人不是依靠信任或监管,而是有意为自己的安全防范措施负责。并且如果他们使用的软件是恶意的或者有缺陷的,那么就会有漏洞来攻击那个特定的个人。举个愚蠢的例子,一个简单的用户,没有编程知识,会把他虚拟钱包的私钥存储在他的电脑上。单点故障,黑客会黑他/她的电脑,偷走密钥。实际上黑客并没有黑掉区块链,他/她只是用偷来的私钥创建了一些有效的交易。在这种情况下,谁将帮助您回滚事务?不要忘记你不能改变区块链的历史!在传统的系统中,银行为他们的客户提供安全保障,如果安全被破坏,他们会把偷来的钱还给你。每家银行都有保险,所以你不会失去你一生努力的所有钱。所以你怎么想,你会相信你自己的技能有完美的安全和使用区块链还是你会相信银行和保险公司或其他安全专家?

我不认为这个想法很棒,是的,这是一个很好的非常有用的概念,我喜欢内置的变化检测,它是很容易检测到黑客攻击 链的历史,它是分布式的,这非常有用,安全在区块链没有单点故障增加了可用性并且它基于共识没有中间人(这有时会非常痛苦和危险,你会因为一个罪犯利用区块链进行交易而信任他吗?).但是正如你所看到的,太多的自由,太多的控制对于不知情或没有准备的用户来说是非常危险的!

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

我真的很喜欢咖啡,因为它给了我写更多文章的能量。

如果你喜欢这篇文章,那么你可以请我喝杯咖啡来表达你的欣赏和支持!

**成为媒介上的作家:**https://czakozoltan08.medium.com/membership

参考

  1. 蹩脚的区块链
  2. 比特币实际上是如何运作的
  3. 创建一个区块链
  4. 区块链讲解

订阅我的博客,因为在下一篇文章中我会谈到如何在中使用比特币。Net (使用 NBitcoin)之后我将开始一个系列文章,使用非常直观和容易理解的例子解释所有流行的人工智能算法。将来我会讨论像软件设计设计模式并行计算这样的话题,我还会有一个哲学的类别,讨论关于世界的有趣想法,关于宇宙和关于人性

区块链对大数据的影响

原文:https://towardsdatascience.com/blockchain-impact-on-big-data-39b38da7f4a5?source=collection_archive---------10-----------------------

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

区块链被认为是自互联网以来最大的技术突破,有着无尽的使用案例,它成为科技界的热门话题是很自然的。在众多区块链应用中,大数据是一个特别有趣的应用。

为了简洁起见,区块链革命的作者 Don & Alex Tapscott 将区块链定义为“经济交易的廉洁数字账本,可以通过编程不仅记录金融交易,而且记录几乎所有有价值的东西。”

Oracle 将大数据定义为更复杂的数据集,尤其是来自新数据源的数据集。这些数据集非常庞大,传统的数据处理软件根本无法管理它们。大数据是更大、更复杂的数据集,尤其是来自新数据源的数据集。这些数据集非常庞大,传统的数据处理软件根本无法管理它们。

区块链与大数据的结合

可以说是信息技术领域最重大的发展在过去几年中,区块链有潜力改变世界对待大数据的方式,增强的安全性和数据质量只是使用中本聪里程碑式技术的企业所能获得的两大好处。”

尽管大数据面临诸多挑战,但区块链的潜在用途提供了以下优势。

验证数据

通过区块链生成的数据需要较少的审查,因为操纵这种数据的可能性极低。区块链结合了哈希和加密技术来创建存储在一系列区块中的数据,这些数据几乎是不可变的,因为操纵区块的原始状态需要巨大的计算能力

一个在组织层面进行数据验证的好的用例是,联想使用区块链来验证文档。根据联想的说法,数字签名被编码在物理文档中,可以被计算机和其他机器处理,以验证文档的合法性。

该流程可作为有效的文件、资产登记等欺诈检测系统。

数据安全和隐私

世界上最大的组织是数据公司,使数据成为世界上交易量最大的商品。集中存储的数据不安全,有几份报告称数据遭到黑客攻击,集中存储的数据受到黑客和其他恶意实体的控制,这一点很明显。

好消息是,区块链打算将权力交还给用户,随着区块链的应用,大数据存在无限的机会。理想的世界是数据可以由生成数据的个人来管理。用户能够管理他们的数据的可能性提供了一个很好的回报,导致用户更有动力提炼和控制他们生成的数据。

通过区块链产生的大数据将在常规大数据之上蓬勃发展,最终将成为产生数据的新方式。

大数据组织采用区块链

由于区块链技术的影响,已经有更多的大型组织采用了这种技术,其中一些组织正在寻找有趣的方法让区块链为他们工作。

其他一些有趣的区块链解决方案有, BigchainDBblockcryptoflureeblockstack.io区块链铸造占卜

机遇

数据生成报告预计,到 2025 年,每年将产生约 180 吉字节的数据(一吉字节等于一万亿吉字节),而 2013 年仅为 4.4 吉字节。

一份 VentureBeat 的报告引用道:“如果说区块链有一个‘甜蜜点’,那很可能就是将见解和问题转化为资产的能力。”

通过使用旨在过滤和提炼数据的专用应用程序,大数据可以很容易地成为可交易资产。这个机会将催生更多的数据挖掘公司。

我们还会看到更多需要分析洞察力的加密货币活动。

结论

拥有大数据的区块链将成为大型和小型企业的强大工具。不断增长的数据和最近的数据黑客攻击强烈表明,区块链是一项非常重要的技术,它补充了大数据,并将重新定义我们处理数据的方式。如果生命就是时间,时间就是金钱,那么数据就是新的生命。

区块链互通

原文:https://towardsdatascience.com/blockchain-interoperability-33a1a55fe718?source=collection_archive---------7-----------------------

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

由于区块链科技经常寻求移除中介,具有讽刺意味的是,用户无法在区块链之间轻松转移价值,通常必须使用中介。举个例子,有人持有比特币,希望在以太坊环境中进行交易。用户必须完成至少三个步骤:在加密货币交易所注册,将 BTC 兑换为以太网,并在以太坊环境中注册以使用其功能(例如,购买天然气或签订智能合同)。

这是因为大多数大型公共区块链都是作为独立环境运行的,彼此之间互不相连。

然而,提高区块链之间的互操作性正成为一个重要的区块链趋势,将有助于区块链技术发挥其全部潜力。

什么是互操作性?

互操作性是跨区块链系统轻松共享信息和进行交易的能力。在一个完全可互操作的环境中,如果一个来自另一个区块链的用户在你的区块链上给你发送了一些东西,你将能够毫不费力地阅读、理解、互动或回复它。

互操作性有三个级别:

  1. **基础级:**允许系统间的数据交换,无需系统解释数据。
  2. **结构层:**允许系统之间以定义的结构或格式进行数据交换,数据在其中统一移动。这个级别允许解释信息,但不允许与信息交互或使用信息。
  3. **语义层:**允许系统之间以允许数据被解释和使用的方式进行数据交换。

侧链

侧链是一种区块链机制,允许使用双向栓将单独的链连接到主区块链。这使得主区块链和侧链之间能够交换数字资产。

Sidechains 最初是为了帮助用户在将应用部署到主区块链之前,在更小、更易管理的环境中测试他们的应用而开发的。侧链功能是迈向互操作性的一步。

宇宙

Tendermint 团队的宇宙网络项目允许多个区块链相互交流。它由“拜占庭容错 Tendermint 协议”提供支持。宇宙网络上的独立区块链被称为“区域”。由于区域通过中央 Cosmos Hub 相互连接,一个区域中的用户可以与任何其他区域进行交互。

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

宇宙使用利害关系的证据。它的原生令牌被称为“原子”,它对验证器的奖励被称为“光子”。

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

比特币和以太坊等单个区块链目前没有被纳入宇宙网络的区域。将它们添加为区域可以实现它们之间的互操作性。

永恒之塔

Nuco 的 Aion 网络允许多个区块链存在,并在彼此之间移动价值和逻辑,消除了对中介的需要。永恒之塔将向私营和公共部门组织开放。Aion 网络还将允许用户定制自己的私人或公共区块链,并选择发布、治理、参与和共识机制。

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

方舟

ARK 是区块链的一个生态系统,通过“智能桥”连接起来,实现互操作性。企业可以在方舟网络中创建自己的区块链。SmartBridge 充当不同区块链之间的中介,方便通过网络传输数据、功能和硬币。ARK 用户可以使用网络以多种货币和代币进行交易,包括 ARK 的本地货币。

ARK 使用授权的股权证明。这个共识机制不涉及挖矿。相反,用户投票选择一小组验证者来伪造程序块并维护系统的完整性。方舟网络中的每个令牌持有者在决策过程中都有相应的发言权。ARK 目前支持 Python、Ruby、Java、Elixir 和其他语言。

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

截至本文撰写之时,在 ARK 网络上创建一个新的 block 需要 8 秒钟,速度快得令人难以置信。(作为参考,在比特币区块链上创建一个新区块需要 10 分钟。)

ARK 还提供按钮区块链部署,允许用户以最小的努力创建和运行区块链。新创建的区块链将使用智能桥连接到方舟生态系统,并具有与主区块链相同的功能。因此,对于希望部署自己的可互操作区块链的人来说,该平台是一个用户友好的选择。

结论

一旦实现了主要公共区块链之间的互操作性,一个主要公共区块链上的用户将能够很容易地在其他主要公共区块链上进行交易。这将释放多样化的功能,包括支付、智能合约和数据存储。每个区块链的安全协议、采矿机制和经济将如何与其他区块链互动和融合还有待观察。一个真正可互操作的区块链基础设施可能成为互联网的新支柱。

沙安雷

关注媒体上的 Lansaar Research ,了解最新的新兴技术和新的商业模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值