TowardsDataScience 博客中文翻译 2016~2018(一百三十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用于时间序列分类的隐马尔可夫模型——基本概述

原文:https://towardsdatascience.com/hidden-markov-models-for-time-series-classification-basic-overview-a59b74e5e65b?source=collection_archive---------0-----------------------

注:需要 HMMs 的基础知识。

最近,我一直在努力理解 HMMs 训练和识别特别有趣的时间序列数据集(美国手语)背后的魔力。在这篇文章中,我想对这个过程中的步骤做一个高层次的概述,经过详细的研究,我终于掌握了这个过程。

首先让我们看看数据。单个数据点(ASL 中的单个单词)由分散在离散时间帧中的值组成。

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

假设我们想要建立一本单词书的模型。我们查看数据集,注意到有三个时间序列对应于图书。我们将 HMM 建立在这三个例子的基础上。

训练前要做的一个重要步骤是决定状态的数量。我们可以凭经验做到。如果我们观察单词书的一个数据点的图,我们可以得出结论,说话者的手通过三个序列进行转换。

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

因此,我们的隐马尔可夫模型应该包含三个状态。稍后,我们可以用不同数量的状态训练另一个图书模型,比较它们(例如,使用 BIC 惩罚复杂性并防止过度拟合)并选择最佳的一个。现在我们只关注三态 HMM。

每个状态都有两种可能性(都有一定的概率):我们要么保持当前状态,要么进行转换。下面的箭头说明了这个概念。

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

我们稍后将回到这一点。现在我们将分配适当的高斯分布,它最适合给定状态下的数据。让我们假设来自训练集的单词书的三个示例在离散时间帧上的以下值:

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

先说一个叫维特比对齐的方法。它开始于将所有的例子大致相等地划分成 3 个群(3 个状态)。

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

接下来,我们计算每个聚类段的正态分布参数(平均值和标准偏差)。

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

基于 Z 值,我们稍后查看相邻值,考虑它们对给定分布的适合度,并在必要时更改红色边界。

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

在反复运行这个方法后,我们得到了对值分布的良好估计。然而,我们可以使用期望最大化算法做得更好,该算法根据正确分布的概率为每个值分配一个权重(P(平均值,标准偏差|值))。我们可以使用贝叶斯定理和给定特定分布(P(value | mean,standard deviation))的值的概率公式来推导。如果我们幸运的话,以下是我们到目前为止可以实现的目标:

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

以下是具有适当边界的聚类值:

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

现在让我们再次考虑第一个完整片段。我们可以注意到,在每个序列中有一个值,在这个值之后,我们转换到下一个状态。

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

如果我们把第一段的所有值都扔进一个盒子里,并试着从三个值中抽取一个,导致转换到下一个状态,我们有多大的机会?概率有多大?实际上很容易计算:3/20 = 0.15 (20 是段中值的总数)。抽取任何其他值(导致停留在第一状态)的概率是互补的(1–0.15 = 0.85)。你猜怎么着?我们刚刚计算了我们的转移和停留概率!让我们将它们添加到模型中。

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

恭喜你!我们刚刚为单词书训练了三态 HMM。下一步是检查测试时间序列的可能性,比如说:

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

为此,我们将模型分解为维特比路径,这些路径表示测试时间序列中所有可能的运动(包括转换和停留)。请注意,在下图中,概率仍然保持不变,我们忽略了无法到达最后状态的路径:

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

在最终计算之前,我们需要添加基于我们之前为每个状态导出的正态分布的时间序列值的概率:

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

最后一步是计算测试时间序列符合我们的图书模型的可能性。为此,我们将路径上的所有概率相乘,并选择最有可能的一个(具有最大概率)。这些概率往往很小,所以你经常会看到这种计算的对数版本。

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

所选路径的概率:

0.8 * 0.85 * 0.8 * 0.15 * 0.5 *0.3 * 0.4 * 0.375 = 0.0002754

识别过程基于从不同模型中比较给定时间序列的最佳路径可能性,并选择最高的一个。

层次聚类及其应用

原文:https://towardsdatascience.com/hierarchical-clustering-and-its-applications-41c1ad4441a6?source=collection_archive---------3-----------------------

聚类是数据科学中最著名的技术之一。从客户细分异常值检测,它有着广泛的用途,以及适合不同用例的不同技术。在这篇博文中,我们将看看层次聚类,这是聚类技术的层次化应用。

使聚集

用一句话来说,聚类就是提取相似数据对象的自然分组。

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

Republican and Democrat clusters of senators

关于集群,有几个常见的想法:

  • 聚类应该自然地出现在数据中。
  • 聚类应该发现数据中隐藏的模式。
  • 聚类中的数据点应该是相似的。
  • 两个不同聚类中的数据点不应相似。

用于聚类的常见算法包括 K 均值、DBSCAN 和高斯混合模型。

分层聚类

如前所述,层次聚类依赖于使用这些聚类技术来寻找聚类的层次结构,其中该层次结构类似于树结构,称为树状图。

层次聚类是基于组相似性的数据的层次分解

查找分层聚类

有两种顶级方法可以找到这些层次聚类:

  • 聚集聚类使用自下而上的方法,其中每个数据点从自己的聚类开始。然后,通过将两个最相似的聚类放在一起并合并,贪婪地将这些聚类结合在一起。
  • 分裂式聚类使用一种自顶向下的方法,其中所有数据点都在同一个聚类中开始。然后,您可以使用 K-Means 之类的参数聚类算法将该分类分成两个分类。对于每个集群,您进一步将它分成两个集群,直到达到所需的集群数量。

这两种方法都依赖于在所有数据点之间构建相似性矩阵,这通常通过余弦或 Jaccard 距离来计算。

层次聚类的应用

1)美国参议员通过 Twitter 聚集

我们能通过 Twitter 找到政党路线吗?

继有争议的“Twitter 情绪预测股市”论文之后,研究人员一直将 Twitter 视为极具价值的数据来源。在这个例子中,我们使用 Twitter 将美国参议员分组到他们各自的党派中。

我们的数据很简单:我们只看哪个参议员跟着哪个参议员。它定义了一个图结构,以参议员为节点,以随从为边。

在这个图中,我们使用了由 Pons 等人提出的 Walktrap 算法,该算法在图中进行随机遍历,并通过从一个参议员开始到某个参议员的次数来估计参议员相似度。

在获得这些相似性之后,我们可以使用凝聚聚类来找到树状图。

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

Reds are Republicans, Blues are Democrats, Blacks are independent

为了衡量我们的聚类效果如何,我们可以用聚会的颜色来给结果着色。正如你所看到的,民主党人和共和党人从顶部非常明显地分裂,显示了这种方法的成功。

你可能也注意到了两条黑线,代表独立参议员。这些都是有点棘手的评估,但参议员伯尼·桑德斯和参议员安格斯金党团与民主党,这意味着这是自然的,他们在民主党的分支树。

2)通过系统进化树绘制进化图

我们如何将不同的物种联系在一起?

在 DNA 测序可靠之前的几十年里,科学家们努力回答一个看似简单的问题:大熊猫更接近熊还是浣熊?

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

如今,我们可以利用 DNA 测序和系统聚类来寻找动物进化的进化树:

  1. 生成 DNA 序列
  2. 计算所有序列之间的编辑距离
  3. 基于编辑距离计算 DNA 相似性。
  4. 构建系统进化树。

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

这项实验的结果是,研究人员能够把大熊猫放在离熊更近的地方。

3)通过系统发生树追踪病毒

我们能找到病毒爆发的源头吗?

追踪病毒爆发及其来源是一项重大的健康挑战。追踪这些疫情的源头可以为科学家提供更多的数据,说明疫情开始的原因和方式,从而有可能挽救生命。

像艾滋病毒这样的病毒具有很高的突变率,这意味着同一种病毒的 DNA 序列的相似性取决于它传播的时间。这可以用来追踪传播途径。

这种方法在一个法庭案例中被用作证据,在该案例中,与对照组相比,发现受害者的艾滋病毒链与被告患者的更相似。

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

V1–3 are victim’s strands, P1–3 are accused patient’s, and LA1–12 are the control group

一项类似的研究也是为了寻找给人类带来 SARS 病毒的动物:

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

所以人类从果子狸身上感染了 SARS 病毒…对吗?

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

image source

“有了手头的数据,我们可以看到病毒是如何利用不同的宿主的,按照这个顺序,从蝙蝠到人类再到果子狸。所以果子狸实际上是从人类那里感染了非典**——科学日报**

结论

分层聚类是一种强大的技术,它允许您从数据相似性中构建树结构。现在,您可以看到不同的子分类之间的关系,以及数据点之间的距离。请记住,这些相似性并不意味着因果关系,就像棕榈果子狸的例子一样,您将拥有另一个工具。

参考

  1. Anasse Bari 博士的大数据科学(NYU)讲座幻灯片
  2. 生物信息学(Bogazici 大学)Arzucan Ozgur 博士的讲稿

R 中分类数据的层次聚类

原文:https://towardsdatascience.com/hierarchical-clustering-on-categorical-data-in-r-a27e578f2995?source=collection_archive---------0-----------------------

这是我第一次尝试在真实数据上执行客户聚类,这是一次宝贵的经历。虽然网上关于使用数值变量进行聚类的文章和博客文章很多,但我花了一些时间来寻找分类数据的解决方案,如果你想到这一点,这确实不那么简单。分类数据聚类的方法仍在开发中——我将在另一篇文章中尝试这两种方法。

另一方面,我也遇到过这样的观点,对分类数据进行聚类可能不会产生合理的结果——这在一定程度上是正确的(在 CrossValidated 上有一个惊人的讨论)。在某一点上,我想“我在做什么,为什么不把它全部分成几组呢?”但是群组分析并不总是明智的,特别是在您获得更多级别的分类变量的情况下,您可以轻松浏览 5-7 个群组,这可能很容易,但是如果您有 22 个变量,每个变量有 5 个级别(比如,这是一个离散分数为 1,2,3,4,5 的客户调查),并且您需要了解您有哪些独特的客户群,您将有 22×5 个群组。没人想这么做。聚类似乎是有用的。所以这篇文章是关于分享我希望在开始研究集群时遇到的事情。

聚类过程本身包含 3 个不同的步骤:

  1. 计算相异度矩阵——可以说是聚类中最重要的决定,你所有的后续步骤都将基于你所做的相异度矩阵。
  2. 选择聚类方法
  3. 评估集群

这篇文章是初级水平的,涵盖了基础知识和 r 中的实现。

D issimilarity Matrix
可以说,这是你聚类的主干。相异矩阵是一种数学表达式,表示数据集中的点彼此之间的差异或距离,因此您可以稍后将最接近的点分组在一起或分离最远的点,这是聚类的核心思想。

这是数据类型差异非常重要的步骤,因为相异矩阵是基于各个数据点之间的距离。虽然很容易想象数字数据点之间的距离(例如,还记得欧几里德距离?),分类数据(R 中的因子)似乎不那么明显。

为了计算这种情况下的相异度矩阵,你需要一个叫做高尔距离的东西。我不会进入它的数学,但我在这里提供了一个链接链接。为此,我更喜欢使用**cluster** package中的daisy()metric = c("gower")

#----- Dummy Data -----#
# the data will be sterile clean in order to not get distracted with other issues that might arise, but I will also write about some difficulties I had, outside the codelibrary(dplyr)# ensuring reproducibility for sampling
set.seed(40)# generating random variable set
# specifying ordered factors, strings will be converted to factors when using data.frame()# customer ids come first, we will generate 200 customer ids from 1 to 200
id.s <- c(1:200) %>%
        factor()
budget.s <- sample(c("small", "med", "large"), 200, replace = T) %>%
            factor(levels=c("small", "med", "large"), 
            ordered = TRUE)origins.s <- sample(c("x", "y", "z"), 200, replace = T, 
             prob = c(0.7, 0.15, 0.15))area.s <- sample(c("area1", "area2", "area3", "area4"), 200, 
          replace = T,
          prob = c(0.3, 0.1, 0.5, 0.2))source.s <- sample(c("facebook", "email", "link", "app"), 200,   
            replace = T,
            prob = c(0.1,0.2, 0.3, 0.4))## day of week - probabilities are mocking the demand curve
dow.s <- sample(c("mon", "tue", "wed", "thu", "fri", "sat", "sun"), 200, replace = T,
         prob = c(0.1, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2)) %>%
         factor(levels=c("mon", "tue", "wed", "thu", "fri", "sat", "sun"), 
        ordered = TRUE)# dish 
dish.s <- sample(c("delicious", "the one you don't like", "pizza"), 200, replace = T)

# by default, data.frame() will convert all the strings to factors
synthetic.customers <- data.frame(id.s, budget.s, origins.s, area.s, source.s, dow.s, dish.s)#----- Dissimilarity Matrix -----#library(cluster) 
# to perform different types of hierarchical clustering
# package functions used: daisy(), diana(), clusplot()gower.dist <- daisy(synthetic.customers[ ,2:7], metric = c("gower"))# class(gower.dist) 
## dissimilarity , dist

用相异矩阵完成。这对于 200 次观察来说是非常快的,但是如果你有一个大的数据集,计算起来可能会非常昂贵。

实际上,您很可能必须首先清理数据集,执行从字符串到因子的必要转换,并注意丢失的值。在我自己的例子中,数据集包含丢失值的行,每次都很好地聚集在一起,使我认为我找到了宝藏,直到我看了这些值(哼!).

C 聚类算法
你可能听说过有 k-means分层聚类。在本文中,我主要关注后者,因为它是一种更具探索性的类型,并且可以采用不同的方法:您可以选择遵循聚集(自下而上)或分裂(自上而下)的聚类方式。

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

Credits: UC Business Analytics R Programming Guide

凝聚聚类将从 n 个聚类开始,其中 n 是观察值的数量,假设它们中的每一个都是自己单独的聚类。然后,算法将尝试找到最相似的数据点,并将它们分组,因此它们开始形成聚类。

相比之下,分裂聚类将反其道而行之——假设所有的 n 个数据点是一个大的聚类,并将最不相似的分成不同的组。

如果你正在考虑使用其中的哪一个,尝试所有的选项总是值得的,但总的来说,*凝聚聚类在发现小簇方面更好,*并且被大多数软件使用;分裂聚类——发现更大的聚类

我个人喜欢先看看树状图——聚类的图形表示,以决定我将坚持哪种方法。正如你将在下面看到的,一些树状图将会非常平衡,而其他的看起来会很混乱。

# The main input for the code below is dissimilarity (distance matrix)
# After dissimilarity matrix was calculated, the further steps will be the same for all data types
# I prefer to look at the dendrogram and fine the most appealing one first - in this case, I was looking for a more balanced one - to further continue with assessment#------------ DIVISIVE CLUSTERING ------------#
divisive.clust <- diana(as.matrix(gower.dist), 
                  diss = TRUE, keep.diss = TRUE)
plot(divisive.clust, main = "Divisive")

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

#------------ AGGLOMERATIVE CLUSTERING ------------#
# I am looking for the most balanced approach
# Complete linkages is the approach that best fits this demand - I will leave only this one here, don't want to get it cluttered# complete
aggl.clust.c <- hclust(gower.dist, method = "complete")
plot(aggl.clust.c,
     main = "Agglomerative, complete linkages") 

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

A 选择聚类
在这里,您将在不同的聚类算法和不同数量的聚类之间做出选择。正如评估经常发生的那样,可能的方式不止一种,辅以 你自己的判断 。它是粗体和斜体,因为你自己的判断 很重要 —聚类的数量应该有实际意义,数据分组的方式也应该有意义。使用分类变量时,您可能最终会得到无意义的聚类,因为它们的值的组合是有限的-它们是离散的,组合的数量也是如此。可能,您也不希望集群数量非常少——它们很可能太过笼统。最后,一切都取决于你的目标和你分析的目的。

从概念上讲,当创建聚类时,您会对不同的数据点组感兴趣,这样,在聚类内它们之间的距离(或紧密度)最小,而组之间的距离(间隔)尽可能大。这直观上很容易理解:点与点之间的距离是从相异度矩阵导出的它们相异度的度量。因此,聚类的评估是围绕紧密性和分离性的评估而建立的。

这里我将采用两种方法,并说明其中一种可能会产生无意义的结果:

在实践中,它们很可能会提供不同的结果,这些结果在某一点上可能会令人困惑-不同数量的聚类将对应于最紧密/最明显分离的聚类,因此判断和理解数据实际上是什么将是做出最终决策的重要部分。

还有一堆测量值,你可以根据自己的情况进行分析。我将它们添加到代码本身。

# Cluster stats comes out as list while it is more convenient to look at it as a table
# This code below will produce a dataframe with observations in columns and variables in row
# Not quite tidy data, which will require a tweak for plotting, but I prefer this view as an output here as I find it more comprehensive library(fpc)cstats.table <- function(dist, tree, k) {
clust.assess <- c("cluster.number","n","within.cluster.ss","average.within","average.between",
                  "wb.ratio","dunn2","avg.silwidth")
clust.size <- c("cluster.size")
stats.names <- c()
row.clust <- c()output.stats <- matrix(ncol = k, nrow = length(clust.assess))
cluster.sizes <- matrix(ncol = k, nrow = k)for(i in c(1:k)){
  row.clust[i] <- paste("Cluster-", i, " size")
}for(i in c(2:k)){
  stats.names[i] <- paste("Test", i-1)

  for(j in seq_along(clust.assess)){
    output.stats[j, i] <- unlist(cluster.stats(d = dist, clustering = cutree(tree, k = i))[clust.assess])[j]

  }

  for(d in 1:k) {
    cluster.sizes[d, i] <- unlist(cluster.stats(d = dist, clustering = cutree(tree, k = i))[clust.size])[d]
    dim(cluster.sizes[d, i]) <- c(length(cluster.sizes[i]), 1)
    cluster.sizes[d, i]

  }
}output.stats.df <- data.frame(output.stats)cluster.sizes <- data.frame(cluster.sizes)
cluster.sizes[is.na(cluster.sizes)] <- 0rows.all <- c(clust.assess, row.clust)
# rownames(output.stats.df) <- clust.assess
output <- rbind(output.stats.df, cluster.sizes)[ ,-1]
colnames(output) <- stats.names[2:k]
rownames(output) <- rows.allis.num <- sapply(output, is.numeric)
output[is.num] <- lapply(output[is.num], round, 2)output
}# I am capping the maximum amout of clusters by 7
# I want to choose a reasonable number, based on which I will be able to see basic differences between customer groups as a resultstats.df.divisive <- cstats.table(gower.dist, divisive.clust, 7)
stats.df.divisive

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

