我的数据科学和生物信息学之旅—第 1 部分:编程
“算法是新药,医生是新技术的处方者.” — 休·哈维,放射科医师
根据 IBM 的调查,每天产生 250 万兆字节(10 ⁸)的数据(平均每台电脑只能容纳 1 兆字节)。现有数据的 90%是在过去两年中生成的。此外,预计这一增长将继续加速。这导致了数据处理和解释滞后的瓶颈。面临这些问题的不仅仅是推特、脸书、谷歌和网飞。生物医学、生物学、物理学、制药……也面临这个问题。
为了进一步说明这个问题,单个全基因组测序的大小可能是数百千兆字节(外显子组和 RNA 大约是 100 千兆字节)。小 100 倍)。处理如此大量的数据需要一套特定的技能。这就是生物信息学的用武之地。
背景
整整一年前,我从未执行过一行代码。因此,我绝不是数据科学家或生物信息学专家,但我也不是一个完全的初学者。
去年我在做关于全基因组测序的硕士论文时熟悉了数据科学和生物信息学,突然面临一个问题:我必须打开一个 3 300 000 行 40 列的. csv(逗号分隔值)文件。不用说,Excel 过得并不愉快。在尝试使用 Excel 或其他程序但毫无结果之后,我意识到我必须使用命令行,这是我从其他领域的朋友那里听说的。从那以后,事情自然就演变到了我今天的位置。
我学到的几乎所有东西都要感谢朋友、同事和导师建议的探索主题。实际的学习是通过辅导课、博客帖子、互联网上的大规模开放在线课程(MOOCs)的帮助,或者通过谷歌搜索我遇到的具体问题,因为我没有时间获得额外的硕士学位。
但我面临的问题是,几乎每个主题都有数百门课程。这将是一篇由 2 或 3 部分组成的博客,第一部分是关于编程的,侧重于资源和我参加的推荐课程(免费或以很低的价格),考虑的是绝对的初学者。第二部分将更加面向生物信息学(DNA 和 RNA 测序),重点是关键的期刊文章,但也有其他在线资源和常用工具。
Bash 和 Linux
安装 Linux
如果你有一台 Mac,你可以打开终端,运行任何 bash 命令,没有任何问题。对于 Windows 用户来说,这并不容易。你必须安装 Linux,一个不同于 Windows 的操作系统。Linux 有许多版本,其中 Ubuntu 是最流行的发行版。
- 对于想要尝试 Linux 的绝对初学者,建议使用虚拟机。虚拟机不会有太大的问题,它在 Windows 中运行 Ubuntu。查看这本指南了解更多信息。
- 双引导有点复杂,你把 Ubuntu 安装在 Windows 旁边。小心,你可以用这种方法删除你所有的数据。如果对电脑了解多一点的话推荐。查看这份指南。
- Windows 10 上的 Ubuntu 是大约一年前的新特性。与虚拟机或双引导相比,这似乎是一个更优雅的解决方案,但我没有尝试过,我不知道它在更高级的工作中表现如何。
尝试
一旦启动并运行 Linux,打开终端(或者直接在 macOS 上打开终端),就可以在 Bash 命令语言/shell 中输入命令。
The terminal on macOS
Bash 是一种通用编程语言,在其上可以完成基本任务,在高性能计算(HPC)集群上运行程序。它也使得重复的任务变得更加容易和快速。这是一项基本技能,因为生物信息学社区开发的大多数工具都是由命令行控制的。
- data camp 上的 shell for data science 简介从零开始,但是有非常好的例子说明 Bash 为什么如此有用。它也只有 4 个小时长。在进一步阅读之前,先从这里开始。
Python 和 R
在生物信息学中,几乎每个任务都可以用两种编程语言中的一种来完成:R 和 Python。Python 是一种通用的编程语言,在过去的几年里广受欢迎:
Source: stackoverflow blog
这种大规模增长的原因是 Python 易于学习&易于阅读,但它非常通用。Youtube 上有一个关于为什么 Python 是如此受欢迎的语言的精彩演讲,作者是杰克·范德普拉斯。简而言之,Python 可以做任何事情,从任务自动化的基本脚本,基本和高级统计,高级绘图到机器和深度学习&等等。有些人不喜欢 Python,但是我认为它不应该受到如此的讨厌。特别是对于初学者来说,Python 做了它需要做的事情,而不会让事情变得过于复杂。
r 是一种专门为统计和数据处理而构建的编程语言,这与 Python 形成了鲜明的对比,Python 在其基础上构建了数据科学库。在过去的几年中,R 被生物信息学社区采用为发布新包的头号编程语言,部分原因是因为 bioconductor (用于下一代测序分析的成熟库集合)和用于高级绘图的 ggplot2 库。有些人喜欢用 Python 进行数据清理,用 R 进行数据操作,但是 R 几乎可以做 Python 能做的任何事情,比如统计,甚至更多。我对 R 的唯一问题是有时不直观的语法。 Tidyverse (dplyr、tidyr、ggplot2、…)中的包提供了一个优雅的 R 工作流,明确关注数据清理、探索和可视化。
计算机编程语言
因为 Python 是如此多才多艺,当你第一次接触它时很容易被淹没。推荐的资源和课程:
- Charles Severance 的《Python 为 Coursera 上的每个人》。课程材料也可以在 py4e.com 的找到(如果你按照的手册一直到第 11 章,你就为接下来的内容打下了坚实的基础)。如果你阅读编程方面的书籍,请确保你的笔记本电脑就在你身边,以便键入和执行书中的命令!我再怎么强调这一点也不为过,仅仅读一本书是不够的。最重要的是,做运动。你通过失败和搜索解决方案来学习编程。
- Wes McKinney 的《用于数据分析的 Python》是一本很好的参考书,但我个人更喜欢通过讲座/视频来学习。
- 这让我想到了这篇博文,推荐何塞·波尔蒂利亚/Udemy 的 Python 用于数据科学和机器学习训练营。这是一门很棒的课程,我怎么推荐都不为过。它的星级为 4.6,拥有 80,0 00 多名学生。这本书基本上是由韦斯·麦金尼(Wes McKinney)编写的,包含 21 个小时的视频讲座和真实世界的练习。不要支付超过 15 欧元,Udemy 有频繁(如果不总是)的折扣。
- Enki 是一款用于智能手机的应用程序,每天花 10-15 分钟修改 Python 和其他编程语言,这有助于将最常用的代码保持在记忆中。
稀有
我犯了一个错误,试图把 R 作为我的第一门编程语言来学习。如果你以前从未编程过,先学习 Python,R 作为编程语言会更有意义。
- Roger Peng 在 Coursera 上的 R-programming 是我上的第一堂关于 R 和编程的课程。一门非常好的入门课程。然而,在第二周之后,难度会急剧增加,这也是我建议从 Python 作为你的第一语言开始的主要原因。本课程也没有很好地涵盖绘图,也没有关注清理数据/数据科学。它也可以作为好书使用,可以与之前提到的 Python For Everybody 手册相媲美,涵盖了 dplyr。花点时间仔细阅读,你就会对 R 是什么以及它的核心是如何工作的有一个坚实的基础。
- 漩涡是一个在运行 R/R-studio 时学习 R 的 R 包。没有视频的,纯文字的。在写这篇博文的时候,我重新发现了它。强烈建议您掌握基本概念,这也是 R 编程 Coursera 课程的一部分。几乎涵盖了一切。
- 数据科学和机器学习训练营是何塞·波尔蒂利亚的数据科学课程的 R 版本。我更喜欢 Python 课程,因为该课程更详细地介绍了这些主题。然而,它值得一读,因为它涵盖了 ggplot2、dplyr、tidyr,并且对如何使用 R 进行机器学习有一个总体介绍。如果你觉得太容易(特别是如果你学了 Coursera 课程),在 Python 课程之后再学,以 2 倍的速度浏览前几章。
乳液
你花了多少时间来调整 Word 文档的布局,直到它变得完美,才注意到你做了一个小调整,然后一切又都错了?这就是乳胶的用武之地。来自官方文档:“LaTeX 基于这样一种理念,即最好将文档设计留给文档设计者,让作者继续编写文档”。
LaTeX in a nutshell
缺点是 LaTeX 的学习曲线几乎是垂直的。但是一旦你掌握了基础知识(在 ShareLaTeX 上有很好的介绍),这实际上比用 Word 写文档要有趣得多。对于非常短的文档,我仍然更喜欢 Word,但是对于超过几页的文档,LaTeX 是无与伦比的,尤其是与作为参考管理器的 JabRef 结合使用时。
一个缺点是,一个包含所有包的完整的 LaTeX 安装会变得非常复杂和耗费资源。与多个人合作写作也不容易。背页(以及之前提到的 ShareLaTeX )是这两个缺点的解决方案:这是一种类似谷歌文档的协作写作方法,它在云中运行 LaTeX,使跨平台和跨机器写作变得轻而易举。多个日志(bioRxiv!)甚至支持直接通过背页提交。它是免费增值,高级版起价 12 欧元/月(学生减半)。
虽然 LaTeX 知识对于数据科学来说并不重要,它也不是真正的编程语言,但是如果您有几个小时的空闲时间,可以尝试一下。你以后会感谢我的。
未来展望
可复制软件
我注意到我花了相当多的时间让我的脚本恰到好处,但我在这里和那里做了一些小的调整。有些变化很难跟踪,例如,如果我想重新运行 3 个月前的东西。未来,我希望通过强调再现性来改进我的工作流程。
饭桶
Git 是一个版本控制系统,它使得在多人之间协调文件和版本变化成为可能。如果你犯了一个错误,导致整个程序崩溃,那么很容易回到以前的版本。我将使用数据营的课程作为指导。参见《公共科学图书馆计算生物学》中的利用 git 和 GitHub 的十个简单规则,了解为什么使用 Git 是个好主意的更多信息。
码头工人
Docker 是另一个迅速获得成功和流行的软件包。它是一种在计算机和服务器之间分发应用程序或其他程序的方法。它由类似于虚拟机的“容器”组成,但具有更好的可移植性和更轻的重量。容器映像是一个轻量级的、独立的、可执行的软件包,包含了运行它所需的一切:代码、运行时、系统工具、系统库、设置。
为什么学习这个是必要的或者有用的?嗯,如果你想与同事、朋友或在你的出版物中分享你制作的工具或程序,你会遇到这样的问题:你的程序依赖于不同的程序(例如特定的 Python 模块),甚至依赖于特定的版本(例如 Python 3.5.2)。Docker 将您的应用程序与正确的依赖项捆绑在一起,这样最终用户就不需要担心安装特定版本的特定软件,可能会使他们计算机上已经存在的版本崩溃,并导致许多挫折和/或您的程序的不良采用。Docker 官方文档和关于 GitHub 的教程是一个很好的起点。
管道
管道是程序或脚本执行的特定顺序,将输出从第一个脚本“管道化”到第二个脚本。在下一代测序(NGS)中,这包括下载原始数据文件、质量控制、预处理、绘制参考基因组图谱和后处理,但在关于生物信息学的第 2 部分中对此有更多介绍。为了使这个过程自动化,可以编写一个“主脚本”,将所有这些不同的步骤组合在一个脚本中。在 Bash 中,这是可能的,但是对于复杂的管道,它的伸缩性不是很好。工作流管理软件有助于使您的管道具有可重复性和可扩展性。选项是无穷无尽的:
- Luigi ,基于 Python 和 Spotify 开发的(!),但现在也被 NGS 社区所采用(开源软件的力量)。SciLuigi 是 Luigi 的包装器,用于优化科学工作流程。
- Snakemake ,也是基于开源和 Python 的。
- 下一个流程
- WDL ,由远大研究所开发
- 鲁弗斯
- b 管道
正如你所料,它们都有优点和缺点。浏览文档,在 Google 或 Stack Overflow 上搜索,找到最适合您需求的工作流管理软件。关于 bash、make Nextflow、snakemake 的详细介绍请点击。
推荐软件
下面列出的软件取决于个人喜好。
文本编辑器和 IDE
我更喜欢 Atom,但是还有很多其他的(崇高文字,Vim,…)。看看 Hydrogen ,这是 Atom 的一个包,可以让你在文本编辑器中运行 Jupyter Notebook 这对测试/调试时运行代码块非常有用。对于 LaTeX,我使用 TeXstudio ,对于 R Rstudio 。
末端的
在 MacOS 中我用 iTerm2 搭配 tmux (见封面图片)。Tmux 将你的终端拆分成多个窗口,方便多任务处理。 Homebrew 是 macOS 的一个包管理器,可以在 Mac 上通过命令行安装程序。在 Ubuntu 中,我使用默认的 GNOME 终端。
调色板和主题
我个人是受不了白底黑字的终端的。一个好的终端和文本编辑器的调色板可以让脚本编写变得更加有趣和高效。在 MacOS 上,我喜欢为 macOS 上的应用程序使用 Nord 调色板。尤其是 macOS 上的 colored ls 或者 Ubuntu 上的 dircolors 是一个巨大的帮助。在 Ubuntu 上,我使用了 Arc Darker 主题和 Numix Circle 图标来使它在视觉上更具吸引力,并通过一些扩展来添加开发者遗漏的功能。
结论
这篇相对较短的博文中的内容会让你忙碌 200 多个小时。它为你需求领域的进一步专业化打下了坚实的基础。如果你不得不做一个重复的特定任务,有一种方法可以用 Python/Bash 或 r 来实现自动化。从快速的 Google 搜索开始,99%的情况下有人试图做类似的事情,并且会在 Stack Overflow 或另一个论坛上询问。借助本页链接中的技能和知识,您将能够理解语法并根据您的要求修改和调试它。也有其他的编程语言,比如 NCBI 作为通用语言使用的 perl ,以及用于文本处理的 awk / sed 。然而,对于 Python/R 组合,您应该已经准备好了,以后如果您真的需要它们,您可以探索它们。
请记住,除了这里列出的,还有很多非常好的编程和数据科学课程(例如data camp 上的这个 67 小时 Python 课程看起来很有前途)。帖子里的只是我拍的,我个人喜欢和推荐的。大多数也是免费的,只是尝试一些,如果不适合你的个人需求,就转移到下一个。
祝你好运!
我想感谢我在这篇博文中提到的每一个人,以及以各种方式帮助我的导师、朋友、同事和其他人。
如果你喜欢读这本书,如果你把它推荐给你的朋友和同事,或者在脸书的推特上分享,那会很有帮助。
关于作者:
我是 Ruben Van Paemel 博士,2017 年从医学院毕业后,开始在根特大学(医学遗传学中心)担任博士研究员,由研究基金会 Flanders 资助。我也是根特大学医院的儿科住院医师。可以在 Twitter 关注我:@ RubenVanPaemel
我从事神经母细胞瘤的研究,这是一种罕见但极具破坏性的肿瘤,最常见于非常年幼的儿童。我们的团队试图了解潜在的基因改变,以提高神经母细胞瘤儿童的诊断、治疗和最终存活率。大数据和现代测序技术让我对编程、生物信息学、统计学和人工智能产生了兴趣。
我的数据科学和生物信息学之旅:第 2 部分——测序速成班
这部分需要一些分子生物学和遗传学的基础知识。这篇文章主要是关于测序技术的基础知识,面向具有生物医学背景的人,医学学生和临床医生。如果你对 DNA 知之甚少或者想更详细地了解基因组和 DNA 测序的历史,我推荐你阅读悉达多慕克吉 。
人类基因组是一件非常不可思议的事情。想象走进一个巨大的图书馆。这里有成千上万个书柜,每个书柜总共可以容纳大约 130 本书。你打开一本书,你看到的只是四个字母:A、C、G 和 t。所有这些书中的信息足以建造一个最复杂的生物,一个人。
当这些书中的字母被弄混,或者当章节或书籍在书架中被打乱时,遗传病就开始了。有时只有一个或几个字母是错误的或丢失的,但这可以对那本书的故事产生重大影响。
要知道书柜中的错误在哪里,你可以将它与你认为没有错误的其他书柜(“参考基因组”)进行比较(这里有点棘手:什么被定义为“正常”?).用手找到这些字母是不可能的。幸运的是,我们发明的电脑在比较这两个书柜时要好得多。生物信息学处理与处理所有这些信息相关的一切,因此我们可以从中得出结论。
正如我在关于编程的第一部分中解释的那样,我在做关于全基因组测序的硕士论文时了解了所有这些(就复杂性而言,我非常低估了这一点)。这篇文章将简要介绍不同的测序技术。下一部分将深入探究其背后的实际生物信息学。
一点历史
“实验进展缓慢,”孟德尔写道。“起初需要一定的耐心,但我很快发现,当我同时进行几个实验时,事情会变得更好。随着多个交叉并行,数据生产加速。”悉达多·慕克吉引用了孟德尔在 19 世纪关于植物的实验。
自从大规模并行测序(MPS,也称为下一代测序,NGS 或高通量测序,HTS)的出现,由于新的和指数级增长的需求,生物信息学领域发生了彻底的变革。
但是首先,先回顾一下测序的历史。我们如何阅读书中的字母?
桑格测序
弗雷德·桑格和他的同事在 1977 年开发了一种 DNA 测序方法,后来被称为“桑格测序”或“链终止测序”。这个视频把题目解释的非常清楚。
与书柜类似,桑格排序将是一页接一页地复制每本书。
Sanger 测序是 40 多年来最流行的测序方法,直到它被大规模平行测序(MPS)和本世纪初超越。Sanger 测序的缺点是速度慢(每次运行 96kb,而 MPS 每次运行 1–150 Gb 以上)且成本高。今天,它仍被用于某些领域,以验证多磺酸粘多糖或以非常高的精确度对非常小的 DNA 片段进行测序(遗传病中的基因)。
大规模并行测序
然后,在 2003 年,人类基因组计划完成。这项艰巨的任务历时 15 年,耗资数十亿美元。今天,我们可以在一天多一点的时间内,花费不到 1000 美元,完成一个完整的人类基因组测序。那么发生了什么?
Cost per genome. The sharp decline around 2007 is due to the rise of massively parallel sequencing. Source: genome.gov
2005 年,第一台用于“大规模并行测序”的机器由 454 推向市场,称为焦磷酸测序。我不会详细说明确切的机制,但主要思想是 DNA 被分裂成数百万个小片段。所有这些小片段同时被测序,这比一个接一个地对所有这些小片段进行测序快得多。
再把这个和我们的书柜比较一下。你很快就会意识到,一页一页地复制所有的书将会花费很长时间。于是你决定带几个朋友,把书分好,这样每个人都有自己的书架可以抄。大规模并行测序就是这样,但你带来的不是几个朋友,而是整个村庄。
焦磷酸测序法仍然没有足够的通量来进行常规的全基因组测序。如今,最广泛使用的测序技术是 Illumina 的“合成测序”(见下面的视频)。Illumina HiSeq 4000 可以在 3.5 天内对多达 12 个人类基因组进行测序!
Sequencing-by-synthesis by Illumina
下一步是什么?
很难预测未来,但对我来说,最近的一项发展正接近科幻小说:
Picture by my colleague, Celine Everaert on Twitter (@celine_everaert)
这个设备被称为小程序。这是一个 1000 美元,比 u 盘大一点(它甚至可以通过 USB 连接到你的笔记本电脑),可以序列读取> 200 000 bp 长。相比之下:Illumina 测序仪的最大读取长度为 300 bp 长。Illumina MiSeq 是一台具有类似生产能力的笨重机器,而的价格为 99 000 美元。
有了 MinION,就有可能在没有 PCR 扩增的情况下,用一种称为“纳米孔测序”的技术实时对 DNA 和 RNA 进行测序(视频介绍其工作原理)。实时长阅读测序也被称为“第三代测序”,大规模平行测序的继承者。
然而,这是一项早期技术,所以它不像 Illumina 系统那样得到广泛支持。我们目前正在实验室进行测试,结果看起来很有希望。床边基因组分析的路还很长,但这是一大进步!
覆盖率和阅读深度
高通量测序中的一个重要术语是“覆盖”或“阅读深度”(有时也称为“深度”)。这是一个重要的术语,用来理解为什么有些实验是好的或坏的(永远不要在 30 倍覆盖率下进行全外显子组测序),以及为什么有些技术比其他技术更贵或更便宜。
DNA 测序
单个核苷酸的覆盖范围或阅读深度(例如 30X)是该核苷酸在测序运行中被有效调用的次数。人类基因组的平均覆盖率为 30 倍,这意味着平均每个核苷酸被测序了 30 次。为什么这很重要?假设你只调用每个核苷酸一次。这样,你将永远无法说出这个位点是纯合子还是杂合子。如果你调用每个核苷酸两次,你可能会偶然得到两次相同的核苷酸(例如一个 T)。你会认为这是一个纯合位点(T/T),而实际上它是一个杂合位点(例如 T/C)。增加你调用该碱基的次数会增加以该碱基的真实频率结束的几率(在种系杂合子的情况下为 50–50%,在嵌合体或癌症中的较小亚克隆的情况下为< 1–99%)。
增加覆盖率需要测序仪进行更多的读取,因此增加了你实验的价格。一个 60 倍平均覆盖率的全基因组测序实验的测序成本大约是 30 倍覆盖率的两倍。
RNA 测序
RNA 测序是不同的。在 RNA 测序中,通常使用总阅读深度(每个样品的阅读次数)来代替核苷酸水平的覆盖率。这是因为在 RNA 测序中,你最感兴趣的是基因表达。基因表达与该基因的阅读次数相关(RPKM,FPKM,TPM: 参见此处的解释)。
期望的读取深度取决于实验目标的 T2。对于高表达基因的快速快照,500-2500 万的总读取深度就足够了,而对于更全面的基因表达视图,需要 3000-6000 万次读取(高达 2 亿次读取)。
应用
大规模平行测序在全基因组测序后产生了一系列广泛的子技术,原因有两个:(1)降低实验成本和(2)不仅研究基因组,而且研究转录组、甲基组和其他“-组”。
2017 年是外显子组和靶向测序进入常规遗传诊断的一年。Wright 及其同事关于诊断罕见儿科遗传疾病的顶级综述可在此处获得,关于下一代测序的综述可在此处获得。两者都强烈推荐!
外显子组测序
虽然“垃圾 DNA”的概念已经被放弃,但大多数已知的遗传疾病仍然与外显子突变有关。仅对这些“相关”部分进行排序,可以大幅降低成本,并简化数据解释。基因组长 3 Gb,外显子组仅占总基因组的约 1% (30Mb)。
Probe-based capture of DNA. Image source.
****工作原理。在 DNA 测序之前,它被分割成小段。市售试剂盒含有数千个捕获探针(在 Illumina Nextera 试剂盒中为 429,826 个),它们是与外显子或其他感兴趣区域互补的寡核苷酸。这些探针可以连接到(磁性)珠上。
当您将含有未捕获的 DNA 和与磁性探针杂交的 DNA 的混合物的试管放入磁场中并进行清洗步骤时,所有未结合到珠子上的 DNA 都会被洗掉。这样,只有外显子 DNA 保留在样本中。
与全基因组测序(WGS)相比,这有一些缺点。DNA 的捕获并不是百分之百有效的。它在外显子边缘的效率特别低,这就是为什么需要更高的平均覆盖率来可靠地检测变体(100-150 倍覆盖率而不是 30 倍)。结构变体、监管变体等将被遗漏。
也就是说,根据你对实验的期望,全外显子组测序(WES)可能是 WGS 的一种经济有效的替代方法。
靶向测序
靶向测序基本上是外显子组测序的精简版本(在 WES 中,你的外显子组是你的“目标”,在靶向测序中,目标是一个或几个基因)。它也是基于与你感兴趣的区域互补的探针的扩增或设计。
它允许以可承受的价格对基因组的小区域进行非常深入的测序(覆盖 1000-20000 倍)。
靶向测序在单基因疾病中可能是有用的(如罕见的囊性纤维化突变),但对于这种桑格测序,或其他技术仍然很受欢迎。
RNA 测序
我在医学院上分子生物学的课是在 2010 年。那时候,很容易。有三种 RNA 以某种方式参与翻译:信使 RNA (mRNA)、核糖体 RNA (rRNA)和转移 RNA (tRNA)。如今,这个名单上有了更多的非编码 RNA(完整的名单在这里和在这里)。
****RNA 的富集。大多数时候,你对占总 RNA 80%的核糖体 RNA 不感兴趣。为了富集您感兴趣的 RNA,已经开发了一系列方法。在翻译之前,通过在 mRNA 的起始处添加一个 5’帽,在 mRNA 的末端添加一个 3’聚腺苷酸尾,并通过剪切掉内含子,将前 mRNA 加工成 mRNA。
mRNA processing. Source: Khan Academy.
Poly(A) selection 用 Poly(A)尾捕获 mRNA,耗尽样品中你不感兴趣的其他 RNA。然而,这也去除了没有 poly(A)尾的其它非编码 RNA 或 mRNA。另一种方法是 rRNA 去除,即在样品中留下非编码 RNA。
RNA 测序是如何工作的。你不能直接测序 RNA(实际上你可以,但这还不是主流)。这就是为什么如果你想进行 RNA 测序(也称为转录组测序),你首先必须用逆转录酶(rt)步骤将 RNA 转化为互补 DNA (cDNA)。一旦你有了 cDNA,文库制备和测序就可以开始了。RNA 测序方法的广泛概述(超过 110!)可在 Illumina 网站上获得。
RNA-Seq. Two basic variations use either random primers or oligo(dT) primers for this reaction. Oligo(dT) primers are highly 3’ biased and mostly suitable for mRNA abundance (expression) analysis. Source: Illumina.
逆转录酶步骤并不是 100%有效的(像探针捕获一样),可能会给结果带来假象和偏差。此外,寡(T)引发偏向 3’端,随机引发会导致引物偏向。
RNA 测序正稳步增加其临床相关性。韦斯和 WGS 只能在高达 50%的情况下识别出罕见的孟德尔遗传疾病,而 DNA 某处变异的影响很难评估。将 WES/WGS 与 RNA 测序结合可以揭示异常剪接、表达减少和其他功能暗示甚至遗传性疾病或癌症中的基因融合。
甲基化测序
在过去的 10 年里,表观遗传学领域也有一个巨大的受欢迎程度激增。在基因启动子区域的胞嘧啶(5-甲基胞嘧啶)上添加甲基(CH3)基团可以导致 RNA 或蛋白质的表达减少,而不改变 DNA 的结构。如果 DNA 的结构没有改变,经典的 DNA 测序就不会发现。
Bisulfite sequencing. Image source.
一种解决方法是在测序前用亚硫酸氢钠处理 DNA。甲基化的胞嘧啶有一个“帽”来保护它们免受亚硫酸氢钠的伤害。未甲基化胞嘧啶缺少这个保护帽,被转化为尿嘧啶。所得产物的扩增将尿嘧啶转化为胸腺嘧啶。测序并与参考测序进行比较后,有可能鉴定哪些胞嘧啶最初是甲基化的,哪些不是。
结论
这是对测序历史和目前正在使用的测序方法的一个温和的介绍(还有很多,但我把这篇文章限制在最流行的)。正如我自己所经历的,在没有对测序如何工作有非常基本的理解的情况下,钻研使用高通量测序的综述论文或研究文章可能是令人生畏的。我希望这篇文章能为你提供进一步钻研文献的基础。如果你想进一步阅读,我在正文和下面的参考资料中提供了一些关键的论文。如果你正在寻找一个非常具体的测序方法的信息,最好是寻找原始出版物,看看在 Illumina 网站上是否有任何关于它的信息(例如芯片测序:这里和这里)。
我想感谢我在这篇博文中提到的每一个人,以及以各种方式帮助我的导师、朋友、同事和其他人。我与我提到的任何公司都没有任何关系。
如果你喜欢读这本书,如果你把它推荐给你的朋友和同事,或者在脸书的推特上分享,那会很有帮助。
关于作者:
我的名字是 Ruben Van Paemel 博士,我于 2017 年从医学院毕业后开始在根特大学(医学遗传学中心)担任博士研究员,由弗兰德斯研究基金会资助。我也是根特大学医院的儿科住院医师。可以在 Twitter 关注我:@ RubenVanPaemel
我从事神经母细胞瘤的研究,这是一种罕见但极具破坏性的肿瘤,最常见于非常年幼的儿童。我们的团队试图了解潜在的基因改变,以提高神经母细胞瘤儿童的诊断、治疗和最终存活率。大数据和现代测序技术让我对编程、生物信息学、统计学和人工智能产生了兴趣。
进一步阅读
一般
悉达多·慕克吉。基因:一段亲密的历史。在亚马逊上有售。
希瑟·JM,链 B. 测序仪的序列:DNA 测序的历史。基因组学。2016;107(1):1–8.doi:10.1016/j . ygeno . 2015 . 11 . 003
40 岁时的 DNA 测序:过去、现在和未来。 天性。2017.doi:10.1038/nature24286
桑格测序法。 Youtube 。
大规模并行测序
Illumina。合成测序。 Youtube 。
Goodwin S .等时代来临:下一代测序技术的十年。 自然评论遗传学。 2016 年。doi:10.1038/人民币 2016.49
Illumina。RNA 序列阅读长度和覆盖范围的考虑。在Illumina.com有售
RNA-Seq 编码指南和最佳实践:2016 年 12 月修订。可用此处或此处。
纳米孔
牛津纳米孔技术。纳米孔 DNA 测序。视频。
Jain et al. 纳米孔测序和超长读数的人类基因组组装。 自然生物技术。2018.doi:10.1038/nbt.4060
Garald DR 等人在纳米孔阵列上进行高度平行的直接 RNA 测序。 自然战法。 2018。多元指数:10.1038
临床翻译
Wright CF 等儿科基因组学:诊断儿童罕见疾病。 《自然评论遗传学》。 2018。doi:10.1038/nrg.2017.116
基因测试:RNA-seq 的诊断能力。 《自然评论遗传学》。2017.doi:10.1038/nrg.2017.39
邱,陈,高 Y,等.通过母体血浆 DNA 大规模平行基因组测序对胎儿染色体非整倍体进行无创性产前诊断。 美国国家科学院院刊。2008;105(51):20458–20463.doi:10.1073/pnas
RNA 测序
可汗学院。真核前 mRNA 加工:5’帽和 poly-A 尾。剪接、内含子和外显子。
Illumina。RNA 序列阅读长度和覆盖范围的考虑。在Illumina.com有售
RNA-Seq 编码指南和最佳实践:2016 年 12 月修订。此处可用或此处可用。
RNA-seq 博客。RPKM,FPKM 和 TPM,解释清楚。在RNA-seqblog.com上可用。
RNA-Seq:转录组学的革命性工具。 自然评论遗传学。2009;10(1):57–63.doi:10.1038/nrg2484。
将 RNA 测序转化为临床诊断:机遇与挑战。 自然评论遗传学。2017.doi:10.1038/nrg.2016.10
基因家族:非编码 RNA。在GeneNames.org有售。
赖特兆瓦,布鲁福德 EA。命名“垃圾”:人类非蛋白编码 RNA (ncRNA)基因命名法。 人类基因组学。2011;5(2):90–98.doi:10.1186/1479–7364–5–2–90
Illumina。RNA 测序方法集:以 Illumina 技术为特色的近期 RNA-Seq 出版物概述。可在Illumina.com买到。
基因检测:RNA-seq 的诊断能力。 《自然评论遗传学》。2017.doi:10.1038/nrg.2017.39
我的深度学习之旅
在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个非正式的帖子,但内容有趣(我希望如此)。
一点关于我和深度学习
我来自物理和计算机工程。我在委内瑞拉学习了这两个专业,然后在墨西哥攻读了物理学硕士。但我认为自己是一名数据科学家。有趣吧?因此,尽管我在数学、微积分和统计学方面有着良好而广泛的背景,但开始机器学习和深度学习并不容易。
这个主题并不新鲜,但是我们研究它们的方式,我们如何构建使用它们的软件和解决方案,以及我们编程或与它们交互的方式都发生了巨大的变化。
我之前写了一篇文章,其中我谈到了深度学习的一些理论以及为什么它现在如此重要,但要再次说的是,使深度学习成为当前“炒作”的因素是几个简单但重要的算法改进的发展,硬件(主要是 GPU)的进步,以及过去十年中数据的指数级生成和积累。
我从哪里开始?
2012 年左右,当我在学习计算机工程时,我上了一堂关于人工智能的课(这是课程的名字)。当时我真的被这个题目弄糊涂了。我的意思是,我知道这很重要(当时“有原因”),但这很奇怪。
我研究了专家系统、神经网络、遗传算法,并阅读了一些论文,其中两个我发现非常有趣的是:
当我阅读这些论文时(我不知道机器学习的进展,甚至不知道它的存在),我认为我们离实现真正的人工智能真的真的很远。我仍然认为我们并不像我们想象的那样亲密,有些事情我们必须弄清楚,但以后会有更多的。
所以,因为那时(22 岁)人工智能对我来说是一个失去的希望,我开始研究量子计算,对我来说它是人工智能之前的事情,当然我错了:
但是它对我来说真的很有趣,因为它融合了很多科学和工程。
我对人工智能的兴趣
那么回到人工智能和所有这些,发生了什么?为什么我现在对人工智能、机器学习、深度学习如此热情,而我确信我们离所有这些都很远?
发生在我身上的是阿帕奇火花和吴恩达。什么?
于是,2014 年(24 岁),刚从物理专业毕业,正在做工程中黑洞模拟的论文,然后,嘣!我发现了 Coursera、机器学习、吴恩达和 Apache Spark。
我对严肃的在线学习感到非常惊讶,这是我以前没有尝试过的事情(我仍然不知道为什么),我开始学习各种课程,从基因组学到天文学,从 scala 到 python,从机器学习到索伦·克尔凯郭尔的哲学理论(顺便说一句,他很棒)。
我没有路,也没有导师,所以我只是在探索这个世界,试图弄清楚我这一生想做什么。
与此同时(2014 年底),我发现了吴恩达的机器学习课程和 Apache Spark 项目。我在两周内完成了这个课程,我简直不敢相信这个领域有多神奇。然后我开始编写我在 Scala 和 Apache Spark 中学到的东西,所以我开始了解分布式计算、Hadoop、HDFS 和所有这些伟大的东西。
我早期的一些关于机器学习和 spark 的项目(不是很好)你可以在我的 GitHub 中找到它们。去我最后的回复!
FavioVazquez 有 111 个存储库。在 GitHub 上关注他们的代码。
github.com](https://github.com/FavioVazquez)
我的第一份数据科学工作
我的第一份工作是 2014 年结束的数据科学工作,我是公司里唯一一个试图弄清楚你可以用数据做什么的数据科学家。我很困惑,事情并不像课程中那样!我不再在 R 中导入虹膜数据集,我在处理奇怪的数据,我不知道数据在现实生活中是“脏”的。
但是我一直在学习。有趣的是,我一点也不确定!)当时的数据科学是什么。
我构建了一些简单的模型,以及更复杂的模型,主要是用 Scala 和 Python。Scala 是我 2015 年的生活。
然后我意识到我喜欢开源。我开始在简单的项目中合作,一些是我自己的,然后是一些大的项目,比如 Apache Spark。我在 Spark 项目上接受了一些委托,感觉自己像个英雄。有些很简单,有些更先进,但我觉得我在为社会做贡献。我仍然不知道怎么做,但我知道我在做贡献。
宇宙冒险
Roger Penrose theory of Conformal Cyclic Cosmology
数据科学是我继物理学和宇宙学之后的第二个爱好(我想现在它们是同一个地方),所以我来到墨西哥攻读物理学硕士。这是一次令人惊奇的经历,但是仍然缺少了一些东西。我需要编码!我爱上了编程!
我学习了基础物理课程,比如经典力学、量子力学,还有数值方法、高性能计算,然后是贝叶斯推理和机器学习。
所以最终我的主人被我的两种激情所分裂。而且我在论文里用 Python 写了很多代码,真的很开心。
成为数据科学家
当我完成我的硕士学位(2017 年)时,我决定我想做的是成为一名数据科学家,帮助社会。是的,我花了点时间。
如果你想知道我是如何在这个领域找到一份令人惊叹的工作的,看看我几周前写的这篇博客吧:如何找到一份数据科学家的工作?
我也开始在我的 LinkedIn 上分享我的经历、想法和知识,这是非常重要的事情。我认识了很多了不起的人,他们帮了我很多,现在我在帮助别人,回报别人:)。
我每天都在学习、编码、为开源项目做贡献,同时也帮助人们,所以我对自己所做的事情非常满意。
深度学习呢?
这不是一个关于深度学习的帖子吗?
是的,但是我需要告诉你为什么深度学习现在对我很重要。我采取的所有这些步骤让我走到了这一步。
作为一名数据科学家,以及大多数职业,你需要了解最新的理论、技术和框架;所以去年我们看到了深度学习的爆发,就在我对机器学习感到舒服的时候,这是一个全新的学习内容。令人惊讶但压力很大。
你知道我从哪里开始的吗?猜猜…
是啊!又是吴恩达!
我真对他感到惊讶。当我开始一个领域时,他已经在教了。
但是,我仍然在学习这些课程。但我没有就此止步。我也需要更多的实用信息。于是我开始学习 TensorFlow 然后是 Keras 。
对于那些不知道 Keras 的人来说,它是一个高级神经网络 API,用 Python 编写,能够在 TensorFlow 、 CNTK 或 Theano 之上运行。它是由 Franç ois Chollet 开发的,专注于实现快速实验。能够以尽可能少的延迟从想法到结果是做好研究的关键。
有很多学习实用深度学习的资源,比如 GitHub repos 和书籍。现在我正在读这本书,它已经成为我的图书馆的一个惊人的补充:
我见过的对深度学习最清晰的解释…阅读是一种乐趣。
www.manning.com](https://www.manning.com/books/deep-learning-with-python)
深度学习的未来
“预言是一种艺术,它先说将会发生什么,然后解释为什么没有发生!”
我不知道如何预测未来。但我能说的是我看到正在发生的和可能发生的。
我去年看到的深度学习最好的东西之一是深度认知。这是一个创建和部署人工智能的解决方案。简单的 drag & drop 界面帮助你轻松设计深度学习模型。深度学习工作室可以自动为你的定制数据集设计深度学习模型,这要归功于他们先进的 AutoML 功能。
我认为 GUI 和 AutoML 可以成为深度学习的不远的将来。不要误解我,我喜欢编码,你也可以在那里编码。但是我认为我们明年要写的代码数量将会减少。我们不能在世界范围内花费这么多时间一遍又一遍地编写相同的东西,所以我认为这两个特性(GUI 和 AutoML)将帮助数据科学家提高生产率和解决更多的问题。
我将在未来发表一些关于如何用代码和深度认知平台创建一些简单的深度学习解决方案的帖子,所以我们很快会再见。
如果您有任何问题,请添加我,我们可以在这里聊天:
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 10 个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)
我使用 Keras 的深度学习之旅
介绍如何在 Keras 中从头开始构建和训练神经网络。
PC: Felipe Lopez on Unsplash
“不要相信短期炒作,但要相信长期愿景。人工智能可能需要一段时间才能发挥其真正的潜力——这种潜力的全部程度还没有人敢梦想——但人工智能正在到来,它将以一种奇妙的方式改变我们的世界”——Francois Chollet
深度学习是机器学习的一个迷人领域,也是一个有前途的领域。它表现得非常好,尤其是在视觉和听觉等感知问题领域,这些问题曾经是机器无法解决的。我第一次接触深度学习发生在几年前,当时我正在 Kaggle 解决问题。正是在这里,我被介绍给 Keras,我想探索它的细节。在我遇到的所有其他深度学习库中,我发现 Keras 非常容易、灵活和简单易用。文档和示例也很方便,容易理解。
为了对这个主题有更强的理解,我一直在看一本名为《Francois Chollet用 Python 进行深度学习》的书,他也是 Keras 的作者。这已经成为我最喜欢的关于这个话题的书之一,我从中学到了很多。就像我常说的,我有在阅读任何书籍时创建笔记的习惯,所以这里是我从使用 Python 的深度学习一书中获得的笔记。我试图总结基本概念,并以一篇文章的形式呈现出来。对于任何想开始或刚刚开始进入深度学习世界的人来说,这些笔记会很有用。****
目标
本文的目标是熟悉 Keras 的世界、它的安装、部署以及如何用它来解决机器学习问题。本文不涉及像 LSTM、康维兹等先进的深度学习概念。我打算在我的下一系列文章中讨论这些主题。
你应该知道什么
由于你已经涉足深度学习领域,并且对 Keras 特别感兴趣,所以假设你:
- 有基本的编程经验
- 有一个在 Python 和
- 都知道基本的机器学习概念。
目录
- 深度学习:初级读本
- Keras:简介|安装|硬件要求
- MNIST 的 Keras 工作流程示例
- 结论
1.深度学习:初级读本
深度学习是机器学习的一个特定子领域。深度学习强调学习越来越有意义的表示的连续层。深度学习中的 深度 代表使用连续层表示的思想。这些分层表示是通过被称为神经网络的模型来学习的,这些神经网络被构造成堆叠在彼此顶部的文字层。
为什么现在要深度学习?
总的来说,今天有三种技术力量正在推动机器学习的重大进步
- 五金器具
- 数据集和基准以及
- 算法进步
正是由于今天所有这三个领域的丰富和改进,深度学习获得了动力。
深度学习到目前为止取得了哪些成果
深度学习已经取得的一些主要成功是:
- 接近人类水平的图像分类和语音识别。
- 接近人类水平的手写转录
- 改进的机器翻译
- 改进的文本到语音转换
- Google Now 和亚马逊 Alexa 等数字助手
- 回答自然语言问题的能力
2.keras:Python 深度学习库
Keras (κέρας)在希腊语中是号角的意思。这是指古希腊和拉丁文学中的一个文学形象,最早见于《奥德赛》。 Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。Keras 是一个用 Python 构建深度神经网络的框架。Keras 使我们能够建立最先进的深度学习系统,就像在谷歌和脸书使用的那些系统一样,没有什么复杂性,也只有几行代码。其的一些主要特征是:
- 用户友好的 API
- 内置对卷积网络(用于计算机视觉)、递归网络(用于序列处理)以及两者任意组合的支持。
- 支持任意网络架构:多输入或多输出模型、层共享、模型共享等等。
Keras 是用 Python 编写的前端层,运行在其他流行的深度学习工具包之上,如 TensorFlow、Theano 和微软认知工具包(CNTK)** 。您用 Keras 编写的任何代码都可以在这些后端中的任何一个上运行,而无需对代码做任何修改。通过 TensorFlow/Theano /CNTK,Keras 可以在 CPU 和 GPU 上无缝运行。**
The deep-learning software and hardware stack
装置
在安装 Keras 之前,我们需要安装它的一个后端引擎,即 TensorFlow、Theano 或 CNTK 中的任意一个。在本文中,我们将使用 TensorFlow 后端。阅读详细说明这里安装 Tensorflow。
安装 Keras 有两种方式:
- 从 PyPI 安装 Keras(推荐):
sudo pip install keras
如果您使用的是 virtualenv,您可能希望避免使用 sudo:
pip install keras
- 或者:从 GitHub 源安装 Keras】
首先,使用git
克隆 Keras:
git clone [https://github.com/keras-team/keras.git](https://github.com/keras-team/keras.git)
然后,cd
到 Keras 文件夹并运行安装命令:
cd keras
sudo python setup.py install
如有任何安装相关的疑问,请参考 Keras 官方文件。
硬件要求:设置工作站。
作者建议(尽管不是绝对必要的)在现代 NVIDIA GPU 上运行深度学习代码。或者,您可以考虑在 AWS EC2 GPU 实例或 Google 云平台上运行您的实验(随着时间的推移,这将变得非常昂贵)。
在本文中,我将使用 Jupyter notebooks 来开始使用 Keras,尽管这不是必需的:您也可以运行独立的 Python 脚本,或者从 PyCharm 之类的 IDE 中运行代码。
3.Keras 工作流程
典型的机器学习工作流程如下:
一个 Keras 工作流没有什么不同,要完全理解它;我们将在中使用一个神经网络的例子,这个神经网络使用 Keras 对手写数字进行分类。它就是著名的 MNIST 数据库问题也叫深度学习的“ Hello World ”。问题是将手写数字(28 × 28 像素)的灰度图像分为十类(0 到 9)。
**[## MNIST 手写数字数据库,Yann LeCun,Corinna Cortes 和 Chris Burges
MNIST 数据库是由 NIST 专题数据库 3 和专题数据库 1 构成的
yann.lecun.com](http://yann.lecun.com/exdb/mnist/)**
MNIST 数据集以一组四个 Numpy 数组的形式预加载到 Keras 中。
步伐
让我们强调我们将采取的步骤,利用 Keras 解决这一问题。
I)在 Keras 中加载 MNIST 数据集
**from keras.datasets import mnist****(train_images, train_labels), (test_images, test_labels) = mnist.load_data()**
图像被编码为 Numpy 数组,标签是一个数字数组,范围从 0 到 9。存储数据的多维数组称为张量**。你可以把张量想象成数据的容器。更具体地说,张量是矩阵到任意维数的推广。张量可以由三个关键特征来定义:**
我们来看看训练和测试数据。
**#Training Data
train_images.shape**
(60000, 28, 28)
**len(train_labels) #** Total no. of training images
60000
**train_labels**
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)**#Testing Data
test_images.shape**
(10000, 28, 28)
**len(test_labels)**
10000
**test_labels**
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
所以我们这里有一个 8 位整数的 3D 张量。更准确地说,它是一个由 60,000 个 28 × 28 整数矩阵组成的数组。每个这样的矩阵都是灰度图像,系数在 0 到 255 之间。
ii)预处理数据
i) 准备图像数据
在输入之前,我们需要对数据进行预处理。这是通过将其重新整形为网络所期望的形状来实现的。我们还将缩放范围(0,1)之间的所有值。
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
因此,我们将形状为(6000, 28, 28), type — uint8
的数组中的训练图像转换为形状为(60000, 28 * 28)
的float32
数组,其值介于 0 和 1 之间。
ii) 对标签进行编码
标签也需要被分类编码,因为我们不能将整数列表输入神经网络。
from keras.utils import to_categoricaltrain_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
iii)构建网络架构
深度学习网络本质上由模型和层组成。
层
****层是神经网络的核心构建模块。它充当一种数据处理模块。各层从输入数据中提取出 表示 ,并输入其中。本质上,深度学习包括堆叠这些层以形成模型。
层是深度学习的乐高积木
模型
模型是层的线性堆叠。它就像一个数据处理的筛子,由一系列不断增加的称为层的精细数据过滤器组成。Keras 中最简单的模型是 sequential ,由层顺序堆叠而成。
模型结构
我们将在 Keras 建立我们的第一个模型,只有两层。这里,我们将输入数据的预期形状传递给第一层。
**from keras import models
from keras import layers****network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))**
我们的网络由一系列两个层组成,它们是密集连接的**(也叫全连接的)神经层。**
- 第一层由 512 个单元组成,接受从 28×28 图像转换的 784 维阵列的输入。使用的激活函数是 ReLU(整流线性单位)。一个 整流线性单元 如果输入小于 0 则输出 0,否则为原始输出。也就是说,如果输入大于 0,则输出等于输入。
- 第二层(也是这里的最后一层)是 10 路 softmax 层,这意味着它将返回 10 个概率分数的数组(总和为 1)。每个分数将是当前数字图像属于我们的 10 个数字类之一的概率。你可以在下面阅读更多关于 softmax 函数的信息。
例如,假设您的例子是只包含一个项目的图像——一片水果。Softmax 可以确定…
developers.google.com](https://developers.google.com/machine-learning/crash-course/multi-class-neural-networks/softmax)
不同的层最适合不同类型的数据处理。一般规则(不是经验法则)是:
iv)网络编译
我们现在知道,我们的网络由两个密集层组成,每一层都对输入数据应用一些张量运算。这些操作涉及权重张量,并且网络的知识出现在这些权重上。
模型构建完成后,我们进入编译阶段,该阶段主要包括三个基本要素:
- 损失函数(目标函数) : 损失 【预测—实际值】是我们在训练一个神经网络的过程中试图最小化的量。因此,测量损失函数是我们试图解决的任务成功的度量。为一个问题选择正确的目标函数是非常必要的。常用损失函数见下图。
Commonly used Loss functions
- 优化器:指定损耗梯度用于更新参数的确切方式。换句话说,它决定了如何根据损失函数更新网络。优化器可以是 RMSProp 优化器、SGD with momentum 等等。
- 度量:衡量模型的准确性。在这种情况下,我们将使用准确性。
**network.compile(optimizer='rmsprop', loss='categorical_crossentropy',****metrics=['accuracy'])**
本质上,损失的减少是通过小批量随机梯度下降实现的。管理梯度下降的具体使用的确切规则由作为第一个参数传递的 rmsprop 优化器定义。
五)培训网络
我们现在准备训练网络,这在 Keras 中是通过调用网络的拟合方法来完成的——我们将模型拟合到它的训练数据:
**network.fit(train_images, train_labels, epochs=5,batch_size=128)**Epoch 1/5
60000/60000 [==============================] - 5s 90us/step - loss: 0.2567 - acc: 0.9264
Epoch 2/5
60000/60000 [==============================] - 5s 88us/step - loss: 0.1032 - acc: 0.9694
Epoch 3/5
60000/60000 [==============================] - 5s 89us/step - loss: 0.0679 - acc: 0.9798
Epoch 4/5
60000/60000 [==============================] - 6s 92us/step - loss: 0.0490 - acc: 0.9856
Epoch 5/5
60000/60000 [==============================] - 5s 89us/step - loss: 0.0375 - acc: 0.9885
网络将开始以 128 个样本的小批量迭代训练数据 5 次(所有训练数据的每次迭代称为一个 时期 )。在每次迭代中,网络将计算关于批次损失的权重梯度,并更新权重
训练期间显示两个量:
- 训练数据的网络丢失,以及
- 网络对训练数据的准确度。
训练数据的准确性大约在98.9%
左右。现在让我们检查一下模型在测试集上的表现。
vi)测试数据测试
test_loss, test_acc = network.evaluate(test_images, test_labels)
10000/10000 [==============================] - 1s 66us/stepprint('test_acc:', test_acc)
test_acc: 0.9783
测试集的准确度是 97.8%
——比训练集的准确度低很多。但这就是 ML 术语中著名的 过度拟合 的问题。通过从原始训练数据中创建大约 10,000 个图像的验证样本并将其放在一边,可以避免这种情况。测试可以在这个样本上进行,因为它以前没有暴露于训练。整个代码可以从这里的访问。**
结论
差不多就是这样了。在 Keras 的帮助下,我们详细解决了整个 MNIST 数字分类问题。我们刚刚从零开始建立并训练了一个神经网络。但是,理论是学习的一个方面,实际应用又是另一个方面。所以起来出发吧。通过处理一些真实的数据集来利用你新发现的知识。我们将在下一部分看到,我们将学习利用 Keras 解决一些高级问题。在那之前,祝你阅读愉快。
我的机器学习之旅:第一课
我是纽约大学研究生一年级学生,攻读计算机科学。我已经决定在我的研究生课程“机器学习”中保留笔记。我相信它是最强大的媒介(无意双关!)来分享,可能会帮助很多感兴趣的读者进入 ML。它也提供了一个如何构建研究生课程的洞察力。我将根据每周课堂上所教授的内容来写文章。
课程和讲师简介
CS-GY 6923“机器学习”是纽约大学坦登工程学院教授的核心课程。研究生需要完成四门核心课程,本课程是其中之一。本课程介绍机器学习领域,涵盖标准的机器学习技术,如决策树、最近邻法、贝叶斯方法、支持向量机和逻辑回归。
丽莎·赫勒斯坦博士是 2018 年春季这门课程的讲师。她于 1984 年在哈佛大学获得了应用数学/计算机科学学士学位。然后,她于 1989 年在加州大学伯克利分校获得了计算机科学博士学位。她在期刊论文、书籍文章和会议上发表了超过 55 篇论文/文章。她的研究领域包括计算学习理论、机器学习算法、复杂性理论和离散数学。
来源
这些笔记的灵感来自各种材料,包括但不限于:
- Alpaydin 的机器学习入门
- 汤姆·米切尔的机器学习
- Andrew NG 的机器学习课程
- 赫勒斯坦教授的讲座、笔记和幻灯片
- 互联网
机器学习简介
机器学习是当今计算机科学中最具爆炸性的领域之一。这是一个令人兴奋的领域,其重点是让计算机有能力做出自己的决定。这是一个遍及商业、工业、科学和所有人类日常生活的领域。让我们从它的定义开始我们进入这个广阔领域的旅程。
根据亚瑟·塞缪尔的说法,*“机器学习是一个研究领域,它赋予计算机无需明确编程就能学习的能力。”Tom Mitchell 最近的另一个定义是,“据说一个计算机程序可以学习它在任务 T 中的性能,用性能 P 来衡量,是否随着经验 e 而提高”*我从上面的定义中理解的是,机器学习是让计算机通过处理数据来思考和决策。
如果机器不能学习,就很难称之为智能的。我们知道,要让计算机解决问题,需要算法。算法是将输入转换为输出的一系列指令。例如,要对一个数字进行排序,机器需要一个算法(如合并排序)将输入(未排序的数组)转换为输出(排序的数组)。
但是,对于某些任务,很难拿出一个算法。例如,检测垃圾邮件。在垃圾邮件中,输入通常是由字符序列组成的文件。这里期望的输出是决定电子邮件是否是垃圾邮件(是)或不是(否)。这里,我们不知道如何将输入转换为输出,因为:
- 被视为垃圾邮件的内容会随着时间而变化
- 垃圾邮件对不同的人有不同的含义
我们不知道将电子邮件分类为垃圾邮件的算法。但是我们在知识上的不足,我们用数据来弥补。计算机自动提取任务的算法。我们可能无法完全确定这一过程,但我们相信我们可以构建一个良好而有用的近似值,即我们可以检测某些模式或规律。这是机器学习的利基。这些模式可能:
- 帮助我们理解这个过程,或者
- 用于预测
与机器学习相关的另一个常见术语是数据挖掘。这两个过程是相互关联的。事实上,将机器学习方法应用于大型数据库被称为数据挖掘。在数据挖掘中,大量的数据被处理以构建一个简单的模型,该模型具有有价值的用途,例如,高预测准确性。
机器学习的应用
以下是机器学习正在积极应用的一些领域:
- **零售:**零售商使用机器学习来了解客户的购买习惯,以便他们能够有效地锁定他们,增加他们的收入
- **金融:**银行分析过去的数据,为信用卡申请、欺诈检测和股票市场建立模型
- **制造业:**学习模型在制造业中用于提高生产能力、降低材料消耗和优化供应链
- **医学:**机器学习用于医学诊断、个性化治疗、预测疫情爆发、发现药物
- **电信:**分析呼叫模式,以实现网络优化和服务质量最大化
- **科学:**机器学习使物理、化学、天文学中的大量数据得到更快的处理和分析
- **互联网:**更快地在网上搜索相关信息(想想谷歌)
- **视觉:**机器学习帮助识别人脸的模式,如对称性、眼睛的位置、耳朵等。从样本数据和使用这种模式,识别脸(想想苹果的脸锁)
机器学习也可以定义为使用示例数据或过去的经验对计算机进行编程,以优化性能标准。我们有一个定义了一些参数的模型。学习是使用训练数据/过去的经验来执行计算机程序以优化模型的参数。型号可以是:
- 预测:对未来做出预测
- **描述性:**从数据中获取知识
- 或两者都有
机器学习在建立数学模型时使用统计理论,因为核心任务是从样本中进行推断。计算机的作用是双重的:
- 在训练中,我们需要高效的算法来解决优化问题,以及存储和处理我们拥有的大量数据
- 一旦学习了一个模型,确保它的表示和推理的算法解决方案是有效的
在一些应用中,学习或推理算法的效率,即空间和时间复杂度,可能与其预测准确性一样重要。
机器学习方法的应用
1.学习协会
就零售业而言,机器学习的一个流行应用是购物篮分析。购物篮分析的目的是发现顾客购买的产品之间的关联。例如,如果通常购买产品 X 的人 A 也购买产品 Y,并且如果另一个人 B 购买产品 X 而不购买产品 Y,则人 B 是潜在的 Y 客户。一旦我们找到这样的客户,我们就可以针对他们进行交叉销售。
在寻找关联规则时,我们感兴趣的是学习 P(Y|X)的条件概率,其中:
- y:以 X 为条件的产品
- x:购买的产品/产品组
2.分类
分类是一种监督学习方法,其输出是离散值(即 0 或 1)。
监督学习方法是一种已经给出“正确答案”的机器学习方法。目标是产生更多这样的正确答案。
在金融应用中,分类是指机器学习系统将模型与过去的数据进行拟合,以便能够预测(例如,计算风险)新的应用,并决定归类为{低风险,高风险}中的任一种。有关客户的信息作为分类器的输入,分类器的任务是将输入分配给两个类中的一个。在用过去的数据训练之后,分类规则可以是以下形式:
如果收入> x1 和储蓄> x2,那么风险低;其他高风险
上述规则是判别式的一个例子。判别式是将不同类别的样本分开的函数。
一旦我们有了符合过去数据的规则,并且如果未来与过去相似,我们就可以对新的实例做出正确的预测。
在某些情况下,我们可能希望计算一个名为 P(Y|X)的概率,而不是做出 0/1(低风险、高风险)类型的决策,其中:
- x:客户属性
- Y : 0/1(低风险、高风险)
从这个角度来看,我们把分类看作是学习从 X 到 y 的联想。
P(Y=1|X=x) = 0.8
从上面的等式,我们可以说:
- 客户有 80%的可能性是高风险客户
- 客户有 20%的可能性是低风险客户
分类的另一个应用是在光学字符识别(OCR)中。这里的任务是从图像中识别字符代码。这是一个多分类的例子,其中输入是手写数字的图像,输出是实际的数字(即,机器应该能够识别出您手写的“8”是实际的“8”)。
分类也用于人脸识别。这里,输入是图像,输出是被识别的人。学习程序学习将面部图像与身份相关联。在这里应用分类有点问题,因为类别太多,输入图像往往非常大,并且姿势和光照的某些差异可能导致图像中的显著变化。
分类还用于医疗诊断(识别疾病)、语音识别、自然语言处理(垃圾邮件检测、大型文档汇总)和异常值检测等。
一旦进行了分类,我们就可以从数据中学习规则。这就是所谓的知识提取。这个规则是一个解释数据的简单模型,通过这个模型,我们可以解释数据背后的过程。学习还执行压缩,因为通过使规则适合数据,我们得到比数据更简单的解释,即,需要更少的存储器来存储和更少的计算来处理。
例如,一旦我们有了加法规则,我们就不需要记住每一对可能数字的总和。
3.回归
回归是一种监督学习方法,其输出为连续值。
例如,预测二手车的价格是一个回归问题。输入是汽车属性,输出是汽车的价格。回归通常具有以下形式:
y = wx + w1 其中
w =直线的斜率,
w1 =常数
典型地,在监督学习中,任务是学习从输入到输出的映射。机器学习的一个标准方法是,我们假设一个定义了一组参数的模型:
y = g(x / w)其中
y 是输出,
x 是属性,
w 是参数,
g(x/w)可以是回归函数,也可以是判别函数
机器学习优化“w ”,以使近似误差最小化,即我们的估计尽可能接近训练集中给定的正确值。
回归的一些例子包括:
- **机器人汽车导航:**输入是传感器,比如摄像机,GPS,输出是方向盘应该转动的角度。通过监控和记录人类驾驶员的动作来收集训练数据。
- **咖啡烘焙:**输入的是咖啡的属性,如温度、时间、咖啡豆种类等。进行了许多实验,对于这些输入的不同设置,我们测量咖啡的质量作为顾客满意度(比方说)。为了找到最佳设置,我们拟合了一个回归模型,将这些输入与咖啡质量联系起来,并在当前模型的最佳值附近选择新的采样点,以寻找更好的配置。我们对这些点进行采样,检查质量,并将其添加到数据中,以适应新的模型。这通常被称为响应面设计。
有时,我们希望能够学习相对位置,而不是估计绝对数值。例如,在推荐系统中,我们部署了一个排名函数,其中输入是电影属性和用户评级,输出是已排名电影的列表。
4。无监督学习
无监督学习方法是一种不给出“正确答案”的机器学习方法。目标是找到数据的结构。
通过找到数据中的某些模式,我们可以找到数据的结构。在统计学中,这被称为密度估计。
密度估计的一种方法是聚类。聚类是一种旨在发现输入数据分组的聚类的技术。
例如,基于客户的人口统计、过去的交易(即,客户数据)找到客户的分组。该公司希望了解经常出现的客户类型。聚类模型将属性相似的客户分配到同一组。这叫做*客户细分。*这将有助于公司针对不同的客户群体提供服务和产品。
另一个例子是图像压缩。在图像压缩中,输入是表示为 RGB 值的图像像素。聚类程序将具有相似颜色的像素分组在同一组中,并且这样的组对应于图像中频繁出现的颜色。
文档聚类是聚类的另一个例子。目的是将类似的文档,如新闻、宗教话题、体育等进行分组。文档被表示为单词包,即我们预定义了一个由 N 个单词组成的词典。每个文档都是一个 N- 维二元向量,如果 i 出现在文档中,则其元素 i 为 1。后缀’ s ‘,’-ing ‘和’ of ‘,’ in '等单词被删除。然后根据共享单词的数量对文档进行分组。如何选择词汇至关重要。
5.强化学习
强化学习是让一个主体在世界中行动以最大化其回报的问题。例如,考虑教一只狗一个新把戏:你不能告诉它做什么,但如果它做对/错的事情,你可以奖励/惩罚它。它必须弄清楚它做了什么使它得到了奖励/惩罚,这就是众所周知的信用分配问题。我们可以使用类似的方法来训练计算机完成许多任务,例如玩双陆棋或象棋,调度作业,以及控制机器人肢体。
教授的重要建议
- 我们将在本课程中使用一些基本术语:
例数: N
培训示例:
- 应该使用随机分布生成训练样本
- 假设有一个分布,但是你对这个分布不做任何事情
- PAC 模型:PAC(大概正确近似学习)模型是一个框架,学习者接收样本,必须从某一类可能的函数中选择一个泛化函数(称为假设)。目标是,以高概率(“可能”部分),所选函数将具有低泛化误差(“近似正确”部分)。总是假设数据来自未知分布
- **直觉:**简单的规则会比复杂的规则概括得更好,前提是训练误差低。
- VC-Dimension:VC-Dimension(Vapnik-Chervonenkis Dimension)是一种衡量一组假设简单性的方法。如果存在具有低训练误差的简单假设,并且存在“足够”的训练数据,则该假设很可能具有低预测误差。
- 奥卡姆剃刀定律: 奥卡姆剃刀定律指出,如果一件事有两种解释,越简单的解释越好(或者)你必须做出的假设越多,解释就越不可能。给出两种解释来解释数据,你应该选择更简单的一种。只有在绝对必要的情况下,你才应该有一个复杂的规则。
- 你并不总是希望选择训练误差较低的假设。它可能不会很好地“学习”或概括。
这就是本周的全部内容。敬请期待下节课!
我的机器学习之旅:第四课
大家好!感谢你和我一起踏上机器学习之旅!这是该系列的第四篇文章;如果你还没有看过第一篇、第二篇和第三篇的文章,请查看一下。
上周,我们学习了线性回归的核心概念。我们一直从贝叶斯的角度思考,研究朴素贝叶斯算法。我们还简要地了解了模型是如何被评估的。
本周,我们将:
- 讨论验证集的必要性
- 继续研究交叉验证
- 讨论引导
- 直观和数学地理解偏差和方差
请注意,上周,尽管我提到我们将从头实现一个朴素贝叶斯算法,但我不会在本文中这样做(我们将在接下来的文章中讨论它,所以不要担心!).
来源
这些笔记的灵感来自各种材料,包括但不限于:
- Alpaydin 的机器学习入门
- 汤姆·米切尔的机器学习
- Andrew NG 的机器学习课程
- 加州大学伯克利分校的机器学习博客
- 赫勒斯坦教授的讲座、笔记和幻灯片
- 互联网
模型评估(续)
上周,我们讨论了交叉验证,以及它如何成为评估模型的一种强有力的方式,尤其是在数据较少的情况下。我们还讨论了数据科学家通常如何将数据集分为两组:训练集和测试集。但在实践中,大多数数据科学家将数据集分为三组:
- 训练集,
- 测试集,以及
- 验证集
人们经常问的一个常见问题是:
“测试集和验证集之间有什么区别?”
验证集主要用于调整学习算法的参数,而测试集仅用于评估算法的性能。
所以你有一个学习算法,你想评估它的表现。的确,您可以将数据集划分为训练集和测试集,并通过对训练数据进行训练和对测试数据进行评估来评估您的模型有多准确(好)。但是像多项式回归这样的学习算法有许多参数,我们想要测试参数的每一个设置。因此,通过在验证集上评估学习算法,我们可以得到一个学习算法的最佳参数设置。然后使用学习算法的这个最佳设置,我们在测试集上评估它的性能。这通常能创造奇迹!
要点是:
- 更新学习算法的参数以获得数据的最佳算法设置所必需的验证集
- 测试集对于评估我们从验证集中得到的算法的最佳设置的性能是必不可少的
现在你会问,
“但是等等易勒雅斯!高次多项式(在回归中)的性能通常不会比低次多项式好吗?”
是的,这是真的。高次多项式有过度拟合数据的趋势。我们得到的精度可能很高,但在推广方面做得很差。因此,如果您在不同的数据集上使用相同的模型(比方说具有相同的属性),它的性能会大大降低。
图 1 是低次多项式,而图 2 是高次多项式。正如我们可以清楚地看到,高次多项式试图执行太难,甚至适合离群值。
反之亦然:多项式次数过少可能无法很好地推广。
图 1 是低次多项式,而图 2 是高次多项式。可以清楚地看到,在这种情况下,高次多项式更适合数据。
那么,当我们考虑一个验证集时,我们如何处理这个问题呢?我们如何选择多项式的最佳次数,使模型既不欠拟合也不过拟合?
嗯,我们使用交叉验证!
如果我们只记录总体数据的误差,显然高次多项式会表现得更好。因此,我们使用交叉验证(回收数据),以便数据中的每个集合都可以作为训练集和验证集重用。这样,在一个验证集中起作用的高次多项式不太可能在另一个验证集中起同样的作用。这样,我们可以得到我们一直在寻找的多项式的最佳次数!
一般程序如下:
让
- D1 —培训套件
- D2 —验证(调谐)装置
- D3 —测试集
执行 k 重交叉验证时,保持 D3 独立,不要接触它
对于每个 k:(其中 k = 1,2,3,4,……多项式的次数)
- 使用设置为 k 的学习算法训练假设
2.计算 D2 假设的误差
3.对所有折叠重复此操作
4.选择 k,它给出了所有褶皱的 D2 平均误差的最小值
5.现在,在测试集 D3 上用 k 的这个设置运行学习算法。如果它表现良好(即准确性值得称赞),就保留它。
另一个可能被问到的问题是:
“如果学习算法在 D2 上跨所有折叠都执行得很好,但在 D3 上(从未见过的测试集)却不行,会怎么样?”
这意味着三者之一:
- 学习算法是不能够的
- 怀疑过度拟合
- 出了问题,比如 D1、D2 非常小或者 D3 非常小(可能不适用于交叉验证场景)
如果我们遭受类不平衡问题,我们应该使用分层 k-fold 交叉验证。分层是一个重新排列数据的过程,以确保每个折叠都是整体的良好代表。例如,如果我们有两个类,分层确保每个折叠都有两个类的 50%。
另一个关键问题是:
我们如何选择交叉验证中折叠数“k”的值?
没有金科玉律来定义训练、验证和测试集应该有多大。我们希望每个数据集足够大,以减少方差(方差衡量数据集分布的程度;我们很快就会谈到它!)的估计。估计方差有两种形式:
- 适合训练数据的假设(学习算法)的方差
- 验证/测试风险估计值的方差
好的启发法(通常)是:
- 50%/25%/25%用于培训/val/测试分割,以及
- k = 5 或 k = 10
- 随机拆分数据,集合之间的实例没有重叠
我们应该总是设法减少验证/测试风险估计的方差以及学习算法估计的方差。
所以差异是由两个因素驱动的:
- 训练/拟合:
-随着模型的复杂度与训练数据大小之比的增加,模型可能会过度拟合,这增加了模型的方差。 - 小型测试/验证集:
——测试/验证风险是整个数据集中每个样本风险的平均值。均值估计值的标准误差与 sqrt(数据集的大小)成比例减少
交叉验证的替代方法是引导。
Bootstrapping 是一种通过从原始样本中抽取实例并替换来生成新样本的方法。这类似于从单个样本生成多个样本。原始样本在这里被当作一个“群体”。
更具体地说:
- 训练数据集—从总共 N 个数据实例中随机选择 N 个替换样本
- 验证数据集-原始数据集(不属于训练数据集的实例)
bootstrap 样本可能比交叉验证样本重叠更多(因为我们是用替换样本进行采样的),因此它们的估计更具依赖性;但是它被认为是对非常小的数据集进行重采样的最佳方式。
现在:
我们选择一个实例的概率= 1/N
我们不选择实例的概率= 1 - 1/N
在 N 个实例后我们不挑选的概率
= (1 - 1/N)^N
=(大约。)e^-1
= 0.368
这意味着训练数据包含大约 63.2%的实例;即,系统将不会对 36.8%的数据进行训练。因此,误差估计将是悲观的。为了使我们的误差估计更准确,我们复制;即多次重复该过程并观察平均行为。
在某种程度上,我们使用 bootstrap 程序根据经验计算估计量的方差,并将方差估计纳入我们的选择机制。
关于引导要记住的要点:
- 是一种非参数方法(即,不假设任何关于基础分布的事情),不需要假设人口分布的参数形式
- 用替代品取样
- 将原始样本视为“总体”
- 潜在的假设是,从大小为 N 的原始样本中进行替换的抽样模拟了从更大的总体中抽取大小为 N 的样本
- 适用于各种各样的问题,如非线性回归,分类,置信区间估计,偏差估计,调整 p 值,和时间序列分析
- 必须记住,它并不真正代表原始人口
自举不仅仅是我们讨论的内容。我推荐你通读以下文章,以便更好地理解它:
偏见和差异:两难
偏差-方差困境是机器学习和数据科学领域中最流行的困境之一。理解它也很重要。为了理解偏差和方差,我将用两种方式来解释它:
- 直观的方式(你可以很容易地跟随)
- 一种更数学化的方式
对偏差和方差的直观理解
偏差-方差困境具有现实世界的意义。它导致成千上万人死亡。流行的 【福岛核电站灾难】 就是过度拟合的结果。让我们回过头来看看欠拟合和过拟合与偏差和方差有什么关系。
我们希望我们的学习算法能够非常接近地模拟训练数据,即捕捉相关的属性和趋势。然而,如果我们过于接近我们的学习算法,我们可能会高估离群值。这是机器学习算法试图踩在预测上的微妙平衡。
事情是这样的:
- 我们希望避免过度拟合,以停止重视离群值
- 但是在我们尝试这样做的时候,我们可能会适得其反:忽略训练数据中的重要特征
你可能拥有宇宙中最快的计算机、最先进的算法、计算密集型 GPU,但如果你的模型过拟合/欠拟合,你的学习算法的预测能力将仍然很糟糕。
偏差和方差是统计领域的术语。偏差是一个定义非常松散的术语,但它通常被定义为*“实际参数和计算统计值之间的差异”。如果您不知道统计数据和参数之间的区别,请参考这个。另一方面,方差被定义为“对数据分布程度的度量”*。
偏差对应于欠拟合,而方差对应于过拟合。看这个图:
在这里,我们看到线性模型表现出高偏差,即它欠拟合。这个模型不够复杂,无法捕捉信息的潜在趋势。我们的模型是有偏差的,因为它隐含地假设数据以某种方式运行(在这个例子中,是线性的),即使这个假设不是真的。需要记住的一个关键点是,我们的线性模型没有任何问题;它正尽力而为。问题出在模型本身,也就是说,它不够复杂,无法从数据中获取足够的信息。
看一下这个例子:
从图中可以看出,模型过拟合。这也叫高方差。数据表明,曲线对于捕捉信息可能是必不可少的,但我们的模型选择了复杂的曲线来做到这一点。在这种情况下,它表现出高方差和非常低的偏差(低偏差,因为它不对数据做任何假设)。事实上,它对数据的适应性太强了。
需要记住的一个关键点是,模型本身没有任何问题;它适应每一个数据点。对上述数据使用这种模型存在问题。我们的模型想要考虑每一个数据点,因此过度概括。过度概括的模型具有很高的方差,因为它基于无关紧要的数据细节而变化太多。
太好了!但是现在你问:
“嘿,易勒雅斯!我明白你说的偏差和差异是什么意思。但是为什么它们的背后会有取舍呢?为什么我们不能利用两者的优点,即低偏差和低方差?”
碰巧偏差和方差是一个因素的副作用:我们模型的复杂性。
当我们的模型的复杂性低,我们有高偏差和低方差。另一方面,当我们的模型的复杂性很高时,我们有低偏差和高方差。
我们能做的最好的事情就是在两者之间找到一个平衡点,也就是说,选择一个既不太复杂也不太简单的模型。
还有一件事我想让你记住:
- 训练误差总是会随着模型复杂度的增加而减少(从上图中的绿线可以看出)
- 测试误差会降低到某一点,然后增加(从上图中的红线可以看出)
- 因此,这些误差是确定您的模型是否欠拟合/过拟合的良好度量
扩展上述观点:
- 低复杂度模型导致训练和测试数据的精度差和误差大 。这是因为模型本质上缺乏足够的复杂性来描述数据。
- 高复杂度模型导致高精度和高测试误差。这是因为该模型将能够很好地描述训练数据,因此不能推广到测试数据。
参数方法
别再凭直觉了!让我们试着从数学上理解偏差和方差!在具体谈论偏差和方差之前,让我们先了解什么是参数方法。
在参数方法中,我们假设样本来自服从已知模型的某种分布,例如高斯(正态)。参数化方法的优点是模型被定义为少量的参数(例如,均值和方差)。这些被称为分布的充分统计量。这意味着一旦从样本中估计出参数,整个分布就是已知的。
我们:
- 根据给定的样本估计分布的参数,
- 将这些估计值代入假设模型,
- 得到一个估计的分布,然后
- 用它来做决定
我们用来估计分布参数的方法是最大似然估计(MLE)(如果你读过以前的文章,现在应该知道了)。
让我们将样本定义为独立同分布。这意味着我们样本中的每个随机变量都具有与其他变量相同的概率分布,并且相互独立。它表示如下:
我们假设 x^t 是从一些已知的概率密度函数 p(x |θ)中提取的实例,定义为参数θ:
我们想找到θ,使得从 p(x |θ)采样 x^t 尽可能的可能。因为 x^t 是独立的,给定样本 x 的参数θ的可能性是各个点的可能性的乘积:
在最大似然估计中,我们感兴趣的是找到使 X 最有可能被画出的θ。因此,我们寻找最大化上述可能性的θ。我们可以最大化可能性的对数,而不改变取最大值的地方的值。应用对数技巧(对数将乘积转换为总和),我们将对数似然性定义为:
对于高斯(正常)密度:
x 是高斯分布,具有:
如果你在想上面的 E 是什么,那就是随机变量 x 的期望值,对于连续型随机变量,期望值一般是均值。更多信息,请参考本。
密度函数如下所示:
现在,考虑到:
对数可能性是:
现在,我们通过对上述导出的对数似然进行偏导数(w.r.t mu 和 sigma 以获得估计值)并将其设置为 0 来找到 MLE。我们得到:
评估一个估计量:偏差和方差
我们终于准备好讨论偏差和方差了!
让:
为了评估该估计量的质量,我们可以测量它与θ的差异,即,
但是由于估计量是一个随机变量(它取决于样本 X),我们需要在所有可能的 X 上平均,并考虑 r(d,θ),估计量 d 的均方误差定义为:
估计量的偏差是估计量的平均值和实际参数θ之间的差值:
如果上述 bias 值等于 0(零),我们说 d 是θ的无偏估计量。如果 x^t 是从具有实际均值 mu 的某个密度中抽取的,则样本平均值 m 是实际均值 mu 的无偏估计量,因为:
请注意, m 是样本的估计平均值, mu 是总体的实际平均值。所以上面基本上说的是,如果我们从很多这样的样本中取很多这样的 m ,所有这样的 m 的平均值就会接近实际平均值(mu)。因此,随着样本数量的增加,样本均值将(几乎)等于实际均值。
m 也是一致估计量,这意味着 Var(m)—>0 为 N—>无穷大。
随着样本中的点数 N 变大, m 偏离 mu 越小。
现在让我们检查 s,实际方差σ的 MLE(最大似然估计):
鉴于:
如果你对上面的证明感到好奇,可以参考这个。
从(4)中,我们可以写出:
将上述值代入(3),我们得到:
上式表明 s 是*μ的有偏估计量。*如果我们将 N 项从 R.H.S 移动到 L.H.S,我们得到(N/(N-1))s,这是一个无偏估计量(即,它等于实际σ)。但是,当 N 变大时,差别可以忽略不计。这是一个渐近无偏估计量的例子,当 N 趋于无穷大时,其偏差趋于 0。
最后,回到我们的均方差:
Fig. Analogy by my friend, Rakshit Sareen
E[(d - E[d]) ]是公式中的方差。它衡量特定 di 在期望值(即估计平均值)附近的平均变化程度(即期望值 E)。
为了记住这一点,想想地球和月球之间的类比。地球的位置是估计的平均值(E[d])。月球在任何给定时间的位置都是 D1。方差就是两者的平均差。
因此,具有实际参数θ的模型的误差(均方误差)为:
注意,如果偏差= 0,即估计平均值(E[d]) =实际平均值(θ):
你有它!偏差和方差的数学分解!现在你在直觉上和数学上已经准备好处理偏差和方差了。
这就是本周的全部内容,各位!下周见!
我的机器学习之旅:第五课(回归)
欢迎回来,伙计们!机器学习巡航继续!这是该系列的第五篇文章;请务必阅读以前的职位,因为我从那里建立了很多。
上周,我们讨论了对验证集的需求。我们继续讨论了交叉验证,并讨论了作为交叉验证替代方法的自举。我们也试图直观和数学地理解偏差和方差。
在本帖中,我们将讨论:
- 回归模型—单变量、多变量和多项式
- 正规方程方法
- 梯度下降算法
- 正规化
来源
这些笔记的灵感来自各种材料,包括但不限于:
- Alpaydin 的机器学习入门
- 统计学习的要素
- 吴恩达的机器学习课程
- 艾琳金姆🙏的文章
- 赫勒斯坦教授的讲座、笔记和幻灯片
- 互联网
一元线性回归模型
在第三篇文章中,我介绍了线性回归的核心概念。概括地说,我们希望有一个函数 f 来模拟我们的数据。我们建立一个函数 f 的近似器,称为g,表示为:
我们使用误差函数来衡量函数对数据的逼近程度。误差函数有许多变体,但我们将利用:
例如,假设我们的数据如下:
上述的误差函数为:
我们的误差函数值不是很大。值越接近 0,我们的模型就越好。如您所见,我们的误差函数取决于:
- 属性/特征 X
- 参数 w1 和 w0
我们不能改变属性 X 的值,因为它代表实际的数据(我们可以对它进行规范化,但不能随意改变它的值)。然而,我们可以改变参数 w1 和 w0 的值。一元线性线中的 w1 和 w0 表示:
- w1 -斜率或梯度(我们的线有多陡)
- w0 - y 轴截距(直线与 y 轴相交的位置)
如果我们能够控制 w1 和 w0 的值,我们可以使上面的线准确地穿过我们的数据!
在我们讨论如何精确地优化 w1 和 w0 的值之前,我想用矩阵来表示上述误差函数。
让:
请注意 X_0 = 1。这是因为 X_0 不是一个真正的属性,但我们用它来简化我们的矩阵符号。这只是一个培训示例。如果我们有一个以上的训练示例(比如 3 个),我们的矩阵符号就变成:
产生的向量(向量是具有单行/列的矩阵)是我们预测值的集合(g(X)的值)。
现在我们已经定义了矩阵术语,让我们看看如何优化参数 w1 和 w0 的值。
有两种方法可以获得 w1 和 w0 的优化值:
- 正规方程法,以及
- 梯度下降算法
1。正规方程法
正规方程方法是一种非迭代方法,它帮助我们确定 W(带有我们希望优化的参数的矩阵)的优化值。
在我们继续之前,我想定义一些术语:
**残差:**观测值®和估计值之间的差值(在我们的例子中是 g(X))
误差:观察值®与 r 的真值(不可观察)之差
**RSS(残差平方和)😗*表示为
最小二乘法:最小化 RSS 的方法。它测量模型的平均拟合缺失。它分为两类:普通(线性)最小二乘法和非线性最小二乘法
**闭型表达式:**可以在有限次运算中求值并有解的数学表达式。
**普通最小二乘法:**有一个封闭形式的解(我们这里的正规方程组方法)
**非线性最小二乘法:**一般来说,没有封闭形式的解
我们这里考虑的正规方程组方法是普通最小二乘法。在这种方法中,我们通过明确地对 w 求导并将它们设置为 0 来最小化误差函数。它由以下公式给出:
如果你对这个等式是如何推导出来的感兴趣,那么 Aerin Kim 将是一个很好的起点🙏笔下的文章。我还推荐你浏览一下维基百科的页面和博客。
关于正规方程,需要记住几个要点:
- 正规方程只需一步即可解析求解 W
- 不需要要素缩放(将要素/属性的值转换为相同的比例,通常为-1 比 1)
- 计算(X^T X)的倒数的时间复杂度为 O(n ),其中 n =特征的数量
- 如果我们有非常多的特征,法线方程将会很慢
- 实际上,当 n > 10,000 时,可能是从常规解决方案进入迭代过程的好时机
- 法线方程非常适用于线性模型,尤其是当要素数量较少时
- 它不适用于其他模型,如逻辑回归(我们将在后面介绍!)
- 有时,(X^T X)的逆可能不存在,即(X^T X)是不可逆的(它的行列式是 0)
- 如果(X^T X)是不可逆的,常见原因可能是:
- 冗余特征,其中两个或多个特征非常相关(即,它们是线性相关的)
例如,如果我们有以米为单位的 X1 -尺寸,以厘米为单位的 X2 -尺寸,X1 = 100X2,那么 X1/X2 是一个多余的特征,应该被删除
2.功能太多。在这种情况下,删除一些特征或使用正则化
现在让我们来看看获得优化参数的迭代解决方案。
2.梯度下降算法
梯度下降是一种迭代算法,可以最小化我们的误差函数。这是一个非常强大的通用算法,广泛用于机器学习,而不仅仅是线性回归。
让我们试着直观地理解我们的误差函数和参数的目的是什么。我们将画出 g(X)和误差函数 e。
在我们的例子中,我们得到 E = 1.165。理想情况下,我们应该得到 E = 0。为此,我们不断改变 w1 的值,以使该点位于 x 轴上。然后,我们的 E(w)将是 0,我们将有一个模型,完美地描述我们的数据。
上图是我们假设只有一个参数的时候。让我们考虑参数 w0 和 w1,并想象我们的 E(w)。
我为我糟糕的绘画技巧道歉。当我们考虑参数 w0 和 w1 时,我们得到 3D 表面图。当我们对 w0 和 w1 取不同值时,弓形表面就是我们的误差函数。这个弓形表面的底部点是我们得到误差函数最低的地方。同样的图形可以用等高线图绘制在二维平面上,但我们不会在这里深究。
因此,我们可以手动绘制如上图,找到 w1 和 w0 的值,并查看我们的误差函数如何响应这些值。但这是一个极其繁琐的过程。更不用说,当我们有两个以上的参数时,我们会得到更高维度的图形,这些图形不容易绘制,也更难可视化。
我们希望有一种有效的算法,能够自动找到 w1 和 w0 的值,使我们的误差函数最小。这个算法就是梯度下降。
通过一个例子可以更好地理解梯度下降。
想象你和你的爱人去爬山。经过艰苦的努力和时间,你终于到达了山顶!(万岁!).当你沉浸在荣耀中时,你突然意识到你的爱人不在你身边。惊慌失措中,你呼唤着爱人的名字。幸运的是,你的爱人回应说他/她在山的最低点(山很小!).
你想尽快到达这座山的最低点。你可以随意往任何方向走,希望你能找到你的爱人。但是你的爱人可能会有危险(有凶猛的野兽在附近徘徊!).你不想拿你爱人的安全冒险。
你深吸一口气,开始分析你的环境。从你站的地方,你环顾四周,选择最陡下降的方向。你推理说,如果在每一步,你都选择最陡的下坡路,你会比盲目地朝一个随机的方向走更快地到达你的爱人。这需要你一些时间,但是按照上面的策略,你最终会找到你的爱人(干杯!).
根据上面的类比:
- 您的位置 -当前故障点功能
- 你女朋友的位置——误差函数最低的点
- 最陡下降 -误差函数的导数(该点切线的斜率)
这可以想象如下:
从图中可以看出,我们的目标是到达图表中的最底部,也就是说,当它的值最小时。
方法是将误差函数 w.r.t 对参数 w0 和 w1 求导。我们在下降速度最快的方向上逐步降低误差函数。
每一步的大小由参数 alpha , 决定,称为学习率。较小的α会导致较小的步长,而较大的α会导致较大的步长。采取步骤的方向由 E(w0,w1)的偏导数决定。根据一个人在图上的起点,他可能会在不同的点结束。
在上图中,我们注意到对于两个不同的起点,我们到达不同的最低点(局部最小值)。我们稍后将详细讨论这一点。
梯度下降算法可以封装在一个公式中:
可能会出现一个问题:
为什么取导数的负值,而不取正值?
任何函数的导数的方向都是该函数最大增加的方向。因为我们的目标是 E(w0,w1)(我们的函数)的最小化,我们选择函数的负导数,因为它给出了函数的最大减少的方向。
为了直观地理解它,考虑下面的例子:
你可以清楚地看到:
- 当我们考虑正斜率时,w1 减小,因此误差函数也减小
- 当我们考虑负斜率时,w1 增加,因此误差函数也增加
另一个重要的问题是:
梯度下降如何以固定步长大小 alpha 收敛?
收敛背后的直觉是,当我们接近凸函数的底部时,导数接近 0。在最小值点,导数将始终为 0,因此,我们得到:
当我们接近局部最小值时,梯度下降将自动采取较小的步骤。偏导数的值会随着我们向下移动到局部最小值而减小。这就是为什么,我们确实需要改变学习速度。
当梯度下降专门应用于线性回归的情况时,可以导出一种新形式的梯度下降方程:
所有这些的要点是,如果我们从估计量(g(X))的猜测开始,然后重复应用梯度下降算法,我们的估计量将变得越来越精确。
上述梯度下降算法被称为批量梯度下降,因为它查看整个训练集中的每个示例(求和部分)。它对凸函数非常有效,因为凸函数只有一个全局最小值(即只有一个局部最小值)。然而,当我们有凹函数(凹函数有不止一个局部极小值)时,这在计算上极其昂贵并且根本不可行。
因此,为了减轻计算,使用梯度下降的另一个变体,称为随机梯度下降。在随机梯度下降中,我们不是查看每步的整个训练集(求和部分),而是只查看每步的一个样本。单个样本可能有噪声,因此随机梯度下降的许多变体使用小批量(每步几个样本,而不是每步一个样本)。
如果你想看看批量梯度下降与随机梯度下降,我强烈推荐 Aerin Kim🙏的文章和这个 StackExchange 回答。
要了解凸凹函数的区别,看一下这篇文章。
关于梯度下降需要记住的几点:
- 梯度下降需要特征缩放,因为如果缩放不均匀,梯度可能会花费很长时间,并在最终找到全局最小值之前来回振荡
- 在特征缩放中,每个特征(即 X)大约在-1 ≤ X ≤ 1 的范围内
- 特征缩放将使梯度下降运行得更快和在更少的迭代中收敛
- 要素缩放包括将输入值除以范围(即最大值-最小值)或标准差
- 另一个称为均值归一化的变量,包括用相同变量的平均值减去输入变量的值
- 结合特征缩放和均值归一化,我们得到:
- 为了确保梯度下降能够正常工作,我们可以绘制一个如下图:
- 我们可以在每 100 次迭代中评估 E(W)的值。要点是 E(W)应该在每次迭代后减小
- 对于特定应用,梯度下降收敛所需的迭代次数可能会有很大变化。可能需要 30、3000、300000 次迭代
- 很难预先知道梯度下降需要多少次迭代才能收敛。通常通过绘制如上图,我们可以发现梯度下降是否收敛。
- 也有可能提出一个自动收敛测试:如果 E(W)减少小于ε(比如 10^-3)in 一次迭代),则宣布收敛
- ε是一个很小的值,是一个阈值。一般来说,选择阈值的值是非常困难的。因此,依靠图表是更可取的
- 有时,你的 E(W)可能在每次迭代中增加而不是减少
- 发生这种情况是因为:
- 梯度下降可能不起作用
- 阿尔法太大了
- 你的代码中有一个错误
- 选择α值是梯度下降算法的一个重要部分
- 如果α太小:收敛速度慢
- 如果α太大:E(W)可能不会在每次迭代中减少,也可能不会收敛
- Andrew NG 提出的一个很好的启发是:
- 最初,设置 alpha = 0.001(或任何小值)
- 将后续 alphas 设置为大约是其先前值的 3 倍,即 0.001、0.003、0.01、0.03 等等
- 对于每个α值,绘制 E(W)作为迭代次数的函数
- 选择看起来能使 E(W)迅速减小的α值
- 当特征数较少时,最好使用正规方程组方法
- 如果数据集太大,使用小批量随机梯度下降比批量梯度下降更好
多元线性回归
多元意味着我们有不止一个变量(特征)。它的工作方式与一元线性回归完全相同。我们只需要推广多元线性回归的上述方程。
1.正规方程方法
矩阵的维数变了,但我们的正规方程保持不变。
2.梯度下降
梯度下降方程本身一般也是这种形式;我们只需要对 k 个特性重复这个过程。
多项式回归
多项式回归是回归分析的一种形式,其中自变量(在我们的例子中是 X)和因变量®之间的关系被建模为次数≥ 2 的多项式。
次数= 1 的多项式是线性方程。我们上面看到的例子都是次数= 1 的多项式。
多项式回归允许您使用线性回归的机制来拟合非常复杂的非线性函数。
将多项式模型表示为线性模型的一个小技巧是通过替换。内容如下:
如果我们像这样选择我们的特征,那么特征缩放对于梯度下降算法变得越来越重要。
高次多项式有过度拟合的趋势。因此,高次多项式的精度将优于低次多项式的精度。
为了解决过度拟合的问题并实现良好的通用模型,我们有两种选择:
- 减少功能的数量:这是通过只选择最重要的功能,扔掉那些不太有用的功能来实现的。为了自动选择重要的特征,我们使用了模型选择方法,例如最佳子集选择、逐步选择(正向和反向)、以及逐步回归等等(我们将在后面介绍这些方法!)
上述方法的问题是它导致信息的删除(特征或者被保留或者被丢弃)。因此,它通常表现出很高的方差
- **正则化(或收缩方法)😗*正则化是引入惩罚项(称为 lambda)的过程。该λ确保惩罚高复杂度模型(更高阶多项式),即,它平滑系数(w0,w1,…,wK)。为了说明正则化如何帮助我们获得更好的拟合,考虑这个例子:
有两种常用的正则化类型:
- L2 正则化(岭回归)
- L1 正则化(拉索回归)
1.L2 正则化(岭回归)
L2 正则化由以下公式给出:
请注意,我们在正则化项中不考虑 w0。为什么?因为这是一种惯例,在实践中,我们是否包括 w0 关系不大。
2.L1 正则化(拉索回归)
LASSO(最小绝对收缩和选择运算符)由以下公式给出:
这里唯一的区别是我们考虑参数 w 的模,而不是它们的平方。
比脊和套索更好的正则化方法是弹性网正则化。
弹性网络正则化结合了脊和套索,由以下公式给出:
为了理解为什么这更好的直觉,我推荐你阅读提出这种方法的原始论文。但是简而言之,当你有高度相关的特性时,那么弹性网就是你要走的路!
正则化的一个问题是选择λ的值:
- 如果 lambda 太高,模型就会太简单,从而导致拟合不足
- 如果 lambda 太低,你实际上没有受到惩罚,因此,你的模型仍然很复杂
为了选择最佳的λ,在不同的λ值上使用交叉验证,选择产生最低 E(W)的λ。
另一个要注意的要点:在使用正则化时,鼓励特征缩放,因此参数的惩罚是基于它们的预测能力,而不是它们的比例。
我希望这篇文章能够帮助您更好地理解回归。伙计们,这几周就到这里吧!下一篇帖子再见!
我的编程和生物信息学之旅:第 3 部分
生物信息学是一个非常广阔的领域,甚至还有专门的生物信息学硕士学位。在 10 分钟左右的阅读时间内涵盖所有方面是不可能的。如果你刚刚起步,对专业术语感到困惑,请阅读这篇文章。如果你想深入研究,Github 上有免费开放的 生物信息学课程。
既然我们可以(在某种程度上)编程(第 1 部分)并对大规模并行测序(第 2 部分)的一些概念有所了解,我们可以继续并将这些应用于我们面临的任何问题。
更类似于第 1 部分,这篇文章将是一个教程、指南和期刊文章的集合,可以帮助您找到进一步研究的正确方向。这里的很多信息在 Illumina 测序介绍中也有涉及。
在我们开始之前,了解常用术语是很重要的。我也将只涉及基于 Illumina 的测序,因为它是最广泛使用的测序类型。
词汇表
**覆盖面或阅读深度。**单个核苷酸的覆盖率或阅读深度(例如 30X)是该核苷酸被测序运行有效调用的次数。人类基因组 30 倍的平均覆盖率意味着平均每个核苷酸被测序 30 次。为什么这很重要?假设你只调用每个核苷酸一次。这样,你永远也不能说出这个位点是纯合的还是杂合的。如果你调用每个核苷酸两次,你可能会碰巧得到两次相同的核苷酸(例如一个 T)。你会认为这是一个纯合位点,而实际上,它是一个杂合位点(例如 A/C)。增加你调用该碱基的次数会增加以该碱基的真实频率结束的几率(50-50%,在蚊子或癌症中非常小的亚克隆的情况下为 1-99%)。
**成对末端读取。**成对末端测序能够对 DNA 片段的两端进行测序。因为每对读数之间的距离是已知的,比对算法可以使用该信息更精确地绘制重复区域的读数。这导致更好的读数比对,特别是在基因组的难以测序的重复区域,并允许检测结构变异。[更多信息请点击这里](http://www.illumina. com/technology/next-generation-sequencing/paired-end-sequencing_assay.html)。
**Phred (Q)质量评分。**Q = 10 log(10)P,其中 P =不良碱基或变异呼叫的概率。例如,如果 Phred 给碱基分配 30 (Q30)的 Q 分数,这相当于 1000 次中不正确碱基呼叫 1 的概率。这意味着碱基调用的准确性(即,正确碱基调用的概率)是 99.9%。更多信息点击这里。
**FASTA 和 FASTQ 文件。**FASTA 格式用于存储生物序列(如核苷酸:“AGTCGGCTATTGCGAG”或氨基酸:“LIAEAYPEDSNATST”)。FASTQ 格式是 FASTA 格式的扩展,包含相应核苷酸的 Phred 质量分数,以显示测序仪对该核苷酸的“确信”程度。更多信息请点击此处。
**参考基因组。**当测序仪显示读数时(FASTQ 格式),您需要将它们与参考基因组进行比对,以查看它们来自哪里。更简单的是,目前有三个参考基因组在使用。2009 年:GRCh37 和 hg192013 年:GRCh38。GRCh37 和 hg19 的染色体位置相同,但 GRCh使用“chr”前缀表示染色体,而 hg不使用。虽然这似乎是一个微不足道的问题,但如果你决定交换参考基因组,这可能会给你带来很多麻烦。挑一个坚持下去,除非真的要改。这里是关于差异的更多信息。阅读如何选择参考基因组。虽然如果每个人都改用 GRCh38 会更好,但许多工具仍然依赖于 2009 版本,这使得转换很困难。
**SAM/BAM/CRAM-files。**SAM 格式是用于与参考序列比对的生物序列的格式,支持短和长读取(高达 128 Mb)。BAM 与 SAM 完全相同,但采用二进制格式以实现高效压缩(BAM 可由计算机读取,而 SAM 可由人类读取),因为 SAM 文件可能会变得非常、非常、非常大。CRAM 是 BAM 的更压缩版本。更多信息可在 SAMtools 文档中找到。
**变体呼叫格式(VCF)。**VCF 格式是包含元信息行、标题行和数据行的文本文件,每一行都包含关于基因组中位置的信息。标题行命名了 8 个固定的强制列。这些列是:CHROM(染色体)、POS(位置)、ID(如 rsID)、REF(参考)、ALT(替代)、QUAL
(质量)、FILTER(通过或失败)、INFO(附加信息)。SAMtools 文档中提供了更多信息。
图书馆准备
在您开始处理数据之前,显然您首先需要数据。将“原始”DNA 或 RNA 转化为可以测序的东西的过程被称为文库制备或简称为文库制备。它包括将 DNA 片段化成短序列(~300bp)并添加衔接子、索引和尾部。测序引物需要衔接子来结合。后面的解复用需要索引(见下文),最后,尾使 DNA 片段结合流动细胞成为可能。如果您对此感到困惑,请阅读第 2 部分了解更多信息。
我不会在这里涉及湿实验室方面,让湿实验室的人在你开始做这些类型的分析时施展他们的魔法。但是,每个实验都是不同的,您需要了解您的样品使用的是哪种文库制备。如果你不这样做,你会有解释 QC 图的问题。
定序
在大多数情况下,当你刚刚开始时,你的工作将在测序运行结束时开始。看看测序的质量。我怎么强调都不为过。如果你有坏的数据开始,因为,例如,你的文库制备或测序运行出错,你的下游分析也将是坏的。垃圾进=垃圾出。
如果你的跑步记录被上传到 Basespace,你需要在https://basespace.illumina.com/建立账户。
第一次打开 Basespace 时,你会被一系列你不理解的 QC 参数击中。为了更好地了解在 Basespace QC 中发生的事情,最好了解 Illumina 测序实际上是如何工作的。为此,我们需要深入研究流动池。根据您使用的机器,有两种流动池:模式化流动池和随机流动池。
Further reading at CoreGenomics
图案化和非图案化流动池都有优点和缺点。
Sources of duplicate reads on Illumina platforms. Source: Illumina.
如果您使用的是未形成图案的流动池,机器必须预先(用显微镜)目测决定簇的位置。通常(取决于测序机器),这在前 5 个循环中完成。如果你使用一个低多样性的库,这会导致问题。例如,如果您的文库中的前 5 个核苷酸都是相同的(以 CAGTG 开始),测序仪将不知道哪里有簇(因为在循环 1 中,整个流动池有 1 种颜色,C;在周期 2 中,整个流动池具有不同的颜色,等等)。
为了解决这个问题,你可以插入一个更复杂的不同的库,比如 PhiX 基因组。通常,在文库中加入约 1%的 PhiX 作为阳性对照来计算错误率。您知道 PhiX 基因组的序列,并且您知道比对后 PhiX 基因组中有多少错误,从而允许您计算测序运行中其他样品的错误率。在低多样性库的情况下,增加更高%的 PhiX 会增加库的多样性。
Illumina 有一个指南解释地下室的参数。如果你认为你的跑步过于拥挤,这里有一个有用的指南。
一个常见的问题是,你需要多少阅读量来准备你的图书馆。老实说,我不知道。使用覆盖率计算器。
在看了几次测序运行后(特别是如果你有一次不好的运行),你会更熟悉什么参数是重要的,要注意什么等等。如果你不知道你在看什么,问问你的同事。
Fastq 产生和解复用
你的测序给了你。bcl 文件(基本调用文件)。对于下游分析,我们需要。fastq 文件,用 bcl2fastq 生成。如果您使用的是 Basespace,这是自动完成的。大多数情况下,您会希望每次测序运行对多个样品进行测序,因为(a)每个样品不需要那么多读数,(b)这样更便宜,©这样更快。
这就是为什么对于每个样本,你的 DNA 片段会有不同的索引。将读数合并回原始样本的过程称为解复用。Basespace 会自动为您完成这项工作。如果出于某种原因,你需要手动操作,Gavin Wilkie 的是一个很好的指南。
使用 FastQC 进行质量评估
更多质量控制!耶!请注意,我们仍然没有做任何事情来解释我们测序运行的生物学结果。
FastQC 是一个很好的工具,可以让你先看看你的数据。它可以给你一个印象,如果你的数据中有某些偏差,或者如果你的文库准备或测序运行中出现了问题。这真的很容易运行,只需在命令行中键入以下内容(安装后):
fastqc sample1.fastq.gz --outdir=/some/other/dir/
您将收到一个包含不同情节的. html。更多信息,一如既往,在文档中。不要依赖于 FastQC 上的通过/警告/失败,这真的取决于你的库准备。例如,在亚硫酸氢盐测序中,每个碱基序列中几乎没有胞嘧啶,但这是意料之中的(因为它们几乎都转化为胸腺嘧啶)。FastQC 将这些错误标记为“失败”。像 Basespace 一样,在解释 FastQC 图时,经验也很重要。如果你对某事感到困惑,问问同事。
大多数情况下,您会分析多个样本,并且会生成相当多的日志文件。 MultiQC 是一款非常棒的软件,只有一个命令:
multiqc .
您可以将所有日志文件汇总到一个报告中。我一直在用,怎么推荐都不够。
如果您对编写处理 fastq 文件的最佳实践管道感兴趣,您可能会对 bcbio 感兴趣。但是你仍然需要知道在 bcbio 管道的引擎盖下发生了什么,或者你可能想要自己开发一个。
绘图
将产生的读数与参考序列进行比对的过程被称为“作图”。组装就是在没有参考序列的情况下生成基因组。这种方法的优点是检测结构变异、复杂的重排和重复序列。然而,精确的从头组装需要相对长的读数,这在 Illumina 测序中是不可能的。但是更长的阅读测序技术(纳米孔和 PacBio)即将出现,所以我们可能很快就会看到一些变化。然而,在 RNA 测序中,转录组的从头组装已经被用于检测新的转录物。
对于 DNA 图谱,最受欢迎的图谱绘制者是BWA-记忆和鲍蒂 2 。
对于 RNA 测序来说,最受欢迎的图谱绘制者是 STAR 、 HISAT2 和 TopHat。只有在 STAR 遇到内存问题时才使用 TopHat。总的来说,对于 RNA 测序,我喜欢参考 Conesa 及其同事的这篇论文和 Sahraeian 及其同事的这篇论文。
为了绘制 DNA 甲基化图谱(亚硫酸氢盐转化的 DNA),我使用 Bismark 。
映射后,您的。fastq 通常被转换成. bam 文件。同样,查看日志文件。如果只有 35%的读数被唯一定位,那么你的文库准备、测序或数据分析可能出了问题。
重复读取
通常,您还会对样品中重复的数量感兴趣。如果> 99.9%是重复的,你将只是在你的文库制备中看到一些独特的片段。除非你在处理扩增子测序,否则你不会想要这个。
重复读取可能源于测序(见上文;流动细胞的类型)或从文库制备中的 PCR 获得。这些可以用皮卡德识别(用 MultiQC 可视化):
java -jar picard.jar MarkDuplicates \
I=input.bam \
O=marked_duplicates.bam \
M=marked_dup_metrics.txt
如果一切看起来都很好,你可以继续进行下游分析,这取决于你的输入:DNA,RNA 或 DNA 甲基化。
例子:DNA 测序
变体调用
变异体调用是识别与参考序列(单核苷酸变异体、SNVs 和插入/缺失、indels)不同的核苷酸的过程,在这种情况下是您选择的参考基因组。根据你的输入材料,你可能对种系变异或体细胞变异感兴趣。
变体调用很难。非常辛苦。对我们来说幸运的是,布罗德研究所开发了一个工具包,名为基因组分析工具包(简称 GATK),它附带了【最佳实践】关于如何从全基因组测序、外显子组测序和靶向测序中为种系和体细胞变异调用进行变异调用。
GATK workflow for germline short variant discovery —June 2018
GATK 附带了大量的文档和教程。如果你有问题,而且你是在非常罕见的情况下,你不能在文档或谷歌上找到它,开发者会非常迅速地在论坛上回答问题。留意你附近的 GATK 工作室。我有幸参加了 2017 年在比利时鲁汶举行的一次研讨会,这是我参加过的最有用的研讨会之一。GATK 进化的速度也很惊人。去年,体细胞 CNV 呼叫(见下文)仍处于早期测试阶段,现在已经有了经过验证的最佳实践指南。
虽然 GATK 是一个很棒的软件,但它对你放进去的东西也很挑剔。如果你正在用 GATK 开发一个管道,不要偷工减料。如果你在想“哦,我不需要按坐标排序我的 bam 文件,它可能会运行”。
剧透:不会的。
或者“我用的是 GRCh37,这个参考集在 hg19 中,这可能不成问题”。相信我,会的。我想我已经从 GATK 那里得到了所有存在的错误信息。但是过一会儿你就知道陷阱在哪里了。
成功运行 GATK 后,您将拥有一个. vcf 文件。然而,这是一个很长的变体列表。你如何从生物学角度理解这一点?首先,您可以从注释. vcf 开始。
VCF 注释
答。没有任何注释的 vcf 看起来有点像:
[HEADER]
#CHROM POS ID REF ALT QUAL FILTER INFO
1 889455 . G A 100.0 PASS AF=0.0005
1 897062 . C T 100.0 PASS AF=0.0005
SnpEff 就是一个注释这个的工具。带有功能信息的 vcf。它用基因名称、错义/无意义变体、编码或非编码等信息更新 INFO 字段,结果如下所示:
#CHROM POS ID REF ALT QUAL FILTER INFO
1 889455 . G A 100.0 PASS AF=0.0005;EFF=STOP_GAINED(HIGH|NONSENSE|Cag/Tag|Q236*|749|NOC2L||CODING|NM_015658|)
1 897062 . C T 100.0 PASS AF=0.0005;EFF=STOP_GAINED(HIGH|NONSENSE|Cag/Tag|Q141*|642|KLHL17||CODING|NM_198317|
接下来,SnpSift(不要与 SIFT 混淆)允许您基于您选择的参数过滤带注释的 VCF(例如,过滤掉质量分数低于 30 的变体):
cat variants.vcf | java -jar SnpSift.jar filter " ( QUAL >= 30 )" > filtered.vcf
这是一个非常强大的工具,可以做更多的事情,一定要看看文档。
ANNOVAR 是另一个为注释. vcf 而设计的工具,与 SnpSift 不同,ANNOVAR 的输出是. csv 或。tsv(逗号或制表符分隔的文件)。这些文件可以很容易地在 Excel 或其他电子表格程序中打开(只要确保基因名称没有被转换成日期,因为 Excel 是出了名的)。《T4》快速入门指南让你一切顺利。最后,你会得到这种格式,对于非生物信息学领域的人来说也很容易使用:
Source: ANNOVAR quick start guide
使用 Excel,您可以基于群体频率、内含子/外显子进一步筛选,以进一步探索数据。
复制号码变体(CNV)呼叫
拷贝数变异是大于 1000bp 的 DNA 片段的增加或减少。CNV 打电话也是辛苦的,这体现在许多刊物上 CNV 打电话。
没有黄金标准,不同的工具针对非常不同的场景进行了优化。一些工具需要匹配的法线。一些使用法线池来更好的覆盖归一化。有些支持不使用平铺探针的检测的脱靶读数。有些是肿瘤纯度和倍性意识,并提供整数拷贝数。有些工具在高吞吐量环境中比其他工具工作得更好。有些在临床样品(例如低纯度 FFPE 样品)中比其他样品效果更好。— 马库斯·里斯特
本质上看你想做什么。如果你想看看种系 CNVs,那就看看 CNVkit 。CNVKit 可以处理靶向测序、外显子组测序和全基因组测序数据,是 bcbio 推荐的。也很好用。Illumina 还有一个工具, Canvas ,可以处理 WGS 数据。另一方面,如果你对体细胞 CNVs 感兴趣,今天是你的幸运日:GATK4 有最佳实践。如果你想看看等离子体中的 CNVs,看看 WISECONDOR。
现在去哪里?
最后,基于最初的临床问题或假设,你会想要做一些生物学上的解释。你可能会对家庭成员之间共享的变体感兴趣(或缺乏变体,从头开始变体)。还有一个工具可以完成这个任务。或者,你可能对癌症中的体细胞热点突变感兴趣。或者是易患癌症的种系突变。或者完全不同的东西(那样的话,谷歌就是你的朋友。在写你自己的脚本之前,记住某人在某个时候也可能想做同样的事情。
在从原始读取到变量调用的每一步过程中,保持你最初的假设是头脑。当与最初的问题(一个极端的例子:进行拷贝数变异呼叫以发现肺癌中的 EGFR T790M 突变)结合时,您的工作流程有意义吗?如果答案是“我不知道”或“可能”,你应该再次咨询做文库准备的湿实验室科学家和/或启动测序运行或项目的临床医生或研究人员。
为了简洁起见,我在这里只关注 DNA。我可以继续下去,用 RNA 和甲基化测序的类似资源填充另外 4 个段落。但是一旦你对以上有了一些经验,你就能自己找到你需要的。然而,如果你对一个关于 RNA 或甲基化的帖子感兴趣,请给我留言!
我想感谢我在这篇博文中提到的每一个人,以及导师、朋友、同事和其他以各种方式帮助我的人。我与我提到的任何公司都没有任何关系。
如果你喜欢读这本书,如果你把它推荐给你的朋友和同事,或者在推特或脸书上分享,那会很有帮助。
关于作者:
我是 Ruben Van Paemel 博士,2017 年从医学院毕业后,我开始在根特大学(医学遗传学中心)担任博士研究员,由研究基金会 Flanders 资助。我也是根特大学医院的儿科住院医师。可以在 Twitter 关注我:@ RubenVanPaemel
我从事神经母细胞瘤的研究,这是一种罕见但极具破坏性的肿瘤,最常见于非常年幼的儿童。我们的团队试图了解潜在的基因改变,以提高神经母细胞瘤儿童的诊断、治疗和最终存活率。大数据和现代测序技术让我对编程、生物信息学、统计学和人工智能产生了兴趣。
我的贝叶斯统计之旅
Photo by Guillermo Velarde on Unsplash
2018 年夏天,我有一个极好的机会,加入了马萨诸塞大学阿默斯特分校 Leontine Alkema 教授的实验室。我们用贝叶斯模型做了一个生物统计学研究。在这篇文章中,我将分享一些在我的研究中一直帮助我的资源。如果你也在学习贝叶斯统计的话,希望这能对你有所帮助!
一些关于我背景的信息
我是美国第一所女子学院 Mount Holyoke 学院的计算机科学专业学生。我 10 岁的时候开始了我的第一堂编程课。我对 Java、R、Python 和版本控制都很得心应手。而且,我对统计学和艺术史很感兴趣。在此研究之前,我对数据科学中的机器学习算法有基本的了解和项目经验。我每年还参加当地的数据科学竞赛。
我想分享的资源
-
基本概率 :概率是贝叶斯统计的前提。如果你没有任何概率方面的背景知识,请点击链接。
-
做贝叶斯数据分析,与 R,JAGS,斯坦的教程作者:约翰·克鲁施克 :这是我刚开始学习贝叶斯统计时的入门书。有了所有的例子和情节,很容易理解一些必须的想法。
-
麻省理工学院电子讲座 :这门课完全免费。菲利普·里戈莱教授很容易理解。他有两节关于贝叶斯统计的课。你也可以利用这些讲座来概括一些统计学的基础知识。
3.Bradley p . Carlin 和 Thomas A. Louis 的数据分析贝叶斯方法 :这本书有很多例子和 R 代码。与 Kruschke 的书不同,这本书用大量的细节来解释贝叶斯模型。
4.彼得·d·霍夫的《贝叶斯统计方法初级教程》 :这本书解释了贝叶斯统计为什么以及如何工作。它被选为许多贝叶斯统计课的教科书。
-
MCMC 和 Metropolis 算法
-
置信区间和可信区间 : Keith Winstein 的回答是我迄今为止见过的最直白的解释之一。我把这个推荐给大家。
-
时间序列 :将时间序列添加到你的贝叶斯模型中总是很有趣:这是一个关于时间序列的简单易懂的入门教程。
【周期性和季节性时间序列:Rob J hynd man 的精彩解释
8.使用贝叶斯统计的更多示例:
我们即将结束关于经验贝叶斯方法的这个系列,并且已经触及了许多统计方法…
varianceexplained.org](http://varianceexplained.org/r/simulation-bayes-baseball/)
我喜欢大卫·罗宾逊的博客!他们太棒了,真的让我在贝叶斯世界大开眼界。因为我的研究都是关于计划生育的,所以很高兴看到贝叶斯统计如何应用于其他现实生活场景。大卫还写了一本书,名为经验贝叶斯导论:棒球统计的例子。如果你正在学习贝叶斯统计,你不想错过它!
一个有趣的旅程到线性回归理论与贝叶斯触摸(嘘嘘:我用公制测量在这…
towardsdatascience.com](/how-bayesian-statistics-convinced-me-to-hit-the-gym-fa737b0a7ac)
读到 Tuan Doan Nguyen 的这篇文章,我真的很兴奋。很励志!我真的很期待在中国建立一个案例模型。
9.其他检查列表
这是博客文章系列“数据科学的概率与统计”的第五篇,这篇文章涵盖了这些主题…
towardsdatascience.com](/bayesian-statistics-for-data-science-45397ec79c94)
安基特·拉希写了这个惊人的博客系列,其中还包括许多有用的链接!我从他们身上学到了很多。非常感谢!
我要感谢实验室里的每一个人,让我们度过了这个美妙的夏天:Leontine Alkema、Krzysztof Sakrejda、Emily Peterson、Greg Guranich、Chuchu Wei、Wang 和 Remy Wang。
感谢您阅读我的博客,希望对您有所帮助。如果你想关注我未来的更新,请随时通过 LinkedIn 和 Medium 与我联系。加油贝叶斯!
(credit: https://en.wikipedia.org/wiki/Bayes%27_theorem)
我的图书推荐系统建设之旅。。。
推荐系统已经占据了我很长一段时间,由于我喜欢看书,探索图书交叉数据集非常有吸引力。
在线推荐系统是许多电子商务网站要做的事情。推荐系统广泛地向顾客推荐最适合他们口味和特点的产品。关于推荐系统的更多细节,请阅读我关于推荐系统的介绍性文章和一些使用 Python 的插图。
当我遇到图书穿越数据集时,我开始了构建图书推荐系统的旅程。该数据集由 Cai-Nicolas Ziegler 于 2004 年编制,由用户、图书和评分三个表组成。显性评分用 1-10 分表示(数值越高表示欣赏程度越高),隐性评分用 0 分表示。
在建立任何机器学习模型之前,了解数据是什么以及我们试图实现什么是至关重要的。数据探索揭示了隐藏的趋势和见解,数据预处理使数据准备好供 ML 算法使用。
那么,我们开始吧。。。
首先,我们加载数据集并检查图书、用户和评级数据集的形状,如下所示:
书
逐一研究这些数据集,从 books 数据集开始,我们可以看到 image URLs 列似乎不是分析所必需的,因此可以删除它们。
我们现在检查每一列的数据类型,并纠正缺失和不一致的条目。我还调整了列宽,以显示各列的全文。
出版年份
现在我们检查这个属性的唯一值。
yearOfPublication 中有一些不正确的条目。由于 csv 文件中的一些错误,出版商名称“DK Publishing Inc”和“Gallimard”似乎被错误地加载为数据集中的 yearOfPublication。此外,一些值是字符串,在某些地方相同的年份被输入为数字。我们将对这些行进行必要的更正,并将 yearOfPublication 的数据类型设置为 int。
现在可以看到 yearOfPublication 的类型是 int,其值的范围是 0–2050。由于这个数据集是在 2004 年构建的,我假设 2006 年以后的所有年份都是无效的,保留两年的余量,以防数据集可能已经更新。对于所有无效条目(包括 0),我会将这些转换为 NaNs,然后用剩余年份的平均值替换。
出版者
来到“publisher”列,我已经处理了两个 NaN 值,将它们替换为“other ”,因为经过一些调查后无法推断出 publisher 的名称(检查 jupyter 笔记本嵌入)。
用户数据集
现在,我们研究用户数据集,首先检查它的形状、前几列和数据类型。
年龄
在检查唯一值时,userID 看起来是正确的。但是,年龄列有一个 NaN 和一些非常高的值。在我看来,5 岁以下和 90 岁以上没有太大的意义,因此,这些正被 NaNs 所取代。然后,所有的 NaNs 都被替换为年龄的平均值,其数据类型被设置为 int。
我在这里没有对 Location 列进行任何处理。但是,如果您愿意,您可以进一步将其分为城市、州、国家,并使用文本处理模型进行一些处理。
评级数据集
我们检查评级数据集的形状和前几行。它揭示了我们的用户-图书评分矩阵将非常稀疏,因为实际评分与评分矩阵的大小(用户数×图书数)相比非常小。
现在评级数据集应该有 userID 和 ISBN,它们存在于各自的表中,即。用户和书籍。
很明显,用户已经对一些书籍进行了评级,这些书籍不是原始书籍数据集的一部分。数据集的稀疏度可以计算如下:
由 1-10 表示的明确评级和由 0 表示的隐含评级现在必须分开。我们将只使用明确的评级来建立我们的图书推荐系统。类似地,用户也被分为那些明确评级的用户和那些隐含行为被记录的用户。
bookRating 的计数图表明,较高的评分在用户中更常见,评分 8 被评为最高次数。
简单的基于流行度的推荐系统
在这一点上,一个简单的基于流行度的推荐系统可以基于不同书籍的用户评级计数来构建。很明显,J.K .罗琳写的书很受欢迎。
基于协同过滤的推荐系统
为了应对我的机器拥有的计算能力并减少数据集的大小,我正在考虑对至少 100 本书评分的用户和至少有 100 个评分的书。
构建基于 CF 的推荐系统的下一个关键步骤是从评分表中生成用户项目评分矩阵。
请注意,评级矩阵中的大部分值都是 nan,表示缺少评级,因此数据稀疏。另外,请注意,这里只考虑了显式评级。由于大多数机器学习算法不能处理 nan,我们用 0 来代替它们,这现在表示没有评级。
基于用户的 CF
我将重用我的文章中的功能,例如基于 CF 的推荐系统。函数findksimilarrusers输入 userID 和评级矩阵,并返回 k 个相似用户的相似度和索引。(阅读我以前的故事,了解基于用户/项目的 CF 方法的概念和公式)
函数 predict_userbased 基于基于用户的方法预测指定用户-项目组合的评分。
函数 recommendItem 使用上述函数为基于用户或基于项目的方法(基于选定的方法和指标组合)推荐图书。如果一本书的预测评级大于或等于 6,并且该书还没有被评级,则进行推荐。调用此功能时,您可以选择相似性度量(余弦/相关性)。
瞧啊。!!基于基于用户的 CF 方法,检查用户 4385 的前 10 本书推荐。
基于项目的 CF
已经为基于条目的 CF 编写了类似的函数来查找 k 本相似的书,并预测用户对每本书的评分。相同的功能recommende item可用于根据基于项目的方法和所选指标推荐书籍。如果一本书的预测评级大于或等于 6,并且该书还没有被评级,则进行推荐。
哇!!!根据基于条目的 CF 方法,检查为用户 4385 推荐的前 10 本书。这些与基于用户的方法所建议的显著不同。
在这篇文章中,像交叉验证、测试序列分割和推荐系统的评估这样的领域还没有被讨论,这些领域值得探索。下面嵌入了 Jupyter 笔记本的这个代码。
[## csaluja/JupyterNotebooks-中号
在 GitHub 上创建一个帐户,为 JupyterNotebooks-Medium 开发做出贡献。
github.com](https://github.com/csaluja/JupyterNotebooks-Medium/blob/master/Book%20Recommendation%20System.ipynb)
感谢阅读!我希望你喜欢这篇文章。请在下面的评论区分享你的观点。同时,我会去为自己查一些书籍推荐。
参考资料:
我的数据科学之旅(面向零编码经验的初学者)
正如我在上一篇博客文章中所说,自从我在大会上开始数据科学沉浸式课程以来,已经过去了三周。只是给你一个视角,让你了解我现在的学习进度。我想说,我学到了很多关于 python(我们在课堂上使用的主要语言)和一些基本的统计算法(t 检验、p 值、z 得分)。然而,我还没有自信到可以教人的程度。但是我认为如果我继续努力,这是可行的。今天,我想与你分享我采取的步骤和我使用的一些好的资源。
供您参考,在本课程之前,我的编码经验非常有限。我在大学时学过 HTML 和 CSS,但仅此而已。好像是五年前。GA 的要求之一是在参加课程之前完成课前准备工作,旨在帮助我们快速学习数据科学沉浸式课程。课前工作是一个基于网络的学习工具,名为 DataCamp(链接:https://www.datacamp.com/home)。它提供了各种各样的计算机科学相关的课程,你可以从初级水平到高级水平。
以下是我喜欢它的地方:
- 非常有活力的教学风格。编码有时会被解释和混淆。它提供了一段视频,由一名教师演示材料并解释编码背后的逻辑,如果你能通过观看更好地学习,这将非常有帮助。此外,它使整个学习过程变得直观,并允许用户返回视频进行任何参考。
- 实践。很多练习。通常看完视频后,他们会围绕这个话题做几个练习。练习也有不同的形式,通常坚持多项选择题和在给出指令的界面上编写代码。
- 提供演示幻灯片的 PDF 版本,您可以下载到您的本地资源进行查看。
- 它保存了你的进步。如果你有一个繁忙的时间表,它允许你跳回到你上次离开的地方。
以下是我推荐给初学者参加的 DataCamp 的一些课程:
Screenshot of DataCamp interactive platform with instructor teaching
- 面向数据科学的 python 简介-涵盖了您需要了解的关于 Python 的所有基本资料。共有 4 个不同主题的章节。不要继续下一章,直到你有一个坚实的理解,因为每一章通常是建立在前一章的基础上。如果有必要的话,多做几次。
2.面向数据科学的中级 Python 一旦您掌握了基础知识,这就是您应用知识和进行案例研究的地方。它涵盖了更深入的课程,如可视化工具,数据结构和其他软件包的实施。这可能是你想花更多时间关注每一章的地方,因为随着时间的推移,你会在案例研究中用到本课程的大部分工具。
所以我在 DataCamp 一共上了 8 门不同的课程。我不会说我记得所有的事情,但它确实让我开始编码并在案例研究中应用逻辑。请记住,如果 DataCamp 不适合你的学习风格,有很多资源可以帮助初学者。
我为初学者推荐的其他资源:
Hard cover of the book
艰难地学 Python 数字&书 —这本书是为没有编码经验的初学者设计的。作者用非技术人员也能理解的方式解释了一切,做得非常好。此外,他一步一步地解释练习,很容易跟上。你可以购买这本书或者阅读免费的 html 版本。
链接:【https://learnpythonthehardway.org/book/
DataQuest —另一个类似 DataCamp 的学习平台。它允许你根据你想要完成的目标来选择学习路径。尽管这种学习方式更多的是基于文本的。对那些通过阅读学得更好的人来说很棒。你将阅读概念,然后做练习。此外,它提供的指令不如 DataCamp 具体。所以你不能猜测答案,而在 DataCamp 中,你可以通过阅读说明来推断答案。我所做的是,我将学习 DataCamp 的基本形式,并从 DataQuest 进行更多的练习。有限的课程是免费的,但是如果你想打开所有的课程以及其他的额外津贴,你可以选择按月订阅。
链接:https://www.dataquest.io/home
如果你有其他好的资源想要分享,请在帖子里留下评论。我确信有人能从中受益。记住,当你学习新的东西时,它必然会有一个学习曲线。一旦你投入了足够的时间和精力,这些点将开始连接起来,你会有更多的学习乐趣。
我的强化学习之旅——第 0 部分:简介
Gif from website
目前,我对强化学习知之甚少,我想改变这一点,所以这是我学习强化学习的第一步。作为第一步,我希望先介绍高层次的概述。
请注意,这篇文章是为我未来的自己写的,我的学习过程可能会很慢,或者与你的不同。
加州大学伯克利分校彼得·博迪克的强化学习教程
从这个讲座中,我了解到,强化学习相对于有监督或无监督来说,更具有一般性。然而,似乎仍然有一个目标的概念,因此我假设将有一个特定的成本函数来衡量我们离实现目标有多近。下面是对强化学习的一个很好的总结。
右图 →最优解(每步无奖励)
中图 →每步奖励为-0.1 时的解
左图 →每步奖励为 0.01 时的解
上面,图片是一个完美的例子(对我来说),展示了强化学习是多么复杂。如果我们制造一个机器人,它的目标是得到最多的点,最优解将是最正确的图像。然而,根据不同的政策(这一次,每一步都有奖励),机器人学习的解决方案是完全不同的。从这里开始,ppt 解释了相当多的数学,所以我不会把它作为一个高层次的概述,但是 ppt 有一个非常好的总结页面。
从上文中,我了解到当使用强化学习时,强化学习最具挑战性的部分实际上是设计特征、状态和奖励。
机器学习国际会议(ICML 2007)教程
从之前的演示中,我们已经了解到,具有挑战性的部分是设计状态和奖励。底部的缩写代表马尔可夫决策过程和部分可观测马尔可夫决策过程。
上面显示了状态、行动和奖励的完美示例。我们可以看到,这个设置可以很容易地应用于任何游戏。(国际象棋,开始工艺甚至真实世界的设置。)
不同类型的学习算法,从这里我了解到有不同的类似于分类算法集的算法集,SVM,NN,或者 k 近邻。
强化学习简易入门&其实现(analyticsvidhya)
Image from this website
当我们谷歌强化学习时,我们可以一遍又一遍地看到如上图。因此,与其看到一个代理人或环境,不如把它想象成一个婴儿学习如何走路的过程。
Image from this website
这个例子的“问题陈述”是 行走 ,其中 这个孩子是一个代理人 试图操纵 环境(它行走的表面) 通过 采取行动(即行走) 和他/她当他/她完成任务的一个子模块(即采取几个步骤)时,孩子得到一个 奖励而当他/她完成任务的一个子模块时,将不会得到任何巧克力 (也就是说这是一个强化学习问题的简化描述。——法赞·谢赫****
Image from this website
作者实际上对这些算法的不同之处做了很长的解释,如果你想看的话,请点击这里。不过短短的一/两句话。
监督 vs RL :两者都映射了输入和输出之间的关系,但在 RL 中有一个奖励函数来衡量代理采取的行动,另外还有一个成本函数来衡量我们是否达到了最终目标。(例如赢得一盘棋→赢得比赛很重要,但赢得一盘棋有多种方式)
无监督 vs RL :无监督学习(大多)是在底层数据中发现模式,并对其进行聚类。
最后的话
还有一个帖子,“各种强化学习算法介绍。第一部分(Q-Learning,SARSA,DQN,DDPG) ”是一篇了解不同类型学习算法的优秀文章。总的来说,互联网上有数以百万计的资源,所以任何想学习 RL 的人都不会有时间去寻找资源。
参考
- (2018).cs . uwaterloo . ca 2018 年 4 月 6 日检索,来自https://cs . uwaterloo . ca/~ ppou part/ICML-07-tutorial-slides/icml 07-brl-tutorial-part 2-intro-ghavamzadeh . pdf
- 2018 年People.eecs.berkeley.edu。【在线】。可用:https://people . eecs . Berkeley . edu/~ Jordan/ml short course/reinforcement-learning . PPT .【访问时间:2018 年 4 月 6 日】。
- 部分可观测马尔可夫决策过程。(2018).En.wikipedia.org。检索于 2018 年 4 月 6 日,来自https://en . Wikipedia . org/wiki/Partially _ observable _ Markov _ decision _ process
- 马尔可夫决策过程。(2018).En.wikipedia.org。于 2018 年 4 月 6 日检索,来自https://en.wikipedia.org/wiki/Markov_decision_process
- 各种强化学习算法介绍。第一部分(Q-Learning,SARSA,DQN,DDPG)。(2018).走向数据科学。2018 年 4 月 6 日检索,来自https://towards data science . com/introduction-to-variable-reinforcement-learning-algorithms-I-q-learning-sarsa-dqn-ddpg-72 a5 E0 CB 6287
我的强化学习之旅——第 1.5 部分:使用 Q 学习的简单二进制图像转换
GIF from this website
所以今天,我想用 Q-learning 解决一个非常简单的问题,希望能让我的理解更加具体。
警告我还在学习 RL,我学习东西的方式是通过给自己解释概念,而这篇帖子正是如此。注意,我还在学习这个话题,所以如果你是来学习 RL 的,我推荐你不要看我的帖子,而是来自 UCLA 博士生的这个帖子: 深度强化学习去神秘化(第 0 集)
实验设置
左侧图像 →原始图像
→右侧图像 →变换图像
→红色数字 →添加黑色块,共有 4 个
所以整个实验非常简单,我们想从左边的图像到右边的图像。我们只想在给定的图像中增加 4 个黑色块。
Q-学习设置(状态,动作)
黑色数字/线条 →将图像分成 10 个小状态
首先,让我们制作状态,因为我们的原始图像的尺寸是 10 * 100,让我们把图像分成小方块(10 * 10),这样我们就有 10 个方块。
Modified Image from here
所以我们的 Q-Learning 表看起来会像上面这样。它是一个一维数组,数组的索引是状态,数组中的值是阈值。这意味着我们将有一个阈值过滤器,只让特定的像素强度通过,其他的将被过滤掉。
上面我们可以看到手工制作的地面真值表,我们可以看到零号的索引对准了图像中有黑色块的地方。但是我们想学习这些阈值,而不是手工制作。因此,让我们首先初始化我们的 Q 表如下,所有的 1。
最后,让我们定义奖励可以是什么,因为这让我们简单地对我们有阈值的图像和地面真实图像进行逐位 XOR 运算。
Q-学习设置(奖励-异或不同值)
Image from this website
红框 →图像中的异或运算
在两幅图像之间进行 XOR 运算,将会给出这两幅图像之间有多少差异。因此,如果两个图像相同,XOR 差值将为 0,因为没有差异。否则,如果图像完全不同,我们将获得 XOR 运算的正值,因为存在巨大的差异。
create_data →阈值运算后创建的图像
奖励→create _ data 与地面真值之间的异或运算
因为我们的目标是用正确的值填充 Q 表,所以我们应该减去 1 并除以最大像素强度,即 100。如果阈值是正确的,则奖励 1,如果阈值是错误的,则奖励 0。
电子贪婪探索
我们将创建一个名为 epsilon 的变量,根据这个值,我们将更改阈值或保持不变。此外,随着事件数量的增加,我们将采用较小的数量级,为了数值稳定性,我们将添加 1e-8。
结果
左上 →原始图像
右上 →地面真实图像
左下 →由学习的 Q 表值生成的图像
右下 →由手工制作的 Q 表值生成的图像
我们的 Q 表已经错过了一个块,这是第二个黑色块。但是让我们看看原始的 Q 表结果。
红框 →阈值 1 的值不正确
交互代码
对于谷歌 Colab,你需要一个谷歌帐户来查看代码,而且你不能在谷歌 Colab 中运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要获取这篇文章的代码,请点击这里。
最后的话
滑铁卢大学的一位教授已经给出了使用 RL 来执行分割的示例“ 增强学习在经直肠超声图像分割中的应用 ”我也希望尽快实现该论文。
如果发现任何错误(因为我仍在学习,会有很多),请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 构建 Java 程序第 7 章— ppt 下载。(2018).Slideplayer.com。检索于 2018 年 4 月 10 日,来自http://slideplayer.com/slide/8688800/
- drawBitmap,clipPath,UNION,DIFFERENCE,INTERSECT,REPLACE,XOR Android 示例|面向开发者的软件和源代码。(2018).Android . ok help . cz . 2018 年 4 月 10 日检索,来自http://Android . ok help . cz/draw bitmap-clip path-union-difference-intersect-replace-xor-Android-example/
- f .萨赫巴、h .提祖什和 m .萨拉马(2008 年)。强化学习在经直肠超声图像分割中的应用。BMC 医学影像,8(1)。doi:10.1186/1471–2342–8–8
我的强化学习之旅——第 1 部分:Q-用表格学习
Gif from this website
目前,我对强化学习知之甚少,我想改变这一点,所以这是我学习强化学习的第二步。第二步,我想谈谈 Q——用表格学习。
请注意,这篇文章是为我未来的自己写的,我的学习过程可能会很慢,或者与你的不同。
我学习的方式是向自己解释概念,这篇文章就是这样。注意我还在学习这个话题,所以如果你来这里是为了学习 Q-Learning with table,我建议你不要看我的帖子,而是来自加州大学洛杉矶分校博士生的这篇帖子: 深度强化学习揭秘(第 0 集)
Q 学习理论
Image from wiki
通过谷歌搜索,我了解到 Q-learning 是开始学习 RL 的一个很好的地方,因为我们让代理学习处于给定状态的价值以及从给定状态采取特定行动的回报,这个概念似乎很简单。
与试图学习将观察直接映射到行动的函数的策略梯度方法不同,Q-Learning 试图学习处于给定状态并在那里采取特定行动的价值。”——亚瑟·朱利安尼
Q-学习方程
红框 →更新当前状态 St
蓝框 →当前状态 St 的原始值
现在,让我们只关注这两件事。对于我来说,我喜欢用具体的例子来学习,所以让我们使用 OpenAI Gym 的“frozen lake-v 0”作为例子。(请注意,我不会深入解释这是什么,什么是 Open AI。)
就像上面一样,我们有 4*4 的矩形,在每个状态(或坐标)上,我们要么死,掉进一个洞,要么通过进入目标而获胜,或者只是在冰冻的湖中再走一步,现在让我们实际看看可用状态和动作的表格。
Printed out values
红色数字 →每个状态
蓝色数字 →每个状态下我们可以做的每个动作
现在我们可以看到我们制作的 Q-learning 表有 16 列 4 行。现在让我们回顾一下我们的环境。
红色数字 →在 Q 学习表中代表相关的每个状态
现在,我不能 100%确定这些数字是水平增加还是垂直增加(意味着第一列的数字可能是 1 5 9 13)。我认为这取决于实现,但我们仍然可以得到大致的想法。在每个状态下,我们可以做四个动作,(上图中蓝色数字代表的是什么),这些动作是上、下、左、右(同样,不确定这是否是准确的顺序,可以是右、左、下、上等等)。但是我们肯定能知道事情的大致方向。所以现在让我们回到 Q 学习方程。
从这里我们可以估计,上面的等式将更新每一行中的某个值(即状态)。选择采取什么行动。
确认和实验
红线 →分排以便于观察
蓝线 →洞内左、下、右、上动作
紫线 →球门内左、下、右、上动作
粉线/开始 →可疑值
我们可以看到,洞内或目标内的动作值都是零,这非常合理,因为游戏在该点结束,我们没有更多的动作可以采取。
注 ,有一些值值得商榷,比如粉色值。在这个坐标中,我们要么向上走,要么向下走,以求生存。但是在 Q 表中代理似乎向右走,这是自杀。这里我们需要解决不确定性的概念!
这意味着,我们会向右移动,但我们可能根本不会向右移动,我们可能会向上或向下移动一个百分比。我相信,这就是为什么我们的 Q 表已经学会了在粉红色坐标中向右走。
我们可以通过两种方式来确认这些动作的顺序。从源代码中,或者通过我们自己运行代码。
From the source code
现在我们知道了,让我们给我们的代理一个完美的地图,来达到目标。我会用路径**【下,下,右,右,下,右】。**
此外,为了使这个实验具有确定性,我将关闭滑动设置。(请看这篇关于如何做到这一点的 stackoverflow 帖子。)
红线 →上下左右的数组值。
很好,我们可以看到我们的代理完全按照我们想要的方式移动,现在让我们实际应用 Q-learning 来学习这个表,而不是手工绘制路径。通过使用下面的等式。
红框 →实现方程
蓝框 →由于我们是用全零初始化 Q-Learning 表,所以我们要添加一些噪声来得到 random max 自变量。
实验结果(无不确定性)
红线 →每个数字代表每个状态
绿线 →每个状态下的左、下、右、上动作
通过学习到的 Q 表,我们可以清楚地看到我们的代理在每个状态下将采取什么行动,这是**【下右下右下右】。**
我们可以想象代理人采取的每一步,它完全按照我们的预期进行。
实验结果(不确定度)
在存在某种不确定性的情况下,代理人无法学习实现目标的正确路径。一旦我更深入地研究了这个话题,我将在以后回到这个问题上来。
对于希望了解更多折扣系数的人
以上,视频做得非常出色,我们为什么把折扣值。此外,它本身就是一个令人惊叹的视频系列。
交互代码
对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要获取这篇文章的代码,请点击这里。
最后的话
强化学习是非常有趣但又很难的话题。我很高兴能了解更多!
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
与此同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣,我还在这里做了解耦神经网络的比较。
参考
- 使用 Tensorflow 的简单强化学习第 0 部分:使用表格和神经网络的 Q 学习。(2016).中等。检索于 2018 年 4 月 7 日,来自https://medium . com/emergent-future/simple-reinforcement-learning-with-tensor flow-part-0-q-learning-with-tables-and-neural-networks-d 195264329d 0
- q-学习。(2018).En.wikipedia.org。2018 年 4 月 7 日检索,来自 https://en.wikipedia.org/wiki/Q-learning
- 开放/健身房。(2018).GitHub。2018 年 4 月 8 日检索,来自https://github . com/open ai/gym/blob/master/gym/envs/toy _ text/frozen _ lake . py
- FrozenLake-v0,O. (2018)。open ai-gym:frozen lake-v 0 中设置 is _ slick = False。Stackoverflow.com。检索于 2018 年 4 月 8 日,来自https://stack overflow . com/questions/43556245/open ai-gym-setting-is-slippy-false-in-frozen lake-v 0
- 奖励测试序列-佐治亚理工学院-机器学习。(2018).YouTube。2018 年 4 月 8 日检索,来自https://www.youtube.com/watch?v=HhLsIxKq_1s&list = plawxtw 4 sypnidwo 9 e 2c 7 ixisu _ pdSNp&index = 17
- 深度强化学习去神秘化(第 0 集)。(2017).中等。检索于 2018 年 4 月 8 日,来自https://medium . com/@ m . alzantot/deep-reinforcement-learning-demystized-episode-0-2198 c05a 6124