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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

从生物信息学开始——将 DNA 序列转化为蛋白质序列

原文:https://towardsdatascience.com/starting-off-in-bioinformatics-turning-dna-sequences-into-protein-sequences-c771dc20b89f?source=collection_archive---------3-----------------------

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

在这篇文章中,我们将学习蛋白质以及如何将 DNA 序列转换成蛋白质序列。如果你错过了我之前的一篇关于 DNA 核苷酸和链的文章,我建议你读一读,这样你会觉得这篇文章更有意义。让我们继续来看蛋白质。

什么是蛋白质?

蛋白质是由氨基酸组成的链状大分子。蛋白质之间的区别主要在于它们的氨基酸序列,这是由它们基因的核苷酸序列决定的。在讨论蛋白质之前,让我们看看什么是氨基酸。

什么是氨基酸?

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

Structure of an amino acid (https://en.wikipedia.org/wiki/Amino_acid)

氨基酸是复杂的有机分子,主要由以及其他一些原子组成。它包含一个 胺基 和一个 羧基 ,以及一个对每种氨基酸特异的 侧链 (R 基团)。

目前已知大约 500 种氨基酸,但只有 20 种出现在我们的遗传密码中。这 20 种氨基酸是我们感兴趣的组成部分。

20 种常见的氨基酸

下图显示了在我们的遗传密码中出现的 20 种常见氨基酸,以及它们的全名、三个字母的代码和一个字母的代码。

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

The 20 Common Amino Acids (Compound Interest: http://www.compoundchem.com/2014/09/16/aminoacids/)

用氨基酸代表蛋白质

生物化学家已经认识到,特定类型的蛋白质总是以相同的比例包含完全相同数量的总氨基酸(统称为残基)。举个例子,

**insulin = (30 glycines + 44 alanines + 5 tyrosines + 14 glutamines + . . .)**

此外,氨基酸以链的形式连接在一起。蛋白质的特性是从它的组成以及组成它的氨基酸的精确顺序中获得的。因此,胰岛素可以表示为,

**insulin = MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERG FFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN**

形成蛋白质

蛋白质是由氨基酸及其羧基基团在序列中连续的残基之间形成被称为 肽键 的键而形成的。下面给出的两个图表描述了游离氨基酸如何通过形成肽键来形成蛋白质。

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

Free amino acids (Wiley: Bioinformatics For Dummies, 2nd Edition)

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

Amino acids chained together to form a protein molecule (Wiley: Bioinformatics For Dummies, 2nd Edition)

你可以看到在最左端有一个未使用的胺基,在最右端有一个未使用的羧基。这些末端分别被称为蛋白质链的 N 端C 端。蛋白质的序列是由组成它的氨基酸读出的,这些氨基酸按从 N-末端到 C-末端的顺序排列。因此,在上图中发现的蛋白质序列将是,

**MAVLD = Met-Ala-Val-Leu-Asp
      = Methionine–Alanine-Valine–Leucine-Aspartic**

将 DNA 转化成蛋白质

当你知道一个 DNA 序列时,你可以通过使用遗传密码将其翻译成相应的蛋白质序列。这与细胞自身产生蛋白质序列的方式相同。这个过程被称为 DNA 到蛋白质的翻译

遗传密码(称为 DNA 密码子表 用于 DNA 序列 ) 显示了我们如何将一个 4 核苷酸序列(A、T、G、C)与一组 20 个氨基酸唯一地联系起来。它描述了一套规则,通过这些规则,活细胞将遗传物质中编码的信息翻译成蛋白质。下图以图表的形式显示了 DNA 密码子表。

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

Genetic Code Chart for DNA (http://www.geneinfinity.org/sp/sp_gencode.html)

如何使用遗传密码图进行 DNA 到蛋白质的翻译

首先你应该得到你的 DNA 序列。

**ATGGAAGTATTTAAAGCGCCACCTATTGGGATATAAG**

然后开始一次读取 3 个核苷酸的序列(一个三联体)。

**ATG GAA GTA TTT AAA GCG CCA CCT ATT GGG ATA TAA G...**

现在用遗传密码图读出当前三联体对应的氨基酸(技术上称为密码子)。从中心开始的第一个圆圈代表三元组的第一个字符,第二个圆圈代表第二个字符,第三个圆圈代表最后一个字符。翻译后,你会得到与上述 DNA 序列相对应的蛋白质序列。

**M E V F K A P P I G I STOP
M E V F K A P P I G I**

TAA标签TGA 被称为终止信号,在此停止翻译过程。

使用 Python 进行 DNA 到蛋白质的翻译

下面给出的 Python 代码获取 DNA 序列,并将其转换为相应的蛋白质序列。我已经创建了一个字典来存储遗传密码图的信息。请随意尝试代码,看看会发生什么。

我已经在 sample_dna.txt 文件中输入了我们之前讨论过的相同 DNA 序列。

**ATGGAAGTATTTAAAGCGCCACCTATTGGGATATAAG**

下面给出了获得的结果。

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

Translating DNA into Protein output

最后的想法

如果你知道蛋白质编码区在 DNA 序列中的起始位置,你的计算机就可以用简单的代码生成相应的由氨基酸组成的蛋白质序列。许多序列分析程序使用这种翻译方法,因此您可以使用计算机将 DNA 序列作为虚拟蛋白质序列进行处理。

希望你喜欢读这篇文章,并学到一些有用的东西。

因为我对这个领域还很陌生,所以我想听听你的建议。😇

请继续关注我的下一篇关于生物信息学的文章,那将是关于 RNA 序列的。

感谢阅读…😃

从哈斯克尔张量流开始

原文:https://towardsdatascience.com/starting-out-with-haskell-tensor-flow-49ec8aa7697f?source=collection_archive---------6-----------------------

上周,我们讨论了人工智能系统的蓬勃发展。我们看到了这些系统如何越来越多地影响我们生活的几个例子。我认为我们在选择架构时应该更加关注可靠性。毕竟,当我们现在正确编码时,人们的生命可能处于危险之中。自然,我建议 Haskell 作为开发可靠的人工智能系统的主要候选人。

所以现在我们实际上要写一些 Haskell 机器学习代码。我们将关注张量流绑定库。我第一次熟悉这个图书馆是在四月的 BayHac 。我在过去的几个月里学习了整个张量流Haskell 库。在第一篇文章中,我们将回顾张量流的基本概念。我们将看到它们是如何在 Python(TF 最常用的语言)中实现的。然后我们将把这些概念翻译给 Haskell。

请注意,本系列不是对机器学习概念的一般性介绍。Medium 上有一个很棒的系列,叫做机器学习很有趣!如果您对学习基本概念感兴趣,我强烈推荐您阅读该系列的第 1 部分。有了这个背景,我自己的文章系列中的许多观点会更加清晰。

张量

张量流是一个伟大的名字,因为它将库分解成两个基本概念。首先是张量。这些是张量流中数据表示的主要工具。低维张量其实挺直观的。但是,当你无法真正想象正在发生的事情时,你必须让理论思想来指导你。

在大数据的世界里,我们用数字来表示一切。当你有一组数字时,程序员的本能是把它们放在一个数组中。

[1.0, 2.0, 3.0, 6.7]

如果你有很多相同大小的不同数组,你想把它们关联在一起,你会怎么做?你创建了一个二维数组(数组的数组),我们也称之为矩阵。

[[1.0, 2.0, 3.0, 6.7],
[5.0, 10.0, 3.0, 12.9],
[6.0, 12.0, 15.0, 13.6],
[7.0, 22.0, 8.0, 5.3]]

大多数程序员都非常熟悉这些概念。张量采用这种思想,并不断扩展。当你有很多相同大小的矩阵时会发生什么?您可以将它们组合成一个矩阵数组。我们可以称之为三维矩阵。但是“张量”是我们在所有维度中用来表示数据的术语。

每个张量都有度数。我们可以从一个数字开始。这是一个 0 度张量。那么一个正常的数组就是一个 1 阶张量。那么矩阵就是 2 次张量。最后一个例子是一个三阶张量。你可以不断地把这些加在一起,无穷无尽。

每个张量都有形状。形状是一个代表张量维数的数组。这个数组的长度就是张量的次数。所以一个数字的形状是空列表。一个数组将有一个长度为 1 的列表,包含数组的长度。一个矩阵将有一个长度为 2 的列表,包含它的行数和列数。诸如此类。有几种不同的方法可以在代码中表示张量,但是我们一会儿会讲到。

随波逐流

要理解的第二个重要概念是张量流如何执行计算。机器学习通常涉及简单的数学运算。许多简单的数学运算。由于规模如此之大,我们需要尽可能快地执行这些操作。我们需要使用针对这一特定任务而优化的软件和硬件。这就需要对正在发生的事情有一个底层的代码表示。这在 C 语言中比在 Haskell 或 Python 中更容易实现。

我们可以用 Haskell 编写大部分代码,但是用 C 语言使用外部函数接口来执行计算。但是这些接口有很大的开销,所以这很可能会抵消我们从使用 c 语言中获得的大部分好处。

张量流对这个问题的解决方案是,我们首先建立一个描述我们所有计算的图。一旦我们描述了这些,我们就用一个“会话”来“运行”我们的图表。因此,它一次执行整个语言转换过程,所以开销较低。

如果这听起来很熟悉,那是因为这是 Haskell 中动作的工作方式(在某种意义上)。例如,我们可以描述一个 IO 动作。这个动作不是我们在代码中出现的时候执行的一系列命令。更确切地说,动作是我们的程序将在某个时刻执行的操作的描述。这也类似于有效编程的概念。我们将在以后的博客中探讨这个话题。

那么我们的计算图是什么样的呢?我们会,每个张量都是一个节点。然后,我们可以为“运算”创建其他节点,这些节点以张量作为输入。例如,我们可以把两个张量加在一起,这是另一个节点。我们将在示例中看到如何构建计算图,然后运行它。

张量流的一个令人敬畏的特性是张量板应用程序。它可以让你可视化你的计算图表。我们将在本系列的后面看到如何做到这一点。

编码张量

因此,在这一点上,我们应该开始检查我们实际上是如何在代码中创建张量的。我们将从如何在 Python 中实现这一点开始,因为这样概念更容易理解。我们将考虑三种类型的张量。首先是“常数”。这些代表一组不变的值。我们可以在整个模型训练过程中使用这些值,并且每次都是相同的。因为我们预先定义了张量的值,所以没有必要给出任何大小参数。但是我们将指定用于它们的数据类型。

import tensorflow as tfnode1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0, dtype=tf.float32)

现在我们可以用这些张量做什么呢?为了快速举例,让我们试着添加它们。这在我们的图中创建了一个新的节点,表示这两个张量的相加。然后我们可以“运行”加法节点来查看结果。为了封装我们所有的信息,我们将创建一个“会话”:

import tensorflow as tfnode1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0, dtype=tf.float32)
additionNode = tf.add(node1, node2)sess = tf.Session()
result = sess.run(additionNode)
print result“””
Output:
7.0
“””

接下来是占位符。这些是我们每次运行都要改变的值。通常,我们将使用这些作为模型的输入。通过使用占位符,我们将能够改变输入并每次训练不同的值。当我们“运行”一个会话时,我们需要给每个节点赋值。

我们不知道将进入占位符的值,但我们仍然在构造时分配数据的类型。如果我们愿意,我们也可以指定一个尺寸。这里有一个简短的片段,展示了我们如何初始化占位符。然后,我们可以在每次运行应用程序时分配不同的值。即使我们的占位符张量没有值,我们仍然可以添加它们,就像我们添加常量张量一样。

node1 = tf.placeholder(tf.float32)
node2 = tf.placeholder(tf.float32)
adderNode = tf.add(node1, node2)sess = tf.Session()
result1 = sess.run(adderNode, {node1: 3, node2: 4.5 })
result2 = sess.run(adderNode, {node1: 2.7, node2: 8.9 })
print(result1)
print(result2)"""
Output:
7.5
11.6
"""

我们要用的最后一种张量是变量。这些是将构成我们“模型”的价值观。我们的目标是找到这些参数的值,使我们的模型能够很好地拟合数据。我们将一如既往地提供数据类型。在这种情况下,我们还将提供一个初始常数值。通常,我们会希望使用某种随机分布。张量实际上不会取值,直到我们运行一个全局变量初始化函数。在开始之前,我们必须创建这个初始化器,然后让我们的 session 对象运行它。

w = tf.Variable([3], dtype=tf.float32)
b = tf.Variable([1], dtype=tf.float32)sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

现在让我们使用我们的变量来创建一个“模型”的排序。在本文中,我们将制作一个简单的线性模型。让我们为输入张量和模型本身创建额外的节点。我们将设w为权重,b为“偏差”。这意味着我们将通过w*x + b构造我们的最终值,其中x是输入。

w = tf.Variable([3], dtype=tf.float32)
b = tf.Variable([1], dtype=tf.float32)
x = tf.placeholder(dtype=tf.float32)
linear_model = w * x + b

现在,我们想知道我们的模型有多好。所以让我们将它与y进行比较,它是我们期望值的输入。我们取差,平方,然后用reduce_sum库函数得到我们的“损失”。损失衡量的是我们希望我们的模型代表的东西和它实际代表的东西之间的差异。

w = tf.Variable([3], dtype=tf.float32)
b = tf.Variable([1], dtype=tf.float32)
x = tf.placeholder(dtype=tf.float32)
linear_model = w * x + b
y = tf.placeholder(dtype=tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)

这里的每条线都是一个不同的张量,或者是我们图形中的一个新节点。我们将通过使用学习率为 0.01 的内置GradientDescentOptimizer来完成我们的模型。我们将把我们的训练步骤设定为试图最小化损失函数。

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

现在我们将运行会话,初始化变量,并运行我们的训练步骤 1000 次。我们将传递一系列输入及其预期输出。我们来试着学一下台词y = 5x - 1。我们的预期产出y值将假设这一点。

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
    sess.run(train, {x: [1, 2, 3, 4], y: [4,9,14,19]})print(sess.run([W,b]))

最后,我们打印出权重和偏差,并看到我们的结果!

[array([ 4.99999475], dtype=float32), array([-0.99998516], dtype=float32)]

所以我们可以看到我们学习到的值非常接近正确值 5 和-1!

用 Haskell 表示张量

最后,我将详细介绍如何在 Haskell 中应用这些张量概念。像字符串和数字一样,我们不能在 Haskell 中有这种“张量”类型,因为这种类型可能真的代表一些非常不同的概念。为了更深入地了解我们正在处理的张量类型,请查看我们的深度指南中的

同时,让我们看一些简单的代码片段,复制我们在 Python 中的工作。下面是我们如何制作几个常数,并把它们加在一起。请注意“重载列表”扩展。它允许我们用和列表一样的语法来表示不同的类型。我们将此用于Shape物品和Vectors:

{-# LANGUAGE OverloadedLists #-}import Data.Vector (Vector)
import TensorFlow.Ops (constant, add)
import TensorFlow.Session (runSession, run)runSimple :: IO (Vector Float)
runSimple = runSession $ do
  let node1 = constant [1] [3 :: Float]
  let node2 = constant [1] [4 :: Float]
  let additionNode = node1 `add` node2
  run additionNodemain :: IO ()
main = do
  result <- runSimple
  print result{-
Output:
[7.0]
-}

我们使用constant函数,它接受一个Shape然后是我们想要的值。我们将创建我们的加法节点,然后run它得到输出,这是一个带有单个浮点数的向量。我们将一切都包装在runSession函数中。这封装了我们在 Python 中看到的初始化和运行动作。

现在假设我们想要占位符。这在 Haskell 中稍微复杂一点。我们将使用两个占位符,就像在 Python 中一样。我们将用placeholder函数和一个形状来初始化它们。我们将为函数的输入值提供参数。要真正传递参数来填充占位符,我们必须使用我们称之为“提要”的东西。

我们知道我们的adderNode取决于两个值。所以我们将把 run-step 写成一个函数,它接受两个“feed”值,每个占位符一个。然后我们将使用feed函数将这些提要分配给适当的节点。我们将把这些放在一个列表中,并将该列表作为参数传递给runWithFeeds。然后,我们通过对输入数据调用 run-step 来结束。我们将不得不encode原始向量作为张量。

import TensorFlow.Core (Tensor, Value, feed, encodeTensorData)
import TensorFlow.Ops (constant, add, placeholder)
import TensorFlow.Session (runSession, run, runWithFeeds)import Data.Vector (Vector)runPlaceholder :: Vector Float -> Vector Float -> IO (Vector Float)
runPlaceholder input1 input2 = runSession $ do
  (node1 :: Tensor Value Float) <- placeholder [1]
  (node2 :: Tensor Value Float) <- placeholder [1]
  let adderNode = node1 `add` node2
  let runStep = \node1Feed node2Feed -> runWithFeeds 
        [ feed node1 node1Feed
        , feed node2 node2Feed
        ] 
        adderNode
  runStep (encodeTensorData [1] input1) (encodeTensorData [1] input2)main :: IO ()
main = do
  result1 <- runPlaceholder [3.0] [4.5]
  result2 <- runPlaceholder [2.7] [8.9]
  print result1
  print result2{-
Output:
[7.5]
[11.599999] -- Yay rounding issues!
-}

现在,我们将通过我们已经在 Python 中看到的简单线性模型场景来总结。我们再一次将两个向量作为输入。这些将是我们试图匹配的价值观。接下来,我们将使用initializedVariable函数来获取我们的变量。我们不需要调用全局变量初始化器。但是这确实会影响会话的状态。注意,我们将它从 monad 上下文中提取出来,而不是使用 let。(占位符也是如此。)

import TensorFlow.Core (Tensor, Value, feed, encodeTensorData, Scalar(..))
import TensorFlow.Ops (constant, add, placeholder, sub, reduceSum, mul)
import TensorFlow.GenOps.Core (square)
import TensorFlow.Variable (readValue, initializedVariable, Variable)
import TensorFlow.Session (runSession, run, runWithFeeds)
import TensorFlow.Minimize (gradientDescent, minimizeWith)import Control.Monad (replicateM_)
import qualified Data.Vector as Vector
import Data.Vector (Vector)runVariable :: Vector Float -> Vector Float -> IO (Float, Float)
runVariable xInput yInput = runSession $ do
  let xSize = fromIntegral $ Vector.length xInput
  let ySize = fromIntegral $ Vector.length yInput
  (w :: Variable Float) <- initializedVariable 3
  (b :: Variable Float) <- initializedVariable 1
  …

接下来,我们将制作占位符和线性模型。然后我们用和之前差不多的方法计算损失函数。然后,我们将使用相同的提要技巧来插入占位符。

runVariable :: Vector Float -> Vector Float -> IO (Float, Float)
  ...
  (x :: Tensor Value Float) <- placeholder [xSize]
  let linear_model = ((readValue w) `mul` x) `add` (readValue b)
  (y :: Tensor Value Float) <- placeholder [ySize]
  let square_deltas = square (linear_model `sub` y)
  let loss = reduceSum square_deltas
  trainStep <- minimizeWith (gradientDescent 0.01) loss [w,b] 
  let trainWithFeeds = \xF yF -> runWithFeeds
        [ feed x xF
        , feed y yF
        ]
        trainStep
…

最后,我们将对输入数据运行 1000 次训练步骤。然后,我们将再次运行我们的模型,以提取权重和偏差的值。那我们就完了!

runVariable :: Vector Float -> Vector Float -> IO (Float, Float)
...
  replicateM_ 1000 
    (trainWithFeeds (encodeTensorData [xSize] xInput) (encodeTensorData [ySize] yInput))
  (Scalar w_learned, Scalar b_learned) <- run (readValue w, readValue b)
  return (w_learned, b_learned)main :: IO ()
main = do
  results <- runVariable [1.0, 2.0, 3.0, 4.0] [4.0, 9.0, 14.0, 19.0]
  print results{-
Output:
(4.9999948,-0.99998516)
-}

结论

希望这篇文章让你对 Haskell 中张量流的一些可能性有所了解。我们看到了张量流基础的快速介绍。我们看到了三种不同的张量。然后我们看到了 Python 和 Haskell 中的代码示例。最后,我们看了一个简单线性模型的快速示例,并了解了如何学习适合该模型的值。下周,我们将做一道更复杂的学习题。我们将使用经典的“Iris”花卉数据集,并使用全神经网络训练分类器。

如果你想了解更多细节,你应该查看免费的哈斯克尔张量流指南。它将引导您使用张量流库作为依赖项,并运行一个基本模型!

也许你对 Haskell 完全陌生,但对使用它进行机器学习或其他任何事情的可能性很感兴趣。您应该下载我们的入门清单!它有一些关于安装 Haskell 和学习核心概念的很好的资源。

开始在 PySpark 中开发,Jupyter 安装在一个大数据集群中

原文:https://towardsdatascience.com/starting-to-develop-in-pyspark-with-jupyter-installed-in-a-big-data-cluster-8a84e4db27e4?source=collection_archive---------12-----------------------

众所周知,像 Jupyter、 Apache Zeppelin 或最近推出的云数据实验室Jupyter 实验室这样的数据科学工具对于日常工作来说是必不可少的,那么如何将轻松开发模型的能力与大数据集群的计算能力结合起来呢?在本文中,我将分享在 GCP 的一个数据处理集群中开始使用 PySpark 的 Jupyter 笔记本的简单步骤。

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

Final goal

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

先决条件

1.拥有一个谷歌云账户(只需登录你的 Gmail,就能自动获得一年 300 美元的信用额度)[1]

2.用您喜欢的名称创建一个新项目

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

步骤

  1. 为了使部署更容易,我将使用一个测试功能,它只能在通过 Google Cloud Shell 创建数据处理集群时应用。对于我们的集群,我们需要定义许多特性,比如工作人员的数量、master 的高可用性、RAM 和硬盘驱动器的数量等。为了简单起见,我建议通过 UI 模拟集群的创建。首先我们需要启用 Dataproc(图 1 和图 2)。

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

Figure 1 Enable Dataproc API I

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

Figure 2 Enable Dataproc API II

2.使用您自己的集群大小获得模拟创建过程的等效命令行*。我将设定基本规格:*

  • 区域:全球
  • 集群模式:标准
  • 主节点:2 个 vCPUs、7.5GB 内存和 300 磁盘大小
  • 工作节点:2 个 CPU、7.5GB 内存和 200 个磁盘大小

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

Simulate creating a cluster through UI

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

Basic specs

重要提示:您应该点击高级选项,将图像更改为 1.3 Debian 9,以使 beta 参数生效。

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

To access click Advance options

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

Change to 1.3 Debian 9

3.获取等效命令行

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

Click in command line

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

Copy the gcloud command

4.关闭模拟并单击以激活云壳

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

Activate Cloud Shell

5.修改您的命令添加并运行(可能需要几分钟)

--optional-components=ANACONDA,JUPYTER

变化

g cloud data proc星团gcloud beta dataproc 星团

奔跑

  • **重要信息更改项目 id ctic-227716,**在控制台中用黄色书写的名称,同时将 cluster-ctic 重命名为您喜欢的名称(记住使用小写)
gcloud beta dataproc clusters create cluster-ctic --subnet default --zone us-west1-a --master-machine-type n1-standard-2 --master-boot-disk-size 300 --num-workers 2 --worker-machine-type n1-standard-2 --worker-boot-disk-size 200 --optional-components=ANACONDA,JUPYTER --image-version 1.3-deb9 --project ctic-227716

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

running in shell

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

cluster created

6.允许 Jupyter 端口的传入流量,在登录页面中搜索防火墙规则并创建一个规则。

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

search Firewall rules VPC network

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

click on create a rule

7.定义防火墙规则开放端口 8123 并保存。

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

parameters

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

Rule working

8.检查您的所有节点是否都允许 http 和 https 流量,并添加在每个节点中创建的防火墙标记。

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

9.输入您的 Jupyter 笔记本!(您需要您的主 IP 并添加 jupyter 默认端口,例如http://30.195 . XXX . xx:8123)

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

get master´s IP

10.让我们创建我们的第一个 Pyspark 笔记本

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

create the first Pyspark notebook

11.验证运行良好

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

奖励:检查火花 UI

  • 要访问 Spark UI,您需要添加另一个防火墙规则,如步骤 7。打开端口 8088、4040、9870 和 4041。

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

Create Spark UI rule

  • 点击我们第一个笔记本中的 Spark UI 链接,您将看到一个 ERR_NAME_NOT_RESOLVED 错误,只需将 URL 替换为主 IP 即可

例如http://3x . XXX . xx . x:8088/proxy/application _ 1542773664669 _ 0001

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

Spark UI

结论

在本文中,我尝试在 Data Proc 集群中部署 Jupyter,使得在真实集群中使用 PySpark 更加方便。如果您对下一篇文章有任何问题或建议,请随意。

下一篇文章再见!快乐学习!

PS 如果你有任何问题,或者想要澄清一些事情,你可以在 TwitterLinkedIn 上找到我。如果你想了解 Apache Arrow 和 Apache Spark,我有一篇文章用一些例子温和地介绍了 Apache Arrow 与 Apache Spark 和 Pandas 此外,今年还出版了一本了解 Apache Spark、Spark 的最佳书籍:权威指南

州政府关于鸦片滥用治疗的政策可能会驱使人们使用谷歌购物:一个数据可视化。

原文:https://towardsdatascience.com/state-government-policy-on-opiate-abuse-treatment-may-drive-people-to-google-shopping-a-data-f71f4a09ef73?source=collection_archive---------9-----------------------

当人们需要某样东西而又很难得到它时,他们通常会在网上寻找愿意卖给他们的人。这不仅适用于收藏品、不寻常的配方成分和廉价的教科书,也适用于处方药。

用于治疗阿片成瘾或滥用的两种主要药物是美沙酮丁丙诺啡。丁丙诺啡与纳洛酮混合,通常被称为 Suboxone。这些药物抑制了渴望和戒断症状,使人们在接受治疗的同时更好地发挥作用。美沙酮治疗需要患者每天到特定的配药地点领取药物,这对许多人来说是一种负担。相比之下,Suboxone 可以在药店买到,每月一次。作为一种仿制药,它有望使更多的鸦片上瘾者和滥用者得到成功的治疗。

但是由于多种原因,患者很难得到 Suboxone 根据联邦法律,它只能由经过专门认证培训的医生开出,而医生自己必须为此付费;各州只有少量医生持证;这些医生每年只能为 30、100 或 250 名患者开处方,这取决于他们的认证类型;一些获得认证的人可能会避免接受有需要的病人,因为他们可能是高维护费用的病人;病人排在注册医生的等候名单上是很常见的;一些州将 Medicaid 承保的治疗限制在 2 年或 3 年;一些保险政策,包括医疗补助或医疗保险(视州而定),可能根本不涵盖 Suboxone。

因此,谷歌有一份关于“Suboxone”的谷歌购物搜索次数的记录。这可以按州进行细分,以获得搜索词“Suboxone”受欢迎程度的相对度量。

点击 此处 查看此图的互动版本…

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

Click here for an interactive version of this graph

你可能会认为,受阿片类药物流行影响最严重、过量致死率最高的会有最多的关于 Suboxone 的谷歌购物搜索,可能是那些试图在没有处方的情况下购买 Suboxone 的人。这种趋势是存在的,但是有些州的搜索率比你预期的要高(用橙色突出显示)。有些州的搜索率比你预期的要低(用绿色突出显示)。死亡率根据各州年龄组比例的差异进行调整,因为一些死亡原因更可能影响特定年龄范围内的人。

由于 Suboxone 本身可能被吸毒者滥用或转移,试图避免得分之间的戒断症状,并不是所有谷歌购物搜索该药物的人都是积极试图恢复的人。纳洛酮成分被认为可以防止过量服用,但是丁丙诺啡成分确保了黑市的存在。

各州正在做什么与比预期更高或更低的次级搜索率相关联?一些因素包括州医疗补助扩展状况、州医疗补助对阿片类药物成瘾或滥用治疗的覆盖范围,以及州政府在认证医生开出 Suboxone 方面所做的努力。点击交互图左侧的按钮,查看哪些州在谷歌购物上的 Suboxone 搜索率高于或低于预期,以及州政府政策是如何相关的。我使用的是 2015 年的数据,因为这是我能够获得所有数据的最近一年。

点击 此处 查看此图的互动版本…

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

Click here for an interactive version of this graph

我们可以在谷歌购物搜索“Suboxone”上看到与这些因素相关的趋势。通过医疗补助政策或医学博士认证努力促进医生处方 Suboxone 使用的州,人们通过互联网寻找危险替代品的比率较低。不可能知道这些因素是否导致了搜索率的差异——我们只能观察一种趋势。这里还有许多其他因素没有涉及,比如 T2 限制阿片类止痛药处方的程度;针对毒品犯罪的州执法实践;和价格或街上是否有Suboxone。此外,一些因素也是相互关联的,例如一个州的医疗补助或医疗保险覆盖的子处方的百分比,以及该州是否参与了医疗补助的扩展。

鸦片成瘾治疗包括行为疗法、药物辅助治疗及其组合。关于每种治疗方法的疗效存在争议,此处不予讨论。美国医学协会美国成瘾医学协会世界卫生组织已经声明药物辅助治疗应该广泛可用。

使用 RShiny 中的工具处理和绘制数据。

感谢您的阅读。

我欢迎反馈——您可以“鼓掌”表示赞同,或者如果您有具体的回应或问题,请在此给我发消息。我也有兴趣听听你想在未来的帖子中涉及哪些主题。

阅读更多关于我的作品【jenny-listman.netlify.com】。欢迎随时通过 Twitter@ jblistmanLinkedIn联系我。

数据来源:

  1. 用药过量死亡率是按每 100,000 人中的死亡人数计算的年龄调整死亡率。在比较不同年龄分布的人口(如各州)时,按每个人口中年龄组的比例调整死亡率可以进行直接比较。如果某个特定的死亡原因更有可能影响某个年龄组的人,而某个州该年龄组的人口比例更高,那么在没有年龄调整的情况下,该原因导致的死亡率可能会被夸大。这些比率包括阿片类药物以外的药物过量。在某些情况下,死亡被报告为药物中毒,但不包含药物类型的信息。由于当地的报告惯例,阿片类药物报告的死亡人数在各州差异很大,但非阿片类药物中毒死亡的百分比在各州差异较小。在这项分析中,我使用了每 100,000 人中经年龄调整的药物中毒死亡率,包括没有特定药物的死亡。由于各州的用药过量死亡率和州的 Suboxone 搜索率被用作各州之间的相对衡量标准,这使得在面对不规则的药物类型报告做法时,可以进行合理的州与州之间的比较。用药过量死亡率的数据来自 2015 年,从 CDC 网站获得:https://www.cdc.gov/drugoverdose/data/statedeaths.html
  2. 按州和年份分列的有资格开 Suboxone 处方的医生人数和允许的病人人数的数据来自:https://www . Sam HSA . gov/medication-assisted-treatment/physician-program-data/certified-physicians
  3. 谷歌购物数据来自谷歌趋势:https://trends.google.com/trends/* * *谷歌趋势数据是符合趋势用户选择的搜索标准的所有谷歌搜索数据的随机子集。因此,使用相同搜索标准的 Google Trends 报告之间的结果略有不同。我正在开发一个 R 工具来最小化趋势报告中的偏差。
  4. 各州的 Suboxone 和阿片类药物处方数据以及 Medicaid Suboxone 和美沙酮覆盖政策来自 IMS 医疗保健信息学研究所的报告:阿片类药物康复治疗的使用:州级丁丙诺啡使用和支付类型的最新证据。https://www . IMS health . com/files/web/IMSH % 20 institute/Reports/health care % 20 briefs/IIHI _ Use _ of _ opoid _ Recovery _ drugs . pdf
  5. 2015 财年(截至 2016 年 1 月)医疗补助扩展州数据,来自凯泽家族基金会:http://www . kff . org/Medicaid/state-indicator/Medicaid-expansion-spending/?current time frame = 0&sort model = % 7B % 22 solid % 22:% 22 location % 22,%22sort%22:%22asc%22%7D

原文:https://towardsdatascience.com/states-70fab9ba479?source=collection_archive---------5-----------------------

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

I don’t think he was quite as excited about this as I was.

我一直在思考我想写些什么。上一次我有机会以这种方式思考是在大约一年前,在来自默克公司的 grand incredible Priya Agrawal 的帮助下,我有机会向比尔和梅林达盖茨以及盖茨基金会的董事会介绍数字技术在全球卫生系统发展中的作用。

这是一次有趣的经历,它让我有机会以一种自 Wellframe 成立以来从未有过的方式整理思绪。还是在有孩子之前?

无论如何,我主要对两件事感兴趣

  1. 人类系统中存在的信息系统和激励网络。比我最初想象的更多的事情是信息处理任务。计算机不仅仅是一台机器,而是信息处理的隐喻。我有时甚至会说,计算机是自然存在的形式,但当我醒来时,我最终得出结论,计算机只是(几乎无处不在的)信息处理任务的最方便的隐喻。
  2. 如何使用计算机通过创造人机混合系统来改善物质事物的组织——人类和计算机一起工作来放大彼此。

多年来,我发现图灵机的简单模型是思考健康和社会其他系统的一种有趣方式。事实上,几年前我非常喜欢艾伦·图灵,以至于我想用他的名字给我们的第一个女儿取名,但是我找不到一个和他名字一样的女性衍生词。现在我重新认识了睡眠的全部好处,我们不太可能再要孩子了,但就我所见,这将是生男孩的主要好处。

卫生系统中的病人就像某种图灵机——每个人都经历一系列不同的状态,其中的转变就是卫生系统的行动。从这个角度来看,医院(或者可以说是任何医疗服务单位)在一般意义上从事信息处理和计算的业务,就像从事医疗服务一样。当然,我并不是说关心的因素不重要(我花了 10 年时间试图证明它们是重要的),也不是说医学知识(这些隐喻程序中的真理)是完美的,但为了便于讨论,将这些东西抽象出来会更方便。

剩下的是两个核心计算任务:诊断(推理)和管理(基本上是带有一些推理的规则的应用,以使这一切不那么干净)。目前,诊断主要受到缺乏结构化数据的限制,这首先是一个传感问题,这实际上是基础科学领域的一个问题——在大多数情况下,我们需要更好的传感器来提供一些客观的可比性,否则就会受到人们如何使用语言描述发生在他们身上和他人身上的事情的变化的影响。有了大量的结构化数据(当然,现在也有结构化数据存在的领域),诊断问题变成了一个非常有趣的推理问题,机器学习,特别是计算的认知方法的深刻飞跃可以发挥作用。

许多更有资格的人已经写了这方面的文章,所以没有必要贬低他们的基础工作。在没有结构化数据的情况下,人类在许多情况下实际上是最擅长诊断的,因为我们能够更有效地解释歧义,产生启发,并快速地以有时不明显的方式利用它们(我想是 House MD)。这些人看起来很像现在的临床医生,当然,尽管他们很有价值,但却难以培训,维护起来成本高昂,因此很难在需要他们的地方找到他们。随着更好的感知、学习和自我优化算法,很明显我们可以增加每个临床医生的杠杆作用,但这仍需要几年时间。

在未来的一篇文章中,在获得许可之前,我将写一写我的朋友 Sid 和 Michal 以及他们的公司,他们使用手机和微型化学技术,以现有成本的一小部分,将实验室测试带给各地的患者。他们目前正在通过 FDA 的许可,但最有趣的是,他们已经有数万家诊所在印度成功使用他们的测试——在剑桥和我们一起在麻省理工学院 CSAIL 的黑暗洞穴中开始之后。它有时被称为逆向创新,这是一个非常令人讨厌的术语,但稍后会有更多的介绍。

回到故事上来,我认为管理问题在短期内更容易解决。这在很大程度上是一个感知患者健康状态的问题(在随后的帖子中会详细介绍如何做到这一点),并根据该健康状态确定最合适的干预措施,以使患者在通往理想健康状态的道路上达到下一个最佳健康状态——健康目标。同样,感知状态并基于该状态确定干预的能力在历史上一直是系统中的约束,但随着移动电话和云计算的出现,这些约束现在被有效地解除了。这是 Wellframe 运营的地方。

从管理问题来看,很明显,医学上并不缺乏规则,只是众所周知,它们没有得到应用,因为在资源、努力和直接不便方面的成本都非常高。我认为,通过使现有规则对患者来说更容易访问和用户友好,并利用这个机会使用生成的数据来定义至少对临床医生来说不明显的领域中的新规则,可以创造很多价值——即“体验”维度及其剪裁。

我认为,支撑这一切的是一种强制性的认识,即病人创造他们自己的“健康”,而我们只是为这种创造提供一些原材料和一些必要知识的供应商。考虑到这一点,我们采用了一种非常古怪的方式,这在任何其他制造流程中都是完全不可接受的,我们真的需要做得更好。我认为,如果我们围绕患者以这种方式重新构建任务,并意识到管理挑战是一种迭代的状态感知和转换,这是一项计算机非常擅长的任务,那么就可以节省更多的人类时间和精力,将它们花在人们真正擅长而计算机真正不擅长的事情上——让其他人感到被关心。

七年前,我非常幸运,在麻省理工学院和周围的一些不可思议的人一起工作了几年,他们仍然是我的朋友,他们向我介绍了这些想法,并从根本上改变了我的生活,或者至少改变了我对一个人的可能性的看法。

这个博客的目的是回到那种惊奇的感觉,并在我的才能和时间的限制下,传达它。我会试着在下面的帖子中包含更多的细节和具体的例子来进一步发展我的想法。

很多这样的想法都是着眼于长远,当然空白的事实是(至少现在是这样;)从长远来看,令人沮丧的是,我们都会死。遗憾的是,这比我想的要早得多,因为我那了不起的叔叔 Sithamparanathan Sivagnanam 最近去世了。他轻轻地踩在地上,把它变成了一个更好的地方。他是一个“做梦的傻瓜”,人类的所有进步都建立在这样的事情上。

作为纪念。

T

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

“统计学”成就了我的一天,是吗?

原文:https://towardsdatascience.com/statistic-has-made-my-day-or-has-it-982c7d527410?source=collection_archive---------8-----------------------

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

Bedtime Paradox cartoon

A 几乎所有的活动都必须与数据相关,数据可以通过多种不同的方式收集。自从 19 世纪初统计学被广泛使用和知晓以来,数据收集变得流行起来。由于统计数据的功能,它被用来使用有限的数据来解释一种现象,例如一个业务用例或者仅仅是一场赌博。它帮助了许多商人、经纪人、赌徒,尤其是现在的电子商务或科技公司,它们在短时间内产生许多数据。

由于对统计学家的高需求,许多人将他们的职业道路转变为能够做好统计的“数据向导”。目前,通过博客、文章或这里的“媒介”,甚至询问*【大师】*,就可以很容易地了解这些统计数据。每个人都可以使用它,每个人都可以教它,而且每个人都可能是错的,这就是问题所在。统计是一种工具,作为另一种有有限用途的工具,它也有许多假设和不同的解释。这里有一些在做统计分析时可以发现的悖论或谬误。

辛普森悖论

这个简单的统计数字不会伤害任何人,也不会让每个人都破产。然而,基于简单统计的错误输出的决策可能导致一个国家的毁灭。众所周知,统计学中的一个悖论会误导统计学家,这个悖论叫做辛普森悖论。

这是使用 A/B 测试的观察者或想要比较产品的研究者通常会遇到的矛盾。辛普森悖论是这样一种悖论,当不同组的数据被合并时,不同组中出现的趋势消失了,这是英国统计学家 Udny Yule 在 1903 年首次提到的。

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

Simple Simpson’s Paradox

这个悖论有很多不同的例子。在一个著名的例子中,研究人员得出结论,一种新的治疗肾结石的方法比传统手术更有效,但是后来发现这种新的治疗方法更常用于小肾结石。在研究人员根据肾结石的大小进行分割后,这一发现出现了。

此外,这在企业案例中也经常发生。例如,假设公司生产两种产品,并想知道哪一种是最好的。公司随机选择 200 个不同的好顾客作为样本来试用新产品,其中 100 个顾客试用产品 A,另外 100 个顾客得到产品 b。每个顾客必须给出对产品的意见,“喜欢还是不喜欢”。这是实验的结果,

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

Initial Result

很容易计算出,这些数据明显表明产品 A 比产品 b 更容易被客户接受。但是,如果公司知道并拥有关于性别的数据,并且研究人员将数据分为两种类型的客户,那么上面的报告将变为下表(具有相同的性别比例)。

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

Gender Centrist Result

简单的比例计算表明,只有对女性顾客来说,产品 B 比产品 A 更有利。

如果研究人员不在乎进行分割,上面的简单实验可能会导致错误的方向。为了防止这种情况发生,需要对每个调查进行适当的分组。然而,帕夫利德斯和帕尔曼的一篇论文证明了辛普森悖论发生的概率正好是 1/60。

啧啧嗖图

一幅画,总的来说,可以操纵任何观众,这幅画有许多不同的解读。因此,任何人创建的表格中的简单图表都可能改变研究人员甚至领导的决定。操纵数据解释视角的方法之一是 Gee Whiz 图。

那是什么?请注意下面的图表。

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

Famous Example of Gee Whiz Graph

左边的图表显示了“政府支出”的显著增长。1937 年 10 月以后,显示这一点的报纸似乎终究是反对政府的。同时,对于相同的数据,右边的线在同一个月之后没有显示出显著的差异。如果两个人一眼看到这些图表,他们可能会有不同的观点。

选择阿尔法

“用α0.05,假设检验表明…” 这句话通常写在研究论文或很多统计学教材上,问题是假设检验是否应该用 alpha 等于 0.05?。使用 0.05 作为显著性水平(α)似乎是不可否认的,并成为每个假设检验的强制性要求。然而,假设检验或统计显著性检验通常具有显著性水平。

假设检验中的显著性水平或通常写为 Alpha 是当假设检验或统计检验中的零假设为真时拒绝零假设的概率(假阳性的概率)。这意味着阿尔法值越小,拒绝真零假设的可能性就越小。它被用作确定是否拒绝零假设的基准。由于它的作用,α的值应该取决于情况和要处理的问题。如果研究者有兴趣拒绝一个真正的零假设,那么他可以使用一个更大的α,反之亦然。

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

Z-value of Alpha

尽管α值允许使用 0 到 1 之间的所有实数,但从理论上讲,用于统计测试是不实际的。通常,α的值是 0.01、0.05 或 0.1,即使没有数学定理表明这些是唯一可以使用的显著水平。因此,有必要为每一个显著性检验提供α值,并且每次阅读统计研究时都要小心。

伯克森悖论

这个悖论也被称为伯克森偏差或伯克森谬误,非常接近辛普森悖论。伯克森悖论是一种情况,其中两个指标在统计上可能是负相关的,即使它们在总体中似乎是正相关的,甚至是不相关的。

这种情况可能是由于观察者在收集数据时的选择偏差造成的。在这个悖论中,观察被限制在两个变量相加的地方。因为如果你知道 A+B 一定在某个范围内,那么 A 高导致 B 低,反之亦然。

例如,假设观察者想要分析订单值(OV)和某个电子商务上 VIP 客户的订单数量(N)之间的相关性。在本研究中,VIP 客户被定义为具有总标准化 OV 且标准化 N 高于某个基准 B_max 的客户。总体人口分布大致如下图所示,

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

Berkson’s Example

绿点(数据选择)在这些指标之间会有明显的负相关,因为在开始时有偏差选择。标准是“标准化 OV”+“标准化 N”≤B _ max,当 OV 较低时给出信息,则 N 的值由于其限制而必须较高。

上面的例子从一开始就有明显的错误,但是有一些情况很难被注意到有这种悖论,特别是在医学观察上,这种观察限制了获取样本的途径。另一个例子来自教育领域关于 GPA 和 SAT 成绩的相关性。

后特设谬误

Post Hoc 是“Post Hoc,Ergo Propter Hoc”的简称,意思是“在它之后,因此因为它”。这是一个逻辑谬误,认为第一个事件是紧随其后的第二个事件的原因。许多研究人员由于缺乏信息和经验而陷入这一悖论。此外,这是一个懒惰的答案,为研究者创造一个报告的研究结论。

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

Domino’s Cause and Effect

举一个我们熟悉的医学领域疾病及其治疗的例子。比方说,一个病人病了几天,然后他买了一种药来治疗,这种药能使他立即好转。之后,病人得出结论,由于药物的作用,疾病已经消失。然后,他会买同样的药,或者建议人们如果疾病感染了他们就买这种药。

并不是每一个事后谬误都会像上面的例子一样带来好的结果,大多数都不会有好的结局。例如,社交媒体、恶作剧和仇恨言论大多使用这种逻辑谬误来传播仇恨,从而在现实世界中制造冲突和混乱。这种现象通常发生在总统竞选期间,在社会中引发不同的群体。

在统计学中,这种谬误不是由错误的公式或公式的错误使用引起的,而是发生在观察者产生结果的方式上。这确实与观点偏见和观察者的经验有关。作为一名统计学家或数据分析人员,有多种统计测试来确定两组或多组数据的事后效应,如霍尔姆-邦费罗尼方法图基检验邓尼特校正

结束注释

从数据中获得洞察力离不开统计,如果偏见(或个人观点)仍然存在,统计就无法给出最佳结果。如果观察者或“统计学家”不能理解公式中变量的含义,这也是一个自食其果的工具。不仅在使用统计数据时,而且观察者也必须注意在从公式中获得所有数字后再陈述结论。

巴塞罗那 Airbnb 市场的统计概览

原文:https://towardsdatascience.com/statistical-overview-of-barcelonas-airbnb-market-83dc7d6be648?source=collection_archive---------8-----------------------

本文对巴塞罗那的 Airbnb 经济进行了探索性的数据分析。Airbnb 在巴塞罗那非常受欢迎,与大型酒店行业平行。福布斯提到巴塞罗那是继巴黎和伦敦之后欧洲第三大 Airbnb 租赁城市,也是世界第六大。巴塞罗那的 Airbnb 活动也成为了针对使用该平台的东道主的政治和法律诉讼的对象。这座城市正在采取行动,从这个平台上移除数以千计没有旅游许可证被关闭的房产。根据现有数据,Airbnb 在巴塞罗那的使用量每年都在增加,越来越多的主机在该平台上建立房源。

Airbnb 数据源

Airbnb 不共享原始数据,但是使用 Airbnb 内部的可以获得一些数据,这使得可以通过使用 Airbnb 网站上公开的信息来访问 Airbnb 数据。该数据是从 2018 年 2 月 7 日开始的可搜索列表的快照。这些数据包括:

  • 未来可用日期的日期和价格
  • 可搜索列表的评论
  • 位置和列表元数据

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

探索性数据分析

我们可以预计,在一个需求如此之高的城市,大多数主持人将是“专业主持人”,他们出租完整的公寓或私人房间,并持有多个房源,以实现净利润的最大化,但数据告诉我们的情况不同。我们可以看到,大约 70%的活跃列表主机持有单一列表。这可能是市政厅关闭非许可房源的行动以及 Airbnb 自己制定的“一个主机一个家”政策的结果,该政策限制市中心的非旅游许可房源的每个主机只能有一个房源。

*如果在未来一年中有 1 到 364 个可用日期,并且在过去 8 个月中至少收到 1 次审核,则该列表被视为有效。

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

假设大多数房源是非专业的,我们可以预计最受欢迎的房源类型将是私人和共享房间,允许主人继续住在自己的家里。实际上,私人房间平均分布在整个公寓中。这表明了两种情况——主人住在他们的日常公寓里,并列出另一个完整的公寓,这是一年的 Airbnb 清单,或者整个公寓的收入足够高,以鼓励主人搬出去过夜。

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

季节性需求

我们可以通过查看给定评论的数量来估计预订量。Airbnb 内部已经估计审核率为大约 50% ,与 Airbnb 官方文件中的统计数据相比,该审核率也符合下图。
审查显示,从 2016 年到 2017 年,被审查的上市公司数量每年增长 40%。

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

需求也有月度季节性,在 8 月份达到需求高峰,在新年达到另一个较短的高峰。我们可以看到可用房源的价格是如何相互关联并适应假日需求的。
看到这些数据可以解释主人合租甚至搬出公寓的意愿。市中心一居室的平均租金可以达到每月 800€,日租金 32 美元。同样的公寓可以在 8 月份以 140 美元的价格在 Airbnb 上挂牌,即使扣除平台和清洁费,这对公寓租户来说也是一笔非常好的节省。将 8 月份 140 美元的平均挂牌价格与巴塞罗那酒店212 美元的平均每日房价进行比较,可以看出主人和客人都觉得 Airbnb 很划算。

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

专业主持

有多少专业 Airbnb 房源在巴塞罗那运营,这是 Airbnb 活动和这座城市之间的一个主要争议问题。全职主持人将努力最大化客人占用列表的时间,并最小化拜访方之间的时间。

可以使用审核日期来估计预订之间的平均时间。下图告诉我们,一个仅被审核 10 次的列表可以被认为是一个临时的-非专业的列表,预订间隔为 10 天(基于 50%的审核率)。

根据 Airbnb 的报告,每位客人的平均入住时间为 4.3 晚。这一措施被添加为橙色虚线。为了让列表每天晚上都工作,列表需要接收至少 90 个预订。

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

Airbnb 将每年预订超过 120 天的房源视为专业房源。我们将在这部分分析中使用相同的阈值。
根据预计预订量绘制的列表分布图显示,在 4320 个列表中,约 32%的列表可以根据 120 天标准被视为专业列表。

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

当比较 Airbnb 的 4320 个专业列表和该市酒店的 75000 个床位时,我们可以得出结论,这些列表只代表了巴塞罗那旅游专用住宿的 5%。

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

列表邻域分布

巴塞罗那 160 万人口居住在该市的 10 个街区。这座城市每年接待 3200 万游客,其中大约一半是一日游游客。让我们看看 Airbnb 是如何在邻里层面上影响这座城市的。对于这一部分,我们使用了 Tableau 10.2 GeoJSON 导入功能。

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

Ciutat Vella 和 Eixample 的市中心社区是最活跃的 Airbnb 社区,实际上,当查看特定区域时,reta de l’Eixample、Raval 和 Barri Gòtic 占据了整个城市 Airbnb 活动的 27%。
巴塞罗那只有市中心主机享受 Airbnb 的人气吗?似乎不是。我们可以注意到,列表和评论都分布在城市的不同区域,而大约 30%的列表和评论发生在三个中心社区之外。

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

Airbnb 是否占用了特定街区的居住空间?

回答这个问题的正确方法是计算每个街区使用 Airbnb 的家庭百分比,特别是专业房源。我们将通过使用按地区划分的人口数据来估计家庭数量,并假设每套公寓有 2 个人。
Ciutat Vella 街区是巴塞罗那最具影响力的街区,然而,只有 1.9%的公寓是真正的专业房源,其余 3.3%的公寓是临时 Airbnb 房源。Airbnb 正在吸引更多游客进入已经拥挤的市中心,但可能会减少对当地住宅公寓费用的考虑。

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

结论

Airbnb 在一个受政治、法规、季节性、文化和经济影响的动态市场中运营。巴塞罗那是一个美丽的旅游胜地,这使得 Airbnb 成为一种流行的创收方式,不仅在特定地区是专业的,而且在所有社区都是如此。大多数主机以一种随意的方式使用 Airbnb,通常只有一个列表,大约 30%的主机会管理多个列表。只要 Airbnb 提供比酒店更友好的预算选择,并为主机提供有意义的收入,我们可能会继续看到市场在当局监管主机的压力下增长。

哈雷尔·瑞卡维亚

解释统计显著性

原文:https://towardsdatascience.com/statistical-significance-hypothesis-testing-the-normal-curve-and-p-values-93274fa32687?source=collection_archive---------0-----------------------

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

用数据证明一件事是什么意思?

作为一所重点大学的院长,你收到一份令人担忧的报告,报告显示你的学生每晚平均睡眠时间为 6.80 小时,而全国大学的平均睡眠时间为 7.02 小时。学生会主席担心学生的健康,并指出这项研究证明家庭作业必须减少。另一方面,大学校长对这项研究不屑一顾,称其为无稽之谈:“在我年轻的时候,我们每晚能睡四个小时,就已经很幸运了。”你必须决定这是否是一个严重的问题。幸运的是,你精通统计学,并最终看到了一个运用你所受教育的机会!

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

How can we decide if this is meaningful?

统计显著性是我们经常听到但没有真正理解的术语之一。当有人声称数据证明了他们的观点时,我们点头接受,假设统计学家做了复杂的运算,得出了不容置疑的结果。事实上,统计显著性不是一个需要多年学习才能掌握的复杂现象,而是一个每个人都可以——也应该——理解的简单概念。像大多数技术概念一样,统计学意义建立在一些简单的概念上:假设检验、正态分布和 p 值。在本文中,我们将简要地触及所有这些概念(提供了更多的资源),以解决上面提出的难题。

**作者注:**这篇文章的早期版本过于简化了 p 值的定义。我要感谢教授蒂莫西·贝茨纠正了我的错误。这是在线协作学习的一个很好的例子,我鼓励任何反馈、纠正或讨论!

我们要讨论的第一个想法是假设检验,一种使用数据评估理论的技术。“假设”是指研究者在研究之前对情境的最初信念。这个最初的理论被称为 替代假设,相反的被称为无效假设。在我们的示例中,这些是:

  • 替代假设:我们大学学生的平均睡眠时间低于全国大学生平均水平。
  • 零假设:我们大学学生的平均睡眠时间不低于全国大学生平均水平。

请注意,我们必须小心措辞:我们正在寻找一个非常具体的效果,这需要在假设中形式化,因此在事实发生后,我们不能声称已经测试了其他东西!(这是一个单边假设检验的例子,因为我们只关心一个方向的变化。假设检验是统计学的基础之一,用于评估大多数研究的结果。这些研究可以是从评估药物有效性的医学试验到评估锻炼计划的观察性研究。所有的研究都有一个共同点,那就是它们都关注于进行比较,要么在两组之间进行比较,要么在一组和整个人群之间进行比较。在医学的例子中,我们可能会比较服用两种不同药物的两组之间的平均康复时间,或者,在我们作为院长的问题中,我们希望比较我们的学生和全国所有学生之间的睡眠。

假设检验的测试部分允许我们决定哪一个理论,无效的或替代的,更好地被证据支持。假设检验有很多种,我们将使用一种叫做 z 检验的方法。然而,在我们开始测试我们的数据之前,我们需要谈论两个更重要的想法。

具有统计意义的第二个构件是正态分布,也称为高斯曲线或钟形曲线。正态分布用于表示来自过程的数据是如何分布的,并且由给定希腊字母μ (mu)的平均值和给定字母σ (sigma)的标准偏差来定义。平均值表示数据中心的位置,标准偏差表示数据的分布。

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

Normal Distribution with mean μ and standard deviation σ

正态分布的应用来自根据标准偏差评估数据点。我们可以根据一个数据点相对于平均值的标准偏差来确定它的异常程度。正态分布具有以下有用的特性:

  • 68%的数据在平均值的 1 个标准偏差范围内
  • 95%的数据在平均值的 2 个标准偏差范围内
  • 99.7%的数据在平均值的 3 个标准偏差之内

如果我们有一个正态分布的统计数据,我们可以用均值的标准差来描述任何一点。例如,美国女性的平均身高为 65 英寸(5 英尺 5 英寸),标准差为 4 英寸。如果我们遇到一个 73 英寸高的新朋友,我们可以说她比平均值高两个标准差,是女性中最高的 2.5%。(2.5%的女性比μ-2σ(57 英寸)矮,2.5%的女性比μ+2σ高)。

在统计学中,我们不是说我们的数据是平均值的两个标准差,而是根据 z 分数来评估它,z 分数只是代表一个点与平均值的标准差的数量。通过从数据点中减去分布的平均值并除以标准偏差,可以转换为 z 得分。在身高示例中,您可以检查我们的朋友的 z 值是否为 2。如果我们对所有数据点都这样做,新的分布称为标准正态分布,平均值为 0,标准差为 1,如下所示。

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

Transformation from normal (right) to standard normal distribution (left). (Source)

每次我们做假设检验时,我们都需要假设检验统计量的分布,在我们的例子中,检验统计量是学生的平均睡眠时间。对于 z 检验,正态曲线用作检验统计分布的近似值。一般来说,根据中心极限定理,当我们从一个数据分布中取更多的平均值时,平均值将趋向于正态分布。然而,这将始终是一个估计值,因为真实世界的数据永远不会完全遵循正态分布。假设正态分布让我们决定我们在研究中观察到的结果有多大意义。z 值越高或越低,结果越不可能是偶然发生的,结果越有可能是有意义的。为了量化结果的意义,我们使用了另一个概念。

最后一个核心思想是 p 值。一个 p 值是当零假设为真时,观察结果至少与测量结果一样极端的概率。这看起来有点复杂,所以让我们看一个例子。

假设我们正在测量美国佛罗里达州和华盛顿州的平均智商。我们的零假设是华盛顿的平均智商并不比佛罗里达的平均智商高。我们进行了研究,发现华盛顿的智商高出 2.2 点,p 值为 0.346。这意味着,在一个零假设——华盛顿的平均智商不高于佛罗里达州的平均智商——为真的世界里,我们有 34.6%的机会测量华盛顿的智商至少高出 2.2 分。因此,如果华盛顿的智商实际上没有高,我们仍然会测量出他们高至少 2.2 个点,大约 1/3 的时间是由于随机噪声。随后,p 值越低,结果越有意义,因为它不太可能是由噪声引起的。

结果能否被称为具有统计显著性,取决于我们在开始实验之前 为显著性确定的 p 值(称为α)。如果观察到的 p 值小于α,则结果具有统计学意义。我们需要在实验之前选择α,因为如果我们等到实验之后,我们可以选择一个数字来证明我们的结果是显著的,不管数据显示什么!

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

Choosing a p-value after the study in one good way to “Lie with Statistics”

α的选择取决于情况和研究领域,但最常用的值是 0.05,相当于随机出现结果的概率为 5%。在我的实验室中,我看到常用的值从 0.1 到 0.001。作为一个极端的例子,发现希格斯玻色子粒子的物理学家使用 0.0000003 的 p 值,或 350 万分之一的发现概率是因为噪音。(统计学家不愿意承认 0.05 的 p 值是任意的。现代统计学之父 R.A. Fischer 出于不确定的原因选择了 0.05 的 p 值,并坚持了下来!

要从正态分布的 z 值获得 p 值,我们可以使用表格或 r 等统计软件。结果将显示 z 值低于计算值的概率。例如,z 值为 2,p 值为 0.977,这意味着我们随机观察到 z 值大于 2 的概率只有 2.3%。

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

The percentage of the distribution below a z-score of 2 is 97.7%

到目前为止,我们总结了三个想法:

  1. 假设检验:一种用来检验理论的技术
  2. **正态分布:**假设检验中数据的近似表示。
  3. **p 值:**如果零假设为真,则出现至少与观察到的结果一样极端的结果的概率。

现在,让我们把例子中的各个部分放在一起。以下是基本情况:

  • 根据国家睡眠基金会的数据,全国学生平均每晚睡眠时间为 7.02 小时
  • 在对我们大学 202 名学生的调查中,平均每晚睡眠时间为 6.90 小时,标准差为 0.84 小时。
  • 我们的另一个假设是,我们大学学生的平均睡眠时间低于全国大学生的平均水平。
  • 我们将使用α值 0.05,这意味着如果 p 值低于 0.05,结果是显著的。

首先,我们需要将我们的测量值转换成 z 值,或者说它偏离平均值的标准偏差数。我们通过从测量值中减去总体平均值(全国平均值)并除以样本数量平方根的标准偏差来计算。(随着样本数量的增加,标准偏差和变异减少。我们通过将标准偏差除以样本数量的平方根来说明这一点。)

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

Conversion to z-score

z 分数被称为我们的检验统计量。一旦我们有了一个检验统计量,我们就可以使用一个表格或一种编程语言(如 R)来计算 p 值。我在这里使用代码不是为了恐吓,而是为了展示用免费工具实现我们的解决方案是多么容易!(#是注释,粗体是输出)

# Calculate the results
z_score = (6.90 - 7.02) / (0.84 / sqrt(202)) 
p_value = pnorm(z_score)# Print our results
sprintf('The p-value is %0:5f for a z-score of %0.5f.', p_value, z_score)**"The p-value is 0.02116 for a z-score of -2.03038."**

基于 p 值 0.02116,我们可以拒绝零假设。统计学家喜欢我们说拒绝零,而不是接受替代。有统计上显著的证据表明,在 0.05 的显著性水平上,我们的学生比美国的大学生平均睡眠时间少。p 值显示我们的结果有 2.12%的可能性是由随机噪声引起的。在这场总统之战中,这个学生是对的。

在我们禁止所有作业之前,我们需要注意不要对这个结果赋予太多。请注意,如果我们使用阈值 0.01,那么我们的 p 值 0.02116 并不显著。有人想证明我们研究中的相反观点,可以简单地操纵 p 值。每当我们检查一项研究时,除了结论之外,我们还应该考虑 p 值和样本量。由于样本量相对较小,只有 202 人,我们的研究可能具有统计意义,但这确实意味着它具有实际意义。此外,这是一项观察性研究,这意味着只有证据表明的相关性,而不是因果关系。我们发现在我们学校的学生和较少的平均睡眠之间有一种相关性,但不是说去我们学校会导致睡眠减少。可能有其他因素影响睡眠,只有一项随机对照研究能够证明因果关系。

与大多数技术概念一样,统计意义并不复杂,只是许多小概念的组合。大部分的麻烦来自于学习词汇!一旦你把这些碎片放在一起,你就可以开始应用这些统计概念了。当你学会了统计学的基础知识,你就能更好地以健康的怀疑态度看待研究和新闻。你可以看到数据实际上在说什么,而不是别人告诉你它意味着什么。对付不诚实的政客和公司的最佳策略是一个持怀疑态度、受过良好教育的公众!

一如既往,我欢迎建设性的批评和反馈。可以在 Twitter @koehrsen_will 上找到我。

统计意义与实际意义

原文:https://towardsdatascience.com/statistical-vs-practical-significance-b428bdbef6fb?source=collection_archive---------5-----------------------

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

维基百科包含了一系列认知偏见。(有 170 左右)。心理学家经常进行实验来发现和理解这样的现象。通常,实验者会花很大力气来控制环境,以便唯一的真实变量是感兴趣的变量。显然,这是实验的目的,而且对于理解因果关系是极好的。另一方面,实验对于理解相对重要性并不是很好。

我的意思是,虽然你可能在实验室里发现一种因果效应,但这种效应在你的生活中可能并不十分重要。我来详细解释一下。

讲故事:一把双刃剑

学者和其他大多数人一样,喜欢好故事。研究报告通常围绕一个现象或问题展开。主持人用一个主要的冲突或挑战来设置情节:它可能是一个研究手段要解决的问题,一个要澄清的主题。然后,对研究进行解释,并提出解决冲突的方法。这使得演示更加有趣,并且易于理解。

研究报告中讲故事的优势和劣势是一样的:影响力。观众更关注,更享受体验,这些都是好事。另一方面,演讲的主题也似乎更重要。对于一些非常非常重要的话题来说,这可能是一件好事。对于认知偏差,我觉得不是那么好的事情。这可能是因为讲故事的方式让我们对这些偏见给予了过多的重视。

虽然我喜欢他的书,但马尔科姆·格拉德威尔提供了一个很好的例子。他编织精彩的故事,让人身临其境,增长见闻。的确,他是一个讲故事的大师。在我读完他的书(以及类似的书)后,我通常会对自己的发现感到兴奋。随着时间的推移,热情会消退,剩下的只是书中实用的智慧。我发现,那里的经常没有。没错,我从这些书中学到的大部分东西最终都没有什么实用价值。我很像一个人,兴奋地用新方法减肥,却在几个月后发现新方法有致命的缺点。

数量很重要

通常,当描述实验时(特别是在社会心理学中),主要问题是因果关系。因果关系的标准标准包括“统计显著性”的概念。几乎在所有情况下,这都依赖于一种叫做假设检验的统计方法。如果你曾经处理过“零假设”和“替代假设”,这可能对你来说很熟悉我就不多讲技术细节了,关键是大部分研究都是用一个临界值来表示显著性(主要是 p>0.05)。

一旦某种效应越过了统计显著性的门槛,它就有了很大的可信度。通常它会停留在人们的大脑中(即使它不会转化为行为的改变)。但是,在现实生活中,清除统计门槛并没有多大意义。

记住,正如我提到的,实验是在严格控制的环境中进行的。目标是隔离一个效果,因此上下文被移除。但是把背景放回去,你会发现效果被它淹没了。这就是为什么数量很重要。特别是,相对于可能出现这种影响的常见环境的程度。

谁在乎呢。

你可能想知道我为什么花时间写这篇文章。这是一个合理的问题。主要是,我想帮助人们去除智力上的杂物。

我感觉被知识、建议、新闻和想法淹没了。随着互联网的发展,它给数十亿人的生活带来了新的信息和联系能力。与此同时,现在有一个巨大的负担,要从我们阅读和看到的东西中筛选出重要的东西。这可能很难。我希望为家务杂事提供一个工具:实际意义。

因为我们都喜欢简单的经验法则,所以我将提供一个统计经验法则的替代品,包括一个阈值。我姑且称之为*贝尔法则对于现实意义来说,*它是这样的:影响> 1 年。这个想法是,一个现象、效果、想法或策略,如果有人使用它,并持续感知一年以上的影响,它实际上是重要的。为什么是一年?我认为它足够长,足以建立一个真正强大的效果,但也足够短,它不是一个如此繁重的负担。当然,从理论上讲,理想的阈值是一个不确定持续时间的影响,但是基于这样一个阈值的经验法则是没有用的。

是的,我的门槛是随意的,但它很容易记住,而且它为思考实际意义提供了一个起点。

应用贝尔法则

如果我搜索我的记忆,一些非常重要的现象浮现在脑海中,通过贝尔法则。

  1. 确认偏差
  2. 收入与幸福曲线
  3. 马后炮偏差
  4. 损失厌恶与禀赋效应
  5. 体验与物质消费效应

可能有更多,但这些肯定通过了规则:影响> 1 年。

现在,让我强调一下,在实际意义上应用贝尔法则可以清理很多东西。我是一名博士生,读过大量流行的社会心理学书籍。我几乎每周都了解新的效果。我总共了解了数百种这样的效应,但在我看来,基本上只有 5 种是真正重要的。(讽刺的是,我这么做完全是后知后觉,所以第 3 条可能适用。😃

如果你坚持这篇文章,感谢阅读。我希望它能帮助你专注于重要的事情。

统计和概率复习

原文:https://towardsdatascience.com/statistics-and-probability-refresher-fb642a3a5f7d?source=collection_archive---------7-----------------------

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

从 2020 年 6 月起,我将不再使用媒体发布新故事。想继续看我的文章请访问我的个人博客:https://val lant . in

对于任何愿意从事机器学习工作的人来说,统计学基础是必备的。在这里,让我们讨论一下这一数学分支的一些基本概念,以及如何使用 Python 将它们应用于数据。

寻找中心

如果你想找到数据集中的地方,找到数据的中心是非常重要的。你可以用平均值、中间值或众数来计算。

平均值就是我们都知道的“平均值”。你把所有的数字相加,然后把结果除以数字的个数,就可以找到它。

用 Python 来做吧。假设您已经收集了一个城市中 10,000 套房屋的租赁价格,并且您想知道该城市的平均租赁价格。

Python 的库numpy提供了一种找到平均值的便捷方法。但是在跳到这个解决方案之前,让我们实现这个函数的版本,这样我们可以更好地理解平均值是如何计算的。然后,我将使用 numpy 的实现进行计算。

我们可以说,平均而言,房屋租金为 999 美元。但是如果我们在数据中加入 50 栋非常昂贵的房子会怎么样呢?假设这些房子的平均租赁价格为 10 万美元。我们的意思是什么?

我们的平均价格从 999 美元飙升至 1492 美元。在你看来,这个新的平均值代表现实吗?观察发现,只有 50 套房子能够拉动 1 万套房子的平均价格。事实上,平均值对异常值非常敏感。所以我们需要一个对此不太敏感的指标。

为此,我们有一个中位数,它是一个数字排序列表中的中间数字。

请注意,当我们的数据集中有异常值时,中位数更好地代表了数据中心点。所以,如果离群值对你很重要,就用平均值来计算中心点。如果你需要相反的,使用中间值。

但是,如果您想发现数据中最常见的值是什么呢?为此,我们可以使用模式。让我们创建一个新的数据集,包含 100,000 个年龄从 18 岁到 75 岁的人。我们来看看最常出现的值是多少。在我们的例子中,年龄是 34 岁,数据集上有 1835 个条目。

标准偏差和方差

这些度量告诉我们,考虑到中心点,数据是如何分散的。它们很重要,因为它们告诉我们数据是否或多或少远离平均值。

方差衡量数据相对于平均值的分布程度,而标准差是方差的平方根。

这些方法有助于发现异常值,异常值是指距离平均值太远的点,会改变我们对数据的看法和理解。以下是如何使用 Python 计算它们。

概率论

我用了一些来自 DataCamp 概率论 课程的例子。

概率是一种计算事件发生频率的数学方法。基本上,我们通过分析事件在过去发生的频率,使用概率来预测未来事件发生的可能性。

为了理解基本的概率概念,让我们以一副 52 张扑克牌为例。

但是首先,我们需要明白:

  • 在概率方面,我们分析在相同条件下可以重复的事件。
  • 试验是试图重现一个事件的行为,它会导致不同的结果。
  • 所有可能结果的集合称为样本空间。

一个例子是扔硬币,期望正面朝上。我们通过尝试投掷硬币来计算正面朝上的概率。在这种情况下,我们有两种可能的结果:正面或反面。这是我们的样本空间

单一事件的概率

这是计算概率最简单的方法。你只需将可能事件结果的数量除以样本空间。让我们回到卡片的例子。让我们计算一下在第一次尝试中从一副牌中拿到 a 的概率。因为我们有 4 张 a 和 52 张牌,所以概率是这样计算的:

组合和排列的概率

了解样本空间对于计算概率至关重要。但有时样本空间可能比我们之前看到的要大。想象一下,你必须在 0 和 9 之间选择一个数字。你有十分之一的可能性。

现在,想象一下,你必须在 0 和 9 之间选择一个数字四次(就像你必须选择一个 pin 来解锁你的电话),并且你不能重复这些数字。在这种情况下,你有 10、9、8 和 7 种可能性。在这种情况下,我们说我们正在做一个排列。

注意,当我们谈论排列时,我们谈论两件事:

  • 我们可以选择的选项数量(数字 0 到 9)。
  • 我们必须填充的位数(4,因为它是一个 4 位数的 pin)。

为了发现概率,我们必须用选项数量的阶乘除以选项数量和位置数量之间的阶乘差。

所以:

10P4 = 10! / (10-4)!

现在,假设你要计算口袋 a 的排列数,我们可以从中选择 2。全套 a 是 4。

4P2 = 4! / (4 — 2)!

组合

对于排列,顺序是一件重要的事情。想象一下 PIN 码的例子:如果你的 PIN 码是 1234,如果你输入 4321,显然是不行的。有了组合,我们就不再有顺序限制了。想象一下,你必须去买一些杂货。是买苹果香蕉葡萄还是葡萄苹果香蕉都不重要。结果会是一样的。

在组合中,我们也试图计算在一个有限的集合中某件事情发生的方式的数量。但是我们不在乎事情发生的顺序。让我们回到食品杂货的例子。假设现在冰箱上有 5 种不同的水果,你必须去掉 3 种。为了解决这个问题,您将计算排列并除以冗余(3 x 2 x 1)。

5C3 = (5! / (5-3)!) / 3!

或者只是:

5C3 = 5P3 / 3!

让我们使用带有 ace 的卡片例子用 Python 来写这些。我们想找到从一副 52 张牌中去掉两张 a 的组合可能性。

从属和独立事件

当一个事件不影响另一个事件的概率时,可以将其归类为独立事件。当你拿了 52 张牌,拿走一张王牌,然后把它放回去,洗牌并拿走另一张牌,我们有两个独立的事件,因为在这两个事件中拿走一张王牌的概率是相同的。

然而,如果你移除一张王牌,然后移除另一张牌*,而没有将王牌放回,那么我们有依赖*事件,因为在第二个事件中移除另一张王牌的概率与第一个事件不同。在第二个例子中,样本空间从 52 变为 51,ace 的数量从 4 减少到 3。

让我们用 Python 来看看这一切:

多个事件

从一副牌中取出 3 张红心牌而不替换的概率是多少?要计算这一点,您需要确定事件的数量(3),然后计算每个事件分别发生的概率。然后,你乘以概率。在我们的例子中,我们有一个 AND 概率(去除心脏和心脏和心脏)。所以:

互斥事件

有时候,两件事不可能同时发生。在这种情况下,我们必须计算多个互斥事件中任何一个的概率,并将它们相加。这是一个或概率(A 或 B 发生)。

假设我们想从 52 张牌中抽一张牌,但第一张牌必须是一张红心或一张梅花。

数据分布

数据分布是一种可视化所有可能的数据值的方法,以查看它们出现的频率。假设我们有一个包含 10,000 个年龄的数据集。为了发现数据分布,让我们绘制一个直方图。

检查橙色线。它有高度和宽度。它也比偏向图表的一边更居中。通过观察这些特征,我们能够猜测可能的分布类型。因为有很多可能的发行版,所以在这里检查其中的一些:

[## 概率分布列表-维基百科

周期为 2 π的 Dirac 梳虽然不是严格意义上的函数,但却是许多方向分布的极限形式。它…

en.wikipedia.org](https://en.wikipedia.org/wiki/List_of_probability_distributions)

百分位数

假设您的数据可以分成 4 个子集。总数据对应 100%,所以每个子集对应 25%的数据。百分位数的概念帮助我们确定数据的给定值落在哪里。关于上面的年龄例子,20 岁在哪里?

正如我们所见,20 岁属于第一百分位。由于我们有一个正态分布,我们的大部分数据落入第二和第三百分位数。

朋友圈

矩是概率密度函数形状的定量度量。事实上,它是帮助您更好地理解数据分布的度量集合。它们是:

  • 平均值(一阶矩)。
  • 方差(二阶矩)。
  • 偏斜(三阶矩)。
  • 峰度(或数据分布的形状)(四阶矩)。

让我们使用 Python 来计算这些值:

协方差和相关性

当数据集中的两个变量有某种关系时,就产生了相关性。协方差是衡量两个变量一起变化的程度。协方差的范围从-1 到 1,其中:

  • -1 表示负面关系。
  • 0 表示没有关系。
  • 1 表示积极的关系。

[## 相关性、因果关系、鲨鱼和冰淇淋

在数据科学世界,你可能已经听过吃咸菜会死人的笑话。为什么?因为每个人…

www.linkedin.com](https://www.linkedin.com/pulse/correlation-causation-sharks-ice-creams-wilame-vallantin/)

让我们看一个 Python 上的相关性示例:

请注意,在第一张图中,数据非常分散。如果我们计算相关系数,我们可以看到它非常接近 0 (0.01)。

现在,跳到第二张图。注意我们可以在这里画一条线。还观察到系数现在更接近-1(-0.6)。

相关性是机器学习中一个非常重要的概念。它可以帮助我们在数据集上找到重要的数据关联。

5 分钟内为数据科学家提供统计数据

原文:https://towardsdatascience.com/statistics-for-data-scientists-f2456d26c5a5?source=collection_archive---------10-----------------------

事实是顽固的东西,但统计数字是柔韧的。―马克·吐温

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

Photo by Mike Kononov on Unsplash

总体参数与样本统计

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

研究者的目标不是得出关于样本的结论,而是从提供的样本中得出关于总体的结论。因此,研究人员必须使用样本的统计数据来推断人口中的数值。总体中的这些值称为参数。参数是整个总体的未知特征,如总体均值和中位数。样本统计描述了作为样本的一部分人口的特征。样本均值和中位数是固定的和已知的。

抽样误差

假设,我有 3000 人去公园散步。我可以得到他们的平均体重和人口平均值,这是平均身高的精确表示。实际上,计算真实平均值并不是每次都可行。因此,我们将从 3000 总人口中抽取一部分,即 1000 人。如果样本是随机选择的,而不是观察到的,那么期望均值与真实均值相似。然而,由于它是一个随机样本,平均值可能与真实平均值不同。样本均值和真实均值之间的差异称为抽样误差。

标准误差

指的是所有均值的标准差。它显示了一组样本的平均值之间的差异。

假设,我们想观察 3 天内有多少销售额。通过计算每天的销售额,我们可以得到平均销售额。然而,有许多外部因素影响销售,如折扣、假期等。因此,我们不是取一天的平均值,而是取三天的平均值。

平均值的标准误差现在是指每次不同观察的平均值的变化。

如果我们测量一个数据集的多个样本,均值将不会相同,并且会扩散。样本的标准差是样本平均值的标准偏差,它为我们提供了一个衡量分布的标准。

置信区间和置信水平

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

“根据一项调查,在 96%的置信度下,果园中的橙子重量在(132-139 克)之间”。

(132–139 GM)是置信区间。这是一个真正的价值所在的价值范围。CI 用于表示我们确定总体参数所在的范围。每当我们想表达一个总体参数的估计时,最好是说明它的置信区间。CI 的宽度告诉我们许多关于从收集的样本中得到的总体的确定性。当你不太了解总体的行为时,你需要使用 t 分布来寻找置信区间。

96%的置信水平意味着,如果在相同的条件下一次又一次地重复调查或民意测验,调查的结果将在 96%的时间里与实际人口的结果相匹配。
影响置信区间(CI)的两个因素是变异和样本量:-
变异:如果总体中的所有值都相似,那么样本的变异很小。人口中的每一个样本都是相似的。

  • 低变异导致相似样本导致窄 CI
  • 高变化导致样本变化导致CI 变宽

样本量:如果我们取小样本,我们没有任何发现可以作为我们推断的基础。小样本彼此不同,细节较少,导致 CI 较宽

  • 大样本尺寸导致更多细节导致CI 狭窄
  • 小样本尺寸导致细节较少导致CI 较宽

误差幅度

调查是基于从样本中收集的事实,而不是整个人口。当我们不得不根据样本推断真实的统计数据时,一定会出现一些误差,比如抽样误差,这是因为没有考虑到每个人。误差幅度用来衡量样本结果与实际总体结果的最大差异。它衡量的是准确性,而不是偏差量。
误差幅度=临界值标准误差*

例证:我们知道 49%的人会在选举中投票给迪克斯,信任度为+/-2。这意味着我有信心 47%(49%-2%)到 51%(49%+2%)的人会投她的票。

假设检验

主要目的是测试调查和投票的结果,以检查结果是否有意义和可重复,而不是随机的。这是我们是否可以接受或拒绝一个索赔使用统计数据。它检验了关于人口的两种说法。例:治头疼的药不会有效,还是男女生身高有差异?一般语句的形式是“If(对自变量这样),then(对因变量也会这样)”。

无效假设和替代假设

零假设(H0),通常是样本观察结果纯属偶然的假设。这是众所周知的事实。研究人员努力拒绝它。这个想法是没有关系,无论是反映在采样误差的结果。它认为在一组给定的观察值中不存在统计学意义。分析或统计程序的 功效 是指当零假设 H0 实际上为假时,它能够显示该假设为假。

另一个假设(H1 或哈),是样本观察值受一些非随机原因影响的假设。这个想法是样本中的关系反映了总体中的关系。例子:
H0:地球是平的。人口与医管局有一定的关系。
替代假设:地球是圆的

第一类和第二类错误

I 型错误表示拒绝真零假设,接受备选假设。这是一个假阳性。没有烟雾时探测烟雾的烟雾探测器。
第二类错误是指当替代假设为真时接受零假设。这是一个假阴性。当火警未能探测到火灾时。

阿尔法和贝塔水平

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

z indicates the alpha level in a two-tailed test

α水平也称为显著性水平,α。它是作出错误决定的概率,即当假设为真时拒绝零假设。低α水平意味着我们需要强有力的证据来拒绝零假设。这意味着 1%的阿尔法水平需要比 5%更多的统计证据。

为什么这么普遍地用 5%作为显著性水平? α水平越小,拒绝真零假设的机会就越小。而且,由于面积很小,拒绝虚假零假设的机会也就越小。你越是试图避免第一类错误,你就越有可能犯第二类错误。

一个置信水平是 1- α,这意味着当它为真时接受零假设。

β水平表示犯 II 型错误的概率,即当替代假设为真时拒绝该假设。

p 值

所有假设检验都使用它来检查总体以数据形式提供的证据的强度。这是反对零假设的证据。该值介于 0 和 1 之间:

较小的 p 值(≤ 0.05)表明有强有力的证据反对零假设,因此您拒绝零假设。这意味着样本结果与为真的零假设不一致。

大的 p 值(> 0.05)表明反对零假设的证据很弱,因此您无法拒绝零假设。这意味着样本结果与为真的零假设一致。

如果 p 值小于或等于α水平,我们拒绝零假设。

如果你想了解峰度 ,点击这里。

如果你想获得一个 机器学习入门 ,点击这里。

感谢阅读! 这里也可以给支持:https😕/buymeacoffee.com/divadugar

为赶时间的人统计

原文:https://towardsdatascience.com/statistics-for-people-in-a-hurry-a9613c0ed0b?source=collection_archive---------2-----------------------

Here’s the audio version of the article, read for you by the author.

曾经希望有人能告诉你什么是统计学的以及术语用简单的英语是什么意思吗?让我试着帮你实现这个愿望吧!我将在 8 分钟内快速浏览统计学中所有最重要的观点!或者只有 1 分钟,如果你坚持使用大字体的话。

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

什么是 统计 ?这是任何使我们的数据变得混乱的老方法。没错。100%技术上正确的定义。现在我们来看看统计的学科是什么都是关于的。

统计学是改变你想法的科学。

根据事实做决定( 参数 )已经够难的了,但是——诅咒!-有时我们甚至没有我们需要的事实。相反,我们所知道的(我们的 样本 )和我们希望我们知道的(我们的 人口 )是不同的。有 不确定性 就是这个意思。

统计学 是在不确定的情况下改变自己想法的科学。你的想法是什么?一个 默认动作 或者一个 先验信念 。如果你的大脑是一张白纸呢?把这个改为

Bayesians 人改变了他们对信仰的看法。

贝叶斯统计是处理整合数据以更新你的信念的思想流派。贝叶斯主义者喜欢用可信区间(两个数字被解释为“我相信答案在这里和这里之间”)来报告结果。

常客改变他们对行动的想法。

频繁主义者统计学处理改变你对行动的想法。你不需要有一个信念来拥有一个 默认动作如果你不分析任何数据,这只是你承诺要做的事情。Frequentist(也称为经典)统计是您在野外和 STAT101 类中更可能遇到的一种统计,所以在本文的其余部分,让我们保持经典。

假设是对世界可能是什么样子的描述。

无效假设 描述了所有的世界,在那里做默认动作是一个快乐的选择; 替代假设 是所有其他世界。如果我用数据说服你!-那你不是生活在零假设的世界里,那么你最好改变你的想法,采取替代行动**。**

例如:“我们可以一起步行去上课(默认动作),如果你通常花不到 15 分钟做好准备(无效假设,但是如果证据(数据)表明时间更长(替代假设,你可以自己步行,因为我要离开这里(替代动作)。”

简而言之,测试:“我们的证据让零假设看起来可笑吗?”

所有的 假设检验 都是在问:我们的证据让零假设看起来可笑吗? 拒绝零假设 意味着我们学到了一些东西,我们应该改变我们的想法。不拒绝 null 的意思是 我们没学到什么有趣的 ,就像去树林里远足,没有看到人类并不能证明这个星球上没有人类。这只意味着我们没有学到任何关于人类存在的有趣的东西。学不到东西让你难过吗?不应该,因为你有一个可爱的保险政策:你确切地知道该采取什么行动。如果你什么也没学到,你没有理由改变主意,所以继续做默认动作

那么,我们如何知道我们是否学到了一些有趣的东西……一些与我们想要继续做默认动作的世界不一致的东西呢?为了得到答案,我们可以看看一个 p 值或者一个置信区间。

p 值在元素周期表上:这是令人惊讶的元素。

p 值 表示,“如果我生活在一个我应该采取默认行动的世界,我的证据有多令人惊讶?” p 值越低,数据越是在大喊“哇,这太令人惊讶了,也许你应该改变主意了!”

为了执行测试,将该 p 值与称为 显著性水平 的阈值进行比较。这是一个旋钮,你可以用它来控制你愿意承受多大的风险。这是你愚蠢地离开你舒适的默认行为的最大可能性。如果您将显著性级别设置为 0,这意味着您拒绝错误地保留默认值。放下笔。不要分析任何数据,只采取你的默认动作。(但这意味着你可能会愚蠢地没有留下一个糟糕的默认操作。)

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

How to use p-values to get the outcome of your hypothesis test. (No one will suspect that my xkcd is a knockoff.)

一个 置信区间 简单来说就是一种报告假设检验结果的方式。要使用它,检查它是否与你的零假设重叠。如果确实有重叠,那就什么也别学。如果没有,那就改变你的想法。

只有当置信区间不与你的零假设重叠时,才改变你的想法。

虽然置信区间的技术含义有点奇怪(我将在未来的帖子中告诉你所有关于它的内容,它肯定不像我们之前遇到的可信区间那样简单,希望也不会使它如此),但它也有两个有用的属性,分析师认为这有助于描述他们的数据:(1)最佳猜测总是在那里,(2)当有更多数据时,它会变得更窄。请注意,它和 p 值都不是用来谈论的,所以不要期待简洁的定义。它们只是总结测试结果的方法。(如果你上了一堂课,发现这些定义不可能记住,这就是原因。代表统计:不是你,是我。)

有什么意义?如果你按照我刚刚描述的方式进行测试,数学保证你犯错误的风险被限制在你选择的显著性水平(这就是为什么你选择它很重要……数学保证你选择的风险设置,如果你不费心去选择它们,这是毫无意义的)。

数学就是建立一个零假设宇宙的玩具模型。这就是获得 p 值的方法。

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

The math is all about making and examining toy universes (how cool is that, fellow megalomaniacs!? So cool!) to see how likely they are to spawn datasets like yours. If your toy model of the null hypothesis universe is unlikely to give you data like the data you got from the real world, your p-value will be low and you’ll end up rejecting the null hypothesis… change your mind!

那些疯狂的公式、概率和分布是怎么回事?它们允许我们表达管理零假设宇宙的规则,这样我们就可以弄清楚那个宇宙是否是那种会吐出与你在现实生活中得到的数据相似的数据的地方。如果不是,你就大喊:“荒谬!砍掉它的头!”如果是的话,你耸耸肩,什么也没学到。在以后的文章中会有更多的介绍。现在,只要把数学想象成为我们建造小玩具世界,这样我们就可以看看我们的数据集在其中是否看起来合理。p 值和置信区间是为你总结所有这些的方法,所以你不需要眯着眼睛看冗长的宇宙描述。它们是终局:用它们来决定是否离开你的默认动作。任务完成。

我们做作业了吗?这就是权力衡量的标准。

等等,我们是否做了功课,以确保我们确实收集了足够的证据,给自己一个改变主意的公平机会?这就是的概念力量的度量。找不到任何改变想法的证据真的很容易…只是不要去找。你的权力越大,你就有越多的机会改变你的想法,如果这是正确的事情。权力是正确离开你的默认动作的概率。****

当我们什么也没学到,继续做我们正在做的事情时,如果我们的过程充满力量,我们会感觉更好。至少我们做了功课。如果我们几乎没有任何力量,我们很清楚我们不会改变主意。还不如不去分析数据。

在开始之前,使用功效分析检查您是否预算了足够的数据。

功耗分析 是一种检查给定数据量的预期功耗的方法。在开始之前,你用它来计划你的学习。(也挺容易的;在以后的文章中,我会向你展示循环只需要几个。*)*

不确定性意味着你可能会得出错误的结论,即使你有世界上最好的数学。

什么不是统计学?神奇的魔法,让不确定变得确定。没有魔法能做到这一点。你仍然会犯错。说到错误,这里有两个你在 Frequentist 统计中可能犯的错误。(贝叶斯人不会犯错。开玩笑!嗯,算是吧。请继续关注我的贝叶斯帖子。)

I 型错误 是愚蠢地离开你的默认动作。嘿,你说你对那个默认动作很满意,现在由于你所有的计算,你离开了它。哎哟! 第二类错误 是愚蠢地不离开你的默认动作。(我们统计学家在给东西命名时很有创造力。猜猜哪个错误更严重。I 型?没错。太有创意了。)

第一类错误是在不该改变主意的时候改变主意。

第二类错误是在你应该改变主意的时候没有改变。

第一类错误就像判一个无辜的人有罪,而第二类错误就像没能判一个有罪的人有罪。这两个错误概率是平衡的(更容易给有罪的人定罪也更容易给无辜的人定罪),除非你得到更多的证据(数据!),在这种情况下,两种错误都变得不太可能,一切都变得更好。这就是为什么统计学家希望你有更多更多的 MOAR 数据!当你有更多的数据时,一切都会变得更好。

更多的数据意味着更多的保护来避免得出错误的结论。

什么是 多重比较校正 ?如果你知道你打算问同一个数据集的多个问题,你必须用一种不同的、调整过的方式来做你的测试。如果你一次又一次地让无辜的嫌疑人接受审判(如果你一直在你的数据中钓鱼),最终某件事会因为随机事故而看起来有罪。 统计意义上的 这个词并不是指宇宙眼中发生的重要事情。这仅仅意味着我们改变了主意。也许不正确。诅咒这种不确定性!

不要浪费时间严谨地回答错误的问题。智能地应用统计数据(仅在需要时)。

什么是III 型错误 ?这有点像统计学上的笑话:它指的是正确地拒绝错误的零假设。换句话说,用所有正确的数学方法来回答错误的问题。

决策智能中可以找到解决提问和回答错误问题的方法,这是一门新学科,旨在应用数据科学来解决业务问题并做出正确的决策。通过掌握决策智能,你将增强对第三类错误和无用分析的免疫力。

总之,统计学是改变你想法的科学。有两种思想流派。更受欢迎的一个——Frequentist statistics——是关于检查你是否应该离开你的默认动作。贝叶斯统计就是要有一个先验的观点,并用数据更新这个观点。如果在开始之前你的大脑真的一片空白,看看你的数据,跟着感觉走。

感谢阅读!YouTube 课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。

统计异常困难:WTF 是激活函数

原文:https://towardsdatascience.com/statistics-is-freaking-hard-wtf-is-activation-function-df8342cdf292?source=collection_archive---------4-----------------------

和任何事情一样,我不是在描述任何独特的事情。有很多人比我更了解这个话题。这个故事是写给我脑海中的另一个人的😬。我确实经常和他聊天,他突然表达了对统计学和机器学习的兴趣。

那么,什么是激活功能呢?神经网络中的神经元松散地模仿我们的大脑神经元。啊!现在,我明白为什么它的名字是一样的了。我们大脑中的神经元会根据输入信息来激发,这不知何故让我们变得聪明!!!神经网络神经元中的激活函数是决定神经元是否应该触发以及以何种强度触发的函数。

让我们来看看不同的常用激活函数及其特性。

这是神经元的样子

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

Neuron

激活函数的输入值将在-∞和∞之间

步进功能

阶跃函数由阈值定义。
如果输入值大于阈值,则输出为 1,否则为 0。

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

step function

是因为长得像台阶才叫台阶函数的吗?听起来比说基于阈值的函数更酷。

缺点是非常二进制。它会丢失输入值中的任何梯度知识。阈值的 10000000 倍对阈值具有相同的影响。此外,忽略任何低于阈值的输入值。

另外,考虑一个你正在开发分类器的例子。如果多个神经元触发,我们如何确定选择哪一个?所有放电神经元的值都是 1。

线性函数

函数是 y = cx。

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

linear function

这样做的一个好处是,在分类器的情况下,你现在可以决定选择哪个神经元。

缺点是你建立了多层神经元,每一层都是线性的,然后它们组合在一起形成一个更大的线性函数。因此,这些额外的层不提供任何价值。

Sigmoid 函数

y = 1 / 1 + e⁻ˣ

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

sigmoid function

这是更平滑和非线性的特征。这没有线性函数的缺点。另一个优点是该值介于 0 和 1 之间。

缺点是在更高的值上梯度知识消失。这就是所谓的消失梯度问题。

Tanh 函数

y = tanh(x)

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

tanh function

这非常类似于 sigmoid 函数。tanh 的梯度比 sigmoid 更陡。tanh 也有渐变消失的问题。

ReLu 函数

y =最大值(0,x)

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

ReLu function

这是非线性的,所以它没有线性函数的缺点。ReLu 的一个优点是激发的神经元数量较少。

从计算的角度来看,这是比较便宜的。

依我拙见,你可以根据你喜欢的特征选择任何激活函数。您可以组合这些功能,甚至调整上述基本激活功能,以获得您想要的特性。

统计学非常难:WTF 是时间序列——第一部分

原文:https://towardsdatascience.com/statistics-is-freaking-hard-wtf-is-time-series-part-1-22a44300c64b?source=collection_archive---------5-----------------------

我是一个记忆力和数学能力都很差的人。我不明白,到目前为止,我是如何在编程世界中生存下来的。Stackoverflow.com,我欠你 80%的工资。

尽管有种种限制,我还是接受了学习更多技能的挑战……跳舞。我忘了说我也是手眼协调有问题的人。但幸运的是,我足够理智,不会分享我学跳舞的经历。

但在系列帖子(更多的是独白)中,我计划揭露我在学习统计学和机器学习方面的斗争。

在目前的帖子里,我打算通过我对时间序列分析的理解来谈谈。与任何统计话题一样,它不可能在一篇文章中全面地重复。所以警告是苦难将会继续…

假设我们有不同时间实例的销售数据:T₀、T₁、T₂、T₃…Tn。

让我们考虑最简单的模型来预测任何时间实例 T 中的值。任何时间实例 T 的预测值是所有观察值的平均值。

这种模型可以满足不感兴趣的数据,其中数据围绕一个值波动。

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

观察值用黑色表示,预测值用红色表示。

在本例中,该值在 20 左右波动。扁平线是所有观察值的平均值。

如果数据是线性的(但本质上不是平坦的),这种方法就不起作用。

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

观察值用黑色表示。预测值显示为红色。观察值似乎具有线性模式,但预测值遵循平坦的平均线

我们能做些什么来改进我们的模型?因此,预测值不是所有值的平均值,而是将预测值改为目前为止观察值的平均值。在这种情况下,下一个时间实例 n+1 的预测值是迄今为止所有 n 观测值的平均值。

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

观察值用黑色表示,预测值用红色表示。
预测值落后于观测值。它肯定比以前的型号更好。

思考这个模型的一种方式是,平均值对所有过去的观察值进行同等加权。所有观察值被赋予 1/n 的相等权重,以预测我们在下一个时间实例 n+1 的值。

Tn+1 =(1/n)T0+(1/n)T1+(1/n)T2…+(1/n)Tn

由于预测只考虑了以前的观察或预测,所以让我们添加一些误差来减少滞后。

Tn+1 =(1/n)T0+(1/n)T1+(1/n)T2…+(1/n)Tn+误差常数

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

观察值用黑色表示。先前的预测值以红色显示。添加常数后的当前预测值显示为绿色。

增加误差常数肯定会使预测值看起来更好。

似乎统计建模喜欢在矩阵运算中定义事物。那么,让我们试着在矩阵运算中用公式表示同样的方程。

w 是重量矢量。w 是 1×n 矩阵。
T 是时间实例值的逆向量。t 是 n×1 矩阵。

因此,Tn+1 = W×T

因此,对于上面的平均建模观点,
w =[(1/n)(1/n)……(1/n)]
t⁻=[t0 t1…TN]

需要记住的一点是,我们对每个过去的值都给予了同等的重视。很远的时间值与接近当前时间的值对预测下一个实例值具有相同的影响,这感觉是不正确的。在下一部分中,我们将研究平滑模型,在这种模型中,我们根据以前的值在多远的时间内发生,为它们赋予可变的权重。

谢谢你陪着我。苦难将会继续…在下一篇帖子中。

统计学非常难:WTF 是时间序列——第三部分

原文:https://towardsdatascience.com/statistics-is-freaking-hard-wtf-is-time-series-part-3-5ffdf77c52fb?source=collection_archive---------9-----------------------

在这一部分,我将尝试解释指数平滑的一些基本概念。因此,在我们深入研究之前,让我们试着理解我们的指数平滑之旅。

第 1 部分中,我们从一个非常简单的模型开始,在这个模型中,我们给所有先前的观察值赋予了相等的权重,这基本上是所有先前观察值的平均值。这意味着所有先前的观察结果同等地影响下一个预测值。

第二部分中,我们转到了另一个极端,我们认为只有 n 先前的观察同样影响下一个结果。我们可以进一步将模型移动到极限,其中最后一个值是预测的下一个值,即 n = 1

让我们试着考虑一个中间地带,与早期的观察相比,后期的观察会产生指数级的影响。这就是指数平滑发挥作用的地方。在这一部分,我们将讨论简单指数平滑,也称为单指数平滑。

简单指数平滑的方程为:
Sn+1 = 𝛼Yn + (1-𝛼)Sn
其中,
sn→nᵗʰ实例预测值,
yn→nᵗʰ实例实际观测值
sn+1→n+1ᵗʰ实例预测值
𝛼 →平滑参数(0 ≤ 𝛼 ≤ 1)

现在,这个方程似乎不是指数的。让我们展开这个等式,试图理解它的指数性质
sn+1 = 𝛼yn+(1-𝛼)sn
sn+1 = 𝛼yn+(1-𝛼)(𝛼yn-1+(1-𝛼)sn-1)→展开 sn
sn+1 = 𝛼yn+𝛼(1-𝛼)yn-1+(1-𝛼)sn-1
sn+1 = yn+yn-1+(1-1)…+ 𝛼(1-𝛼)ⁿY1

现在,你可以看到这个等式的指数性质。权重基本是几何级数。相信我,所有重量的总和是 1。权重值呈指数减少,因此呈指数平滑。

介于 0 和 1 之间的𝛼值决定了如何抑制影响。当𝛼越接近 1 时,阻尼越快。当𝛼越接近 0 时,阻尼越慢。

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

Simple Exponential Smoothing

观察值显示为绿色。预测值用紫色表示。如你所见,简单的指数平滑法比之前文章中的模型预测得更好。

也许在下一篇文章中,我会提到双倍和三倍指数平滑。

统计学:数据的收集、分析和推断(上)

原文:https://towardsdatascience.com/statistics-the-collection-analysis-and-inference-of-data-part-i-b733f5eb1ac6?source=collection_archive---------13-----------------------

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

统计学的定义

统计数字是以某种有意义的方式总结原始事实和数字的数字。他们提出了一些关键的想法,这些想法仅仅通过查看原始数据可能不会立即显现出来,我们所说的数据是指我们可以从中得出结论的事实或数字。

为什么要学统计学?

要做出客观的决定,做出看似鼓舞人心的准确预测,并尽可能以最有效的方式传达你想要的信息。这是总结数据关键事实的一种便捷方式。对统计学有很好的理解会使你处于有利地位。当统计数据不准确或具有误导性时,你更容易判断出来。换句话说,学习统计学是确保你不被愚弄的好方法。

处理数据:分类与数字

当您处理数据时,您需要弄清楚的一个关键问题是您正在处理哪种数据。一旦你明白了这一点,你会发现对你的数据作出关键决策会更容易。

  • 分类或定性数据被分成描述质量或特征的类别。定性数据的一个例子是游戏类型;每个流派形成一个独立的类别。
  • 数值型或定量型数据则与数字相反。数据中的值具有数字的含义,这涉及到测量或计数。数值型数据又称为定量型数据,因为它描述的是数量。

测量中心趋势

有时候你只需要抓住事情的核心。在一大堆数字中很难看出模式和趋势,找到平均值通常是看到更大画面的第一步。有了平均值,您将能够快速找到数据中最具代表性的值,并得出重要的结论。

平均值

很可能你以前被要求算出平均值。求一串数的平均值的一种方法是把所有的数加在一起,然后除以有多少个数。

在统计学中,这叫做 意思是 。它由以下等式表示:

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

模糊含义的情况

让我们考虑一个简单的例子。假设我们计算了所有员工的平均工资,以及工资比其他员工高得多的首席执行官的平均工资。平均值会受到首席执行官工资的影响,因此我们无法推断给定群体的正确信息。在这里,首席执行官的工资被称为 离群值。当数据集中出现异常值时,均值会向异常值移动,从而给我们错误的信息。

当我们绘制包含异常值的数据时,它要么向左倾斜,要么向右倾斜,如下所示:

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

中位数

如果平均值因为数据失真和异常值而变得有误导性,那么我们需要一些其他的方法来说明什么是典型值。我们可以通过取中间值做到这一点。这是一种不同的平均值,它被称为中值。让我们考虑一组中位数待定的数字。

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

*如果你有一组偶数,就取中间两个数的**平均值。*在这种情况下,中值计算为 20.5。

方式

在某些情况下,中位数不能给出正确的数据解释。假设中间值(在奇数个数据集的情况下)或两个中间值的平均值(在偶数个数据集的情况下)可能甚至不接近该组中的其余数据点。在这种情况下,就引入了 模式 的概念。

一组数据的众数是最受欢迎的值,出现频率最高的值。与平均值和中值不同,绝对模式是数据集中的一个值,并且是最常见的值。

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

该模式不仅适用于数字数据;它也适用于分类数据。事实上,只有这种平均值才能处理分类数据。当您处理分类数据时,模式是最常出现的类别。

以上三种方法是统计分析数据的基本方法。在我即将发布的帖子中,我还会涉及更多的话题。所以,在那之前请继续关注!

保持饥饿,保持愚蠢——深入了解 StackOverflow 2018 年调查

原文:https://towardsdatascience.com/stay-hunger-stay-foolish-deep-dive-in-stackoverflow-2018-survey-e542b733e1f6?source=collection_archive---------14-----------------------

介绍

根据今年年初的 StackOverflow 调查,在 98,855 名开发人员中,有 11,971 人认为自己是数据科学专业人员。到目前为止,大约 65%的人对自己的职业感到满意,比开发人员社区高出 10%。作为一名 ML 人员,我对发现哪些技术将成为数据科学社区的趋势以及挖掘使数据科学专业人员对其职业满意的因素很感兴趣。

关于数据集

  • 中位数工资约为 6.8 万英镑,平均工资为 11.5 万英镑
  • 其中 75%是白人
  • 其中 41%拥有高等学位(不限于计算机科学)
  • 大约 50%的人拥有计算机科学学士学位
  • 其中只有 6%是女性
  • 他们中的一半大约在 25-34 岁之间

假设

  • Stack overflow 的数据是数据科学家群体的代表
  • 所有列出的薪水都是以美元计算的(有关他们如何将受访者使用的当地货币转换为美元的信息,请参见他们的方法)
  • 全职/兼职员工的抽样调查对象
  • 本分析考虑了答卷人数超过 100 人的国家
  • 数据科学家/数据分析师/业务分析师等开发类型被视为数据科学专业人员

目标

总体目标是深入了解数据科学家的职业生涯。特别关注影响数据科学家职业满意度的因素以及数据科学家使用的工具。我通过 4 个问题来实现总体目标:

  1. 他们熟悉哪种语言、数据库或框架,他们正在寻找的另一个软件堆栈是什么?Python 和 R 无疑是数据科学社区的流行语言。然而,随着大数据成为一种新型的企业资产,数据科学专业人员可能必须更加熟悉 Scala 等其他语言,并开始从事并行编程工作。
  2. 他们的简介是什么样的?学历影响职业满意度吗?数据科学专业人员位于何处,位置如何影响?
  3. “权力越大,责任越大”的观念是否让他们对自己的工作感到满意?换句话说,当专业人士成为任何数据的关键人物时,职业满意度是什么样的?
  4. 工作环境或薪酬如何推动职业满意度?有太多的故事表明数据科学是 21 世纪最性感的工作,作为一名数据科学家,你可以赚很多钱,这看起来绝对是一份理想的工作。金钱真的是职业满意度的重中之重吗?

分析和总结

Q1 —首先,Python 是数据科学专业人士的通用语言。其次,由于非结构化数据的增加,数据科学专业人员热衷于学习非 SQL 数据库中的技术,如 Elasticsearch。最后,与前端和深度学习相关的框架,这可能表明数据科学界对探索黑盒更感兴趣。

在本节中,如果我们只查看每一栏中的整体技术,那么我们将忽略一些关系,例如最想使用并且与合作过的技术,或者最想使用但是没有与合作过的技术。所以我以的形式对比了数据科学专业人士现在和明年在做的技术,这样我们就能找到两个问题的区别和交集。

编程语言图表摘要

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

  • Python、SQL、Javascript 在当前的数据科学专业人士中很流行,这种编程语言的需求也是存在的。

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

  • Go 是一种数据科学专业人员还没有机会接触但却很想探索的语言。
  • 不管数据科学专业人员是否使用过 Python 语言,python 都很受欢迎。

数据库图表摘要

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

  • 通过比较这些图,可以发现从 SQL 数据库到非 SQL 数据库的转变。
  • 由于文本挖掘的需求,弹性搜索变得越来越流行

框架图概要

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

  • 有趣的是,我们发现想要学习 pyTorch 的数据科学专业人士的数量正在增加。
  • 数据科学专业更倾向于在前端深度学习中学习框架。这是一个有趣的趋势,因为前端与可视化更相关。我想知道这些专业人士是否希望解耦黑盒算法。这也导致了一个结论,即数据科学专业人员希望学会以简单而有意义的方式交流和展示研究结果)

Q2:目前为止,非计算机科学相关专业(工程、社会科学)的博士对自己的职业不太满意;基于 x 检验的结果,国家可以被认为是影响职业满意度的因素之一。

教育类型

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

crosstab between education type and undergraduate major for the difference of career statisfication ratio

上表显示了各组之间的比率差异(满意与不满意),除了统计学和自然科学背景之外,拥有非计算机科学本科专业博士学位的专业人士对他们的状况不太满意。另一方面,到目前为止,拥有硕士学位的计算机科学专业的受访者对他们的职业不太满意。更好地了解他们对工作不满意的原因。我想调查他们未来工作的下一步是什么。

地理

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

The darker the color means that more data science professionals are more satisfied with their career.

北美和北欧国家的数据科学专业人员似乎比其他国家多,约占调查受访者的 12%。(比率按国家标准化。)如地理图表所示,我们可以发现大多数国家的数据科学专业人员普遍对自己的职业感到满意。

最后,X 值为 311.13,p 值低于 0.05,因此,我会发现这是一个令人信服的证据,表明国家和职业满意度之间可能存在关系。

Q3 —通过实施网络分析法,可视化了职称之间的共现关系。结果显示,数据科学专业人士认为自己平均属于四种不同的工作类型。程度中心性和接近中心性是解释受访者日常任务的指标。

通过计算共生矩阵来创建网络。我们可以看到职称之间的加权优势。出现矩阵在自然语言处理中被广泛应用于单词表示。步骤如下:首先我们要清洗数据,考虑每个标题都是一个单词。其次,我们计算回答者的标题出现的次数。最后,我们通过乘以它的转置矩阵来计算共生矩阵。最后,我们将对角元素设置为零,因此网络中没有自循环

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

Co-occurrence network between job titles

上图是用网络分析软件 Gephi 应用网络分析探究职称关系的结果。度中心性和接近中心性是这里衡量的两个关键因素。通常,这两个因素用于衡量信息在网络中的共享程度。度中心性用于衡量职位如何连接在一起,而接近中心性一个节点越中心,它与所有其他节点的同现度就越低。再者,后端开发人员前端开发人员数据或业务分析师数据科学家或 ML 专员等职位联系紧密,是学历较高的职位。另一方面,市场营销或销售专业人员具有最高的亲密度中心性,这表明这在数据科学专业人员中并不常见。与后端开发人员数据科学家或 ML 专家头衔相关的更多细节见解将相应介绍。

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

Backend Developer

如上图所示,后端开发人员与数据或业务分析师的同现性更强。我认为他们的日常工作更多的是商业情报工作。我感到惊讶的是,数据分析师之间的权重比全栈开发人员之间的权重更大。虽然这里的权重可能是数据分析师认为自己是后端开发人员,或者相反,但权重仍然提供了大多数数据科学专业人员是跨职能的见解。

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

Data Scientist or Machine Learning Specialist

如上图所示,数据科学家或机器学习专家与后端工程师的同现度略强。然而,它几乎与每个标题都有联系。为了更好地理解,我们可以研究一下调查对象中头衔数量的分布。

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

如上图所示,职称的平均值介于 4 和 5 之间,中位数为 4。换句话说,大多数数据科学专业人员都认为自己是多重角色。可能是不同类型的开发人员或分析师。t 检验的结果表明 p 值接近于 0,从而拒绝了等均值的零假设。因此,头衔的数量也应该被认为是影响职业满意度的一个因素。

Q4——正在使用与工作环境和薪酬相关的功能对决策树模型进行训练。结果表明,公司的技术等级比其他因素更重要。然而,很难说这是最重要的问题,因为开发人员档案还没有包含在模型中

本节将使用决策树模型构建一个决策树模型,通过与工作环境和薪酬相关的特征来评估实现职业满意度的关键路径。

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

根据我们的模型,第一标准是技术评级,然后是工资。有趣的是,当工资低于 97217.5%时,受访者更关心基本生活福利,而不是办公环境。然而,上述结果不能作为数据科学专业人士的偏好,因为还有其他因素,如开发人员概况,技术不包括在该模式中。该模型可用于评估工作福利工作评估问卷的结果

正如你所看到的,数据科学家或机器学习专家拥有内向、外向、理性和情感技能的良好组合。更重要的是,数据科学是一个不断变化的领域。虽然基础知识——如数学背景或您必须使用的语言(Python、SQL、R、bash)——被认为是常青树知识,但新的方法、工具、技巧和解决方案每年都会出现。因此,如果你想找一份数据科学家的工作,学习是你必须享受的第一件事。

远离端到端深度学习

原文:https://towardsdatascience.com/steering-away-from-end-to-end-deep-learning-d387f55eeb5f?source=collection_archive---------3-----------------------

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

或者混合软件 1.0 和 2.0

在为客户端问题设计攻击策略时,我经常观察到最佳解决方案结合了基于实例编程(机器/深度学习,软件 2.0 )和基于规则编程/基于规则(RB,软件 1.0 )两种风格。我之前的帖子讨论了这两种极端风格之间的拉锯战。

重述一下:给定一堆输入/输出对例子,你需要猜测一个函数 f ,这样对于每一对 f(i) = o 。那么,你是自己编写 f 中的规则还是使用一个从这些输入/输出例子中学习 f 的 ML/DL 算法。或者,更好的是,将它们结合起来以克服其中任何一个的缺点。

有趣的是,对于大多数客户问题,我发现 组合最有效——事实上,人们经常需要设计出创造性的方法来结合这两种风格。你可以有一个断裂的组合,其中 RB 和 ML 组件之间的边界非常明显,或者一个更加密集的组合。交互可以是单向的或双向的。

令人惊讶的是,网上几乎没有关于这种混合编程风格的讨论。因此,这篇文章:我将列出并解释一堆问题的解决方案,所有这些都是这种混合风格的最好解决的。这些应用跨越了各种领域——NLP、视觉和语音,以及强化学习——所有这些都适用于深度学习。

更新: Andrej Karpathy 最近写了一篇文章关于软件 2.0 (程序带实例)将如何吞噬软件 1.0 ( 程序带规则)。相反,这篇文章解释了软件 1.0 和 2.0 将如何很好地结合在一起。

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

AlphaGo 。也许混合学习最著名的例子是 AlphaGo(现在,自我游戏 AlphaGo Zero )。像通常的深度强化学习(RL)方法一样,它学习一个深度网络 N (卷积残差层)来预测每个状态的(我会赢的概率)以及在每个状态下要采取的下一步行动(策略)。现在,我们如何获得目标状态和动作值(~基本事实)来训练每个状态下的网络?这就是有趣的地方。

一种方法是根据从同一网络 NN 的较早快照获得的下一状态的预测来推断 当前状态目标。当试图扩展时,这种方法有许多缺点。相反,AlphaGo Zero 采用了一种混合的方法

为了估计目标,它从当前状态进行一系列模拟(蒙特卡罗树搜索)。这些模拟不是随机的:它们由来自 N 的预测引导,即,在从当前状态开始的树扩展期间,基于 N 的预测贪婪地选择边。构建这棵树让算法能够预见未来(每个 MCTS 1600 次模拟)。最后,使用该树上的局部反向计算来获得当前状态的目标值/动作估计。

简而言之,为了征服围棋,AlphaGo Zero 在核心部分采用了基于神经网络的值和动作预测,与图形探索/动态编程之类的规则精细地交织在一起。注意这里的联轴器是双向 DL < - > MCTS(或者 ML < - > RB)。为什么这样

神经网络需要个例子来学习:基于规则的 MCTS+推理帮助神经网络获得个好的目标值。另一方面,MC 树搜索很容易迷失在巨大的搜索空间中:NN 预测使 MC 搜索集中于更小的一组更高回报的动作和状态。

文/NLP

尽管围绕端到端(e2e)深度学习大肆宣传,但实际上 NLP 解决方案依赖于基于规则的(RB)引擎,该引擎由 ML 引擎提供的结果输入。这种耦合在大多数情况下是单向 ML - > RB(也不像 AlphaGo 那样纠结)。

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

例如,考虑一下将自然语言查询 Q 转换成 SQL 查询 s 的问题。一个常见的解决方案是首先用名词/动词/标记查询 Q…标签,或者使用依存解析器从 Q 中提取中心修饰关系。接下来,我们在 tags/dependency-parse 之上编写一堆 if-then-else 规则,以提取实体、关系并推断 SQL 语句的正确嵌套。这种组合工作得很好,因为解析器公开了一个句子的组成结构,足以让我们编写一堆特别的规则来解决最终目标。

依存句法分析——是自然语言处理中的一个基本问题,用来计算一个句子的成分结构。几个高阶的 NLP 问题(如上图)依赖于一个好的依赖解析器。为了找到给定句子 S 中的中心词和修饰语,必须比较 S中的每一对词,并对这对词进行评分。为了正确评分,你必须理解两个单词在中的上下文,然后给单词评分。给上下文中的成对单词打分是很困难的——我们需要使用一个 ML 引擎从例子中学习分数。

在深度学习中,双 LSTM (+MLP)被用于获得分数。给定评分引擎,外部循环迭代地给几对评分,并挑选出具有最佳评分的依存关系树,例如,使用最小生成树算法。在这里,RB 外环和基于 ML 的评分引擎的组合是断裂,但足以解决问题。

聊天机器人。与人类进行自动化目标驱动对话的关键步骤是定位口语句子中的关键实体。关键问题是序列标记(槽填充),并通过使用 RNNs 从例子中学习来解决。这个肯尼亚支付聊天机器人集合了基于 ML 的槽填充规则,用于检测一些货币提及。另一个最近的例子是 Edina ,一个学习如何对话的社交机器人。与大多数分散的方法不同,Edina 以无缝的方式从 RB 转移到 ML 方法。

本文SQL 查询单词嵌入结合在一起,在数据库中查找不完全匹配(平滑 DB 搜索)。在这里,学习到的嵌入被输入到基于规则的 SQL 语法和执行引擎中。现在,这是 RB 和 ML 方法之间的密集组合,对于解决结构化+非结构化文本领域的搜索至关重要。

形象、言语。

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

预处理原始图像或语音数据包括应用一组已知的滤波器将原始输入编码成特征。一个 ML 引擎发现使用这些特性来合成 f 更容易。例如,图像可以被 ZCA 白化、直方图均衡化以提高对比度、归一化等。本质上,预处理包括应用已知的转换规则,其输出被输入学习引擎。有趣的是,这是 RB - > ML 的一个实例(我们之前看到的 ML - > RB 的反例)。

表格 OCR ,从图像中提取表格结构的问题,例如申请表、收据等。该解决方案通常依次由两个模块组成。使用 ML/DL 可以更好地完成底层的工作(线条、字符边缘、文本边界框检测)。更高级的布局发现可以通过边界框上的一组解析规则来更直接地解决。当然,您可以使用 e2e 学习公式,它以适当的编码格式输出表格布局。然而,我的经验是,数据设置和训练比编写第二部分的规则更麻烦。

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

原始的时间-域语音数据通过计算快速傅立叶变换的变体( FFT )被变换到频率域,随后在馈送到学习引擎之前将频率宁滨到以人为中心的标度(例如梅尔标度/ MFCC )。一些方法摆脱了这种固定层,以实现基于 e2e 深度学习的语音解决方案,但它们几乎不是主流。也许网络发现学习 FFT 方程Mel 系数很难。即便如此,一遍又一遍地学习这些方程也是没有意义的,如果他们最终每次都学到了这些的话。我认为这个问题是一个很好的例子,说明了我们为什么更喜欢一个破碎的 RB+ML 方法,而不是 e2e ML 方法。

表示 。这篇最近的论文使用了一种破碎规则+ ML 的方法来从语音中去除噪声。这是一个有趣的案例研究,它如何结合:(I)使用现有的(RB)语音滤波器和 bark 系数作为特征;(ii)选择一种网络架构,将任务分解为预定义的组件:语音活动检测、噪声估计、减去噪声;(iii)用深度网络实现每个组件,通过跳过连接(ML)进行组合;(iv)允许多任务学习。我发现(ii)特别有趣:尽管它坚持 e2e 学习范式,但是架构选择的反映了我们将如何手动分解问题。

在这篇文章中,我们看到了混合(ML+Rules)学习如何用于解决实际问题的几个例子:它解决了严格规则方法的覆盖限制和严格 ML 方法的缺乏保证。

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

我将以一些关于 e2e 与断裂途径之间紧张的想法来结束我的发言。给定一个复杂的问题,人类很快将其分解为子任务(更容易解决,可以重用众所周知的解决方案)。虽然 e2e 深度学习承诺通过隐藏网络架构内部的分解来使生活变得更容易,但我相信我们有一种倾向,那就是回到我们的(有偏见的)解决方案分解,并使它们显化(也许通过使用一种分裂的方法)。

这导致了基于规则和基于例子的问题解决方式之间的内在矛盾。事实上,像 RNNnoisethis这样的方法,试图通过挑选反映我们预定义的问题分解的架构来将世界聚集在一起,并一次性学习几个任务

我希望这篇文章有助于阐明我们如何从例子中进行混合学习。我会继续在这篇文章中添加其他混合学习的例子。

无激光雷达自动驾驶汽车转向

原文:https://towardsdatascience.com/steering-self-driving-car-without-lidar-a6b0a4d2e2f1?source=collection_archive---------4-----------------------

自动驾驶汽车使用各种技术来检测周围环境,如雷达激光GPS里程计计算机视觉。S 传感器信息用于识别导航路径、障碍物和路标。自动驾驶汽车的控制系统能够分析传感数据,以区分道路上的不同汽车,检测车道线并预测转向角度

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

激光雷达这样的传感器很贵。激光雷达的领先制造商威力登公司以 8000 美元的价格出售其目前用于原型机器人汽车的机械旋转激光雷达设备。有没有可能使用简单的相机图像和其他负担得起的感官数据来让自动驾驶汽车在道路上行驶?

对于行为克隆项目的想法是训练一个深度神经网络来克隆驾驶行为,以预测转向角度。 Udacity 的模拟器用于收集训练数据,也用于测试模型性能。训练数据由来自不同摄像机(中央、左侧和右侧)的一系列图像以及油门、速度、转向角度和制动的相应测量值组成。

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

Udacity Simulator

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

Training image from simulator

对于左边的图像,我们在模拟器上驾驶这辆车后记录了转向角测量值。在模拟器上记录 4 圈的训练数据

每个图像的尺寸为 160×320×3(RGB 图像),进一步用于训练深度神经网络以预测转向角。在我进入模型架构之前,让我给你看一下汽车在模拟器中自动驾驶的视频。

Behavioral Cloning Track Simulation

我使用的 CNN 架构的灵感来自 Nvidia 的架构:

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

数据预处理

使用模拟器 160 x 320 x 3 尺寸(RGB 图像)获得的训练图像,因为模拟器转向角训练期间的大部分时间为零。我不得不在零转向角的情况下随机清除 80%的数据。这是在预测过程中考虑偏差所必需的。并且为了更好的预测,RGB 图像也被裁剪并转换到 HLS 颜色空间。裁剪是必要的,因为它有助于从数据中去除噪声,因为与天空和风景相比,转向角度更依赖于对道路和转弯的感知。不用说,模型在进行数据预处理后表现得更好。

当 lap 向任一方向(左或右)转弯时,即使训练后数据也可能有偏差。为了避免这种情况,cv2。 [flip](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#void flip(InputArray src, OutputArray dst, int flipCode)) 用于扩充数据并生成更多数据集。左右图像用于恢复,转向校正系数为 0.20。

神经网络结构和超参数

在探索了 comma.ai 和 Nvidia 的架构之后,我决定从简单的架构开始。想法是从简单开始,如果需要,增加更多的复杂性。架构与上面张贴的图表相同。应用 5%的下降以避免过度拟合,并且所有层都跟随有 RELU 激活,以便引入非线性。

“MSE”用于计算优化器的损失和“adam”。我发现这个博客真的有助于理解不同的梯度下降优化算法。五个时期用于 20%验证分割的训练。经过五个时期的训练后,我的训练损失大约为 3 %,验证损失大约为 5%。

结论和讨论

虽然这个项目很有挑战性,但最终在模拟器中看到汽车自动驾驶的快乐让我意识到这是值得努力的。仔细收集训练数据很重要。我也不确定这种技术在弱光条件下是否有效。不用说,深度学习,或一类机器学习算法,正显示出巨大的前景,主要是因为它正在取得成果。我相信还有很多不同的技术有待探索,但这是一个很好的开始。

下面是链接到我的 github repo 与 keras 实现上面的代码并写上去。

参考

Udacity 自动驾驶汽车工程师纳米学位。

关于卷积神经网络的 CS231n 课程和安德烈·卡帕西视频讲座

我的 github 回购:https://github.com/linux-devil/behavioral-cloning

英伟达架构

Comma.ai 架构

行为克隆项目

隐写术:将一幅图像隐藏在另一幅图像中

原文:https://towardsdatascience.com/steganography-hiding-an-image-inside-another-77ca66b2acb1?source=collection_archive---------1-----------------------

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

在这个故事中,我们将学习一些图像处理的概念,以及如何将一个图像隐藏在另一个图像文件中。

为了提供一个功能示例,实现了一个 Python来执行本故事结尾提到的过程。

首先我们来了解一下什么是隐写术,数字图像,像素,颜色模型。

什么是隐写术?

隐写术是将一个文件、消息、图像或视频隐藏在另一个文件、消息、图像或视频中的做法。

隐写术比密码学有什么优势?

隐写术相对于单独的密码术的优势在于,预期的秘密消息不会引起对其自身作为审查对象的注意。显而易见的加密信息,无论如何无法破解,都会引起人们的兴趣,而且在加密不合法的国家,这些信息本身可能会被定罪。

换句话说,当我们想要发送秘密信息时,隐写术比密码学更谨慎。另一方面,隐藏的信息更容易提取。

什么是数字图像?

好了,现在我们知道了隐写术的基础知识,让我们学习一些简单的图像处理概念。

在了解如何将一幅图像隐藏在另一幅图像中之前,我们需要了解什么是数字图像。

我们可以将数字图像描述为一组有限的数字值,称为像素。像素是图像中最小的单个元素,包含代表给定颜色在任何特定点的亮度的值。所以我们可以把一幅图像想象成一个包含固定数量的行和列的像素矩阵(或二维数组)。

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

当在此使用“数字图像术语时,我们指的是“光栅图形,它基本上是一种点阵数据结构,代表像素网格,进而可以存储在不同格式的图像文件中。你可以在维基百科网站上阅读更多关于数字图像光栅图形位图的内容。

像素概念和颜色模型

如前所述,像素是图像的最小元素。因此,每个像素都是原始图像的样本。这意味着,更多的样本可以更准确地再现原始图像。每个像素的强度是可变的。在彩色成像系统中,一种颜色通常由三种或四种分量强度表示,如红色、绿色和蓝色,或青色、品红色、黄色和黑色

这里,我们将使用 RGB 颜色模型。可以想象,RGB 颜色模型有 3 个通道,红、绿、蓝。

RGB 颜色模型是一种加色颜色模型,其中红色、绿色和蓝色光以各种方式相加在一起,以再现各种颜色。该型号的名称来自三种加色原色的首字母,即红、绿和蓝。RGB 颜色模型的主要用途是用于电子系统(如电视和计算机)中图像的感测、表示和显示,尽管它也用于传统的摄影

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

因此,图像中的每个像素由 3 个值(红、绿、蓝)组成,这 3 个值是 8 位值(范围是 0–255)。

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

正如我们在上面的图像中看到的,对于每个像素,我们有三个值,可以用二进制代码(计算机语言)来表示。

处理二进制代码时,我们有较高的有效位和较低的有效位,如下图所示。

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

最左边的最高有效位。如果我们改变最左边的位,它将对最终值有很大的影响。例如,如果我们将最左边的位从 1 更改为 0 ( 11111111 更改为 01111111 )它会将十进制值从 255 更改为 127

另一方面,最右边的位是最低有效位。如果我们改变最右边的位,对最终值的影响会更小。例如,如果我们将最左边的位从 1 更改为0(111111111更改为 11111110 )它会将十进制值从 255 更改为 254 。注意,最右边的位在 256 的范围内只改变 1(它表示小于 1%)。

**总结:**每个像素有三个值(RGB),每个 RGB 值都是 8 位(意味着我们可以存储 8 个二进制值),最右边的位不太重要。因此,如果我们改变最右边的位,它将对最终图像有一个小的视觉影响。这是将一幅图像隐藏在另一幅图像中的隐写术密钥。更改一幅图像的较低有效位,并包含另一幅图像的最高有效位。

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

将图像隐藏在另一个图像中

既然我们理解了像素概念和颜色模型,我们就可以讨论将一个图像隐藏到另一个图像中的过程。

在本节中,我们可以找到使用 Python 代码的隐藏和显示过程的一步一步。

隐藏图像:

  1. 要将一个图像隐藏在另一个图像中,被隐藏的图像最多需要与隐藏它的图像大小相同。

2.我们必须创建两个循环来遍历图像的所有行和列(实际上是每个像素)。

3.因此,我们从图像 1 和图像 2 获得 RGB 二进制值:

我们可以使用 __int_to_bin 方法将十进制值转换为二进制值:

4.我们将图像 1 的最高有效位与图像 2 的最高有效位合并:

使用 __merge_rgb 方法:

请注意, __merge_rgb 函数使用每幅图像的 4 个最高有效位,但也可以改变。请记住,使用隐藏图像中较少的位会导致恢复图像的质量较低。

5.最后,我们将新的二进制值转换为十进制值:

使用 __bin_to_int 方法:

并将其设置为结果图像中的新像素位置。

现在我们有了一个隐藏在另一个图像中的图像。

整个合并的方法可以在这里找到

露出一个形象:

  1. 要显示一幅图像,我们必须知道用了多少位来隐藏图像。在这种情况下,我们使用固定数量的 4 位。
  2. 首先,我们需要创建两个循环来遍历图像中的所有像素:

3.因此,我们从当前像素中提取每个 RGB 通道作为二进制值:

使用 __int_to_bin 方法:

4.然后,我们创建一个新的 RGB 值,只将当前像素最右边的 4 位与零值连接起来(以创建一个新的 8 位值):

5.最后,我们将二进制值转换为十进制值,并将其设置为新图像中的当前像素:

6.当隐藏的图像小于隐藏它的图像时,所开发的算法只有最后一步来去除黑边。

通过这个简单的代码,我们可以从另一幅图像中提取一幅图像。

整个解合并方法可以在这里找到。

您可以在下图中查看结果:

左上角的图像将隐藏右上角的图像。左下图像是两个合并的图像,右下图像是提取的(未合并的)图像。

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

正如你在上面的图像中看到的,我们在这个过程中损失了一些图像质量,但这并不影响对图像的理解。

你可以在 https://github.com/kelvins/steganography 的Github:上找到隐写术 Python 代码

隐写术:间谍如何相互欺骗

原文:https://towardsdatascience.com/steganography-how-spies-rickroll-each-other-6a831d7df39e?source=collection_archive---------4-----------------------

ste ga no 图形 y

ˌste-gə-ˈnä-grə-fē

名词

将一个消息、图像或文件隐藏在另一个消息、图像或文件中的艺术或实践

我是 Greg Rafferty,湾区的数据科学家。你可以在我的 github 上查看这个项目的代码。如有任何问题,请随时联系我!

第二次世界大战期间,盟军截获的德国电文如下:

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

他们要求他们最好的密码学家对隐藏的信息进行解码,因为显然这比看起来要复杂得多。但如果他们截获了一些德国人互相发送 1942 年的 Instagrams,他们可能不会费心去过多解读它。

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

Just a picture of a forest? Or something more ominous…?

“Steganography”来自希腊语 *steganos,*意为“被覆盖”或“沉默寡言”。密码学关注的是隐藏信息的内容,而隐写术关注的是隐藏信息的存在这一事实,这阻止了潜在的密码破译者深入研究。

这篇文章是关于某种隐写术,称为最低有效位(或 LSB 隐写术)。如果我给你 00000000 美元,并告诉你在我把钱交给你之前,你只能换其中的一个数字,只有傻瓜才会换最右边的数字并索要 00000001 美元。很明显,改变最左边的数字会得到 10,000,000 美元,或1000 万美元,而改变最右边的数字只会得到 1 美元。即使在这两种情况下,我们只是改变了一个数字,最右边的数字是最不重要的,因为它对总数的影响最小。这和 LSB 隐写术是一个概念。

O 一个字节的数据由 8 位组成——8 个 0 或 1 的数字,如 00011010。如果这个字节代表图像中一个像素的颜色,我们可以改变最右边的数字,并且只能非常细微地改变那个像素的颜色。我们可以将我们的秘密信息编码在这些最低有效位中,这样整个图像对人眼来说不会改变太多,也不会引起对其本身的注意,然后提取这些位来揭示秘密。

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

这里有一个直观的例子。计算机屏幕上的颜色可以用红、绿、蓝的各种平衡来表示。这被称为 RGB 颜色模型,每个像素可以有一个 0 到 255 之间的值。在上图中,左边的红色方块是由R=240, G=64, B=64的红色、绿色和蓝色像素值创建的。转换成二进制表示,这些数字就是R=11110000, G=0100000, B=0100000。右边的下一个方块将每个颜色通道的最低有效位从 0 更改为 1,从而得到R=1111000**1**, G=010000**1**, B=010000**1**的值。这个正方形和第一个正方形的颜色完全一样,我们在这个像素中编码了 3 位信息。下一个平方也改变了第二个最低有效位,导致值为R=111100**11**, G=01000**11**, B=01000**11**。每个方块的下一个最低有效位都发生了变化,您可以看到,直到我们到达序列的中间,颜色才会发生变化(这只是因为我们能够将其与原始值进行比较)。当我们到达最后一个方块时,红色、绿色和蓝色通道的每个字节中的每一位都被交换了,颜色已经完全改变了。当转换回整数值时,我们现在处于像素值R=**0000111**, G=**10111111**, B=**10111111**R=15, G=191, B=191

为了将最大量的信息编码到一个像素中而不改变太多,我选择丢弃 4 个最低有效位。因此,为了将一个图像隐藏在另一个图像中,我取封面图像的 4 个最高有效位和隐藏图像的 4 个最高有效位。我将隐藏图像的 4 位移动到最低有效位的位置,并将它们与封面图像的 4 位合并。然后,瞧!,封面图像看起来一点也没有改变,但它现在包含了重建隐藏图像所必需的信息。****

这是一个展示这一过程的动画:

我们首先遍历封面图像(上面视频中的红框)和隐藏图像(绿色)的每个像素,

  1. 将每个颜色通道的 RGB 值转换为二进制
  2. 同样,对于每个通道,从封面图像中取出 4 个最高有效位,从隐藏图像中取出 4 个最高有效位
  3. 将隐藏图像的 4 位移动到最低有效位的位置,并将它们与封面图像的 4 位组合
  4. 将 RGB 通道组合在一起,创建一个新像素,由封面图像的 4 个有效位控制,但隐藏图像的 4 个最高有效位编码在其中。由于隐藏在最低有效位的信息,颜色会稍微改变*(注意,红色方块现在只是稍微变得*橙色)**
  5. 要解码隐藏图像,从新像素中取出 4 个最低有效位,并将它们移回到最高有效位的位置
  6. 用 0 填充空出的最低有效位(这是我们由于编码而永远丢失的信息)
  7. 隐藏的图像现在会出现,由于最低有效位的数据丢失,与原始图像略有不同(看,它有点暗)

还记得上面那张森林的照片吗?里面藏着一幅图像。我已经用隐藏图像的最高有效位替换了所有最低有效位。所以,如果我拿这张图像,去掉每个像素的四个最高有效位,把最低有效位移过来,会出现什么?里克·阿斯特利!

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

You’ve been rickrolled!

没有看到那片森林的原始照片(即使你看到了!),很难知道里面藏着什么图像。我故意选择了一个“忙碌”的图像,有很多随机的线条和对比,因为变化更难被注意到。不过,阿斯特利的解码图片确实显示了一些因最低有效位丢失而产生的伪像。看下面的图片;顺利(这么顺利!)阿斯特利前额和脸颊的皮肤在解码图像中显示出一些色调分离,其中颜色没有平滑过渡地突然变化。你也可以在砖块中看到,特别是在他右肩(左肩)上方的拱门开始处,砖块中的许多细节都丢失了,它们看起来是一种连续的颜色。

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

Top Left: original cover image; Top Right: coded image; Lower Left: original hidden image; Lower Right: decoded hidden image

对于 LSB 隐写术而不是来说,使用来自公共领域的图像是很重要的,因为人们可以很容易地将原始图像与编码图像进行比较。在这里,我已经采取了森林的原始图像,并从中减去编码图像。这将减去每个像素值,并有效地显示两张照片之间的差异。

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

A ghoulish rickroll emerges from the forest

森林图像大部分丢失,因为它的所有最高有效位已经彼此相减。我们只剩下最不重要的部分,这就是阿斯特利的藏身之处。此外,里克·阿斯特利的照片有不同的长宽比,所以照片底部的 1/8 没有任何隐藏的图像。上图的亮度也显著增加了。图像的变化如此难以察觉,以至于未增强的差异显示为纯黑色。

SB 隐写术不仅仅是间谍使用的工具。例如,电影工作室也经常使用这种技术。当他们需要在向公众发布电影之前将电影发送给审查者时,他们会在电影的一些帧中隐藏水印。这种水印是特定于每个提前拷贝的接收者的,所以如果电影后来在海盗湾上映,电影工作室只需要从拷贝中解码隐藏的水印,就可以发现是谁泄露了它。至关重要的是,如果图像被压缩,这些隐藏的图像仍然可以被解码——因为隐藏的图像只是其自身的“变暗”版本(不完全正确,但只是顺其自然),即使图像被调整大小、压缩或裁剪,它仍然会在那里。

还可以用 LSB 隐写术将纯文本隐藏在另一幅图像中。但是文本需要稍微不同的过程;文本首先被转换成一个字节数组,然后每一位被依次覆盖到图像的最低有效位。因为顺序很重要,并且每个像素包含一长串位的一部分,所以图像必须保存为位图文件,并且不能被压缩(除非以无损格式保存,如. png 格式)、裁剪、调整大小、增强或任何其他会改变像素的过程。与隐藏另一个图像相反,在隐藏另一个图像时,对封面图像的任何改变都会改变但不会破坏隐藏的图像,而隐藏文本时,对底层像素值的任何改变都会完全破坏文本。对于大量的文本来说,这显然很不方便,因为生成的位图文件会非常大(我将《战争与和平》的全部内容编码到一张 243 兆字节的图像中)。这是森林图像的另一个版本,它包含的文本字符串比“战争与和平”短得多:

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

这幅图像中隐藏着什么?

我们对爱情并不陌生
你知道规则,我也知道
完全的承诺是我所想的
你不会从任何其他人那里得到这种承诺

我只想告诉你我的感受,让你明白

永远不会放弃你
永远不会让你失望
永远不会跑来跑去抛弃你
永远不会让你哭泣
永远不会说再见
永远不会说谎伤害你

我们相识已久
你的心一直在痛,但你羞于启齿
我们都知道发生了什么
我们知道这个游戏,我们会玩下去

如果你问我感觉如何,不要告诉我你太盲目而看不到

永远不会放弃你
永远不会让你失望
永远不会到处乱跑抛弃你
永远不会让你哭泣
永远不会说再见
永远不会说谎伤害你
永远不会放弃你
永远不会让你失望
永远不会到处乱跑抛弃你
永远不会让你哭泣
永远不会说再见
永远不会说谎伤害你

永不放弃,永不放弃
(放弃你)
(哦)永不放弃,永不放弃
(放弃你)

我们相识已久
你的心一直在痛,但你羞于启齿
内心深处我们都知道发生了什么
我们知道这个游戏,我们会玩下去

我只想告诉你我的感受,让你明白

永远不会放弃你
永远不会让你失望
永远不会到处乱跑抛弃你
永远不会让你哭泣
永远不会说再见
永远不会说谎伤害你
永远不会放弃你
永远不会让你失望
永远不会到处乱跑抛弃你
永远不会让你哭泣
永远不会说再见
永远不会说谎伤害你
永远不会 我会放弃你,永远不会让你失望,永远不会到处乱跑,抛弃你,永远不会让你哭泣,T21

词干?引理化?什么?

原文:https://towardsdatascience.com/stemming-lemmatization-what-ba782b7c0bd8?source=collection_archive---------2-----------------------

深入探究词干化和词汇化对自然语言处理任务有什么作用,以及它们是如何做到的。

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

词干化和词汇化

在自然语言处理中,有时您可能希望您的程序识别出单词“ask”和“asked”只是同一个动词的不同时态。这是将一个单词的不同形式简化为一个核心词根的想法。相互派生的单词可以映射到一个中心单词或符号,特别是如果它们具有相同的核心含义。

也许这是在一个信息检索设置中,你想提高你的算法的召回率。或者,您可能试图分析语料库中的单词用法,并希望压缩相关单词,这样就不会有太多的可变性。不管怎样,这种文本规范化技术可能对您有用。

这就是词干化或词汇化之类的东西出现的地方,这些东西你可能以前听说过!但是这两者有什么区别呢?他们实际上是做什么的?这是我们今天要探讨的两个问题!

那么它们是什么呢?

从本质上来说,这两种技术处理的是同一个想法:将一个单词简化为它的词根或基本单位。这通常是一个数据预处理步骤,熟悉它是件好事。虽然他们都希望解决这个相同的想法,但他们却以完全不同的方式去做。我们来看看吧!

堵塞物

词干处理无疑是这两种方法中较简单的一种。有了词干,单词就简化成了词干。词干不必与基于词典的词根是同一个词根,它只是等于或小于单词的形式。

词干算法通常是基于规则的。你可以把它们看作是一种启发性的过程,这种过程在某种程度上删减了单词的词尾。一个单词被查看并通过一系列决定如何删减的条件句。

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

例如,我们可能有一个后缀规则,基于一个已知后缀的列表,将它们删除。在英语中,我们有像“-ed”和“-ing”这样的后缀,为了把单词“cook”、“cooking”和“cook”都映射到同一个词干“cook”,去掉这些后缀可能是有用的。

转向过度和转向不足

然而,因为词干通常是基于启发式的,它远非完美。事实上,它通常有两个问题:转向过度和转向不足。

越界来自于一个词被砍掉太多。这会导致无意义的词干,单词的所有意思都丢失或混淆了。或者它可能导致单词被解析为相同的词干,尽管它们可能不应该被解析。

以大学、宇宙、大学和宇宙这四个词为例。将这四个单词解析为词干“univers”的词干算法已经越界。虽然把宇宙和宇宙放在一起,把大学和大学放在一起可能不错,但这四者都不合适。一个更好的解决方案可能是将前两个解析为“univers”,后两个解析为“universi”。但是执行这样的规则可能会导致更多的问题出现。

理解不足是相反的问题。当我们有几个词实际上是彼此的形式时,它就产生了。对他们来说,如果所有人都下定决心做同一件事就好了,但不幸的是,他们没有这样做。

如果我们有一个词干算法,将单词 data 和 datu 词干化为“dat”和“datu”,就可以看出这一点你可能会想,好吧,把这两个都归结为“dat”然而,我们该如何处理日期呢?有没有一个好的通用规则?或者我们只是为一个非常具体的例子执行一个非常具体的规则?

当涉及到词干时,这些问题很快就变成了问题。强制执行新的规则和试探法会很快失控。解决一两个过度/不足的问题会导致两个以上的问题出现!制作一个好的词干算法是一项艰巨的工作。

说到这个…

词干算法示例

当我第一次开始使用词干时,我立即接触到的两个词干算法是 Porter stemmer 和 NLTK 的 Snowball stemmer。虽然我不会详细介绍这两种方法,但我会重点介绍一下,这样您会比我第一次使用它们时知道得更多。

  • 波特词干分析器:这个词干算法比较老。它起源于 20 世纪 80 年代,主要关注的是去除单词的常见词尾,以便它们可以被解析为一种常见的形式。它并不复杂,开发也停滞不前。通常,这是一个不错的基本词干分析器,但是不建议将其用于任何生产/复杂的应用程序。相反,它在研究中有自己的位置,是一个很好的基本词干算法,可以保证可重复性。与其他算法相比,这也是一个非常温和的词干算法。
  • 雪球词干分析器:这个算法也被称为 Porter2 词干算法。几乎所有人都认为它比波特词干分析器好,甚至连波特词干分析器的发明者也承认这一点。话虽如此,它也比波特斯泰默更具侵略性。添加到雪球词干分析器的很多东西都是因为波特词干分析器的问题。雪球和波特的阻止方式大约有 5%的不同。
  • Lancaster stemmer :只是为了好玩,Lancaster stemming 算法是你可以使用的另一种算法。这是最积极的词干算法。但是,如果您在 NLTK 中使用词干分析器,您可以非常容易地将自己的定制规则添加到这个算法中。这是一个很好的选择。围绕这种词干算法的一个抱怨是,它有时过于激进,真的可以将单词转换成奇怪的词干。在使用这个选项之前,请确保它能完成您想要的功能!

词汇化

我们已经讨论了词干,但是事情的另一面呢?词汇化有什么不同?好吧,如果我们认为词干化只是根据单词的外观来猜测在哪里截取单词,那么变元化是一个更加精确的过程。它包括将单词解析成它们的字典形式。其实一个词的一个引理就是它的字典或者规范形式!

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

因为 lemmatization 在这方面更加细致,所以实际工作起来需要更多一些。对于将一个单词解析为其词条的词条化,它需要知道它的词性。这需要额外的计算语言学能力,如词性标注器。这允许它做更好的决定(像决定“是”和“是”)。

关于引理化需要注意的另一件事是,用一种新语言创建一个引理化器通常比词干提取算法要困难很多倍。因为 lemmatizers 需要更多关于语言结构的知识,所以这是一个比仅仅试图建立一个启发式词干算法更密集的过程。

幸运的是,如果您用英语工作,您可以像使用词干一样通过 NLTK 快速使用词汇化。然而,为了获得最佳结果,您必须将词性标签提供给词条分类器,否则它可能无法将所有单词归入您想要的词条。更重要的是,它是基于 WordNet 数据库(有点像同义词网或辞典)的,所以如果那里没有一个好的链接,那么无论如何你都不会得到正确的词条。

包扎

在我结束本文之前,还有一件事:如果您选择在 NLP 应用程序中使用词汇化或词干化,请务必测试这两种方法的性能。在许多应用程序中,您可能会发现,这两种方法最终都会以一种糟糕的方式影响性能,就像它们有助于提高性能一样。这两种技术实际上都是在考虑召回的情况下设计的,但结果往往会影响精确度。但是如果回忆是你的目标(就像搜索引擎一样),那也许没问题!

此外,这篇博文主要围绕英语展开。其他语言,即使它们看起来有些相关,在词干化和词汇化方面也有非常不同的结果。一般的概念保持不变,但是具体的实现会有很大的不同。如果你打算用一种完全不同的语言工作,希望这个博客至少在高层次上有所帮助!

如果你喜欢这篇文章,并渴望更多的 NLP 阅读,为什么不看看我写的另一篇关于单词嵌入如何工作以及你可能遇到的不同类型的博客文章。或者,如果你更喜欢句子,为什么不看看我对一篇论文的总结,这篇论文分析了不同的句子嵌入如何影响下游和语言任务

原主持人:【hunterheidenreich.com】T5

Tensorflow 中用代码实现奇异值分解的逐步反向传播

原文:https://towardsdatascience.com/step-by-step-backpropagation-through-singular-value-decomposition-with-code-in-tensorflow-8056f7fbcbf3?source=collection_archive---------8-----------------------

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

Photo by Rahul Bhosale on Unsplash

奇异值分解,也被称为线性代数的基本定理,是一个惊人的概念,让我们将一个矩阵分解成三个更小的矩阵。(请点击此处阅读关于四个基本子空间的更深入内容:4 行)。就像特征值分解一样,梯度也可以计算。

就个人而言,这是一个巨大的里程碑,我相信知道这个算法将打开许多大门,当涉及到训练一个深度神经网络 而没有 依靠自动微分时。

请注意,这篇文章是为了我自己的教育目的,如果发现任何错误,请在下面评论。

我认为最好的参考

Paper from this website

上面的论文详细描述了这个过程,讲述了如何进行这种求导。

假设以及基本概念回顾

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

Image from this website

我要假设的第一件事是,我们将使用一个维数为(m,n)的矩阵,m 将总是大于 n(m≤n)。这很重要,因为当我们执行奇异值分解时,我们可以计算全矩阵,也可以不计算全矩阵。所以当我们把矩阵分解成三部分时,每一部分都有维度…

U(左奇异向量) → (m,n)
S(奇异值,对角矩阵) → (n,n)
V(右奇异向量) → (n,n)

为了给出一个具体的例子,让我们假设我们的原始数据矩阵“数据”具有如下所示的维度。

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

蓝框 →显示每个矩阵的维度
红框 →比较原始数据和重建数据

现在让我们继续讨论其他基本的线性代数概念,首先我们要讨论正交矩阵。

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

我已经假设读者已经知道了这个概念,但是让我们看看这是如何在代码中实现的。由于每个奇异向量(左和右)都是各自空间的基向量,所以它们是正交矩阵。

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

蓝框→ 该性质适用于左右奇异矩阵
红框 →当我们计算全矩阵时,该性质适用于左奇异矩阵。

现在,再次记住我们没有计算全矩阵的事实,一个性质不适用于左奇异向量,然而,当我们计算全矩阵时,我们看到该性质适用于两个方向上的两个奇异向量。

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

最后,让我们看看逆矩阵==转置性质适用于两个矩阵。(正交矩阵)接下来我们将讨论正交补码。

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

上面的描述并不能帮助我理解这个概念,所以,下面我附上了两个与这个话题相关的视频。

Video from this website

video from this website

现在让我们看看这些属性在代码中是如何体现的。(注意:我将使用这个 git repo 中的代码来寻找正交补码。)

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

红框→U 的原始形状和 U 的 perp,当我们在它们之间进行点积时,所有的结果都将接近于零。

蓝框 →计算以下属性为真。

现在请把注意力集中在蓝色的盒子上,有一分钟的时间,我没有解释这个属性,但是我想证明下面的属性是真实的。

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

我们将在通过 SVD 反向传播时使用这个属性。最后,让我们来看看偏斜矩阵。

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

Image from this website

非常简单的概念,现在让我们看一下代码,让我们的理解更加完整。

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

请注意,上述矩阵的对角线值都是零。

步骤 0 执行奇异值分解

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

从上述示例中,我们探索了一些属性,现在我们将执行 SVD,从原始数据(A)中,我们将获得 U、S 和 V,为了重建原始数据,我们可以简单地执行 U、S 和 V 转置之间的点积。

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

步骤 1 确定一些属性

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

从奇异值分解的定义中,我们注意到 U 和 V 都是正交矩阵,因此与自身的点积会产生一个单位矩阵。现在让我们只关注右边的部分,也就是转置(U) @ U。

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

上面的代码显示了 identity 属性。

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

当我们对上面的方程求导,我们得到上面的公式,从那里我们注意到一些东西。

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

当我们将等式的右边移到左边时,符号发生了变化,然后我们注意到 dU^T U 是一个斜矩阵。(类似的论点适用于右奇异向量 V)

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

最后,利用斜矩阵的性质,我们将 dU 定义如下。(请注意,类似的论点也适用于 V。)

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

步骤 2 使用正交补码推进属性

我们的原始矩阵 U 的维数为(9000,3),现在我们要创建一个形状为(9000,8997)的正交补矩阵。如果我们将两个矩阵都附加到轴 1 上,我们会得到一个形状为(9000,9000)的正交矩阵。

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

红框→U 的正交补矩阵的形状
蓝框→U 与正交补 U 之间的附加矩阵的形状,表示单位矩阵的性质。

然后导数杜灿被展开,看起来像下面这样。

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

其中 dKu 是形状为(8997,3)的无约束矩阵。有关为什么会发生这种情况的详细信息,请点击此处

**目前我还不完全理解为什么上述属性成立,但是它确实有意义。在执行 SVD 时,我们没有计算完整的矩阵,但是原始矩阵 A 由奇异值为 s 的奇异向量 U 和 V 中的所有元素组成。因此,当我们通过 SVD 反向传播时,我们也需要考虑它们。之所以需要 U 的正交补矩阵,是因为全矩阵 U 是正交矩阵。

第三步求奇异值分解关于 A 的微分,并按摩方程

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

现在,如果我们对 SVD 对变量 A 求导,注意,全微分是由对 U,S 和 v 的偏导数得到的。

让我们用 transpose(U)左乘上面的函数,用 V 右乘,得到下面的函数。

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

步骤 4 利用反对称矩阵的性质

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

让我们首先把等式的右边改写成上面这样。接下来,我们注意到 dωU 和 dωV 都是反对称矩阵,因此它们的对角线值将为零。使得 dP 的对角线值只与 dS 项有关,这个关系可以写成如下。

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

现在让我们考虑非对角的情况,首先我要声明一个与单位矩阵相反的项。 其中每一个对角元素都是 0,其他地方都是 1。(我将用 I 来表示这一项,上面有一个横杠。)

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

注意使用反对称矩阵和对角矩阵的性质,我们可以用公式表示上面的方程。

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

当我们转置 dP 项时,我们会得到如下结果。(dP^T)

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

最后,当我们将 dP 右乘 s,左乘 dP^T,并将两项相加,我们会得到如下结果。

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

如果写得更正式一些,它看起来会像下面这样。

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

最后,dωU 可通过以下等式求解。

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

使用类似的逻辑,我们也可以求解 dωV。

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

步骤 4 求无约束矩阵 dKu

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

让上面的等式与 u 的正交补码的转置相乘。

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

红框 →利用 U 和 U 的正交补码之间的点积为零的事实,从而抵消

蓝星 →利用正交矩阵的逆是它的转置这一事实。

让我们一步一步地在代码中看到上述事实。

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

绿框 →我们将用来消除 U 的正交补的重要性质

上面可以看到使红框为真的属性,此外,请查看绿框属性。

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

上面可以看到使蓝框为真的属性。

第五步利用最终性质推导偏导数

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

最后,利用上面看到的性质,我们将得到偏导数。让我们首先收集我们需要解决的所有术语。

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

现在让我们把上面我们已经解决的所有术语收集起来。

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

代入所有的项,我们最终得到我们的方程。

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

这篇博文的代码

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

对于谷歌实验室,你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要获取这篇博文的代码,请点击这里

遗言

最后,我想提一下我知道的另外两篇论文(一篇来自 CVPR 的文章)计算 SVD 的导数。我知道这些文件存在,但是我没有深入研究这些文件。

paper from this website

Paper from this website

Paper from this website

参考

  1. (2018).Arxiv.org。检索于 2018 年 11 月 19 日,来自https://arxiv.org/pdf/1509.07838.pdf
  2. (2018).j-towns . github . io . 2018 年 11 月 19 日检索,来自https://j-towns.github.io/papers/svd-derivative.pdf
  3. (2018).Web.mit.edu。检索于 2018 年 11 月 19 日,来自http://web.mit.edu/18.06/www/Essays/newpaper_ver3.pdf
  4. (2018).Arxiv.org。检索于 2018 年 11 月 20 日,来自https://arxiv.org/pdf/1509.07838.pdf
  5. (2018).People.maths.ox.ac.uk 检索 2018 年 11 月 20 日,来自http://people.maths.ox.ac.uk/gilesm/files/NA-08-01.pdf
  6. (2018).Hal.inria.fr 于 2018 年 11 月 20 日检索,来自https://hal.inria.fr/inria-00072686/document
  7. Anon,(2018)。[在线]见:https://www . quora . com/What-is-the-difference-between-columns-and-rows【2018 年 11 月 20 日获取】。
  8. 正交补码|交替坐标系(基)|线性代数|可汗学院。(2018).YouTube。检索于 2018 年 11 月 20 日,来自https://www.youtube.com/watch?v=QOTjdgmNqlg
  9. 正交补码。(2018).YouTube。检索于 2018 年 11 月 20 日,来自 https://www.youtube.com/watch?v=Kpc5ELrOt5E
  10. ENH: linalg 助手:matrix Issue # 3039 stats models/stats models 的正交补充。(2018).GitHub。检索于 2018 年 11 月 20 日,来自 https://github.com/statsmodels/statsmodels/issues/3039
  11. 反对称矩阵。(2018).En.wikipedia.org。检索于 2018 年 11 月 21 日,来自https://en.wikipedia.org/wiki/Skew-symmetric_matrix
  12. (2018).Math.mit.edu。检索于 2018 年 11 月 21 日,来自http://math . MIT . edu/~ Edelman/publications/geometry _ of _ algorithms . pdf

构建您自己的“迷你 IMDB”数据库的分步指南

原文:https://towardsdatascience.com/step-by-step-guide-to-build-your-own-mini-imdb-database-fc39af27d21b?source=collection_archive---------0-----------------------

如何使用简单的 Python 库和内置功能从 web 中抓取电影信息,并将其存储在本地 SQLite 数据库中。

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

Photo by Charles Deluvio 🇵🇭🇨🇦 on Unsplash

在学习了几门 Python 入门课程后,初学者常常想知道如何编写一个很酷的 Python 程序,展示该语言的一些高级功能,如 web 抓取或数据库操作。在本文中,我将展示如何使用简单的 Python 库和内置功能来抓取 web 上的电影信息,并将它们存储在本地 SQLite 数据库中,稍后可以使用电影信息查询该数据库进行数据分析。请将此视为构建您自己的迷你 IMDB 数据库的项目!

**这种类型的数据工程任务——从网络上收集数据并建立数据库连接——通常是数据分析项目的第一步。**在你做任何酷的预测建模之前,你需要掌握这一步。这一步通常是杂乱无章的,也就是说,没有一步到位的公式或一站式商店为你做所有的事情。所以,你必须从网络中提取数据,检查它的结构,并构建你的代码来完美地浏览它。

具体来说,本演示将展示以下功能的用法:

  • Python urllib
  • **Web API 服务(带密钥)**用于检索数据
  • Python json
  • Python OS 模块
  • Python SQLite

下面给出了这些的简要描述,

Python urllib 模块

Python 到 web 的网关是通过 urllib 模块完成的。它是一个用于获取 URL(统一资源定位器)的 Python 模块。它以 urlopen 函数的形式提供了一个非常简单的接口。这能够使用各种不同的协议获取 URL。它还提供了一个稍微复杂一点的接口来处理常见情况——比如基本身份验证、cookies、代理等等。这些是由称为处理程序和打开程序的对象提供的。

**Web API 服务(带密钥)**用于检索数据

Web 抓取通常由外部网站托管的 API 服务来完成。可以把它们想象成存储库或远程数据库,您可以通过自己的小程序发送搜索字符串来查询它们。在这个特定的例子中,我们将从开放电影数据库(OMDB)网站获得帮助,该网站向注册用户提供 API 密钥,用于下载电影信息。因为这是一项免费服务,他们每天有 1000 个请求的限制。请注意,您必须在他们的网站上注册,并获得自己的 API 密钥,以便从您的 Python 程序发出请求。

从这个 API 服务获得的数据以 JSON 文件的形式返回。因此,我们需要将 JSON 文件解析/转换成一个 Python 对象,这样我们就可以轻松地工作了。

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

Python json 模块

JSON 是一种轻量级的数据交换格式。对人类来说,读和写很容易。机器很容易解析生成。它基于 JavaScript 编程语言标准 ECMA-262 第三版——1999 年 12 月。JSON 是一种完全独立于语言的文本格式,但是它使用了 C 语言系列的程序员所熟悉的约定,包括 C、C++、C#、Java、JavaScript、Perl、Python 和许多其他语言。这些特性使 JSON 成为理想的数据交换语言。

json 库可以从字符串或文件中解析 JSON 页面。该库将 JSON 解析成 Python 字典或列表。它还可以将 Python 字典或列表转换成 JSON 字符串。这是一个非常有用的模块,学习起来非常简单。这个模块很可能在任何基于 Python 的 web 数据分析程序中使用,因为现在大多数网页在返回数据时使用 JSON 作为主要对象类型。

Python 操作系统模块

该模块提供了一种使用操作系统相关功能的可移植方式。如果你只是想读或写一个文件,参见[open()](https://docs.python.org/3/library/functions.html#open),如果你想操作路径,参见[os.path](https://docs.python.org/3/library/os.path.html#module-os.path)模块,如果你想在命令行上读取所有文件中的所有行,参见[fileinput](https://docs.python.org/3/library/fileinput.html#module-fileinput)模块。创建临时文件和目录见[tempfile](https://docs.python.org/3/library/tempfile.html#module-tempfile)模块,高级文件和目录处理见[shutil](https://docs.python.org/3/library/shutil.html#module-shutil)模块。在这个演示中,我们将使用操作系统模块方法来检查现有的目录,并操作文件来保存一些数据。

SQLite 和 Python SQLite3

SQLite 是一个 C 库,它提供了一个轻量级的基于磁盘的数据库,不需要单独的服务器进程,并允许使用 SQL 查询语言的非标准变体来访问数据库。一些应用程序可以使用 SQLite 进行内部数据存储。还可以使用 SQLite 构建应用程序原型,然后将代码移植到更大的数据库,如 PostgreSQL 或 Oracle。Python 的 sqlite3 模块提供了符合 DB-API 2.0 规范的 SQL 接口。

程序的主要流程

程序的流程如下所示。请注意 锅炉板块代码在我的 Github 资源库 中有 。喜欢的请下载/叉/星。

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

Fig: Main flow of the program

基本思想是向外部 API 发送带有用户输入的电影标题的请求。然后,该程序试图下载数据,如果成功,打印出来。

def search_movie(title):
    if len(title) < 1 or title==’quit’: 
    print(“Goodbye now…”)
    return Nonetry:
    url = serviceurl + urllib.parse.urlencode({‘t’: title})+apikey
    print(f’Retrieving the data of “{title}” now… ‘)
    uh = urllib.request.urlopen(url)
    data = uh.read()
    json_data=json.loads(data)

 if json_data[‘Response’]==’True’:
     print_json(json_data)except urllib.error.URLError as e:
    print(f"ERROR: {e.reason}")

例如,JSON 文件如下所示:

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

Fig: An example JSON file retrieved from the API.

如果程序找到了电影海报的图像文件的链接,它会询问用户是否想下载它。如果用户同意,它会将图像文件下载到本地目录,并以电影标题作为文件名。

# Asks user whether to download the poster of the movie
if json_data['Poster']!='N/A':
    poster_yes_no=input ('Poster of this movie can be downloaded. Enter "yes" or "no": ').lower()
    if poster_yes_no=='yes':
        save_poster(json_data)

接下来,它询问用户是否想在本地数据库中保存一些关于电影的基本信息。如果用户点头,它将创建或插入一个 SQLite 数据库中下载电影信息的子集。

#Asks user whether to save the movie information in a local databasesave_database_yes_no=input ('Save the movie info in a local database? Enter "yes" or "no": ').lower()if save_database_yes_no=='yes':
    save_in_database(json_data)

下面是要保存在数据库中的函数定义。

笔记本还包含将现有数据库中的信息保存为 Excel 文件的功能。

关于秘密 API 密匙的一句话

您会注意到程序使用一个秘密的 API 密钥来访问数据。该密钥可以通过访问 OMDB 网站免费获得,每天最多可使用 1000 次。使用秘密(特定于用户的)密钥进行 web 抓取是一种非常常见的做法。我保护个人 API 密匙完整性的方法是在 Jupyter 笔记本的同一个目录下创建一个小 JSON 文件,名为 APIkeys.json 。该文件的内容对将看到我的代码的外部用户是隐藏的。我的 Jupyter 笔记本将这个 JSON 文件作为字典读取,复制对应于电影网站的密钥,并将其附加到由urllib.request方法发送的编码 URL 请求字符串。

with open(‘APIkeys.json’) as f:
    keys = json.load(f)
    omdbapi = keys[‘OMDBapi’]serviceurl = '[http://www.omdbapi.com/?'](http://www.omdbapi.com/?')
apikey = '&apikey='+omdbapi

摘要

本文通过一个演示 Python 笔记本来说明如何使用免费的 API 服务检索关于电影的基本信息,并将电影海报和下载的信息保存在一个轻量级 SQLite 数据库中。

最重要的是,它演示了 Python 库的简单使用,如 urllib、json 和 sqlite3 ,这些库对于数据分析/ web 数据挖掘任务来说是非常有用(和强大)的工具。

我希望读者可以从提供的笔记本文件中受益,并根据自己的要求和想象来构建它。更多网络数据分析笔记本, 请看我的知识库。

如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail . com。你也可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我在 Twitter 上关注我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值