看,average.within,即聚类内观察值之间的平均距离,正在缩小,聚类 SS 内也是如此。平均轮廓宽度有点不直接,但相反的关系仍然存在。

看看星团的大小是多么不成比例。我不会仓促地处理星团中无与伦比的观测数据。其中一个原因是,数据集可能不平衡,一些观察组将在分析中超过所有其他组-这不好,很可能导致偏差。

stats.df.aggl <-cstats.table(gower.dist, aggl.clust.c, 7) #complete linkages looks like the most balanced approach
stats.df.aggl

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

请注意,在每组的观察数量上,更加平衡的聚集完全联系层次聚类是如何进行比较的。

# --------- Choosing the number of clusters ---------## Using "Elbow" and "Silhouette" methods to identify the best number of clusters
# to better picture the trend, I will go for more than 7 clusters.library(ggplot2)**# Elbow
# Divisive clustering**
ggplot(data = data.frame(t(cstats.table(gower.dist, divisive.clust, 15))), 
  aes(x=cluster.number, y=within.cluster.ss)) + 
  geom_point()+
  geom_line()+
  ggtitle("Divisive clustering") +
  labs(x = "Num.of clusters", y = "Within clusters sum of squares (SS)") +
  theme(plot.title = element_text(hjust = 0.5))

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

所以,我们制作了“肘”图。它显示了平方和(作为观察值接近程度的一种度量:平方和越低,分类内的观察值越接近)随着分类数的不同而变化。理想情况下,我们应该在肘部看到一个与众不同的“弯曲”,在那里分裂星系团只会使 SS 略微下降。在下图的情况下,我会选择 7 左右。虽然在这种情况下,一个聚类将只包含 2 个观察值,但让我们看看凝聚聚类会发生什么。

# Agglomerative clustering,provides a more ambiguous picture
ggplot(data = data.frame(t(cstats.table(gower.dist, aggl.clust.c, 15))), 
  aes(x=cluster.number, y=within.cluster.ss)) + 
  geom_point()+
  geom_line()+
  ggtitle("Agglomerative clustering") +
  labs(x = "Num.of clusters", y = "Within clusters sum of squares (SS)") +
  theme(plot.title = element_text(hjust = 0.5))

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

凝聚型“肘”看起来与分裂型相似,只是凝聚型看起来更平滑,而“弯”不那么突兀。与分裂聚类类似,我会选择 7 个聚类,但在这两种方法之间进行选择,我更喜欢凝聚方法产生的聚类的大小——我想要大小相当的东西。

**# Silhouette**ggplot(data = data.frame(t(cstats.table(gower.dist, divisive.clust, 15))), 
  aes(x=cluster.number, y=avg.silwidth)) + 
  geom_point()+
  geom_line()+
  ggtitle("Divisive clustering") +
  labs(x = "Num.of clusters", y = "Average silhouette width") +
  theme(plot.title = element_text(hjust = 0.5))

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

当谈到轮廓评估时,规则是您应该选择使轮廓系数最大化的数字,因为您希望聚类足够独特(远)以被认为是独立的。

轮廓系数的范围在-1 和 1 之间,1 表示类内一致性良好,-1 表示不太好。

从上面的图中可以看出,您不会选择 5 个集群,而会选择 9 个。

作为比较,对于“简单”的情况,轮廓图可能看起来像下图。我们还不完全是,但几乎是。

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

Credits: Data sailors

ggplot(data = data.frame(t(cstats.table(gower.dist, aggl.clust.c, 15))), 
  aes(x=cluster.number, y=avg.silwidth)) + 
  geom_point()+
  geom_line()+
  ggtitle("Agglomerative clustering") +
  labs(x = "Num.of clusters", y = "Average silhouette width") +
  theme(plot.title = element_text(hjust = 0.5))

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

上面的剪影宽度图是在说“你打破的数据集越多,聚类就变得越有特色”。最终,您将得到单个数据点——您不希望这样,如果您尝试使用更大的 k 作为聚类数,您将会看到它。例如,在 *k=30,*我得到了下面的图:

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

所以:你分割得越多,效果越好,但是我们不能分割到单独的数据点(记住我们在上面的图中有 30 个集群,只有 200 个数据点)。

综上所述,在我看来,这种情况下的凝聚聚类看起来更加平衡——聚类大小或多或少是可比的(看看分裂部分中只有 2 个观察值的那个聚类!),我会选择通过这种方法获得的 7 个聚类。让我们看看它们的样子,并检查里面有什么。

该数据集由 6 个需要在 2D 或 3D 中可视化的变量组成,所以是时候接受挑战了!分类数据的性质也造成了一些限制,因此使用一些预定义的解决方案可能会变得棘手。我想 a)了解观察值如何聚集,b)了解观察值如何跨类别分布,因此我创建了 a)彩色树状图,b)每个聚类内每个变量的观察值计数热图。

library("ggplot2")
library("reshape2")
library("purrr")
library("dplyr")*# let's start with a dendrogram*
library("dendextend")dendro <- as.dendrogram(aggl.clust.c)dendro.col <- dendro %>%
  set("branches_k_color", k = 7, value =   c("darkslategray", "darkslategray4", "darkslategray3", "gold3", "darkcyan", "cyan3", "gold3")) %>%
  set("branches_lwd", 0.6) %>%
  set("labels_colors", 
      value = c("darkslategray")) %>% 
  set("labels_cex", 0.5)ggd1 <- as.ggdend(dendro.col)ggplot(ggd1, theme = theme_minimal()) +
  labs(x = "Num. observations", y = "Height", title = "Dendrogram, k = 7")

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

*# Radial plot looks less cluttered (and cooler)*
ggplot(ggd1, labels = T) + 
  scale_y_reverse(expand = c(0.2, 0)) +
  coord_polar(theta="x")

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

*# Time for the heatmap
# the 1st step here is to have 1 variable per row
# factors have to be converted to characters in order not to be dropped*clust.num <- cutree(aggl.clust.c, k = 7)
synthetic.customers.cl <- cbind(synthetic.customers, clust.num)cust.long <- melt(data.frame(lapply(synthetic.customers.cl, as.character), stringsAsFactors=FALSE), 
                  id = c("id.s", "clust.num"), factorsAsStrings=T)cust.long.q <- cust.long %>%
  group_by(clust.num, variable, value) %>%
  mutate(count = n_distinct(id.s)) %>%
  distinct(clust.num, variable, value, count)*# heatmap.c will be suitable in case you want to go for absolute counts - but it doesn't tell much to my taste*heatmap.c <- ggplot(cust.long.q, aes(x = clust.num, y =        factor(value, levels = c("x","y","z",                                                                   "mon", "tue", "wed", "thu", "fri","sat","sun",                                                       "delicious", "the one you don't like", "pizza",                                                             "facebook", "email", "link", "app",                                                             "area1", "area2", "area3", "area4",                                                             "small", "med", "large"), ordered = T))) +

  geom_tile(aes(fill = count))+
  scale_fill_gradient2(low = "darkslategray1", mid = "yellow", high = "turquoise4")*# calculating the percent of each factor level in the absolute count of cluster members*
cust.long.p <- cust.long.q %>%
  group_by(clust.num, variable) %>%
  mutate(perc = count / sum(count)) %>%
  arrange(clust.num)heatmap.p <- ggplot(cust.long.p, aes(x = clust.num, y = factor(value, levels = c("x","y","z",
      "mon", "tue", "wed", "thu", "fri","sat", "sun",                                                                     "delicious", "the one you don't like", "pizza",                                             "facebook", "email", "link", "app",                                             "area1", "area2", "area3", "area4",                                           "small", "med", "large"), ordered = T))) +

geom_tile(aes(fill = perc), alpha = 0.85)+
  labs(title = "Distribution of characteristics across clusters", x = "Cluster number", y = NULL) +
  geom_hline(yintercept = 3.5) + 
  geom_hline(yintercept = 10.5) + 
  geom_hline(yintercept = 13.5) + 
  geom_hline(yintercept = 17.5) + 
  geom_hline(yintercept = 21.5) + 
  scale_fill_gradient2(low = "darkslategray1", mid = "yellow", high = "turquoise4")heatmap.p

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

有了热图,您可以看到初始因素(我们已经开始使用的变量)中每个因素级别有多少观察值。较深的蓝色对应于一个集群中相对较多的观测值。在此图中,您还可以看到,一周中的每一天/购物篮大小在每个箱中都有几乎相同数量的客户,这可能意味着这些对于分析来说不是决定性的,并且可能会被省略。

C 丢失音符
在这篇文章中,我们已经经历了相异矩阵计算,尝试了凝聚和分裂的层次聚类方法,并且用“肘”和“剪影”方法看了一下聚类评估。

在这篇文章中,我们经历了相异度矩阵计算,尝试了凝聚和分裂的层次聚类方法,并对聚类评估进行了研究。

分裂式和凝聚式层次聚类是开始探索的好地方,但是如果您的目标是成为一名聚类大师,请不要止步于此——还有更多的方法和技术出现在那里。与数值数据聚类相比,主要区别在于相异矩阵的计算。从评估的角度来看,并不是所有的标准聚类评估方法都会产生可靠和合理的结果——剪影方法可能会被淘汰。

最后,我做这个练习已经有一段时间了。到目前为止,我看到了我的方法背后的一些缺点,我欢迎任何反馈。我的分析中的一个普遍缺陷在于聚类本身之外— 我的数据集在很多方面都是不平衡的,这个问题仍然没有得到解决。我可以看到它对聚类的影响:有 70%的客户属于一个因素级别(在这种情况下是国籍),这个组控制了大多数产生的聚类,使得很难找出其他因素级别之间的差异。平衡数据集和比较聚类结果是我接下来要尝试的,我会写一篇单独的文章来讨论这个问题。

最后,如果你想克隆,这里有 github 的链接:https://github.com/khunreus/cluster-categorical

希望你喜欢它!

以下是我发现有用的资源:

分层聚类教程(数据准备、聚类、可视化),总的来说,这个博客可能对那些对 R:http://uc-r.github.io/hc_clusteringhttps://uc-r.github.io/kmeans_clustering的商业分析感兴趣的人有用

聚类验证:http://www . sth da . com/English/articles/29-cluster-validation-essentials/97-cluster-validation-statistics-must-know-methods/

文档分类示例(分层和 k-means):https://eight 2 late . WordPress . com/2015/07/22/a-gentle-introduction-to-cluster-analysis-using-r/

denextend 包相当有趣,允许比较不同方法之间的集群结构:https://cran . r-project . org/web/packages/dend extend/vignettes/introduction . html # the-set-function

不仅有树状图,还有聚类图:https://www . r-statistics . com/2010/06/cluster gram-visualization-and-diagnostics-for-cluster-analysis-r-code/

结合聚类热图和树状图:https://JC Oliver . github . io/learn-r/008-gg plot-dendrograms-and-heat maps . html

我个人有兴趣尝试一下在https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5025633/引入的方法,他们的 GitHub 库:https://github.com/khunreus/EnsCat

分层软最大值和负采样:值得讲述的简短笔记

原文:https://towardsdatascience.com/hierarchical-softmax-and-negative-sampling-short-notes-worth-telling-2672010dbe08?source=collection_archive---------0-----------------------

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

感谢观众对我上一篇(也是唯一一篇)致力于单词嵌入的帖子的意外和非常愉快的关注,我很高兴再写一篇:更短更易读。严格地说,这是上一篇文章的延续,因为这里讨论的主题是对方法的更详细的解释,这些方法用于生成单词嵌入,特别是用于使用 softmax 函数计算最后的激活层。Softmax 产生多项式概率分布;我们将接收到的输出向量视为单词的向量表示(上下文单词或简单的输出单词,取决于我们使用的模型)。为什么我们需要新的练习来输出我们的单词向量?他们给了我们什么好处?他们的表现如何,有什么不同?让我们开始这个故事吧,我想我们会明白的。

直觉和先决条件

我之前说过,softmax(归一化指数函数)是输出层函数,它激活我们的每一个节点,作为神经网络计算的最后一步。它用于计算至少两种不同类型的常见单词嵌入: word2vecFastText 。此外,它与 sigmoid 和 tanh 函数一起,是许多情况下神经网络架构的激活步骤。softmax 的公式如下:

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

其中,激活的输出向量的每个元素是给定我们的输入单词 I 的情况下,该单词等于词汇表中第 j 个单词的概率。此外,值得一提的是,输出向量的元素之和等于 1 ,并且它的每个元素都被映射到一个范围*【0,1】*。

以直接方式计算的该算法的计算复杂度是我们的词汇表的大小, O(V) 。实践告诉我们,我们可以通过使用二叉树结构来充分减少它,为什么不呢?

分级 softmax

这种方法背后的主要动机是,我们评估的是以 2 为底的对数 V 而不是 V :

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

这是算法所需的计算复杂度和运算数量的戏剧性变化。我们用二叉树的用法来做,其中树叶代表单词的概率;更具体地,索引为 j 的 leave 是第 j 个字的概率,并且在输出 softmax 向量中具有位置 j

每一个单词都可以通过从根到内部节点的路径到达,内部节点表示沿着这条路径的概率质量。这些值是通过使用简单的 sigmoid 函数产生的,只要我们计算的路径仅仅是这些概率质量函数的乘积,这些函数定义为:

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

在我们的具体案例中 x 是什么?它是通过我们正在使用的单词的输入和输出矢量表示的点积来计算的:

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

其中 n(w,j) 是从根到 w 路径上的第 j 个节点,我们正在计算。更多关于输入和输出单词表示的解释可以在我之前的文章中找到。

实际上,我们可以用概率代替 sigmoid 符号;对于每个内部节点,我们选择一个任意的子节点(左或右),并将正 sigmoid 函数值赋给其中一个(通常是左子节点)。通过保留这些约束,sigmoid 函数可以被视为:

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

对于节点 n 的左子节点,同样对于节点 n 的右子节点:

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

我们已经收集了最终函数计算的所有部分,包括前面的所有步骤,以及对我们选择的任意节点(右或左)的布尔检查:

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

其中,尖括号表示布尔检查大小写是真还是假; L(w) 是树的深度; ch(n) 是节点 n 的子节点。

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

如果树有根节点、2 个内部节点和叶节点,很明显我们正在执行 3 步计算,这足以减少我们正在做的操作的数量。

负采样

负采样思想是基于噪声对比估计的概念(类似于生成性对抗网络),它坚持认为,一个好的模型应该通过逻辑回归来区分伪信号和真实信号。此外,负采样目标背后的动机类似于随机梯度下降:不是每次都改变所有的权重,同时考虑到我们拥有的所有成千上万个观察值,我们只使用其中的 K 个,并且也显著提高了计算效率(取决于负样本的数量)。

一次观察的负采样目标看起来像:

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

正如我们所看到的,与随机梯度下降的不同之处在于,我们考虑的不仅仅是一个观察值,而是其中的 K 个。

我们使用的概率分布是噪声分布(将在后面更详细地描述)。我们使用这种噪声分布的原因是我们试图解决区分真实数据和虚假数据的挑战。

合适的噪声分布是一元分布 U(w) 定义为:

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

其中 3/4 为实验得出的值; f(w) 是该词在语料库中的出现频率。

如果我们说的是取自 word2vec 理论的 skip-gram 模型,那么负样本就是词,不是上下文词;正面的例子当然是语境词。

结论

我不能称这篇文章为一篇有价值的文章,至少因为我花了不超过一个小时来写这篇文章;网上还有很多更详细的帖子专门针对不同类型的 softmax,包括差异化 softmax,CNN-softmax,目标采样等。比如,塞巴斯蒂安·鲁德的这篇文章。我试图尽可能多地关注复杂公式的简单解释和给定算法的优点,这使得它们在给定的领域中最受欢迎。正如从文本中所理解的,所提到的方法更多地从数学公式和机器学习方法的角度进行描述,然后从实际实施的角度进行描述(通常,这些算法已经在标准 gensim/tensorflow 库中采用)。

使用 HAProxy 和 Heartbeat 实现负载平衡的高可用性 MySQL 集群。

原文:https://towardsdatascience.com/high-availability-mysql-cluster-with-load-balancing-using-haproxy-and-heartbeat-40a16e134691?source=collection_archive---------1-----------------------

你好,在这篇文章中,我想分享一些从两个主 MySQL 节点构建高可用性 MySQL 数据库集群的经验,该集群具有基于 HAProxy & Heartbeat 的负载平衡和故障转移功能。

在大多数现代项目中,数据库可用性是生死攸关的问题。好的解决方案是从一个以上的 MySQL 服务器创建一个分布式数据库集群,它可以负责负载平衡、故障转移功能和数据复制。此外,您可以拆分传入的请求并处理高负载。

在这个例子中,我将展示从两个主节点创建一个 MySQL 集群,主要思想是创建一对具有相同配置的服务器和一个用于接收请求的虚拟 IP。即使完全失去其中一个节点,该群集也将继续工作。

我们将使用两台服务器(虚拟或裸机),上面安装一对 MySQL masters 和一对 HAProxy,主虚拟 IP 将配置 Heartbeat。请注意,在本例中,一个时间段内仅使用一个 HAProxy,第二个 HAProxy 将处于热储备状态。MySQL 服务器将循环使用负载平衡类型。

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

选择具有两个服务器的模式是为了使示例更简单。当然,如果您有额外的服务器,您可以创建更复杂的配置,将 HAProxy 与 Heartbeat 放在外部 LB 集群中等等。但是无论如何,这个例子对于在你的项目中构建一个强大的数据库集群来说已经足够了。

0。正在准备。

首先,我们需要为 MySQL 复制和 HAProxy with Heartbeat 选择几个子网,最好将它们分开,如果您的服务器有几个网络接口,也将这些子网放在不同的接口上。

192 . 168 . 0 . 0/24-DB 流量网络

MySQL1 的 192.168.0.1 IP,MySQL2 的 192.168.0.2 IP。

10.10.10.0/24 -心跳网络& HAProxy。

10.10.10.1 虚拟 IP 用于取请求,10 . 10 . 2主 IP 用于服务器 110.10.10.3 主 IP 用于服务器 2

事实上/29 子网就足够了:)

1。用主-主复制配置 MySQL 服务器。

首先,我们需要在两台服务器上安装 MySQL:

# apt-get update && apt-get upgrade -y# apt-get install mysql-server mysql-client

然后在第一个和第二个节点上编辑 /etc/mysql/my.cnf ,以启用 mysql 服务器之间的复制,并使它们使用来自 192.168.0.0/24 子网的 IP:

服务器 1 配置。

[mysqld]bind-address    = 192.168.0.1server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
expire_logs_days    = 10
max_binlog_size     = 100M
log_slave_updates   = 1
auto-increment-increment = 2
auto-increment-offset = 1

Server2 配置。

[mysqld]bind-address    = 192.168.0.2server_id           = 2
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
expire_logs_days    = 10
max_binlog_size     = 100M
log_slave_updates   = 1
auto-increment-increment = 2
auto-increment-offset = 2

然后重新启动它们,并确保 MySQL 叶在指定的 IP:

server1# systemctl restart mysqlserver1# netstat -ntlpActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.0.1:3306        0.0.0.0:*               LISTEN      9057/mysqldserver2# systemctl restart mysqlserver2# netstat -ntlpActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.0.2:3306        0.0.0.0:*               LISTEN      8740/mysqld

现在将为数据库之间的复制创建一个用户,你可以使用 pwgen 实用程序来生成足够强的密码。连接到每个 MySQL 服务器,并使用来自对方服务器的 IP 创建该用户:

server1# mysql -u root -pMariaDB> GRANT REPLICATION SLAVE ON *.* TO 'replicauser'@'192.168.0.2' IDENTIFIED BY 'somestrongpassword';server2# mysql -u root -pMariaDB> GRANT REPLICATION SLAVE ON *.* TO 'replicauser'@'192.168.0.1' IDENTIFIED BY 'somestrongpassword';

检查复制用户是否可以访问每台 MySQL 服务器。

server1# mysql -u replicauser -p -h 192.168.0.2
Enter password: somestrongpassword
Welcome to the MariaDB monitor.  Commands end with ; or \g.bla bla....server2# mysql -u replicauser -p -h 192.168.0.1
Enter password: somestrongpassword
Welcome to the MariaDB monitor.  Commands end with ; or \g.bla bla....

好了,现在我们可以继续配置 MySQL 服务器之间的复制。从那时起,最好从两个 MySQL 服务器打开两个控制台,因为我们需要根据另一个服务器的输出输入命令。

获取服务器 1 上的 MySQL 主服务器状态:

server1# mysql -u root -pMariaDB> SHOW MASTER STATUS;+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      531 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

我们需要这个输出中的文件位置信息。打开 server2 上的 MySQL 控制台,配置与第一台服务器的从属关系。

server2# mysql -u root -pMariaDB> STOP SLAVE;MariaDB> CHANGE MASTER TO master_host='192.168.0.1', master_port=3306, master_user='replicauser', master_password='somestrongpassword', master_log_file='mysql-bin.000002', master_log_pos=531;MariaDB> START SLAVE;

现在从 server2 查询主服务器状态,并在第一台服务器上为 MySQL 配置从服务器关系。

server2# mysql -u root -pMariaDB> SHOW MASTER STATUS;+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      531 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)server1# mysql -u root -pMariaDB> STOP SLAVE;MariaDB> CHANGE MASTER TO master_host='192.168.0.2', master_port=3306, master_user='replicauser', master_password='somestrongpassword', master_log_file='mysql-bin.000002', master_log_pos=531;MariaDB> START SLAVE;

好了,如果一切都做对了,我们必须在 MySQL 主服务器之间建立一个有效的复制。您可以创建一些测试数据库并检查这一点。

server1# mysql -u root -pMariaDB> CREATE DATABASE TESTDB;
MariaDB> CREATE TABLE TESTDB.REPLICA (`id` varchar(40));

然后检查该数据库是否也出现在第二台服务器上:

server2# mysql -u root -pMariaDB> SHOW TABLES IN TESTDB;
+------------------+
| Tables_in_TESTDB |
+------------------+
| REPLICA          |
+------------------+
1 row in set (0.00 sec)

正如您所看到的,TESTDBbase 被成功地复制到了 server2。我们刚刚完成了创建故障转移集群的第一阶段。

2.在两台服务器上配置 HAProxy。

在第二阶段,我们将在两台服务器上安装和配置两个完全相同的 HAProxy,用于平衡 MySQL 服务器之间的传入请求。

首先,我们需要在我们的 MySQL 服务器上添加额外的用户(用户必须在没有任何密码的情况下创建),该用户将由 HAProxy 用于检查 MySQL 服务器的健康状态。

server1# mysql -u root -pMariaDB> CREATE USER 'haproxy_check'@'%';
MariaDB> FLUSH PRIVILEGES;

您可以在我们的任何 MySQL 服务器上创建这个用户,因为我们在它们之间配置了一个复制。使用以下命令检查用户是否已添加:

server1# mysql -u root -p -e "SELECT User, Host FROM mysql.user"
Enter password: 
+---------------+-------------+
| User          | Host        |
+---------------+-------------+
| haproxy_check | %           |
| replicauser   | 192.168.0.2 |
| root          | localhost   |
+---------------+-------------+server2# mysql -u root -p -e "SELECT User, Host FROM mysql.user"
Enter password: 
+---------------+-------------+
| User          | Host        |
+---------------+-------------+
| haproxy_check | %           |
| replicauser   | 192.168.0.1 |
| root          | localhost   |
+---------------+-------------+

此外,让我们创建一个具有 root 权限的用户,以便稍后进行一些测试请求:

server1# mysql -u root -pMariaDB> CREATE USER 'haproxy_root'@'%' IDENTIFIED BY 'password';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'%';

现在是安装 HAProxy 的时候了:

server1# apt-get install haproxy
server2# apt-get install haproxy

保存原始配置并创建新配置:

server1# mv /etc/haproxy/haproxy.cfg{,.back}
server1# vi /etc/haproxy/haproxy.cfg

接下来,在两台服务器上添加此配置:

global
    user haproxy
    group haproxydefaults
    mode http
    log global
    retries 2
    timeout connect 3000ms
    timeout server 5000ms
    timeout client 5000mslisten stats
    bind 10.10.10.1:9999
    stats enable
    stats hide-version
    stats uri /stats
    stats auth statadmin:statadminpasslisten mysql-cluster
    bind 10.10.10.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql-1 192.168.0.1:3306 check
    server mysql-2 192.168.0.2:3306 check

可以看到,两个 HAProxy 服务都将使用 10.10.10.1,共享 IP 地址。这个虚拟 ip 将在服务器之间移动,因此我们需要使用一些技巧并启用net . IP v4 . IP _ non local _ bindsysctl 选项,以允许系统服务绑定在非本地 IP 上。

将此选项添加到文件 /etc/sysctl.conf 中:

*server1# vi /etc/sysctl.conf*net.ipv4.ip_nonlocal_bind=1*server2# vi /etc/sysctl.conf*net.ipv4.ip_nonlocal_bind=1

那就跑

*sysctl -p*

之后,我们可以在两台服务器上启动 HAProxy:

server1# systemctl start haproxy
server2# systemctl start haproxy

检查它们是否在共享 IP 10.10.10.1 上启动:

server1# netstat -ntlp Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 
tcp 0 0 192.168.0.1:3306 0.0.0.0:* LISTEN 918/mysqld 
tcp 0 0 10.10.10.1:3306 0.0.0.0:* LISTEN 802/haproxy 
tcp 0 0 10.10.10.1:9999 0.0.0.0:* LISTEN 802/haproxy 
tcp 0 0 10.10.10.2:22 0.0.0.0:* LISTEN 785/sshdserver2# netstat -ntlpActive Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 
tcp 0 0 192.168.0.2:3306 0.0.0.0:* LISTEN 918/mysqld 
tcp 0 0 10.10.10.1:3306 0.0.0.0:* LISTEN 802/haproxy 
tcp 0 0 10.10.10.1:9999 0.0.0.0:* LISTEN 802/haproxy 
tcp 0 0 10.10.10.3:22 0.0.0.0:* LISTEN 785/sshd

一切看起来都很好,两台服务器都是使用虚拟 IP 启动的,我们还在 9999 端口上配置了一个统计页面,因此您可以使用 statadmin:statadminpass 在http://10 . 10 . 10 . 1:9999/stats上检查 HAProxy 状态。

3.使用共享 IP 配置心跳。

在最后一个阶段,我们需要在两台服务器上配置 Heartbeat 服务,并创建共享的 IP,它将用于处理传入的请求。如果其中一台服务器发生问题,这个 IP 将在服务器之间迁移。

在两台服务器上安装 Heartbeat:

server1# apt-get install heartbeat
server1# systemctl enable heartbeatserver2# apt-get install heartbeat
server2# systemctl enable heartbeat

现在我们需要为它创建一些配置文件,它们对于 server1 和 server2 来说基本相同。

创建一个 /etc/ha.d/authkeys ,在这个文件中心跳存储数据来认证对方。两个服务器上的文件将是相同的:

server1# vi /etc/ha.d/authkeysauth 1
1 md5 securepassserver2# vi /etc/ha.d/authkeysauth 1
1 md5 securepass

securepass 改为您的强安全密码。此外,该文件只需要由 root 用户拥有,因此:

server1# chmod 600 /etc/ha.d/authkeys
server2# chmod 600 /etc/ha.d/authkeys

接下来将在两台服务器上为 Heartbeat 创建一个主配置,对于 server1 和 server2 会有一点不同,创建 /etc/ha.d/ha.cf :

服务器 1

server1# vi /etc/ha.d/ha.cf#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  ens18
mcast ens18 225.0.0.1 694 1 0
ucast ens18 10.10.10.3
#       What interfaces to heartbeat over?
udp     ens18
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    server1
node    server2

服务器 2

server1# vi /etc/ha.d/ha.cf#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  ens18
mcast ens18 225.0.0.1 694 1 0
ucast ens18 10.10.10.2
#       What interfaces to heartbeat over?
udp     ens18
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    server1
node    server2

您可以通过在您的服务器上运行uname -n来获得这个配置的节点名称。

最后,我们需要在服务器 1 和服务器 2 上创建 /etc/ha.d/haresources 文件。文件是相同的,在这个文件中,我们将默认声明我们的共享 IP 地址和主节点:

server1# vi /etc/ha.d/haresourcesserver1 10.10.10.1server2# vi /etc/ha.d/haresourcesserver1 10.10.10.1

毕竟,让我们在两台服务器上启动我们的心跳服务,您必须看到,在服务器 1 上,我们已经启动了虚拟 IP:

server1# ip a 
....
2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bla:bla:bla:bla brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global ens19
       valid_lft forever preferred_lft forever
    inet6 fe80::bla:bla:bla:bla/64 scope link 
       valid_lft forever preferred_lft forever
3: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bla:bla:bla:bla:bla:bla brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.2/24 brd 10.10.10.255 scope global ens18
       valid_lft forever preferred_lft forever
    inet 10.10.10.1/24 brd 10.10.10.255 scope global secondary 
....

好了,现在我们在 server1 上分配了虚拟 IP,HAProxy 监听它,所以我们可以检查它是如何工作的,发出测试请求。从一些外部服务器运行以下命令:

# mysql -h 10.10.10.1 -u haproxy_root -p -e "show variables like 'server_id'"Enter password: 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+# mysql -h 10.10.10.1 -u haproxy_root -p -e "show variables like 'server_id'"Enter password: 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

一切正常,你可以看到我们的 MySQL 服务器之间的“循环”平衡。现在,我们需要检查故障转移,例如当服务器 1 离线时。转到并重新启动或关闭服务器 1,检查虚拟 IP 是否已移动到服务器 2,对 MySQL 服务器的请求是否仍然正常,但现在服务器 2 上只有 MySQL 会响应:

server2# ip a 
....
2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bla:bla:bla:bla brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.2/24 brd 192.168.0.255 scope global ens19
       valid_lft forever preferred_lft forever
    inet6 fe80::bla:bla:bla:bla/64 scope link 
       valid_lft forever preferred_lft forever
3: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bla:bla:bla:bla:bla:bla brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.3/24 brd 10.10.10.255 scope global ens18
       valid_lft forever preferred_lft forever
    inet 10.10.10.1/24 brd 10.10.10.255 scope global secondary 
....

再次检查 MySQL 请求:

# mysql -h 10.10.10.1 -u haproxy_root -p -e "show variables like 'server_id'"Enter password: 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+# mysql -h 10.10.10.1 -u haproxy_root -p -e "show variables like 'server_id'"Enter password: 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

在服务器 1 恢复在线后,虚拟 IP 将被移回服务器 1。

我们做到了,我们刚刚配置并测试了我们的 MySQL 集群,它现在已经准备好为请求提供服务。

祝你好运。

带有 R 的高分辨率天气数据

原文:https://towardsdatascience.com/high-resolution-weather-data-with-r-410e5e5f12e5?source=collection_archive---------3-----------------------

我们在 WeatherDecTech 遇到的一个棘手问题是客户需要大量天气数据,但没有科学数据格式的经验。

自从我们的高分辨率分析数据(NetCDF 格式)发布以来,这个问题越来越频繁地出现。虽然我们过去提供过 CSV 文件,但是这种方法有很多限制。

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

Australian High Resolution Hourly Temperature

最大的问题是 CSV 文件的大小通常是 NetCDF 的 20-30 倍。因此,查看我们对 10 个变量一年的每小时分析数据,NetCDF 分布可能为 750GB,而同等 CSV 数据为 20TB。

使用 NetCDF 数据的其他好处在其常见问题解答中有最佳描述:

NetCDF 数据是:

自诩。netCDF 文件包含有关它所包含的数据的信息。

便携。netCDF 文件可以由具有不同存储整数、字符和浮点数方式的计算机访问。

可扩展。可以有效地访问大型数据集的小子集。

可追加。可以将数据附加到结构正确的 netCDF 文件中,而无需复制数据集或重新定义其结构。

可共享。一个编写器和多个读取器可以同时访问同一个 netCDF 文件。

可建。该软件的当前和未来版本将支持对所有早期形式的 netCDF 数据的访问。

虽然好处是显而易见的,但这仍然不能使格式变得容易使用。为了解决这些可访问性问题,我又写了 2 个 R 包。第一个是一个瘦 API 包装器,它允许你以一种方便的方式下载数据:skywisedataferrer

用法很简单:

> Authorize('app_id', 'app_key')
> DataTransfer('skywise-conus-surface-analysis', directory = '.')

第二个是用于处理 NetCDF 文件的库: SkyWiseNetCDFR

# extract the temperature grid
> grid <- ExtractGrid(fileName, "temperature")

# find the data value at a certain lat / lon
> val <- GetValueAtPoint(35, -97, grid)# Extract a subset of the grid
> vals <- mapply(GetValueAtPoint, lats, lons, MoreArgs = list(grid))

如果你想访问这些数据,请访问 WDT 进行注册或联系销售。

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

CONUS High Resolution Temperature

本周三位一体镜像数据单元的亮点

原文:https://towardsdatascience.com/highlights-from-the-trinity-mirror-data-unit-this-week-58ba5ecb48b7?source=collection_archive---------9-----------------------

以性别薪酬差距、传染病、自动化在新闻中的作用以及我通常对德比郡的春季抱怨为特色,只有数据支持。(算是吧。)

打破性别薪酬差距

所以我们都看到了本周的全国头条新闻,揭示了性别薪酬差距最大和最小的公司。与此同时,数据部门的 Claire Miller 正忙于提取 Trinity Mirror 图书的本地列表,将每家公司注册地址的邮政编码与我们覆盖的每种图书的读者足迹列表进行匹配。

结果呢?一个重要的全国性故事变成了一个重要的地方性故事 x 40(这是 Claire 摘录的许多地方性电子表格)。你可以在这里看到一个例子:

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

Read this story here

如果你对全国的性别工资差异感兴趣,你可能也会喜欢我们上个月做的这个互动。输入你的工资、邮编和性别,找出你的平均收入比男人(或女人)多(或少)多少。

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

Try this interactive here

…公司只支付最低工资

上面的例子很好地说明了在本地化的数据集中寻找故事并不一定要挑出最好的、最差的、进步最快的等等。

这是一个数据记者很容易陷入的陷阱:故事必须主要是一个数据故事;它必须涉及某种比较,无论是与其他地区或另一个时间点。

嗯,不。这些比较可能就是故事。但它们可能只是故事的有用背景。

有时,数据在任何地方都讲述着大致相同的故事。或者,更准确地说:有时,出于完全相同的原因,不止一个地方对关于 X 的相同数据感兴趣,不管它是否显示其中一个地方在 X 处更好或更差。

这是本周的另一个例子:Deb Aru 分解了支付员工最低工资的公司的数据。

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

Read this story here

显然,如果一个地方有全国最差的数据,那显然是新闻专线。但在大多数地方,大多数时候,(当地)读者主要不是问:“在支付高于最低工资方面,我所在的地区与英国其他地区相比如何?”相反,他们在问:“在我所在的地区,有多少人的工资不超过最低工资?”

传染病继续激增

Claire 对什么地方的数据集已经发布,什么时候发布,有着难以置信的了解;作为该团队事实上的新闻编辑,她还保留了一份精心挑选的日记,记录了未来几天和几周将要公布的数据。

结果是,她总是第一个在定期发布的本地数据集中发现趋势和突发事件,否则可能会被忽视。

一个很好的例子是她对猩红热和麻疹病例的法医监测。令人担忧的是,最近几个月病例一直在上升——这一趋势在本周的新数据中得以延续。

这里是她写的关于麻疹的两个故事,包括一个将伯明翰、加的夫和利兹确定为最新爆发热点的全国版本:

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

Read this story here

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

Read this story here

这里有两个她写的关于猩红热的当地故事:

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

Read this story here

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

Read this story here

自动新闻

有时你会在本地数据集中找到新闻;有时它会跳出来打你的脸。

我之前提到过我们的一个副业项目是如何为 Trinity Mirror 的周刊提供自动打印页面的。他们告诉我们他们覆盖的邮政编码、地方当局、健康信托等;我们用它从常规发布的数据集中提取本地信息,通过图形模板运行,页面显示为 pdf。

本周的主题是车辆犯罪,当我在全国各地校对网页时,有一件事引起了我的注意。这是一个康沃尔作品的页面:

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

如果我们把左上角放大一点:

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

这是一个重要的,潜在的高新闻价值的上涨,我们目前正在检查。这也是我们发现的一个上升,因为我校对了自动生成的一个页面

好吧,这是人为干预。尽管如此,这是“机器人新闻”让我兴奋的一点:编程的前景是获取常规数据,并提醒记者有重大新闻价值的变化。

官方:今年英超和英冠垃圾

如果你——像我一样——是德比郡的球迷,你会知道其他人称为“复活节假期”的那段时间是另一回事。也就是:“德比的崩溃和所有晋级的希望再次破灭的时候”。

今年应该是我们的一年。不过话说回来,年都应该是我们的一年。特别烦的是 2017/18 赛季的总冠军感觉有点,嗯,垃圾。

但是是吗?嗯,本周该小组的 Rob Grant 指出的一个因素是去年从英超降级的球队相对糟糕的表现。

米德尔斯堡、赫尔和桑德兰目前分别排名第六、第十八和第二十三。如果他们在那里结束,这将是自 2004/05 赛季冠军更名以来最差的总成绩。

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

Read this story here

不过,英超联赛的观众不应该太得意。随着富人越来越富,穷人越来越穷,英格兰顶级联赛大肆吹嘘的“竞争力”可能正在减弱。

我们的体育数据记者 David Dubas-Fisher 本周对这一问题进行了研究,发现以 3 个或更多进球获胜的英超比赛数量将达到 1958/59 赛季以来的最高水平。

我们这周做的其他事情

在报纸报道方面,《哈德斯菲尔德审查员》对我上周提到的安妮·高克对被看护儿童的调查进行了大篇幅报道:

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

与此同时,《曼彻斯特晚报》将我们对逃学率的研究放在了其奥尔德姆版的头版:

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

我们的摄像师 Mark Magill 第一次使用了他的“摇头管理器”,它最终将成为我们为各种三一镜报制作的视频生成工具的基础:

哦,我在 Twitter 上进行了一次有趣的讨论,讨论的基础是我快速制作的一张地图,上面显示了每个住宅的平均市政税账单,而不是通常用于讨论这个问题的“D 级”税率。如果你对此感兴趣(面对现实吧,如果你已经读到这里,你是我最好的选择),你可以点击这里:

祝你周末愉快。

本周三位一体镜像数据单元的亮点

原文:https://towardsdatascience.com/highlights-from-the-trinity-mirror-data-unit-this-week-7f3b520c82f9?source=collection_archive---------13-----------------------

因为我在罗马,所以比计划的时间晚了一点,这里是该部门上周所做的一些数据新闻工作的简要介绍。

警察倒下了,犯罪上升了

谁能想到,当你把警察人数削减到最低限度时,犯罪率会有所上升?克莱尔·米勒决定在全国范围内运行三一镜报的数据,结果非常明显。

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

在大曼彻斯特地区,自 2010 年以来,记录在案的暴力犯罪增加了两倍,而该地区的警察队伍却损失了 2000 名警官和 1000 名文职人员。政府否认任何形式的因果联系,尽管一份泄露的内政部报告(和当地政客)声称并非如此。

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

不仅仅是曼彻斯特:这里的是《提赛德公报》对克莱尔的作品所做的评价(这里的暴力犯罪上升了 70%,警察人数下降了四分之一)。

紧张的国民保健服务

NHS 的年度员工调查清楚地展示了另一个面临压力的公共服务。克莱尔(再次)分析了当地的数字,同样的画面一次又一次地出现:卫生工作者越来越感到工作过度,工资过低,并担心是否有足够的资源来完成他们的工作。

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

《剑桥新闻》(将近一半的医院工作人员说人手不够)在克莱尔的公告栏上大肆渲染;你也可以阅读她为巴斯、伯明翰和林肯郡所写的文章,前者有 43%的员工因压力而感到不适,后者有 45%的员工对薪酬不满,高于去年的 33%。

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

我们也做了视频,你可以在上面的任何链接上看到。

我用数据选了一匹国马。它输了。

国家大饭店。一个分裂的英国团结一致大喊“你真没用”的时代电视上一些可怜无辜的马。

这也是数据单元开始更新它的“使用数据挑选一匹马”小工具的时候。

这是一件相当简单的事情。我们把选马归纳为四个要素:几率、体重、骑师的评级和马最近的状态。人们向左或向右移动滑块,这取决于这些因素对他们的重要性,我们将这些因素与数据进行匹配。

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

对于这种一直被认为是半开玩笑的东西,这个小工具使用了相当复杂的合成算法。这也是我们用于其他目的的模板,包括“如果我想在英国退出欧盟之后离开英国去欧洲生活,我应该搬到哪个国家”。(显然卢森堡,对我来说。)

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

近年来,这个大国家的小玩意对我并不友好:我最近挑选的大多数数据都幸运地越过了第一道栅栏。今年它选择了 Pleasant Company(见上图),该公司以 25/1 的赔率获得第二名。太好了!

除了我没有赌这场比赛,因为我在罗马。(这个我可能提过。)

不寻常的名字

所以我们都知道国家统计局每年发布的全国“最受欢迎的名字”数据集——如果你对此感兴趣,你可以用我们的小工具在这里绘制你的名字多年来的受欢迎程度。但你知道吗,英国国家统计局还发布了一个地区分类,显示哪些名字在某些地区比其他地区更受欢迎?

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

例如,东北地区特别喜欢它的森林和小树林。去年,西米德兰兹郡有许多玫瑰和扎卡里亚。与此同时,伦敦的父母似乎喜欢米歇尔和锡安这两个名字。你可以通过克莱尔为哈德斯菲尔德莱斯特德比写的故事的链接之一阅读完整的分析(或观看我们的完整结果视频)。

离家出走的寄养儿童

我们最近做了很多关于受照料儿童前景的调查工作:那些因为无论什么原因,他们的父母不能照顾他们而成为国家责任的人。

其中一个方面是被看护的儿童更容易失踪;并不总是持续很长时间,但确实是经常性的。一个下落不明的孩子,显然是一个有潜在危险的孩子。

上周,我们看了显示从寄养家庭出走的儿童人数的数据,利物浦回声报确实非常突出地使用了这些数据:

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

《回声报》的汤姆·霍顿(Tom Houghton)利用当地的引用和见解,在开发我们的数据故事方面做得很好。这是一个很好的例子,说明我们希望如何在这些问题上与三一合作,我建议你读一读

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

其他东西

黛比·阿鲁发现每四个小时就有人因被狗咬伤而住院——你可以通过这些链接查看她为伯明翰德比郡诺丁汉写的这个(极其受欢迎的)故事的版本。

安妮·古克(Annie Gouk)观察了每个地区长期空置的房产数量(主要由私人房东拥有),并将它们与由于显然没有合适的住所而被安置在招待所和住宿加早餐的无家可归者的数量进行了比较。样本数据:在整个西米德兰兹郡,有 687 个家庭因为无家可归而住进了 B&的寄宿处和招待所。仅在考文垂就有 1364 套公寓和房屋空置超过 6 个月。看故事这里

我们还发现,令人惊讶的是,在线欺诈在许多地方都有所下降(例如,在赫尔市下降了三分之一),而大卫·杜巴斯-费希尔证明了(也许难以令人信服)德比郡臭名昭著的 2007/08 赛季可能不是任何职业足球俱乐部有史以来最糟糕的赛季。

最后,衷心祝贺该部门的 Rob Grant,他因今年的个人作品集获得了数据新闻奖提名。这里可以看到

*罗马令人惊叹

这真的是这样的一个伟大的城市度过了一个漫长的周末(虽然,在回顾我的照片后,我似乎花了大部分时间在梵蒂冈博物馆拍摄儿童谋杀天鹅的怪异雕像)。

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

本周三位一体镜像数据单元的亮点

原文:https://towardsdatascience.com/highlights-from-the-trinity-mirror-data-unit-this-week-b39d05dbeee0?source=collection_archive---------6-----------------------

圣帕特里克节前夕快乐!这里是我们本周披露的一些独家数据,以及它们出现的一些标题的链接。

学校:更少的钱+更多的学生+失败的学校=一个重要的问题

学校是怎么回事?在托尼·布莱尔时代,教育是头等大事:“教育,教育,教育”。这是每个父母都非常关心的事情(因此也是大多数成年人关心的事情)。然而,当政客们——相当正确地——谈论 NHS 的现金危机时,对困扰我们教育系统的问题的讨论却少得多。

本周,我们做了一些数据工作,预测未来几个月和几年需要的学校数量。

事实证明,像伯明翰这样的城市——那里的人口,特别是年轻人口,增长极快——到 2021 年 9 月将需要 12000 个名额,到今年 9 月需要 5000 个。

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

Read the story here

当然,不仅仅是伯明翰。数据单元的克莱尔·米勒也为许多其他地方写了基本相同的故事,包括 T2 利兹 T3、T4 巴斯 T5 和剑桥 T7。

与此同时,学校可花的钱越来越少,正如克莱尔本周所展示的,许多失败的学校多年来一直在努力寻找学院的赞助。

世界上两个商店扒手…

该小组的安妮·高克做了一些分析,发现在美国部分地区,入店行窃的比率急剧上升。原因?嗯,你可以振振有词地将这种低层次的贪婪犯罪与紧缩、工资停滞和生活成本上升联系起来。

但是这些数字并不能方便地与被剥夺联系起来,而且在任何情况下,店主自己都有另一种解释:法律的改变意味着警察不会调查价值低于 200 英镑的物品的失窃。

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

Read the story here

自从法院裁定收养应该是最后的解决办法后,收养率直线下降

多年来,委员会和机构已经花费了大量的时间、金钱和努力来促进收养。

尽管如此,我们本周透露,在上一个财政年度,英国大部分地区找到永久新家的被照看儿童数量显著下降。

我是说意义重大。例如:布里斯托尔有 25 例这样的收养,低于前一年的 45 例,而赫尔的数量从 2013/14 年的 90 例下降到今年的 45 例。在整个东北部,2013/14 年度有 390 起,但 2016/17 年度只有 300 起。

收养机构表示,关键的变化是由最高法院和上诉法院做出的两项法院裁决,这两项裁决明确表明了将孩子归还给亲生父母、大家庭或养父母的偏好。

你可能会说这是件好事。这可能确实是一件好事。但是我们也发现接受看护的儿童数量并没有下降。因此,我们不能假设一个快乐的结局:事实上,数据中没有充分的理由认为儿童错过了被收养的机会,因为他们被送回了亲生父母身边。

4 空房子,价格上涨

因此,我们看了一下关于空置房屋数量的新数据,它在全国范围内发出了相当严峻的信号——特别是当无家可归者的比率回到自 2004 年峰值以来从未见过的水平时。

你可能会认为让房屋空置可能意味着需求不足和随之而来的供应过剩,从而导致价格下跌。不幸的是,情况似乎并非如此:例如,在格里姆斯比,有 3000 多套空置房产,但平均价格仍是平均工资的 5 倍。

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

Read the story here

5 其他材料

安妮·高克(Annie Gouk)表示,在像 T2 肯特(Kent)和 T4 利兹(Leeds)这样的地方,宗教和种族仇恨犯罪达到了创纪录的水平(这是多么反常的一件好事),而黛比·阿鲁(Deb Aru)透露,尽管求助需求不断增加,但在雷丁(Reading)这样的地方,性健康支出却下降了一半。

在体育方面, David Dubas-FisherCarlos Novoa 为切尔滕纳姆金杯重建了他们的“使用数据挑选你的马”小工具,而它再次让我非常失望

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

你仍然可以在不同的 Trinity Mirror 网站上试用这个小工具(看看你是否能反向工程出真正的赢家,因为我不知道我能不能做到),例如这里的或这里的或这里的。

本周我最喜欢的一个版面是这个,Alice Cachia 和 Kelly Leung 披露了越来越多的骑自行车的人死于路面坑洼:

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

最后,这是我做的一张奖金图,显示了每个地方政府中自称是爱尔兰裔的人的比例。

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

结论:如果你想度过一个美好的圣帕特里克节,去伯明翰、曼彻斯特或伦敦吧。

祝你周末愉快。

本周三位一体镜报数据单元的亮点是:对被看护儿童的深入调查,查明有逃学问题的学校,以及揭露一波“不加区别的”国民保健服务罚款

原文:https://towardsdatascience.com/highlights-from-the-trinity-mirror-data-unit-this-week-deep-dive-investigation-into-children-in-5da3ef7cc0e0?source=collection_archive---------8-----------------------

上周没有综述,但我们从上周五开始就一直很忙,所以我将把这限制在我们自那以来所做的一些事情上。

被照管的儿童:一个深入的数据项目

数据记者 Annie Gouk 对围绕重要社会问题的当地数据进行了多次“深度”调查。你可以在这里看到她以前围绕种族不平等的一些作品,或者在这里看到性别差距的不同方面。

本周——实际上是今天——我们发表了她对在看护环境中长大的儿童的生活机会的最新调查。除此之外,还有一些令人震惊的新闻:例如,利兹只有 5%的被看护儿童会被收养,而默西塞德被看护的儿童被判有罪的可能性是其他儿童的两倍。

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

View this video here

但这不仅仅是新闻热线。Annie 还讲述了一系列 explainer 视频(你可以在下面的链接中找到),视频采访案例研究,并与编码器 Carlos Novoa 和设计师 Kelly Leung 合作,创建了一个邮政编码搜索互动,让读者可以获得他们当地受照顾儿童的大量数据。这一点很重要:你越是将新闻个性化,读者的反应就越强烈。

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

通过安妮在这里开始的线索,你可以看到许多三一出版社的报道:

无家可归——猜猜看,它正在上升

在全国范围内,无家可归者——不要与露宿街头混淆——自 2010 年以来一直在攀升,并在 21 世纪初达到顶峰。

任何不是因为自己的过错而失去家园的人正式成为无家可归者,重新安置他们的责任落在了当地议会的肩上。众所周知,地方议会受到了预算大幅削减的打击。结果,你得到了一场完美的风暴:更多的人失去了他们的房子,而议会却没有足够的资金和人员来为他们寻找新的房子。

Rob Grant 对最新的无家可归人数做了一些地方层面的分析,发现在许多地区无家可归人数不再攀升,而是直线上升。在城市中尤其如此。例如,在考文垂,Rob 发现在临时住所的无家可归家庭的数量在一年内几乎翻了一番,为《每日电讯报》提供了这样的头版:

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

你可以在这里阅读完整的故事,或者谷歌其他版本的 Rob 写的该集团的其他标题。

与此同时,该部门的 Deb Aru 正在调查无家可归的家庭在处理他们的住房福利申请时如何面对邮政编码抽签。(见她为伯明翰写的故事这里举例。)随着越来越多的人宣布无家可归,资金短缺的议会无力应对官僚主义,等待的时间越来越长。如我所说:一场完美风暴。

逃学的孩子,父母被罚款

本周,我们查看了大量与逃学和其他父母/孩子不良行为相关的数据集。这是影响最大的两个。

首先,克莱尔·米勒分析了全国各地因带孩子在学期中度假而被罚款的父母人数。

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

这在沃里克郡引起了轰动,从利兹到莱斯特,从萨默塞特到克罗伊登,各种头衔都有很棒的台词。

其次,我们对政府的旷课数据做了一些法医分析,这让我们能够找出每一个三位一体镜像区域中未经授权缺勤率最高的学校。

事实证明,这些故事非常受读者欢迎,有许多版本——包括这个给肯特的版本——在最受欢迎的故事排行榜上名列前茅(顺便说一句,肯特学校的校长把它的位置归结为对假期的零容忍政策)。你可以通过搜索找到我们做的各种其他版本,例如赫尔这里或者伯明翰这里

打嗝去 A 和 E

你不会的,对吧?好吧,根据英国国民健康保险制度公布的新数据和安妮的分析,如果你这样做了,那么你会在去年的其他 42 人中。

总共有 22,000 人去了 A 和 E,他们有明显的轻微抱怨,包括打喷嚏、喉咙痛(默西塞德郡有 76 人这样做),以及鼻塞(大曼彻斯特有 30 人这样做)。

正如一位顾问向安妮指出的那样,这些人不是我们 NHS 面临压力的根源。许多人试图从其他地方获得帮助,但都失败了。但是他们在医院的出现,充其量是一个迹象,表明整个系统正在努力在正确的时间,正确的地点,以正确的方式对待人们。

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

你可以在这里阅读安妮为伯明翰写的版本——这是出版当天阅读量最大的新闻报道。

患者推翻“不分青红皂白”的 NHS 牙科罚款

罗布透露了英国国家医疗服务体系是如何发出数万张罚款通知,要求支付牙科服务费用的——尽管事实证明,有问题的病人有权享受免费医疗。

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

以德文郡为例:在发出的 16,000 张罚单中,四分之一被成功质疑。类似的比例在巴斯莱斯特纽卡伯明翰——基本上到处都被成功挑战。

英国牙科协会对这种情况很不高兴,他告诉罗伯:“可悲的是,根除欺诈的强硬言论与完全不加区别的罚款方式齐头并进。”

暴露狂和偷窥者数量的增加 TOMS

安妮一直在做一项数据调查,以了解“偷窥”犯罪的数量是否一直在上升,这种犯罪是指像“穿裙子”这样的闪光和性间谍犯罪。

令人沮丧的是,事实证明,他们已经做到了,几乎遍布全国。

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

Read the story here

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

Read the story here

乐观的解释是,这反映出警方对这些犯罪的认识和采取行动的意愿有所提高。

但是,正如妇女平等党对安妮说的那样:“不管这是因为更多的人站出来,更多的犯罪意识,还是更多的事件,要解决这个问题,我们必须明白,偷窥和暴露犯罪是暴力侵害妇女和女孩行为的一部分。”

你可以看到《安妮故事》的其他版本,比如在这里阅读和在这里阅读的《诺丁汉(那里的人数翻了一番)】。

我们做的其他新闻

随着周末寒流的预测,我们开始关注是否会有破纪录的天气出现。提供了关于令人担忧的极右极端主义崛起的地方数据和分析;揭示了在包括伯明翰在内的一些地区,阿拉伯语和乌尔都语现在比德语更受欢迎。并展示了议会如何削减预防酗酒的开支,尽管酗酒使住院人数创下纪录。

我已经没有空间来容纳我们所做的所有体育内容了,为此我向我们杰出的体育数据记者大卫·杜巴斯·费舍尔道歉——我会在下周首先提到它。我将以我们本周做的一份日报来结束这篇文章,关于在英国国民医疗服务系统工作的外国医生的数量。祝你周末愉快。

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

本周三位一体镜像数据单元的亮点

原文:https://towardsdatascience.com/highlights-from-the-trinity-mirror-data-unit-this-week-e9e811cf62d9?source=collection_archive---------10-----------------------

好吧,这实际上是两周的集锦。上周五,我正在参观我在东中部的精神家园,没有时间去参观。

犯罪:当地情况

一句话,可怕。本周发布的内政部记录的犯罪数字呈现了一幅几乎无处不在的可怕画面。暴力犯罪、持有刀具和其他武器、入室盗窃——都在上升,而且上升得很快。

Claire MillerDeb Aru 做了很好的工作,检查了每个警察部队的数据,并把他们的发现写在整个小组的标题上,导致了(令人沮丧但必要的)这样的报道:

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

Read the full story here

或者这个:

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

Read the full story here

他们发现了几行字:大曼彻斯特现在是全国犯罪率最高的地方;达勒姆的犯罪率在一年内上升了 40 %,比其他任何地方都要高;杜伦和诺森比亚现在的犯罪率都比伦敦高。

这个故事表明了一个数据记者(或记者团队)查看所有领域数据集的价值。这给了他们一个很好的鸟瞰图。如果你只看一个特定的警察队伍,你可能没有这样的背景。

如果你的自行车被偷了,不用麻烦去报警

大多数人都知道自行车盗窃案的破案率很低。但是有多穷呢?有特别的热点吗?

Rob Grant 决定在超本地水平上分析这些数据来找出答案。

在考文垂的福尔希尔区,2017 年发生了 64 起盗窃案。

有多少嫌疑犯被确认了?

零。

其他地方也是如此:例如伯明翰的 Edgbaston,那里发生了 99 起自行车盗窃案,却没有确定犯罪嫌疑人。

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

Read the full story here

显然这不是好消息。但值得指出的是,我们只知道这些事情,因为英国公开的警察数据是好的,并且一直在改进。发布(比方说)整个警队级别的年度数据集(如上例)和发布个人犯罪的详细信息有很大的不同。我们的政府和警察双管齐下,虽然我们可能不喜欢出现的故事,但我们应该感谢有机会找到它们。美国的犯罪数据更好,但许多国家的情况更糟。

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

Read the full story here

英国退出欧盟:还是一团混乱

Trinity Mirror 联合其他地区媒体组织主持了一项关于英国退出欧盟的谷歌调查。它收到了超过 20 万份回复,我相信这是这类调查的最高记录。

现在,你可以争论这类调查的价值:完全有理由指出,它们不像民意调查那样具有人口统计学权重,你可以(事实上应该)将这一点与回应的规模进行对比。

在任何情况下,我们的角色是挑选线条,并找到一种方式将发现呈现给任何想要它们的人,无论是否在三一镜报集团内。

Claire 在她的文章中加入了一个公开的可视化画面,这并不是为了嵌入到我们的网站中,而是为了让记者可以使用这些数据。你可以在这里尝试一下

调查的结果?人们想加入单一市场。他们对英国退出欧盟谈判深感关切。他们担心英国退出欧盟会让我们的情况变得更糟。

但是他们可能还是会投赞成票。

人们,嗯?

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

你可以从这一切中得到各种各样的东西。我从中得到的是,推动反对的不是对潜在经济风险的无知,而是对整个“收回对我们法律/边境/移民水平的控制”论点的信念,这种信念压倒了几乎任何其他考虑。

由此得出什么结论?好吧,如果你希望通过堆积经济证据或拙劣谈判的证据来说服英国退出欧盟选民改变忠诚,你可能会把头撞向砖墙。

对儿童肥胖的局部观察

我们知道观众喜欢的东西:(一)提供真正本地画面的精细数据;(二)邮政编码搜索互动,允许人们个性化的故事;(三)关于孩子变胖的故事。

本周公布的新数据显示,超重或临床肥胖的学龄儿童的比例,细分到委员会级别。

安妮·高克分析了这些数据,发现伦敦南华克的坎伯威尔格林(Camberwell Green)有最大的问题(字面上的意思)。那里大约 33%的 10 岁和 11 岁的孩子肥胖,还有 51%超重。

对坎伯威尔格林的人们来说是令人震惊的,真的。但大多数人都不是坎伯威尔绿人,也不会太在意那些绿人。

那么,对于其他人来说,为什么不给他们一种快速获得自己数据的方法呢?突然之间,你让可能感兴趣的人数增加了数百倍。

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

Try this out here

你可以在我们写的任何版本的故事上试用这个小工具,例如这个

其他东西

安妮根据对食物银行使用的最新数据的分析提供了地区性的故事;《曼彻斯特晚报》的夏洛特·考克斯将这些纳入了一个关于实际使用食物银行的人的更广泛的专题。这是一篇很棒的文章,也是一个很好的例子,说明了地方中心可以如何建立在我们的工作基础上:

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

Read the full story here

我们还报道了越来越多的人因枪伤而住院(例如在伯明翰和 T2,伦敦西部,T3),并披露了监狱中数量破纪录的袭击事件,在地方层面,在你看到全国报道的前一天,在 T4。

我们的体育新闻包括这条关于富勒姆可能在今年的锦标赛中创造最不受欢迎的记录的新闻。

最后,我们非常高兴地在#newsawards18 获得了国际印刷创新奖,这是因为我们为整个集团的出版物制作的每日和每周基于数据的印刷页面。为 Marianna Longo,Alice Cachia,Kelly Leung 和编码天才 Carlos Novoa 欢呼!

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

我们也很高兴在今年的地区新闻奖中获得四项提名。这些对我们来说可能是最重要的,因为我们成立的目的是为三一镜报集团的地区报纸服务,并更广泛地支持地区新闻业。

我们作为一个团队入围了整体数字奖(几年前我们赢得了它,去年再次入围)和年度数字创新奖。

玛丽安娜·隆戈被提名为年度设计师候选人,安妮被提名为年度记者候选人。

我认为,最后一项对整个数据新闻业来说是一个巨大的进步。很高兴看到一名全职数据记者的调查工作与他们行业中最好的一起得到认可,对于我们所有相信数据新闻是主流新闻的人来说,这是一个潜在的突破时刻。

你可以在这里阅读更多关于安妮的作品。

祝你周末愉快!

本周三位一体镜报数据单元的亮点:选举、危险司机和超市抢劫

原文:https://towardsdatascience.com/highlights-from-the-trinity-mirror-data-unit-this-week-elections-dangerous-drivers-and-e2f82c0f4959?source=collection_archive---------10-----------------------

现在是下午 2 点,我在过去的 30 个小时里几乎没有睡觉,因为一个熟悉的朋友:议会选举。

它们并不迷人,但它们确实很重要——而且不仅仅是政治观点的风向标。议会不只是清空垃圾箱。他们照顾老人、脆弱的成年人和面临虐待风险的儿童。他们负责学校和图书馆。他们给无家可归的人提供了栖身之所。虽然读者不一定关心议会政治,但他们非常关心议会选举结果。

我们对待地方选举的方式一直是问我们如何为我们的网站增加最大的价值。对我来说,这是关于确保他们能以最快和最好的格式显示结果。有了大选,每个席位的结果都不难得到。在地方选举中,实际上只有一名当地记者在计票。

这是一个主要的竞争优势——如果你能利用它的话。

为了方便起见,我们与记者合作,在 Google Sheets 中建立候选人名单,看起来有点像这样:

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

然后,我们使用这些电子表格中的数据来支持移动友好的结果小工具。当晚,计票处(或新闻编辑室)的记者只需填写每位候选人获得的票数——因为是谷歌表单,所以可以合作完成。我们的系统将候选人按投票顺序排列,识别出获胜者,并计算出获胜者所在的政党是获胜还是保持领先。

结果几乎立即显示出来,如下所示:

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

你可以在这里看到这个特殊的结果小工具。今年,我们制作了超过 50 个,用于整个集团的标题,它们确实总是做得非常好。我们确实花时间提供其他工具(投票份额、总席位、波动等),以及夜间分析。然而,没有什么比让人们得到他们真正想要的信息更重要:他们的选区和他们的委员会的结果。

当我埋头于选举电子表格时,团队的其他成员却一如既往地忙碌着。

黛比·阿鲁利用公开犯罪表对危险驾驶进行了一些局部分析,得出了明显的结果。

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

Read the full story here

例如,在利兹,违法行为在过去的五年里增加了三倍,包括 31 起危险驾驶致死的案件。

道路安全慈善机构 Brake 告诉 Deb,这种增长是“令人震惊的”,并呼吁在道路交通执法方面进行新的投资,同时进行更严厉的判决。(我们以前写过交通警察是如何被削减的。)

Deb 还忙着写一份信息自由请求,显示全国范围内袭击救护车工作人员的数量在上升。仅举一个例子:在东中部地区,有 203 起袭击事件,包括 7 起性侵犯——其中两起看到受害者受到持刀威胁。在全国范围内,袭击事件的数量在一年内从 3495 起上升到 3701 起。

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

Read the full story here

UNISON 首席官员艾伦·洛夫豪斯告诉 Deb,这样的攻击使得“已经压力很大的工作几乎无法忍受”,并且“导致许多人离开他们热爱的工作”。

你可以在这里阅读格里姆斯比或拉夫堡的故事。

随着阿斯达-塞恩斯伯里合并的消息传出,罗布·格兰特决定搜集两家公司的大型商店的地址,以了解它们在同一邮政编码区的出现频率。答案?很多。这是威尔士的数据,这是布里斯托尔的数据。

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

Sainsbury’s 已经表示没有关闭商店的计划,但是——正如 GlobalData 的 Patrick O’Brien 指出的——监管机构也可能会对一家有两家商店的公司采取措施。

印刷方面,《考文垂电讯报》大肆报道了我上周提到的安妮·高克的儿童肥胖分析:

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

Read the full story here

在体育方面,大卫·杜巴斯-费舍尔发现主队在点球大战中绝对没有优势,分析了英格兰低级别联赛中电视转播最多的球队,并观察了降级球队重返冠军宝座的频率(没有你想象的那么频繁)。

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

我把这个留给你,来自我们本周的报纸,它回答了一个问题:如果世界杯是基于言论自由的评级,它会如何发展?剧透:英格兰在四分之一决赛中被淘汰。但是,他们不总是这样吗?

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

滑稽的图表(和盗版)证明了相关性不是因果关系

原文:https://towardsdatascience.com/hilarious-graphs-and-pirates-prove-that-correlation-is-not-causation-667838af4159?source=collection_archive---------6-----------------------

现实世界中的 DS

说到讲故事,我们有一个问题。

然而这不是我们的错——作为人类我们生来就注定要寻找模式并解释为什么会发生。这个问题并没有随着我们的成长而消失,而是随着我们认为自己越聪明而变得越糟糕。我们说服自己,现在我们更老了,更明智了,更聪明了,我们的结论比年轻时更接近事实(风吹得越快,风车叶片转得越快,而不是相反)。

即使真正聪明的人看到了一种模式,并坚持对其做出解释,即使他们没有足够的信息来得出这样的结论。他们没办法。

这就是做人的道理。我们寻求对发生在我们周围的事件的解释。如果某件事不符合逻辑,我们会试图找到它可能有意义的原因。如果有什么不对劲,我们会弥补。

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

事后谬误

听说过拉丁语表达 Post Hoc,Ergo Propter Hoc ,意思是“在这之后,因此因为这”?这是“相关性并不意味着因果关系”这句话的基础,在统计学中也被称为“事后谬误”,因为这是一个我们都经常陷入的非常熟悉的陷阱。这是一个想法,当观察到事情按顺序发生时,我们推断首先发生的事情一定引起了接下来发生的事情。

事后谬误是导致足球经理只在比赛日穿紫色袜子的原因。他曾经穿着它们参加比赛,他的球队赢了。很明显,是袜子干的。现在他担心如果不穿它们去比赛,球队可能会输。该死的那些发臭的紫色袜子(他也不敢洗,怕神奇的仙尘洗出来)。

Post Hoc 也是雨人成为部落不可或缺的原因——他们相信他们的雨人可以让它下雨。雨人发现了远处酝酿的云,他跳舞直到它倾盆而下。通常不需要超过三四天的舞蹈,直到不可避免的事情发生。“雨人舞,水从天而降”。对雨人来说,印第安人不会说拉丁语是件好事,否则他就真的有麻烦了…

后海盗假设

对于后特设谬误的幽默观点,让我们看看 Pastafarianism。这是最近最流行的。没听说过?这是这个街区最新、发展最快的宗教之一。全称是 Pastafarian Sparrowism,是一种“充满活力的宗教,它试图通过先知杰克·斯派洛船长的一生,将飞行中的意大利面条怪兽短暂的爱带给我们所有人”。说真的,他们不是在开玩笑。嗯,事实上,他们是。他们提倡轻松的宗教观,反对在公立学校教授智能设计和神创论。他们还坚持认为海盗是最初的牧民

为了证明相关性并不意味着因果关系,创始人 Bobby Henderson 提出了全球变暖是自 19 世纪以来海盗数量减少的直接影响的论点,并附有这张图表:

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

Pirates Caused Global Warming. Honest…

哇,看那条直线,我听到你们都说——海盗数量的下降和全球气温的上升之间显然有关联,所以这里肯定有之间的因果联系,不是吗?是的,你们都陷入了事后谬误(我就知道你会)。

仅仅因为图中有一条直线并不一定意味着一件事导致了另一件事,特别是当你随机抓住两个看似不相关的变量,并把它们放在一起,看看它们之间是否存在某种微妙的关联。

以海盗和全球变暖为例,仔细看看 x 轴上的标签。注意到奇怪的事情了吗?除了相邻数据点的比例都不正常这一事实之外,还有一个问题是,其中有几个数据点已经被幽默地打乱,以故意欺骗。

我不知道你怎么想,但我是个信徒!一旦我写完这本书,我就放弃在公海上当海盗的统计数据。如果这是我做的最后一件事,我会阻止全球变暖。

可能会是…

我们中断这篇博文,为您带来突发新闻……

这篇博文摘自诙谐的新书真相、谎言和统计

下面是简介:

海盗、猫、墨西哥柠檬和北卡罗来纳律师。奶酪消费,人造黄油和从渔船上掉下来淹死。这本书什么都有。在这本令人大开眼界的书中,获奖的统计学家和作家李·贝克揭示了统计骗子用来欺骗、蒙蔽和愚弄粗心大意者的关键伎俩。作为一个外行人写的指南,用数据和统计来说明撒谎、欺骗和欺骗,没有一页是乏味的!一本书的八个机智章节的过山车,这可能是你今年会读到的最有趣的统计学书籍。

发现统计欺骗和有说服力的误导的令人兴奋的世界。

点击下面的链接,立即获得这本书……

[## 真相、谎言和统计数据

你被当成傻瓜了吗?一本书的 8 个机智章节的过山车,这可能是最…

www.chi2innovations.com](https://www.chi2innovations.com/truth-lies-and-statistics-book/)

器质性自闭症相关性难题

如果你在网上看看,有各种各样的幽默图表可以证明事后谬误。在过去 20 年左右的时间里,反疫苗运动有了巨大的增长,特别是在美国,并且已经“发现”了各种各样的虚假相关性,这些相关性“证明”疫苗接种计划和自闭症之间存在因果联系。与此同时,为了揭穿这些最荒诞的理论,其他同样荒谬的相关性也出现了。

有一篇发表的文章显示了美国有机食品的销售和自闭症诊断之间的相关性:

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

Organic Food Causes Autism. Oh My…

这对情节线之间有着非常紧密的相关性,甚至伴随着一个非常大的 r 值(接近 1)和一个非常小的 p 值(接近 0)。建议是——如果我们相信相关性意味着因果关系——有机食品和自闭症之间的相关性比目前存在的任何其他理论都更密切,因此它一定是原因。除了相关性不一定意味着因果关系,有机食品不会导致自闭症。那太荒谬了。这就是这些图表的全部意义。你所需要做的就是找到任何一对在同一时间段内增加的变量,用相同的 x 轴和不同的 y 轴将它们绘制在图表上,调整 y 轴刻度,直到曲线结合,然后——嘣——关联!如果,由于某种巧合和命运的魔力,存在一种统计上的相关性,那么就公布与之相伴随的 p 值作为额外的证明。这只是证明了相关性的存在,但并不能证明一件事导致了另一件事。有可能,但也有可能不会…**

柠檬死亡相关收敛

我也很欣赏这种相关性,它证明了墨西哥柠檬是美国道路上死亡的主要原因。等等,什么?我一定错过了那天的新闻——墨西哥柠檬正在杀死美国人?你打赌!

看看从墨西哥进口到美国的新鲜柠檬数量与 1996 年到 2000 年间美国高速公路上的总死亡率的关系图:

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

Mexican Lemons Kill Americans!

天啊,天啊,看看 R 的平方值——它真的必须为真。尽管图表似乎在告诉我们,美国的墨西哥柠檬越多,交通事故死亡人数就越少,但不可避免的结论是,墨西哥柠檬杀死了美国人!我们应该做些什么呢?我们应该进口更多的墨西哥柠檬吗(相关性告诉我们这是我们应该做的)?或者我们应该完全禁止墨西哥柠檬?毕竟,如果街上没有墨西哥柠檬,他们就不会再杀害更多的美国人。

真是一派胡言!我不在乎是否有关联,没有任何迹象表明柠檬会导致事故。如果有,你不认为在卡车进入美国之前,柠檬会在墨西哥道路上造成事故吗?西西里柠檬怎么样?它们会导致意大利和整个欧洲的交通死亡吗?

哦,关联的力量。只要你的观众不明白相关性并不一定意味着因果关系,你就可以让他们相信几乎任何事情。

你忘了你的那本书了吗?别担心,它就在这里等着你:

[## 真相、谎言和统计数据

你被当成傻瓜了吗?一本书的 8 个机智章节的过山车,这可能是最…

www.chi2innovations.com](https://www.chi2innovations.com/truth-lies-and-statistics-book/)

原载于chi2innovations.com

Hinton++

原文:https://towardsdatascience.com/hinton-1e6d26a64bd6?source=collection_archive---------2-----------------------

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

杰弗里·辛顿有所发现。他的机器智能模型依赖于他称之为“胶囊”的神经元簇,这是对我们自己的大脑如何理解世界的最好解释,因此也是对机器如何理解世界的最好解释。然而,总有改进的余地。胶囊未能解释我们对扭曲的理解——当面对不合语法的句子时,我们可以说出“蹒跚学步的是什么意思,当他的特征不对齐时,我们可以看到“如何重新排列土豆头先生”。胶囊仅识别面部,例如,当其部件的姿态正确时,没有关于如何修复变形的建议。我会试着对他的作品做些调整。

打住,什么是胶囊?

如果你没听说过胶囊也没关系。它们并不是一个新的话题——它们从 70 年代就藏在杰弗里·辛顿的脑海里了!从本质上来说,胶囊是一种克服几何变化的尝试。当我们观察一张纸上的正方形时,我们认出它是正方形,即使页面翻转倾斜远离我们。那个正方形的“像素”发生了戏剧性的变化,而我们对“正方形”的 概念 保持不变。

人工神经网络不像我们一样用静态的“方块”来思考。辛顿创造了胶囊,这样 CNN 可以保持正方形的静态概念,即使这些正方形倾斜和旋转。人脸,汽车,任何东西都一样。胶囊通过记录辛顿所说的“姿势”来补偿几何失真。

一个物体的姿态描述了在视野中的位置,它的如何倾斜,它的相对大小,以及如何倾斜。总的来说,这些特性描述了当 3D 对象被简化为 2D 图像,并且这些对象在视场中移动时出现的失真。辛顿的核心见解是这样的:如果我看到一张脸,但那张脸是倾斜和旋转的,那么那张同样的倾斜和旋转被应用到脸的每一个部分。所以,如果我看到一张 2D 倾斜嘴巴的照片,我希望看到同样倾斜的眼睛和鼻子

Hinton 的每个胶囊都在寻找脸部的部分——一个胶囊寻找鼻子,另一个寻找眼睛,第三个胶囊希望找到嘴。当这些胶囊中的每一个找到它们的物体的实例时,它们就会亮起来,说“我找到了一只眼睛/鼻子/嘴!”他们记录下各自目标的姿态,并将信息传递给高层胶囊,即面部胶囊。当面部胶囊接收到来自嘴巴、鼻子和眼睛胶囊的信号时,它会比较它们的姿势。一张真实的脸应该有相同的眼睛、鼻子和嘴的姿态数据。如果三个姿势都一致,那么脸部胶囊就会亮起,表示“我找到了一张脸”。这就是全部了。

我们示例中的面部胶囊有自己的姿势,它向检测上半身的更高层胶囊发送信号。如果肩膀,脖子和头发的胶囊都亮了,并且都同意一个姿势,那么更高层的胶囊也亮了。这种一致的级联反应一直持续到整个人被识别出来,并且类似的胶囊为每一种物体运作。主要思想是较大的对象由较小的对象组成,那些较小的对象期望彼此同意它们的相对排列。到目前为止,Hinton 的胶囊工作得相当好,分离和识别重叠的手写数字,精确度远远超过现有的神经网络。然而…

“我记得好像不太对劲……”

当他们期望的协议没有出现时,辛顿的胶囊绊倒了。如果眼睛完全侧着,嘴巴上下颠倒,那么“面部胶囊”就不会出现。面部胶囊是无声的,就好像根本没有面部部分*,* 一样,即使这些部分存在并且没有对齐。相比之下,我们会看着错位的面部特征说“这是一张,但是眼睛是横着的,嘴是上下颠倒的。”我们自己的“脸”神经元亮了,还有眼睛和嘴巴的神经元,尽管它们的姿势不一致!哎呀。

所以,让我们好好想想。我们大脑的某个部分看到了眼睛、鼻子和嘴巴,并且它们想要压缩这些信息最简单的压缩就是称那堆混乱的东西为‘一张脸’,即使这些特征没有对齐。我们的大脑径直向前,点亮了“脸”神经元。然而,我们的大脑并不止于此。他们回去 检查 那压缩。“我把这种疯狂叫做脸,但是真的是脸吗?”我们的大脑似乎将“面部期望”投射回更低的层次,询问:“如果这是一张正常的面部,那么嘴巴、鼻子和眼睛的正常姿势会是什么样的?”

当姿势投影发生时,大脑使用它在压缩时确定的“脸”的姿势。“如果这个真的是一张脸,在我认为的方向上,那么嘴应该在这里,朝向这个方向,眼睛应该在这里和这里,朝向这个方向……”脸部的压缩产生了对其部分姿势的预期!

眼睛和嘴巴的实际姿势是与这些部位的预期姿势的比较。这就是我们的大脑记录错误的时候!“我看到了嘴、鼻子和眼睛,这让我相信有一张脸, ,但我认为这张脸对这些部分来说会有不同的姿势 。”我们的大脑记下这些错误,然后记住它们。额外的神经元必须被激活,以记录相对于预期的扭曲——嘴相对于脸对“嘴”的预期是颠倒的,眼睛相对于脸对“眼睛”的预期是侧向的。那些失真是附加的“相对姿态”数据。此外,我们的大脑会跟踪这些扭曲,同时还有检测脸部的神经元,这样我们就能在以后记住它们!

因此,将辛顿的胶囊与我们自己的大脑相比较,如上:

胶囊看到眼睛、鼻子和嘴,记录它们的姿势,并将这些姿势发送给面部神经元。面部神经元检查这些姿势是否一致;因为姿势不同意辛顿的脸部神经元。它决定根本没有脸

然而,我们的大脑模型记录了眼睛、鼻子和嘴巴的存在,并将这些信号发送给面部神经元。脸部神经元发出的信号,它停留在一个让最小化不协调的脸部姿势。也就是说,我们的大脑采取每个部分的姿势,并粗略地问,“如果所有这些部分组成一张脸,那么什么样的脸姿势最有可能?”然后,他们将那个姿势向下投射到眼睛、鼻子和嘴巴。因为嘴和眼睛的姿势不同于面部姿势,额外的“扭曲”神经元被触发,记录产生眼睛和嘴姿势的面部姿势的变化。我们的大脑说“有一张脸,但是它的部分是扭曲的。”我们,不像辛顿的胶囊,记得照片有什么问题。

猪脑猴脑

除了最小化姿势之间的不协调,我们的大脑也最小化相互竞争的解释之间的不协调。这个不和谐的概念有一个生物学上的对等物。我们的大脑向前发送许多信号,每个信号都在说“看我发现了什么!”然而,这些信号关注的是我们注意力的同一点,它们不可能都是正确的。所以,我们的大脑根据不和谐通过迭代抑制,在那些信号中找到最强的**。想象一下:你看着一幅画,这幅画可以被理解为一个披着披肩的老妇人或一个戴着帽子的年轻女子…**

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

在任何时候,这些解释中的一种都会胜出。然而,我们的大脑可以在两种观点之间跳跃。不知何故,写着“老女人的眼睛”的信号和写着“年轻女人的耳朵”的信号竞争。假设这幅画是彩色的——在一种颜色中,“耳朵”和年轻女子的脸颊一样晒成褐色,老妇人的幻觉消失了;在另一种颜色中,“眼睛”是带有一点绿色的白色,对年轻女性的诠释不屑一顾。每个观点依次强化,另一个因为不和谐而被压制。(“那可能是一只眼睛——等等,不,是肤色的。”或者“那可能是一只耳朵——等等,不,它有白色的巩膜和绿色的虹膜。”)

具体一点!

看着这种视错觉,我们的大脑触发了神经元,在某种程度上,这些神经元与年轻和年老的女性都相对应。在最高层次的意识中,只能存在一种解释。所以,当两种解释到达时,我们的大脑开始 抑制 一些导致每种解释的信号,直到一种解释比另一种解释被抑制得更多。大脑提取一些活跃的神经元,然后让它们安静下来。对于“年轻女人”的解释,我们看到她的鼻子,她的耳朵,下巴和项链。对“老女人”来说,那些相同的点被记录为眼睑、眼睛、鼻子和嘴。每一部分都有相互竞争的解释,我们的大脑开始忽略一个而偏爱另一个——相反,把年轻女性的下颌线称为鼻子,以观察那个是否会减少不和谐,或者把老女人的眼睛变成耳朵,希望解决分歧。

这种“击倒”或“逆转”输入直到分歧消失的概念,应用于 Hinton 的胶囊和姿势,可能看起来像这样:“我看到一碗水果”/“我看到一张笑脸”……“他们不可能都是对的……这是一只眼睛,还是一个苹果?我称它为一只眼睛,看看一种解释是否比另一种更有效,使用我的假设“……”是的,如果那个苹果是一只眼睛,那么这很可能是一张脸,而不是一个水果盘。从根本上说,这一过程要求高级神经元向低级神经元发回信号,低级神经元选择一个信号或另一个信号,低级神经元重新传输它们的信号,直到低级神经元与它们的高级解释产生最小的分歧。

从土豆头先生的例子可以看出,分歧可能不会完全消失。每一个较低级别的神经元传输它对所见事物的猜测——“眼睛”、“鼻子”、“嘴巴”,以及每一部分的姿势。这些部分和姿势传递到更高层,在那里它们点亮“脸”神经元…然而,这些部分的姿势不一致!嘴巴倒过来,眼睛完全侧着!我们的大脑不会丢弃“脸”神经元的信号——它们只是试图找到一种方法来最小化这种分歧。“或许是整张脸上下颠倒,解释了倒口?不,那不可能是对的,因为鼻子是正面朝上的,而眼睛的位置是正脸的正确位置。”“或者,是脸侧着,解释了不寻常的眼睛?不,因为那会把嘴和鼻子放在完全错误的位置。”所以,我们的大脑说"确实是竖直的,因为那个方向导致最小的不一致,但是脸的部分方向错误。“姿势不一致,而这种不一致并没有消失——我们的大脑只是尽可能地将这种不一致最小化。

接下来是什么?

一旦我们的大脑将分歧最小化,并确定了一个更高层次的解释,他们就会执行额外的一步:他们将更高层次解释的期望投射回更低的层次。这是与 Hinton 的胶囊的一个关键区别,对于迈向通用机器智能至关重要。

土豆头先生的脸虽然扭曲了,但整个脸的姿势是“平均的”。在具有相同平均姿势的正常人脸上,每个部分都有关联姿势——“一张直立的脸应该有直立的眼睛、鼻子和嘴巴”。我们的大脑从土豆脑袋先生那里取了一个平均的姿势,一个最小化分歧的姿势,然后把这个姿势投射回零件的预期姿势。只要预期的姿势与观察到的姿势不一致,我们的大脑就会记下:“对于这张直立的脸,我本以为会看到一张直立的嘴,但这张嘴是颠倒的!”(这种方法确保数据得到接近最优的压缩;我们的大脑会跟踪“主要观点”以及任何“特殊情况”。)后来,当我们回想我们所看到的东西时,我们不记得 只记得 看到一张脸——我们 记得它的嘴是倒着的。胶囊目前不记得这样的扭曲。

因此,我们在较高层次的抽象和较低层次的特征之间有两种方式的回响:1)竞争抽象(‘年轻女人’/‘老女人’)之间的任何‘平局’通过抑制他们的一些输入直到平局被打破来解决(即最小化不和谐);2)一旦一个抽象被认同(“直立的脸”),它的理想化的期望被投射回较低的层(“直立的眼睛、鼻子、嘴”),以找到任何分歧仍然存在的地方(“颠倒的嘴”)。我们的大脑会暂时忘记失去的抽象概念,但它们会记住我们的高层期望与低层观察不一致的地方。我们记得只看到了年轻女子或老妇人,而我们记得土豆头先生的嘴是上下颠倒的。

在实践中

我建议对辛顿的胶囊做一个简单的修复。通过随机梯度下降的反向传播仍然适用。仍然像 Hinton 描述的那样比较姿态向量。我们只需要对网络的前馈激活进行修改。

通常情况下,人工神经网络像方阵一样前进,从网络的最低层步进到最高层,从不后退。然而,我描述的模型有许多向后和向前运动的实例——当竞争的抽象抑制输入,直到确定一个单一的解释,当较高层的“平均姿态”向后投射,以确定其输入的姿态与预期不同的地方。这种神经网络 相呼应。

因此,在得出最终答案之前,网络从低到高被激发*,甚至激活输出层中的多个神经元。从输出层向后移动,网络抑制中间层神经元,直到单个输出神经元占主导地位。(“是啊,是个老女人。”)然后,该输出通过网络将其姿态期望发送回,以记录理想期望与观察值不同的地方*。(“是一张脸,但嘴巴倒过来了。”)输出层激活和低水平失真的结合是网络“真正”看到的,也是我们的神经网络应该“记住”的……不过,有效地存储这些记忆本身就是一个棘手的问题。这个我以后再说。

雇佣聪明的人,不要挡他们的路

原文:https://towardsdatascience.com/hire-smart-people-and-get-out-of-their-way-d152ecea56bc?source=collection_archive---------5-----------------------

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

雇佣聪明人并告诉他们该做什么是没有意义的;我们雇佣聪明的人,这样他们就能告诉我们该做什么。

有时候最直接的建议是最有价值的。史蒂夫·乔布斯用一句话阐明了领导一家公司所需的最有用的品质之一。在我自己的职业生涯中,我见过糟糕的管理者、好的管理者和伟大的管理者。对于那些从优秀走向卓越的人,我能说的一件事是——他们没有挡路。

我努力成为自己理想中的经理人。我也知道我在大多数时候都做不到。最困难的事情之一是在艰难时期成为一名好的领导者。而且,正如大多数艰难的事情一样,很少有真正的文章讲述如何在艰难时期成为一名伟大的领导者。

成为一名优秀的领导者

当环境稳定时,成为一个好的领导者是很容易的。当事情变得困难时,当你筋疲力尽时,当你不知道到底该做什么时,成为一个好的领导者会更加困难。对压力和疲惫的一个典型反应是微观管理。我已经看了一遍又一遍,我自己也至少掉进过几次那个陷阱。

更复杂的是,当你在一家初创公司时,很容易去一个团队并开始提供想法,朝着这个方向稍微移动一下,以找到导致短期收益的路径。可怕的重新排序。然而,当我回头看时,许多“有益的推动”只是阻碍了进步。虽然这听起来并不独特,但我已经艰难地认识到,这更多的是提供最终目标,让你的团队做他们最擅长的事情。这是我一直从我的经理那里得到的重视,也是我自己承诺要做的事情。

提供目标,而不是方向

关于一个领导者应该如何提供愿景和给出方向,有大量的信息。这是真的,但往往缺乏现实世界的感觉。提供视野是什么意思?在我看来,这意味着提供最终的目标,给这个目标一个目的,并帮助其他人在他们的工作中脱颖而出。下面是一个简单目标的糟糕例子:

我们希望一个新的系统能够以 X%的准确率运行,节省 X%的分析师时间。然后,我们可以讨论解决问题的潜在方法,我们愿意在开发时间和性能以及一系列其他假设之间进行权衡。

或者,我可以告诉他们,我们正在尝试回答一个问题或解决一个具体的棘手问题。即给他们一个有目的的目标。

我们需要开发一种量化工具,帮助我们的客户了解美国股市面临的重大媒体事件风险。理想情况下,我会把他们放在客户面前,让他们问问题。如果这是不可能的,我应该给他们尽可能多的领域知识。

我应该把自己看作一个间接的引导者,而不是具体活动的指导者。目标是给他们尽可能多的必要信息,以便他们将来在没有我参与的情况下做出最佳决策。在我看来,最好的方法是让他们首先提出问题并做出决定。

等等,有问题

两周后,他们遇到了一些问题。我们无法达到我们想要的精确度,我们的进展也没有我们想象的那么快。从领导力的角度来看,这里只有两种方法:

  1. 直接参与,准确地告诉人们使用什么算法,做什么调整,并重新定位项目。
  2. 和他们谈谈假设和他们遇到的困难。假设可以调整吗?他们试过另一种选择吗?我们问对问题了吗?我们有合适的领域知识吗?

第一种在短期内要舒服得多(假设你知道该做什么),第二种不仅会帮助他们成长和发展,而且很可能会带来更好的结果。你知道的比他们多吗?他们已经研究这个问题好几个星期了,而你只是插了一脚。

在这种情况下,良好的领导意味着根据证据审查或调整目标,从新鲜的角度提供一些想法,并让他们从那里选择做什么。传统公司中的领导力通常意味着表现得好像你总是知道自己在做什么。真正的领导力意味着承认你并不总是知道自己在做什么,并授权他人去发现。

一个真实生活的例子

我给你看一段我女儿妮娅的视频。不管出于什么原因,她决定爬上她的椅子。我不能和她很好地交流(她七个月大),但是她的目标很明确——学习!

我可以插话说她可能会受伤,或者危险地试图从椅子上跳下来没有任何实际好处,但我认为她会在一天结束时找到对她最好的事情。摔几跤没什么坏处。

招聘合适的人

如果这是我想要的领导方式,我应该如何招聘?这个很简单。雇佣比你更擅长工作的人。除此之外,如果有机会,你应该雇佣那些能够胜任新职位的人。如果你雇佣的是没有经验的人(这通常是非常有益的),要意识到你需要给这些人提供指导和辅导。

虽然我经常听到经理们宣称这是他们的意图,但他们的行动很少在实践中表现出来。

反省过去

如果你是一家公司的领导或经理,回想一下你上一次和你的团队开产品会议是什么时候。

  • 你是如何行动的?
  • 你只是提供目标吗?或者你有没有给目标一个目标和指导?
  • 如果假设不合理或错误,你是否与他们一起调整目标?
  • 你挡住他们的路了吗?

虽然一个好的领导者的品质是显而易见的,但领导远非易事。它是关于扔掉你的自我,每天自我反省,努力成为你想为之工作的人。如果你认为你擅长这个,那么你可能并不擅长。

雇佣数据科学家第一步:停止寻找数据科学家。

原文:https://towardsdatascience.com/hiring-data-scientists-step-1-stop-looking-for-data-scientists-9eb282a0f96b?source=collection_archive---------1-----------------------

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

亲爱的世界,

我们正在寻找一个人来填补我们商业模式中即将到来的空白。我们不确定你会做什么,但我们确信我们的股东会喜欢我们有数据科学家的想法。你将向不理解你工作的人汇报,当你向管理层提出你的解决方案时,你经常会遇到怀疑。候选人必须具备以下条件:

  • B.计算机科学理学学士
  • 米(meter 的缩写))定量领域的 Sc/PhD
  • 3-5 年的研究工作经验,具有后端框架、应用程序开发、网站托管的经验,并对神经网络和统计方法有深入的了解
  • 5 年编程经验
  • 2-3 年数据库管理经验
  • 在我们的领域(医疗保健、营销等)有 5 年的经验
  • 具备 SQL、Python、R、Matlab、Java、C、C++的高级知识
  • 2-3 篇在人工智能、自然语言处理或计算机视觉领域发表的研究论文(三者皆佳)
  • 体验 Spark、Hadoop 和 Pig…和马

这个人几乎不存在

你认为世界上有多少人符合这个标准?这些人中有多少人拥有面向顾客、面向客户、面向管理层的软技能,同时还具有分析能力、创造力和智慧。我们向数据科学家提出了错误的问题,我们也找错了地方。奇怪的是,苹果公司的招聘广告通常不到 XYZ 咨询公司的一半要求。

数据科学家不可能在一家公司使用所有这些工具,更不可能有人知道所有这些语言。数据科学更多的是关于编程的智能使用,而不是编程本身。

你没有雇佣程序员。

不要再关注学位和证书,而是关注已被证明的真实世界的经验。它甚至不一定是一个正式的数据科学家。当我打算为我们的 ML 团队引进一名新成员时,我的主要目标是:

我们想要的:

  • 聪明、探索、热情的人经验丰富。
  • 有能力接受模糊的、不确定的想法,并把它们变成成品的人

我们提供的服务:

  • 提供一个有趣的团队和策略,并给他们机会研究尖端技术
  • 给他们成长的空间,了解他们想学什么,并帮助他们达到目的
  • 团队中的每个人都是平等的

从最重要的事情开始

谈到数据科学,最难找到的技能与学位或具体的工作经验无关。正是探索的天性、对优化的追求、结果思维、永不放弃的态度和学习的意愿造就了一名优秀的数据科学家。如果你给我一个具备这些软技能、一些基本编程能力和对数学的理解的人,我保证他们会在相对较短的时间内成为一名伟大的数据科学家。当我打算在我的团队中招聘员工时,这些是最重要的技能。其他的都是肉汁。

诚然,学位和经验可以很好地判断能力。但这需要很高的成本——它极大地缩小了你希望从中提取的资金规模,并且它造成了一种确认偏差,从而我们继续推动越来越多的凭证。

这是我写的职位描述中的一小段:

期望

我们正在建立一个以高标准和卓越执行为荣的团队。对你的评价更多的是基于你的结果,而不是你的代码。基于客观的精英标准,责任、挑战和机遇将快速增长。

主要职责

-协助深度神经网络和传统机器学习模型的设计、开发和评估。

-协助创建可扩展、高效、自动化的流程,用于大规模数据分析、模型开发、模型验证和模型实施

-致力于成为以执行为导向的团队中的合作伙伴。

—注重结果—能够在紧迫的期限内完成出色的工作

创造一份你想做的工作

当我在招聘的时候,我会花几个小时在职位描述上。我写,我重写,我再写。我所扮演的角色符合我们团队的需求,有成长的空间,提供很好的学习机会,并提供一些令人兴奋的东西。没有这一点,随着时间的推移,人们会变得无聊和痛苦。确定特定角色的业务需求很容易,但通常很难准确定义您为什么需要数据科学家以及他们将做什么。你的工作是在开始搜索之前考虑清楚这一点。

可以肯定的是,工作中总会有人们不喜欢的部分,但每天去上班做自己讨厌的事情是一场悲剧。当我兴奋、积极、有动力地去工作时,我的工作效率是平时的 5 倍。作为团队领导,我必须为我的团队提供这样的环境。这对个人、团队和企业都是最好的。

经理应该写下自己的职位描述

如果你不能花 3-5 个小时写一份合适的工作描述,那么你就不够需要这个职位。

我读过的职位描述听起来都是人力资源部写的,这让我感到震惊。有时候感觉好像同一个职位描述被 100 个招聘人员反复循环使用。你常常不知道自己在做什么,团队是什么样的,或者你是否具备胜任这份工作所需的 35 项技能。

对人们的想法更感兴趣

由于我不是计算机科学家,也不是博士,所以可能有点偏颇(我是机械工程师)。我被教导如何把复杂的问题分解成更小的任务,就像程序员一样。然而,我真的相信,直到我的本科工程学位,没有人期望我去思考。这项技能被如此不充分利用和低估,令我震惊。

寻找能够批判性地、创造性地、聪明地思考的人是很难的。这就是寻找数据科学家如此困难的原因——理解如何获取数据、探索数据、理解数据,并以有价值的方式建模/呈现数据非常困难。获取数十亿个非结构化数据点并提取信息、转换信息、扩充信息以及生成可操作的数据/预测非常困难,并且没有预定义的规则或适用的系统。

也许数据科学家需要的最有价值的技能是在没有明确解决方案的情况下处理公开问题的能力。他/她需要能够在价值未定义时提供价值—他们通常需要理解这一点,并靠自己实现这一点。他/她需要能够从数百个潜在的结果中进行选择,以找到最适合当前问题和业务的结果。

真正的数据科学家:

  1. 理解价值创造的概念
  2. 了解业务
  3. 了解如何使用不同的技术和模型来为您的数据创造价值
  4. 有条不紊地处理复杂、开放的问题,并充满兴趣。
  5. 不需要成为一名优秀的程序员。

这会让你找工作更容易吗?大概不会。但是,至少你会寻找现实生活中的人,你会寻找合适的技能。当你强迫自己去寻找这种类型的人的时候,你强迫自己去思考为什么你首先需要一个数据科学家。

这对你更好,对你的团队更好,对你的公司更好。

雇佣最好的数据科学家

原文:https://towardsdatascience.com/hiring-the-best-data-scientists-fba389a5b3c1?source=collection_archive---------17-----------------------

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

Photo by rawpixel on Unsplash

你在这篇文章中找不到的是数据科学工具、学位授予程序的列表,或者估计填充 747 所需乒乓球数量的能力。这些并不能造就伟大的数据科学家。另一方面,如果你有一个具备以下三个特征的候选人,不管他们已经知道哪一套工具,那么你可以用你的组织使用的工具来训练他们。实际上,他们会训练自己。

特质#1:能够提出重要的问题

如果答案有影响,问题就很重要。通常,这意味着它驱动着一个重要的决策。对于一个企业来说,这可能是进入一个市场还是另一个市场的决定。对于一个非盈利组织来说,这可能是一个关于用什么策略来帮助那些需要帮助的人的决定。对于医生来说,这可能是决定使用何种药物来治疗患者的癌症。特质#1 是关于将我们数据科学家的自然好奇心引向重要目标的能力。这需要首先了解这些目标是什么,然后定义我们对数据提出的问题——即假设——以便答案会告诉我们如何实现我们的目标。

特质#2:确定问题已经被回答的能力,第 1 部分:逻辑思维

从数据到分析结果,从分析结果到关于假设的结论,每一步推理的正确性都是必须的。逻辑思维的一部分是演绎推理。另一部分是理解所有人的假设,并确认每个人都满意。

逻辑思维需要一个额外的重要组成部分:对知识诚实的承诺。这意味着不允许自己屈从于对特定结果的渴望。

特质#3:确定问题已经被回答的能力,第二部分:创造性思维

数据科学家必须积极尝试推翻自己的答案。这意味着要问这样的问题:什么是可能的混淆变量?原因和结果会和我想的相反吗,不管这有多违背直觉?有没有可能这些结果是由于两种或两种以上的效应在历史的这一刻碰巧结合在一起,而不是被重复?我的数据集代表真实世界吗?

特质 3 是创造性头脑风暴的一种形式。在所有三个特征中,它是最费工夫的一个。根据我的经验,这可能会导致进行几次额外的调查,每次调查的规模都与最初的调查一样大。投入精力做到这一点也需要对智力诚实的承诺。

为什么有必要?因为如果问题很重要,那么确保问题得到正确回答也很重要。正确回答这个问题可以决定数百万美元的商业收入是赚了还是赔了,需要帮助的人群是否得到了帮助,病人是否治愈。

数据科学家的好消息

如果你是一名数据科学家,这种思考数据科学家工作的方式对你来说是全新的,不要气馁。这三种特质是认知技能,通过学习形成工作习惯。它们不是本能的问题。这是一个好消息,因为无论你现在对这些特性运用得多或少,你都可以通过训练和有意识的使用来改善它们,直到它们成为习惯,就像它们需要的那样。

如何雇佣最好的数据科学家

如果你雇佣数据科学家,那么你知道软件、工具和数学技能是重要的考虑因素。评估这些应该是你面试过程的一部分。然而,我发现体现这三种特质的数据科学家也是最容易适应不同工具、技术和编程语言的人。

评估求职者这三种特质的一个简单方法是让他们简要描述一个或多个他们过去的项目,然后问他们许多后续问题,关于他们是否以及如何运用这三种特质。是什么让他们的项目变得重要(特质 1)?他们分析的假设是什么(特征 2)?他们如何检查他们命名的假设(特质 2)?他们还考虑了其他什么解释(特质 3)?

即使候选人只在学校项目(有时是玩具问题)中有过数据科学经验,他们对第一个问题(特质 1)的回答也可以揭示他们对问题背景的思考程度,而不仅仅是进行分析。他们对第二个和第三个问题(特征 2 和 3)的回答对学校项目和工作项目一样有意义。

这三个特征是任何类型的优秀科学家的特征。通过让你的候选人参与这种面试讨论,你就和他们一起参与了科学家参与的那种讨论。这有助于你确定他们是否是好的数据科学家。

您的额外福利

事实证明,在你的面试过程中包括上述内容有两个好处。首先,它复制了数据科学团队中发生的协作,从而让您了解候选人是否会很好地参与您希望您的团队进行的讨论。

第二,与你的候选人进行这些讨论强化了你作为招聘经理的三个特质。事实上,在这些讨论中,你的最佳候选人会挑战。雇佣他们!

Boaz Super 是一位财富 500 强高管,领导着一家人工智能和数据科学组织;一个创业公司创始人;也是一所大学研究中心的创始人之一。

你可以通过Medium.comLinkedIn 联系到波阿斯。

Boaz Super 版权所有 2017–2018。保留所有权利。

这篇文章代表我的观点,不一定代表我雇主的观点。

直方图均衡

原文:https://towardsdatascience.com/histogram-equalization-5d1013626e64?source=collection_archive---------1-----------------------

图像对比度增强

柱状图

直方图是图像强度分布的图形表示。简而言之,它代表了所考虑的每个亮度值的像素数。

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

在上图中,X 轴代表色阶(左边为黑色,右边为白色),Y 轴代表图像的像素数。这里,直方图显示了每个亮度级别(从黑到白)的像素数量,当像素越多时,特定亮度级别的峰值越高。

直方图均衡

直方图均衡化是一种用于提高图像对比度的计算机图像处理技术。它通过有效地扩展最频繁的强度值来实现这一点,即扩展图像的强度范围。当可用数据由相近的对比度值表示时,这种方法通常会提高图像的整体对比度。这允许较低局部对比度的区域获得较高的对比度。

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

图像的颜色直方图表示每种颜色分量中的像素数量。直方图均衡化不能单独应用于图像的红色、绿色和蓝色分量,因为它会导致图像的色彩平衡发生巨大变化。然而,如果图像首先被转换到另一个颜色空间,如 HSL/HSV 颜色空间,则该算法可以被应用到亮度或值通道,而不会导致图像的色调和饱和度的改变。

自适应直方图均衡

自适应直方图均衡化与普通直方图均衡化的不同之处在于,自适应方法计算几个直方图,每个直方图对应于图像的不同部分,并使用它们来重新分配图像的亮度值。因此,它适用于提高图像每个区域的局部对比度和增强边缘的清晰度。

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

对比有限自适应均衡

对比度受限 AHE (CLAHE)在对比度限制方面不同于自适应直方图均衡。在 CLAHE 的情况下,对比度限制过程被应用于从其导出变换函数的每个邻域。开发 CLAHE 是为了防止自适应直方图均衡化可能引起的噪声过度放大。

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

实验结果

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

源代码

https://github . com/shree 6791/Deep-Learning/blob/master/CNN/Cats % 20 和%20Dogs/ca_do.py

Python 中的直方图和密度图

原文:https://towardsdatascience.com/histograms-and-density-plots-in-python-f6bda88f5ac0?source=collection_archive---------0-----------------------

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

用 Python 可视化一维数据

绘制单个变量似乎应该很容易。只有一个维度,有效地显示数据有多难?很长一段时间,我通过使用简单的直方图来显示值的位置、数据的分布和数据的形状(正态、偏态、双峰等)。)然而,我最近遇到了一些直方图失败的问题,我知道是时候拓宽我的绘图知识了。我找到了一本优秀的关于数据可视化的免费在线书籍,并实现了其中的一些技术。我没有把我学到的一切都留给自己,而是决定写一个直方图的 Python 指南和一个已经被证明非常有用的替代方法,密度图,这对我和其他人都有帮助。

本文将通过使用 matplotlibseaborn 库,全面了解如何在 Python 中使用直方图和密度图。自始至终,我们将探索真实世界的数据集,因为有了网上可用的丰富资源,没有理由不使用实际数据!我们将可视化nyflights 13 数据,其中包含 2013 年超过 300,000 次对纽约出发航班的观察。我们将重点显示一个变量,即航班的到达延迟时间(以分钟计)。本文的完整代码可以从 GitHub 上的 Jupyter 笔记本中获得。

在开始绘图之前检查我们的数据总是一个好主意。我们可以将数据读入 pandas 数据帧,并显示前 10 行:

import pandas as pd# Read in data and examine first 10 rows
flights = pd.read_csv('data/formatted_flights.csv')
flights.head(10)

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

Head of Dataframe

航班到达延迟以分钟为单位,负值表示航班提前到达(事实证明,航班往往会提前到达,只是我们乘坐的航班从来不会提前到达!)航班超过 30 万次,最小延误-60 分钟,最大延误 120 分钟。数据框中的另一列是我们可以用来比较的航空公司名称。

直方图

开始研究单个变量的一个很好的方法是使用直方图。直方图将变量划分为多个区间,对每个区间中的数据点进行计数,并在 x 轴上显示区间,在 y 轴上显示计数。在我们的例子中,箱将是代表航班延误的时间间隔,计数将是落入该间隔的航班数量。二进制宽度是直方图最重要的参数,我们应该总是尝试一些不同的二进制宽度值,以选择最适合我们数据的一个。

要用 Python 制作一个基本的直方图,我们可以使用 matplotlib 或者 seaborn。下面的代码展示了两个库中创建等价图形的函数调用。对于绘图调用,我们通过面元的数量来指定面元宽度。对于这个图,我将使用长度为 5 分钟的仓,这意味着仓的数量将是数据范围(从-60 到 120 分钟)除以仓宽度,5 分钟(bins = int(180/5))。

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

Histogram (equivalent figured produced by both matplotlib and seaborn)

对于大多数基本的直方图,我会使用 matplotlib 代码,因为它更简单,但是我们稍后将使用 seaborn distplot函数来创建不同的分布,熟悉不同的选项是有好处的。

我是怎么想出 5 分钟的宽度的?找出最佳 binwidth 的唯一方法是尝试多个值!下面是在 matplotlib 中用一系列 binwidths 制作相同图形的代码。最终,binwidth 没有正确或错误的答案,但我选择 5 分钟,因为我认为它最能代表分布。

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

Histograms with Different Binwidths

binwidth 的选择会显著影响结果图。较小的二进制宽度会使图变得杂乱,但较大的二进制宽度可能会模糊数据中的细微差别。Matplotlib 会自动为你选择一个合理的 binwidth,但是我喜欢在尝试了几个值之后自己指定 binwidth。没有真正正确或错误的答案,所以尝试几个选项,看看哪个最适合您的特定数据。

当直方图失败时

直方图是从一个类别开始探索单个变量的好方法。然而,当我们想要比较一个变量在多个类别中的分布时,直方图存在可读性问题。例如,如果我们想要比较航空公司之间的到达延迟分布,一种不太有效的方法是在同一图上为每个航空公司创建直方图:

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

Overlapping Histograms with Multiple Airlines

(请注意,y 轴已被归一化,以反映航空公司之间不同的航班数量。为此,将参数norm_hist = True传递给sns.distplot函数调用。)

这个情节不是很有帮助!所有重叠的条形图使得航空公司之间几乎不可能进行比较。让我们来看看这个常见问题的几种可能的解决方案。

解决方案#1:并排直方图

我们可以将它们并排放置,而不是重叠航线直方图。为此,我们为每个航空公司创建一个到达延迟列表,然后将它作为一个列表列表传递给plt.hist函数调用。我们必须为每家航空公司指定不同的颜色和标签,这样我们才能区分它们。包括为每个航空公司创建列表在内的代码如下:

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

默认情况下,如果我们传入一个列表的列表,matplotlib 会将条形并排放置。在这里,我已经将 binwidth 改为 15 分钟,因为否则情节会过于混乱,但即使进行了修改,这也不是一个有效的数字。有太多的信息需要一次处理,条形图与标签不一致,而且仍然很难比较航空公司之间的分布情况。当我们制作一个情节时,我们希望观众尽可能容易理解,而这个人物没有达到那个标准!让我们看看第二个可能的解决方案。

解决方案 2:堆积条形图

我们可以通过向直方图调用传递参数stacked = True来堆叠每个航空公司的柱状图,而不是并排绘制柱状图:

# Stacked histogram with multiple airlines
plt.hist([x1, x2, x3, x4, x5], bins = int(180/15), stacked=True,
         normed=True, color = colors, label=names)

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

嗯,那绝对不会好到哪里去!在这里,每家航空公司都代表了每个仓位整体的一部分,但几乎不可能进行比较。例如,在-15 到 0 分钟的延迟时,联合航空公司或捷蓝航空公司的酒吧尺寸更大吗?我不知道,观众也不会知道。我一般不支持堆积条形图,因为它们可能很难解释(虽然有一些用例,比如可视化比例)。我们尝试使用直方图的两种解决方案都不成功,所以是时候转向密度图了。

密度图

首先,什么是密度图?密度图是根据数据估计的直方图的平滑、连续版本。最常见的估计形式被称为核密度估计。在这种方法中,在每个单独的数据点绘制一条连续的曲线(内核),然后将所有这些曲线加在一起,进行一次平滑的密度估计。最常用的核是高斯核(在每个数据点产生一个高斯钟形曲线)。如果你和我一样,觉得这样的描述有点混乱,看看下面的情节:

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

Kernel Density Estimation (Source)

这里,x 轴上的每条黑色竖线代表一个数据点。各个内核(本例中为高斯内核)在每个点上方用红色虚线表示。蓝色实线曲线是通过将各个高斯曲线相加得到的,并形成总密度图。

x 轴是变量的值,就像直方图一样,但是y 轴到底代表什么?密度图中的 y 轴是用于核密度估计的概率密度函数。然而,我们需要小心指定这是一个概率密度而不是一个概率。区别是概率密度是 x 轴上每单位的概率。要转换成实际概率,我们需要找到 x 轴上特定区间的曲线下面积。有点令人困惑的是,因为这是一个概率密度而不是一个概率, y 轴可以取大于 1 的值。密度图的唯一要求是曲线下的总面积积分为 1。我通常倾向于将密度图上的 y 轴视为仅用于不同类别之间相对比较的值。

锡伯恩的密度图

为了在 seaborn 中绘制密度图,我们可以使用distplotkdeplot函数。我将继续使用distplot函数,因为它允许我们通过一次函数调用进行多次分发。例如,我们可以制作一个密度图,在相应的直方图顶部显示所有到达延迟:

# Density Plot and Histogram of all arrival delays
sns.distplot(flights['arr_delay'], hist=True, kde=True, 
             bins=int(180/5), color = 'darkblue', 
             hist_kws={'edgecolor':'black'},
             kde_kws={'linewidth': 4})

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

Density Plot and Histogram using seaborn

该曲线显示了密度图,其本质上是直方图的平滑版本。y 轴表示密度,默认情况下直方图是归一化的,因此它与密度图具有相同的 y 轴刻度。

类似于直方图的二进制宽度,密度图有一个称为 带宽 的参数,该参数会改变单个内核并显著影响图的最终结果。绘图库将为我们选择一个合理的带宽值(默认情况下使用‘Scott’估计值),与直方图的 binwidth 不同,我通常使用默认带宽。但是,我们可以考虑使用不同的带宽,看看是否有更好的选择。在情节中,“斯科特”是默认的,这看起来是最好的选择。

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

Density Plot Showing different Bandwidths

请注意,带宽越宽,分布越平滑。我们还看到,即使我们将数据限制在-60 到 120 分钟,密度图也超出了这些限制。这是密度图的一个潜在问题:因为它计算每个数据点的分布,所以可能会生成超出原始数据范围的数据。这可能意味着我们最终在 x 轴上得到不可能的值,而这些值在原始数据中从未出现过!请注意,我们还可以更改内核,这将更改在每个数据点绘制的分布,从而更改整体分布。然而,对于大多数应用程序,默认的内核,高斯和默认的带宽估计工作得很好。

解决方案 3 密度图

现在我们已经了解了密度图是如何制作的,它代表了什么,让我们看看它如何解决我们可视化多个航空公司的到达延迟的问题。为了在同一个图上显示分布,我们可以遍历航空公司,每次调用distplot,将内核密度估计值设置为 True,将直方图设置为 False。绘制多家航空公司密度图的代码如下:

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

Density Plot with Multiple Airlines

最后,我们达成了一个有效的解决方案!有了密度图,我们可以很容易地在航空公司之间进行比较,因为这个图不那么杂乱。现在我们终于有了我们想要的图,我们得出结论,所有这些航空公司都有几乎相同的到达延迟分布!然而,数据集中还有其他航空公司,我们可以绘制一个稍有不同的航空公司,以说明密度图的另一个可选参数,对图表进行着色。

阴影密度图

填充密度图可以帮助我们区分重叠分布。尽管这并不总是一个好方法,但是它可以帮助强调发行版之间的差异。为了给密度图着色,我们将shade = True传递给distplot调用中的kde_kws参数。

sns.distplot(subset['arr_delay'], hist = False, kde = True,
                 kde_kws = {'shade': True, 'linewidth': 3}, 
                  label = airline)

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

Shaded Density Plot

是否对绘图进行着色和其他绘图选项一样,是一个取决于问题的问题!对于这个图表,我认为它是有意义的,因为阴影帮助我们区分重叠区域中的图。现在,我们终于有了一些有用的信息:阿拉斯加航空公司的航班往往比联合航空公司更早更频繁。下次你有选择的时候,你就知道该选择哪家航空公司了!

地毯地块

如果您想要显示分布中的每个值,而不仅仅是平滑的密度,您可以添加地毯图。这显示了 x 轴上的每一个数据点,使我们能够可视化所有的实际值。使用 seaborn 的distplot的好处是我们可以用一个参数调用rug = True来添加 rug plot(也有一些格式)。

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

Density Plot with Rug Plot for Alaska Airlines

如果有很多数据点,地毯图可能会变得过于拥挤,但对于某些数据集,查看每个数据点可能会有所帮助。rug 图还让我们看到了密度图是如何在不存在数据的地方“创建”数据的,因为它在每个数据点创建了一个核分布。这些分布可能会泄漏原始数据的范围,并给人以阿拉斯加航空公司的延误时间比实际记录的时间更短或更长的印象。我们需要小心这个密度图的伪像,并指出给观众看!

结论

这篇文章有望给你一系列的选项来可视化一个或多个类别中的单个变量。我们甚至可以制作更多的单变量(单变量)图,如经验累积密度图和分位数-分位数图,但现在我们将把它留在直方图和密度图(还有地毯图!).如果选项看起来势不可挡,不要担心:通过练习,做出一个好的选择会变得更容易,如果需要,你可以随时寻求帮助。此外,通常不存在最优选择,而“正确”的决定将取决于偏好和可视化的目标。好的一面是,无论你想制作什么样的情节,在 Python 中都有一种方法可以做到!可视化是交流结果的有效手段,了解所有可用选项可以让我们为数据选择正确的数字。

我欢迎反馈和建设性的批评,可以通过 Twitter @koehrsen_will 联系到我。

人工智能的历史

原文:https://towardsdatascience.com/history-of-ai-484a86fc16ef?source=collection_archive---------1-----------------------

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

早期

第二次世界大战期间,著名的英国计算机科学家艾伦·图灵致力于破解德国军队用来安全发送信息的“谜”码。艾伦·图灵和他的团队创造了用于破译恩尼格玛密码的炸弹机器。

英格玛和庞贝机器奠定了机器学习的基础。根据图灵的说法,一台可以在人类不知道它是机器的情况下与人类交谈的机器将赢得“模仿游戏”,可以说是“智能的”。

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

Alan Turing in 1927.

1956 年,美国计算机科学家约翰·麦卡锡组织了达特茅斯会议,会上首次采用了“人工智能”一词。研究中心在美国各地涌现,探索人工智能的潜力。研究人员艾伦·纽厄尔和希尔伯特·西蒙在推动人工智能成为可以改变世界的计算机科学领域方面发挥了重要作用。

认真对待人工智能研究

1951 年,一台名为 Ferranti Mark 1 的机器成功地使用了一种算法来控制跳棋。随后,Newell 和 Simon 开发了通用问题求解算法来解决数学问题。同样在 50 年代,通常被称为人工智能之父的约翰·麦卡锡开发了 LISP 编程语言,这在机器学习中变得非常重要。

在 20 世纪 60 年代,研究人员强调开发算法来解决数学问题和几何定理。20 世纪 60 年代末,计算机科学家致力于机器视觉学习,并在机器人中开发机器学习。第一个“智能”人形机器人 WABOT-1 于 1972 年在日本制造。

艾特斯

然而,尽管几十年来这种资金充足的全球努力,计算机科学家发现在机器中创造智能非常困难。为了取得成功,人工智能应用(如视觉学习)需要处理大量数据。计算机还不够发达,无法处理如此大量的数据。政府和企业对人工智能失去了信心。

因此,从 20 世纪 70 年代中期到 90 年代中期,计算机科学家面临着人工智能研究资金的严重短缺。这些年被称为“人工智能冬天”。

新千年,新机遇

20 世纪 90 年代末,美国企业再次对人工智能产生了兴趣。日本政府公布了开发第五代计算机的计划,以推进机器学习。人工智能爱好者认为,很快计算机将能够像人一样进行对话、翻译语言、解释图片和推理。1997 年,IBM 的“深蓝”计算机成为第一台击败国际象棋世界冠军加里·卡斯帕罗夫的计算机。

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

Garry Kasparov & IBM’s Deep Blue.

21 世纪初互联网泡沫破裂时,一些人工智能资金枯竭了。然而,机器学习继续前进,这在很大程度上要归功于计算机硬件的改进。企业和政府在狭窄的领域成功地使用了机器学习方法。

计算机处理能力和存储能力的指数增长使得公司第一次能够存储大量的数据。在过去的 15 年里,亚马逊、谷歌、百度和其他公司利用机器学习获得了巨大的商业优势。除了处理用户数据以了解消费者行为,这些公司还继续致力于计算机视觉、自然语言处理和一系列其他人工智能应用。机器学习现在嵌入到我们使用的许多在线服务中。因此,今天,技术部门驱动着美国股市。

沙恩雷

关注 Lansaar Research on Medium,了解最新的新兴技术和新的商业模式。

简单码中卷积块的历史

原文:https://towardsdatascience.com/history-of-convolutional-blocks-in-simple-code-96a7ddceac0c?source=collection_archive---------6-----------------------

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

我尽量定期看 ML 和 AI 相关的论文。这是跟上最新发展的唯一方法。作为一名计算机科学家,我经常在阅读科学描述文本或公式的数学符号时碰壁。我发现用明码理解要容易得多。因此,在本文中,我想引导您浏览 Keras 中最近实现的架构中重要卷积模块的精选列表。

当你在 GitHub 上寻找流行架构的实现时,你会惊讶于它们包含了多少代码。包含足够数量的注释并使用额外的参数来增强模型是一个很好的实践,但同时这会分散对架构本质的注意力。为了进一步简化和缩短代码片段,我将使用一些别名函数:

def conv(x, f, k=3, s=1, p='same', d=1, a='relu'):
  return Conv2D(filters=f, kernel_size=k, strides=s, 
                padding=p, dilation_rate=d, activation=a)(x)def dense(x, f, a='relu'):
  return Dense(f, activation=a)(x)def maxpool(x, k=2, s=2, p='same'):
  return MaxPooling2D(pool_size=k, strides=s, padding=p)(x)def avgpool(x, k=2, s=2, p='same'):
  return AveragePooling2D(pool_size=k, strides=s, padding=p)(x)def gavgpool(x):
  return GlobalAveragePooling2D()(x)def sepconv(x, f, k=3, s=1, p='same', d=1, a='relu'):
  return SeparableConv2D(filters=f, kernel_size=k, strides=s, 
                padding=p, dilation_rate=d, activation=a)(x)

我发现去掉模板代码后,代码可读性更好了。当然,这只有在你理解了我的单字母缩写后才有效。让我们开始吧。

瓶颈块

卷积层的参数数量取决于内核大小、输入滤波器的数量和输出滤波器的数量。你的网络越宽,一个 3x3 的卷积就越贵。

def bottleneck(x, f=32, r=4):
  x = conv(x, f//r, k=1)
  x = conv(x, f//r, k=3)
  return conv(x, f, k=1)

瓶颈块背后的思想是使用廉价的 1x1 卷积以一定的速率 r 减少通道的数量,从而使下面的 3x3 卷积具有更少的参数。最后,我们通过另一个 1x1 卷积再次拓宽了网络。

初始模块

Inception 模块引入了并行使用不同操作并合并结果的思想。这样,网络可以学习不同类型的过滤器。

def naive_inception_module(x, f=32):
  a = conv(x, f, k=1)
  b = conv(x, f, k=3)
  c = conv(x, f, k=5)
  d = maxpool(x, k=3, s=1)
  return concatenate([a, b, c, d])

这里,我们将使用内核大小为 1、3 和 5 的卷积层与最大池层合并。这个片段展示了一个初始模块的简单实现。实际的实现将它与上面的瓶颈思想结合起来,这使得它稍微复杂一些。

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

Inception Module

def inception_module(x, f=32, r=4):
  a = conv(x, f, k=1)
  b = conv(x, f//3, k=1)
  b = conv(b, f, k=3)
  c = conv(x, f//r, k=1)
  c = conv(c, f, k=5)
  d = maxpool(x, k=3, s=1)
  d = conv(d, f, k=1)
  return concatenate([a, b, c, d])

残余块

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

ResNet 是由微软的研究人员推出的一种架构,它允许神经网络拥有任意多的层,同时仍然提高了模型的准确性。到现在为止,你可能已经习惯了,但在 ResNet 之前,情况并非如此。

def residual_block(x, f=32, r=4):
  m = conv(x, f//r, k=1)
  m = conv(m, f//r, k=3)
  m = conv(m, f, k=1)
  return add([x, m])

想法是将初始激活添加到卷积块的输出中。这样,网络可以通过学习过程决定输出中使用多少新卷积。注意,初始模块连接输出,而残差块将它们相加。

ResNeXt 块

根据它的名字,你可以猜测 ResNeXt 和 ResNet 有密切的关系。作者将术语基数引入卷积块,作为宽度(信道数量)和深度(层数)的另一个维度。

基数是指一个块中出现的并行路径的数量。这听起来类似于以并行发生的 4 个操作为特征的 inception 块。然而,基数 4 将简单地使用相同的操作 4 次,而不是并行使用不同类型的操作。

如果它们做同样的事情,为什么要把它们放在一起呢?好问题。这个概念也被称为分组卷积,可以追溯到最初的 AlexNet 论文。虽然,当时它主要用于将训练过程分割到多个 GPU,而 ResNeXt 使用它们来提高参数效率。

def resnext_block(x, f=32, r=2, c=4):
  l = []
  for i in range(c):
    m = conv(x, f//(c*r), k=1)
    m = conv(m, f//(c*r), k=3)
    m = conv(m, f, k=1)
    l.append(m)
  m = add(l)
  return add([x, m])

这个想法是把所有的输入通道分成组。卷积将只在它们专用的通道组内起作用,而不是跨越所有的通道。人们发现,每一组将学习不同类型的功能,同时增加重量的效率。

想象一个瓶颈模块,首先使用压缩率 4 将 256 个输入通道减少到 64 个,然后将它们作为输出恢复到 256 个通道。如果我们想要引入基数 32 和压缩率 2,我们将使用 32 个 1x1 卷积层,每个并行 4 (256 / (32*2))个输出通道。之后,我们将使用 32 个 3×3 卷积层和 4 个输出通道,然后是 32 个 1×1 卷积层,每个卷积层有 256 个输出通道。最后一步包括添加这 32 条并行路径,在添加初始输入以创建剩余连接之前,为我们提供单个输出。

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

Left: ResNet Block — Right: RexNeXt Block of roughly the same parameter complexity

这需要消化很多东西。使用上面的图像来获得正在发生的事情的可视化表示,也许可以复制片段来自己在 Keras 中构建一个小网络。我复杂的描述可以用这简单的 9 行代码来概括,是不是很牛逼?

顺便说一下,如果基数等于通道的数量,我们将得到一个叫做深度可分卷积的东西。自从引入 Xception 体系结构以来,这种方法越来越受欢迎。

密集块

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

密集块是残差块的极端版本,其中每个卷积层获得块中所有先前卷积层的输出。首先,我们将输入激活添加到一个列表中,之后我们进入一个循环,该循环遍历一个块的深度。每个卷积输出也连接到列表,以便后续迭代获得越来越多的输入特征地图。这种方案一直持续到达到所需的深度。

def dense_block(x, f=32, d=5):
    l = x
    for i in range(d):
        x = conv(l, f)
        l = concatenate([l, x])
    return l

虽然需要几个月的研究才能得到一个和 DenseNet 一样好用的架构,但实际的构建模块可能就是这么简单。令人着迷。

挤压激励块

SENet 在短时间内是 ImageNet 上最先进的技术。它建立在 ResNext 之上,专注于对网络的信道信息进行建模。在常规卷积层中,对于点积计算中的加法操作,每个信道将具有相同的权重。

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

Squeeze- and Excitation Module

SENet 推出了一个非常简单的模块,可以添加到任何现有的架构中。它创建了一个微小的神经网络,学习如何根据输入对每个过滤器进行加权。如您所见,它本身不是卷积块,但因为它可以添加到任何卷积块中,并可能提高其性能,所以我想将其添加到组合中。

def se_block(x, f, rate=16):
    m = gavgpool(x)
    m = dense(m, f // rate)
    m = dense(m, f, a='sigmoid')
    return multiply([x, m])

每个通道被压缩成一个单一的值,并送入一个两层的神经网络。根据频道分布,该网络将学习根据频道的重要性对其进行加权。最后,这个权重与卷积激活相乘。

SENets 引入了微小的计算开销,同时潜在地改进了任何卷积模型。在我看来,这个街区没有得到应有的重视。

纳斯内特正常细胞

这就是事情变得有点糟糕的地方。我们正在离开人们提出简单而有效的设计决策的空间,进入一个设计神经网络架构的算法世界。NASNet 在设计上令人难以置信,但实际架构相对复杂。我们所知道的是,它在 ImageNet 上工作得非常好。

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

作者手动定义了不同类型的卷积层和池层的搜索空间,每个层都有不同的可能设置。他们还定义了这些层如何并行、顺序排列,以及如何添加或连接。一旦定义了这一点,他们就建立了一个基于递归神经网络的强化学习(RL)算法,如果特定的设计提案在 CIFAR-10 数据集上表现良好,就会得到奖励。

最终的架构不仅在 CIFAR-10 上运行良好,还在 ImageNet 上实现了最先进的结果。NASNet 由一个正常细胞和一个还原细胞组成,它们一个接一个重复出现。

def normal_cell(x1, x2, f=32):
    a1 = sepconv(x1, f, k=3)
    a2 = sepconv(x1, f, k=5)
    a = add([a1, a2])
    b1 = avgpool(x1, k=3, s=1)
    b2 = avgpool(x1, k=3, s=1)
    b = add([b1, b2])
    c2 = avgpool(x2, k=3, s=1)
    c = add([x1, c2])
    d1 = sepconv(x2, f, k=5)
    d2 = sepconv(x1, f, k=3)
    d = add([d1, d2])
    e2 = sepconv(x2, f, k=3)
    e = add([x2, e2])
    return concatenate([a, b, c, d, e])

这就是你如何在 Keras 中实现一个普通的单元。除了这种图层和设置的完美结合之外,没有什么新的东西。

反向剩余块

到现在为止,你已经听说过瓶颈块和可分卷积。让我们把它们放在一起。如果你运行一些测试,你会注意到,因为可分卷积已经减少了参数的数量,压缩它们可能会损害而不是提高性能。

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

作者提出了这样一个想法,即实际上做与瓶颈剩余块相反的事情。他们使用廉价的 1×1 卷积来增加通道的数量,因为下面的可分离卷积层已经大大减少了参数的数量。它在添加到初始激活之前关闭通道。

def inv_residual_block(x, f=32, r=4):
  m = conv(x, f*r, k=1)
  m = sepconv(m, f, a='linear')
  return add([m, x])

这个难题的最后一部分是可分离卷积后没有激活函数。相反,它被直接添加到输入中。这种模块在应用于架构中时非常有效。

阿米巴网正常细胞

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

Normal Cell of AmoebaNet

有了 AmoebaNet,我们可以了解 ImageNet 的当前技术水平,也可能了解一般的图像识别。像 NASNet 一样,它是由一种算法设计的,使用与以前相同的搜索空间。唯一不同的是,他们用一种通常被称为进化的遗传算法取代了强化学习算法。不过,深入研究其工作原理超出了本文的范围。故事的结尾是,通过进化,作者能够找到一个比 NASNet 计算成本更低的更好的解决方案。它在 ImageNet 上获得了 97.87%的前 5 名准确率,这是单一架构中的第一个。

查看代码,这个代码块没有添加任何您没有见过的新内容。你为什么不试着在图片的基础上实现新的正常单元,看看你是否能跟上。

结论

我希望这篇文章让您对重要的卷积块有了一个坚实的理解,并且实现它们可能比您想象的要容易。要更详细地了解这些体系结构,请查看它们各自的论文。你会注意到,一旦你掌握了一篇论文的核心思想,理解其余部分就容易多了。还请注意,实际的实现通常会将批处理规范化添加到组合中,并根据激活函数的应用位置而有所不同。欢迎在评论中提问。

PS:我在考虑用简单的代码创建一个包含所有这些块和架构的存储库。这对你们有些人有帮助吗?

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值