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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用 Galaaz 绘制 Ruby:GraalVM 中 Ruby 和 R 紧密耦合的一个例子

原文:https://towardsdatascience.com/ruby-plotting-with-galaaz-an-example-of-tightly-coupling-ruby-and-r-in-graalvm-520b69e21021?source=collection_archive---------8-----------------------

介绍

Galaaz 是一个紧密耦合 Ruby 和 r 的系统。Ruby 是一种强大的语言,有一个大型社区,一个非常大的库集,非常适合 web 开发。然而,它缺乏数据科学、统计学、科学绘图和机器学习的图书馆。另一方面,R 被认为是解决上述所有问题的最强大的语言之一。也许 R 最强的竞争对手是 Python,它有诸如 NumPy、Panda、SciPy、SciKit-Learn 等库。

对于 Galaaz,我们不打算在 R 中重新实现任何科学库,我们允许两种语言之间非常紧密的耦合,以至于 Ruby 开发人员不需要知道有一个 R 引擎在运行。为此,我们使用了 Oracle 提供的新技术:GraalVM、TruffleRuby 和 FastR:

GraalVM is a universal virtual machine for running applications written in JavaScript, Python 3, Ruby, R, JVM-based languages like Java, Scala, Kotlin, and LLVM-based languages such as C and C++. GraalVM removes the isolation between programming languages and enables interoperability in a shared runtime. It can run either standalone or in the context of OpenJDK, Node.js, Oracle Database, or MySQL. GraalVM allows you to write polyglot applications with a seamless way to pass values from one language to another. With GraalVM there is no copying or marshaling necessary as it is with other polyglot systems. This lets you achieve high performance when language boundaries are crossed. Most of the time there is no additional cost for crossing a language boundary at all.Often developers have to make uncomfortable compromises that require them to rewrite their software in other languages. For example: * “That library is not available in my language. I need to rewrite it.” 
  * “That language would be the perfect fit for my problem, but we cannot run it in our environment.” 
  * “That problem is already solved in my language, but the language is too slow.”With GraalVM we aim to allow developers to freely choose the right language for the task at hand without making compromises.

感兴趣的读者还应该查看以下网站:

加拉茨是什么意思

加拉茨是“加拉哈德”的葡萄牙语名称。来自维基百科:

Sir Galahad (/ˈɡæləhæd/; sometimes referred to as Galeas /ɡəˈliːəs/ or Galath /ˈɡæləθ/), in Arthurian legend, is a knight of King Arthur's Round Table and one of the three achievers of the Holy Grail. He is the illegitimate son of Sir Lancelot and Elaine of Corbenic, and is renowned for his gallantry and purity as the most perfect of all knights.Emerging quite late in the medieval Arthurian tradition, Sir Galahad first appears in the Lancelot–Grail cycle, and his story is taken up in later works such as the Post-Vulgate Cycle and Sir Thomas Malory's Le Morte d'Arthur. His name should not be mistaken with Galehaut, a different knight from Arthurian legend.

Galaaz 演示

先决条件

  • GraalVM (>= rc7)
  • 松露红宝石
  • FastR

以下 R 包将在必要时自动安装,但如果需要,也可以在演示之前安装:

  • ggplot2
  • gridExtra

安装 R 包需要一个开发环境。在 Linux 中,gnu 编译器和工具应该足够了。

为了运行“规范”,以下 Ruby 包是必需的:

  • gem 安装 rspec

准备

  • gem 安装 galaaz

运行演示

这个演示的 ggplot 是从这里的中提取的

在控制台上做

> galaaz master_list:scatter_plot

运行其他演示

在控制台上做什么

> galaaz -T

将显示所有可用演示的列表。要运行列表中的任何演示,请将对“rake”的调用替换为“galaaz”。例如,列表中的一个示例是“rake sthda:bar”。为了运行这个示例,只需执行“galaaz sthda:bar”。执行“galaaz sthda:all”将运行 sthda 类别中的所有演示,在本例中,幻灯片放映中有 80 多个用 Ruby 编写的 ggplot 图形。

一些示例要求“rspec”可用。要安装“rspec ”,只需执行“gem install rspec”。

演示代码

以下是上述示例的 Ruby 代码和绘图。示例中的代码和下面的代码有一点不同。如果运行该示例,绘图将出现在屏幕上,如下所示,我们生成一个“svg”图像,然后将其包含在本文档中。为了生成和成像,使用了 R.svg 设备。要在屏幕上生成绘图,请使用 R.awt 设备,如代码中所述。

require 'galaaz'
require 'ggplot'# load package and data
R.options(scipen: 999)  # turn-off scientific notation like 1e+48
R.theme_set(R.theme_bw) # pre-set the bw theme.midwest = ~:midwestR.svg                   # run the svg device to generate an
                        # image in .png format# Scatterplot
gg = midwest.ggplot(E.aes(x: :area, y: :poptotal)) + 
     R.geom_point(E.aes(col: :state, size: :popdensity)) + 
     R.geom_smooth(method: "loess", se: false) + 
     R.xlim(R.c(0, 0.1)) + 
     R.ylim(R.c(0, 500000)) + 
     R.labs(subtitle: "Area Vs Population", 
            y: "Population", 
            x: "Area", 
            title: "Scatterplot", 
            caption: "Source: midwest")R.png('midwest.png')     
puts ggR.dev__off               # R.dev__off turns off the device.  
                         # If using awt, the plot window will 
                         # be closed

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

Midwest Scatterplot

在 R 中,生成该图的代码如下

# install.packages("ggplot2")
# load package and data library(ggplot2)options(scipen=999)    # turn-off scientific notation like 1e+48
theme_set(theme_bw())  # pre-set the bw theme.data("midwest", package = "ggplot2")# Scatterplot
gg <- ggplot(midwest, aes(x=area, y=poptotal)) + 
      geom_point(aes(col=state, size=popdensity)) + 
      geom_smooth(method="loess", se=F) + 
      xlim(c(0, 0.1)) + 
      ylim(c(0, 500000)) + 
      labs(subtitle="Area Vs Population", 
           y="Population", 
           x="Area", 
           title="Scatterplot", 
           caption = "Source: midwest")plot(gg)

请注意,这两个代码非常相似。Ruby 代码要求在调用任何函数之前使用“R”,例如,在 Ruby 中,R 函数“geom_point”变成了“R.geom_point”。r 命名参数如(col = state,size = popdensity),在 Ruby 中变成(col: :state,size: :popdensity)。

需要注意的最后一点是对‘AES’函数的调用。在 Ruby 中,我们不用“R.aes ”,而是使用“E.aes”。为什么需要 E.aes 的解释是 R 中的一个高级主题,取决于 R 中的非标准求值(NSE)。简而言之,函数“aes”在 R 中是延迟求值的,即在 R 中调用 geom_point(aes(col=state,size=popdensity))时,函数 geom_point 接收类似于包含“aes(col=state,size=popdensity)”的字符串作为参数,aes 函数将在 geom_point 函数内部求值。在 Ruby 中,没有懒惰求值,做 R.aes 会尝试立即求值。为了延迟函数 aes 的评估,我们需要使用 E.aes。对 R 中的 NSE 感兴趣的读者可参考此处的。

该示例的扩展

如果这两个代码如此相似,那么为什么要用 Ruby 而不是 R 呢?galaaz 到底有什么好处呢?

Ruby 是一种现代的面向对象语言,有许多非常有用的结构,比如类、模块、块、过程等等。上面的例子关注于两种语言的耦合,并没有展示其他 Ruby 结构的使用。在下面的例子中,我们将展示一个使用其他 Ruby 结构的更复杂的例子。这当然不是一个写得很好的健壮的 Ruby 代码,但是它给出了 Ruby 和 R 是如何紧密耦合的想法。

让我们想象一下,我们在一家公司工作,这家公司有自己的情节主题。因此,它定义了一个“CorpTheme”模块。该公司的地块不应有网格,标签中的数字不应使用科学符号,首选颜色是蓝色。

# corp_theme.rb
# defines the corporate theme for all plots

module CorpTheme#----------------------------------------------------------------
# Defines the plot theme (visualization).  In this theme we
# remove major and minor
# grids, borders and background.  We also turn-off scientific
# notation.
#---------------------------------------------------------------

  def self.global_theme # turn-off scientific notation like 1e+48    
    R.options(scipen: 999)
    # remove major grids
    global_theme = R.theme(panel__grid__major: E.element_blank())
    # remove minor grids
    global_theme = global_theme + 
       R.theme(panel__grid__minor: E.element_blank)
    # remove border
    global_theme = global_theme + 
       R.theme(panel__border: E.element_blank)
    # remove background
    global_theme = global_theme + 
       R.theme(panel__background: E.element_blank)
    # Change axis font
    global_theme = global_theme +
                   R.theme(axis__text: E.element_text(size: 8,
                                color: "#000080"))
    # change color of axis titles
    global_theme = global_theme +
                   R.theme(axis__title: E.element_text(
                             color: "#000080", 
                             face: "bold",
                             size: 8,
                             hjust: 1))
  end

end

我们现在定义一个散点图类:

# ScatterPlot.rb
# creates a scatter plot and allow some configuration

class ScatterPlot attr_accessor :title
  attr_accessor :subtitle
  attr_accessor :caption
  attr_accessor :x_label
  attr_accessor :y_label

  #----------------------------------------------------------------
# Initialize the plot with the data and the x and y variables
#---------------------------------------------------------------- def initialize(data, x:, y:)
    @data = data
    @x = x
    @y = y
  end#----------------------------------------------------------------
# Define groupings by color and size
#--------------------------------------------------------------- def group_by(color:, size:)
    @color_by = color
    @size_by = size
  end#----------------------------------------------------------------
# Add a smoothing line, and if confidence is true the add a
# confidence interval, if false does not add the confidence
# interval
#-_-------------------------------------------------------------- def add_smoothing_line(method:, confidence: true)
    @method = method
    @confidence = confidence
  end 
  #---------------------------------------------------------------
# Creates the graph title, properly formated for this theme
# @param title [String] The title to add to the graph
# @return textGrob that can be included in a graph
#---------------------------------------------------------------- def graph_params(title: "", subtitle: "", caption: "", 
                   x_label: "", y_label: "")
    R.labs(
      title: title, 
      subtitle: subtitle, 
      caption: caption,
      y_label: y_label, 
      x_label: x_label, 
    )
  end#---------------------------------------------------------------
# Prepare the plot's points
#--------------------------------------------------------------- def points
    params = {}
    params[:col] = @color_by if @color_by
    params[:size] = @size_by if @size_by
    R.geom_point(E.aes(params))
  end#----------------------------------------------------------------
# Plots the scatterplot
#---------------------------------------------------------------- def plot(device = 'awt') device == 'awt' ? R.awt : R.svg

    gg = @data.ggplot(E.aes(x: @x, y: @y)) +
      points + 
      R.geom_smooth(method: @method, se: @confidence) +
      R.xlim(R.c(0, 0.1)) +
      R.ylim(R.c(0, 500000)) + 
      graph_params(title: @title,
                   subtitle: @subtitle, 
                   y_label: @y_label, 
                   x_label: @x_label, 
                   caption: @caption) +
      CorpTheme.global_theme R.png('scatter_plot.png') if !(device == 'awt')
    puts gg
    R.dev__off

  end

end

这是用中西部数据制作散点图的最终代码

require 'galaaz'
require 'ggplot'sp = ScatterPlot.new(~:midwest, x: :area, y: :poptotal)
sp.title = "Midwest Dataset - Scatterplot"
sp.subtitle = "Area Vs Population"
sp.caption = "Source: midwest"
sp.x_label = "Area"
sp.y_label = "Population"
sp.group_by(color: :state, size: :popdensity)    # try sp.group_by(color: :state)
# available methods: "lm", "glm", "loess", "gam"
sp.add_smoothing_line(method: "glm") 
sp.plot('svg')

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

Midwest Plot with ‘glm’ function and modified theme

结论

r 是一种非常强大的语言,用于统计分析、数据分析、机器学习、绘图和许多其他具有非常大的软件包生态系统的科学应用。然而,R 通常被认为很难学,缺乏现代计算机语言的结构,如面向对象的类、模块、lambdas 等。正因如此,许多开发人员已经开始或从 R 转向 Python。

有了 Galaaz,R 程序员几乎可以透明地从 R 移植到 Ruby,因为语法几乎是一样的,而且他们用 fastR 作为 R 引擎。根据大多数基准测试,FastR 可以比 Gnu R 快几个数量级。此外,通过使用 Galaaz,R 开发人员可以开始(如果需要的话,可以慢慢地)使用 Ruby 的所有构造和库来很好地补充 R 包。

对于 Ruby 开发人员来说,Galaaz 允许完全透明地直接使用 R 函数。如上面第二个例子所示,类 ScatterPlot 完全隐藏了 R 调用 Ruby 开发者的所有细节,此外,Galaaz 由 TruffleRuby 提供支持,也可以比 MRI Ruby 快几个数量级。

指导您的数据科学战略的规则

原文:https://towardsdatascience.com/rules-to-guide-your-data-science-strategy-cf4a4eff0e4d?source=collection_archive---------10-----------------------

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

作为数据科学家,我们在一个年轻的领域工作——我们应该努力向更成熟领域的最佳老师学习

许多关于企业战略的文献都过于狭隘,不适用于数据科学战略的制定。虽然企业战略文献通常专注于竞争战略,暗示对手,但更常见的情况是,作为数据科学家,你唯一的竞争对手是你自己;如果数据科学是一项运动,它看起来更像高尔夫而不是网球。

具有讽刺意味的是,军事战略文献虽然也关注击败对手,但对战略目标有着更广泛的看法,特别是当人们认识到战争往往是在战场之外而不是在战场上取得胜利的时候。因此,正如我在早些时候关于数据科学战略的讨论中解释的那样,许多军事院校用来教授战略的公式是用非常通用的术语“战略=目标+方法+手段”来构建的。这个定义的关键是目标的明智选择。

巴兹尔·利德尔·哈特爵士被认为是第一次世界大战后军事战略方面最清晰的思想家之一。在他被广泛阅读的文章《战略》中,他提出了一套八条战略准则。在接下来的内容中,我列出了六条格言(外加一条我自己发明的额外格言),它们并不是专门为了打败对手,还包括了关于它们如何应用于数据科学问题的评论(这些格言的表达方式,我非常感谢弗雷德·尼科尔斯的表述)。

当最初由利德尔·哈特提出时,这些格言的目的是巴兹尔爵士通过研究至少数百年来战争的方式而了解到的战略。数据科学出现的时间并不长,但这并不意味着我们不能或不应该学习他人如何在其他领域取得成功,并将其应用到我们自己的领域,以便取得比巴兹尔爵士研究的将军们更有效的成就——事实上,巴兹尔爵士的、*、*以下面的观察为开头,并将其归功于奥托·冯·俾斯麦:“傻瓜通过经验学习。我更喜欢从别人的经验中获益”。

格言一:量入为出

在某些方面,这应该是法律的全部,正如原始数据科学家阿莱斯特·克劳利可能会说的。在敏捷时代,学会根据需要进行调整是最重要的,但是如果有比这更重要的事情,那就是确保手段是目的的仆人,当你的计划不能让你更接近目标时,是时候制定一个新的,或者至少是改变的计划了。

格言二:时刻牢记你的目标,同时根据情况调整你的计划

数据科学家很容易陷入建模、统计和编程的琐事中。作为商业环境中的专业人士,重要的是要记住,你正在努力为客户解决问题——通常情况下,放弃针对这一特定问题的技术,选择另一种技术,会比试图将不合适的解决方案强加给问题更明智。

我们从战略的 Art Lykke 等式开始,这也意味着如果数据科学不符合目的,我们应该完全拒绝它作为一种工具。数据科学家面临着巨大的同行压力,要求他们对能够实现的目标持乐观态度。然而,请注意,在医学等更成熟的领域,专家不会不好意思告诉病人他们找错了医生,并指导病人去其他地方。

格言三:利用阻力最小的路线——只要它能把你引向任何有助于你根本目标的目标。

数据科学家很容易选择当前的工具——这不太可能是阻力最小的路线。至少,目前的工具可能也是最新的工具,与使用你以前多次使用的工具相比,你需要花费额外的精力来掌握它。

准则四:确保计划和部署都是灵活的——适应环境

数据并不像你想象的那样,直到你对它进行了分析和确认。这条格言几乎是“没有自由的预感”定理,适用于不同的环境。你最喜欢的算法或你认为最有可能成功的方法更有可能失败——拥抱失败,选择一个比你一开始拥有更多知识的新方法,然后再试一次。建立这样的预期,你将会失败于你对任务规模的估计。从最初失败的方法中吸取教训,更好地理解和解决客户的问题。

格言五:一次进攻失败后,不要沿同一路线(或以同一形式)重新发起进攻。

从上面继续,当你不可避免地失败时,确保当你失败时,你避免疯狂地重复同样的行动,同时期待不同的结果。如果一个算法看起来不起作用,不要浪费时间试图调整它,并尝试选择下一个算法来最大化方法的差异。

格言六:选择一条有多种选择的路线

知道你可能会失败意味着你选择了一种解决问题的方法,这种方法可以根据需要很容易地改变,并且在失败的情况下可以产生最大的价值。例如,避免将“黑盒”算法作为您解决问题的第一次尝试,而是选择一种方法,即使它无法实现您所追求的准确结果,也可以最大限度地揭示您的目标与其预测变量之间的关系,以便您的后续尝试可以由您在第一次尝试中所学到的内容来指导。

补充点:避免为他人工作

这最后一个不是来自利德尔·哈特,而是纯粹是我自己的发明。然而,重点是直截了当的-数据科学并不存在于真空中,数据科学团队将依靠他人的善意来获得最佳结果。因此,试着让你周围的人生活得更轻松。如果你的工作流程是一个模型被交给不同的团队去实现,理解他们的过程,并且让你的模型实现变得友好。如果你的公司有一个营销团队,你有时会为他们准备文档,那就按照他们的风格指南去做。一方面,这是礼貌,也是应该做的事情,另一方面,你不知道什么时候你会需要他们的帮助——即使不是特定的那些人,拥有乐于助人的名声会让其他人更有可能在未来想要帮助你。

当然,你也应该避免为自己工作,我上面写的不应该被视为更加努力工作的戒律。取而代之的是,对数据科学采取一种防御方法,这可以防止他人和你自己不必要的努力。

有关改进数据科学策略的更多信息,请查看我正在撰写的 leanpub 书籍“懒惰的数据科学家”。

跑或走(第 1 部分):用机器学习和核心 ML 检测运动活动

原文:https://towardsdatascience.com/run-or-walk-detecting-user-activity-with-machine-learning-and-core-ml-part-1-9658c0dcdd90?source=collection_archive---------4-----------------------

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

在最近六月的苹果 WWDC 会议上有很多公告。其中最引人注目的是 Core ML 框架的发布,该框架为每个开发者提供了设备上的机器学习能力。这是革命性的。

革命性意味着,在更早的时候,想要在应用程序中使用任何有点现代的机器学习模型的人只有一些不容易配置和实现的选择。核心 ML 成为在您应用程序中以“拖放”方式使用 ML 模型的唯一选择。iOS 做了大部分繁重的工作来生成表示模型本身、其输入和输出的接口。

这为每个人提供了实施端到端解决方案的机会:从收集数据和训练模型,到在 iOS 应用程序中利用该模型。

有了这个前景,我早就有的想法——自动检测体育活动——变成了现实。我决定证明一个假设,即内置于 iOS 应用程序中的预训练机器学习模型可以根据加速度计和陀螺仪的数据来分类这个人是跑步还是走路。当然,还有更多其他体育活动可以用自动化的方式检测,但对于第一次尝试,我选择了那些从人们的角度以及从传感器接收的数据中可以明显区分的活动。

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

Accelerometer data when the person is walking

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

Accelerometer data when the person is running

在调查 iOS 上已经有哪些类似的工具可用于此目的时,我发现 CMMotionActivityManager 类的 CMMotionActivity 对象可以检测设备是否在行走或跑步的人身上,或者设备是否在汽车上,甚至是在自行车上。

乍一看,这个问题似乎已经解决了,但在深入研究文档后,我意识到苹果的 Core Motion 使用了来自广泛输入源的数据,包括加速度计、陀螺仪、磁力计和计步器。

仅仅使用传感器数据的一小部分,我们能预测这个人是在走还是在跑吗?有多准确?任何机器学习模型都能够完成这项任务吗?最后,我以后还能在我的 iOS 应用中使用这种模式吗?

这些是我将在接下来几周的一系列博客文章中找到答案的主要问题。

请跟随我,看看我在收集训练数据、设计、训练和调整高精度机器学习模型并将其构建到 iOS 应用程序中时面临了哪些挑战。

阅读下一部分:

跑步或行走(第 2 部分):以正确的方式收集设备运动数据

原文:https://towardsdatascience.com/run-or-walk-part-2-collecting-device-motion-data-the-right-way-58a277ff2087?source=collection_archive---------2-----------------------

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

阅读上一部分: “跑还是走(第一部分):用机器学习和 Core ML 检测运动数据活动”

出于开发一个机器学习模型来准确预测用户是走路还是跑步的动机,我需要数据。快速搜索包含此类活动的公开可用数据集没有得到任何结果。剩下的唯一选择就是自己收集数据。

每个参加过任何数据科学竞赛的人都知道,数据集总是需要经过某种程度的处理,才能馈入机器学习模型。你不能错过这个阶段,否则,你的模型将会遭受缺失、扭曲的数据、异常值和其他一些问题。有时,在完成一项比赛后,回头看看投入的时间,您会意识到将近一半的努力都花在了处理数据集上!原因?数据集是基于现实生活中的数据,而现实生活中的数据在连续性、同质性或统计分布方面并不理想。

DIY 数据

当你独自负责收集数据时,事情会变得更好。从一方面来说,这是获取数据的最昂贵的方式,但是从另一方面来说,你有一个很好的机会通过以你需要的方式收集数据来节省你未来的努力。仔细思考你试图解决的问题的基础有助于找到收集数据的适当方法。

我从要点开始。如果我想知道这个人是在跑还是在走,我首先需要在人体上找到一个地方,根据传感器数据可以清楚地区分这些活动。简单地将 iPhone 放在口袋里并从那里收集数据并不是一个好的解决方案,因为每次设备可以放在不同的位置。这可能导致传感器的结果差异太大,即使是相同的活动。鉴于我收集数据的时间有限,我宁愿为了简单而牺牲数据的可变性。

收集人的活动数据的最佳选择是手腕。原因如下:

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

Walking: hand wrist directed to the ground, moves with low to medium velocity

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

Running: hand wrist directed mostly perpendicular to the ground, moves with medium to high velocity

考虑到大多数人有两个手腕,我的 2 级分类模型的数据应该以下列变化收集:

  • 走路,右手腕;
  • 走路,左手腕;
  • 跑步,右手腕
  • 跑步,左手腕;

这里的一个有效问题应该是“等等,当 Apple Watch 是一个更合适的选择时,为什么要在你的手腕上安装 iPhone?!"完全同意,但那时我还没有手机,并认为 iPhone 及其加速度计和陀螺仪将提供相同的传感器数据。

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

iPhone was always positioned with Home button pointing to the fingers

收藏什么?

第一个似乎很容易回答的问题,可能会把你引向错误的方向。在你的 iPhone 中有加速度计、陀螺仪、磁力计、计步器甚至气压计并不意味着从所有这些设备中收集传感器数据是有意义的。

这里一个很好的起点是一个官方的 文档,它揭示了每个传感器的能力和局限性。仔细阅读后,我意识到最有价值的数据来自两个传感器:加速度计和陀螺仪。记得吗,我想用尽可能少的数据?限制传感器的数量是这个方向的第一步。

为什么是那两个?加速度计提供了设备沿 3 个轴的速度变化,这是关于一个人如何移动他的手的重要信息。陀螺仪提供设备绕空间轴旋转的速率,这可能对区分跑步和行走活动没有太多帮助,但可能仍然有所帮助。

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

Sensor axes for accelerometer (left) and gyroscope (right)

原始数据还是经过处理的数据?

苹果在为不同场合提供不同格式的运动数据方面做得非常好。如果需要加速度计数据仅限于仅由用户应用于设备的加速度,在这种情况下,处理后的数据是一个有效的选项。它不包括不同形式的偏差,如重力引起的加速度。

另一方面,原始加速度计数据由您决定如何处理。这种数据是在我未来的机器学习模型中使用的完美候选。未经处理意味着数据不会因 iOS 中处理算法的实施细节而产生任何形式的偏差。这使得数据有可能在其他平台上重用,并使得在训练模型时出现难以识别的问题的风险降低。

传感器更新频率

根据硬件的不同,苹果表示加速度计和陀螺仪的最大传感器更新频率令人印象深刻的“至少 100 Hz”。很明显:你需要的关于设备移动的信息越详细,这个值就应该越高。但是,当你获得足够详细的数据时,总会有一个阈值,即使获得更详细的测量也没有意义。

如何找到一个最佳的传感器更新频率?以最大可能频率收集等效活动数据,然后是该值的 70%,然后是 40%,最后是 10%。绘制您从这些值中的每一个接收到的信号,并找到一个保持信号的重要细节并且同时具有最低传感器更新频率的图。

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

Data collected at 50Hz

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

The same data downsampled to 30Hz. Important signal details are lost.

在尝试了几个值之后,我确定 50Hz 是我要记录的活动类型的最佳传感器更新频率。

收集间隔

最初,我试图在一个“不受控制”的环境中收集数据。我想我会步行穿过这个城市,无休止地记录步行活动的数据。跑步也是一样——我只是用我的常规慢跑来记录数据。

然而,现实表明,在像城市这样的真实环境中连续记录活动是一个非常糟糕的想法,在那里你的运动经常被十字路口、交通灯和其他人打断。在 30 分钟的步行过程中获得的数据充满了来自干扰的噪音。我尝试应用一些技术来删除无关的数据样本,但是没有一个技术能让我确信我保留了原始数据的特征。

解决方案是大幅缩短数据收集间隔。当我评估仅持续 10 秒钟的记录会话时,我发现其中只有 3–4%包含异常值。与连续记录会话后 45%的数据样本包含噪声相比,这是一个明显的改进,还有很长的路要走。

用于数据收集的应用程序

我需要一个应用程序来收集数据,并在将数据上传到处理样本的环境之前临时存储数据。

对应用程序可能的功能保持务实,我避免开发花哨的东西,专注于一个目标——以固定的时间间隔可靠地收集数据,并将其存储在应用程序中。

关于我希望多长时间收集一次数据样本(50Hz)和多长时间(10 秒间隔)的主要问题已经得到了回答。我必须实现一个应用程序来收集数据样本,并向它们提供元信息,如日期和时间戳、用户名和记录发生的手腕。录制的会话存储在*中的数据录制应用程序的容器中。csv 格式,然后从中提取并复制到我的电脑上。

此外,我在固定的时间间隔内实现了触觉反馈,以便通知自己记录仍在发生,并且我不会浪费时间去某个地方而不实际收集数据。

有两种记录模式:手动和连续。我在 95%的时间里使用第二个,它不需要我每 10 秒钟就开始新的录音,而是自动为我做这件事。

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

Simplest possible UI

根据点击的是“行走”还是“跑步”,收集的数据会相应地标记在结果*中。csv 文件。

最终数据集

在总共收集了大约 5 个小时的行走和跑步数据后,我可以得到几乎相同数量的每一类数据,包括左/右手腕的变化。这产生了具有以下结构的 88588 个数据样本:

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

为了证明我收集的数据集是健壮的,并且不会遭受典型的数据集问题,我将它上传到 Kaggle 并让其他人查看和分析它。

我也做了自己的分析,以确保在这个数据集上训练机器学习模型时,我不会面临难以分析的问题。

事实上,Kaggle 团队展示了数据集,这让我相信记录这些数据所花费的时间是值得的。当然,最大的收获是,在我收集数据的几周内,我可以减轻一些体重。

请关注我,了解我对这个数据集应用了哪些机器学习技术,以 99%以上的准确率预测用户活动。

阅读下一部分:

图像/视频演职员表:

  • https://docs-assets . developer . apple . com/published/96e 9d 46 b 41/ab 00 c 9d 5-4f3d-475 b-8020-95066068 a18d . png
  • https://docs-assets . developer . apple . com/published/96 e9 d 46 b 41/C9 b 606 b 2-9a 52-487 e-8385-e 710 FFA 1 ce 5f . png
  • Videezy.com

跑或走(第 3 部分):用于检测运动活动的准确度> 99%的神经网络分类器

原文:https://towardsdatascience.com/run-or-walk-part-3-99-accuracy-neural-network-classifier-for-detecting-motion-activity-675e16af4a7d?source=collection_archive---------3-----------------------

阅读前几部分: ——跑还是走(第一部分):用机器学习和 Core ML 检测运动数据活动 ——跑还是走(第二部分):以正确的方式收集设备运动数据

前一部分中收集了大量的行走和跑步数据后,我准备进一步利用这些数据。我的目标是设计和训练一个机器学习模型,根据这些数据准确预测用户活动的类型。

框架和模型选择

思考这个任务选择什么机器学习框架,我参考了 Core ML 支持的框架列表。这极大地缩小了候选人的范围,因为只有少数候选人受到本地支持。

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

每个试图用机器学习解决问题的人都面临着多样性的挑战。可以使用的模型种类繁多。选择最合适的一个是至关重要的,因为通常你有时间和资源去评估其中的几个,而不是全部。

如今,围绕深度学习的宣传是巨大的,当你为你的项目考虑完美的模型时,你不能忽视它。嗯,可能我不需要一个真正深度的神经网络来解决这个问题——我想——但至少这将是朝着正确的方向迈出的一步。“浅层”人工神经网络也因其在解决多类分类问题中的效率而闻名。

考虑到 Core ML 中的前馈神经网络仅受 Keras 框架支持,我的选择很简单。这个框架是为快速实验而设计的,可以在 TensorFlow、CNTK 或 Theano 上使用,因此对我来说是一个完美的选择。我选择了 TensorFlow backend for Keras,因为我已经用它体验过了,并且很容易理解它的概念。

事先说一下我使用这种设置的经历,我可以确认它允许我快速试验,并使我专注于设计而不是模型的实现。

模型架构:输入层

在前馈神经网络中,一切都从输入层开始。这是一个休息时间,再次查看我的数据,以便我可以定义输入层中输入神经元的数量。

我的数据集的初始格式如下:

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

这是一个很好的时间点来思考如何在理论上有可能根据传感器数据预测运动活动的类型?基于单个样本来做是不可行的,但是考虑多个数据样本将使得检测模式成为可能。

一个普通人在走路或跑步时做一次自然的手腕运动需要多少时间?1 到 2 秒之间。考虑到这一点,训练数据是以大约 5Hz 的频率收集的,我只需要为每次学习迭代选择大约 10 个样本。这将给我一个 10 乘 6 的矩阵作为我的神经网络的输入

然而,这是不可接受的,因为前馈神经网络的输入层必须是列矩阵,而不是 mn 矩阵。这意味着在一次学习迭代中结合来自所有传感器的数据的想法是不可实现的,因此,我必须使用 6 个模型:2 个传感器*每个传感器 3 个轴。

当使用这些模型来预测运动活动类型时,我可以应用集成技术来评估它们的输出并生成单个预测。

这种方法要求我将初始数据集转换成 6 个独立的数据集,每个数据集代表一个加速度计或陀螺仪轴,包含 12 个传感器样本(约 2 秒。观察时间)。这个“神奇的数字”是从后面几个阶段的大量实验中得出的,我试图在模型的准确性和输入的数量之间找到一个平衡。

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

The format of one of the final datasets: rows represent continuous sensor measurements equivalent to ~2 sec. of observation. Column ‘y’ represents a label for each row.

模型架构:隐藏层

我决定从一个只包含一个隐藏层的神经网络开始,评估它的性能,如果需要的话,进一步增加额外的隐藏层。这种从基本模型开始,然后逐渐增加复杂性的方法保证了我在训练模型时不会出现难以识别的问题。

只有一个隐藏层导致了 92.5%的准确率,再增加一个隐藏层导致了 97.2%的准确率,而具有 3 个隐藏层的神经网络最终产生了 99.2%的准确率。添加 3 个以上的隐藏层对精确度没有影响或者降低了精确度。我在这里和所有进一步的实验中对测试数据进行了 10 重交叉验证,以得出准确的数字。

这是有争议的,是否这样的神经网络可以被认为是一个“深”的,但最重要的是我能够找到一个最佳的隐藏层数。

模型架构:其他超参数

我试图借助网格搜索来调整其他一些可用的超参数:隐藏层中神经元的数量及其激活函数。搜索过程表明,预测精度最高的网络在每个隐层有 15 个神经元,并校正线性单元激活函数。

我选择分类交叉熵损失函数是因为它能够独立于定义的学习速率提高网络的学习速度。我选择 ADAM optimizer 作为我的模型,是因为它的计算效率很高,并且能够为我试图解决的问题提供足够的结果。

数据量明显减少,但精确度几乎相同

当我准备好我的神经网络的架构时,我想证明关于网络需要精确执行的数据量的下限在哪里的假设。

关于数据量,我理解的是预测单个例子时,馈入网络的数据样本数。还记得吗,我提到过 12 这个数字(~2 秒的观察)?我通过比较使用较低和较高数据量时网络的准确性选择了这个数字:

  • 17 个样本:99.32%
  • 12 个样本:99.23%
  • 6 个样本:97.93%

即使当 12 个样本选项的精度最低低于 17 个样本时,它也会大大减少网络消耗的输入数据量,从而降低训练网络所需的计算能力。令人印象深刻的是,每次预测 6 个样本(约 1 秒。观察)允许神经网络也相当准确地执行!

我决定坚持使用 12 个样本,因为它为模型提供了更多的数据以更好地进行归纳,此外,允许我从每个传感器/轴的总共 37777 个数据样本中获得 7387 个样本的数据集。

证明另一个假设

不同的手腕,没有训练数据

如果我只在一只手腕上收集我的所有训练数据,在上面训练我的模型,然后询问是否从另一只手腕预测活动类型,会怎么样?一个有趣的问题,我没花多少时间就找到了答案。

事实证明,神经网络只能在 91%的情况下预测正确的活动。嗯,这不是一个惊人的结果,但它仍然显示了一个相对简单的神经网络可以很好地检测数据中的模式,而不管它的符号!

陀螺仪 Y 轴的可预测性低

专门根据陀螺仪 Y 轴数据训练的模型“只有”85%的预测精度。这证明了当人们试图预测行走或跑步时,该轴对整体准确性没有太大贡献:人的手腕不会围绕该轴以强烈的模式做出反应。或者至少我移动我的手,这样陀螺仪的 Y 轴就没有机会被用于可靠的预测。

其他人的结果

我从 Kaggle 上的贡献者那里获得了有趣的见解,他们使用了我的全部数据集:无论他们使用什么模型或方法,准确性总是最高的!

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

在深入研究了他们的实现后,我意识到他们都是在训练时将数据集“按原样”输入到他们的模型中——一个样本接一个样本,而没有理解时间序列数据中的单个样本在检测整个序列的模式方面毫无价值。

本应使用的数据集可能看起来类似于这个

这是一个很好的提醒,不要在没有花时间去理解问题的基础之前就去解决它。

下一步是什么?

如果你对这篇文章中描述的模型在现实世界中的样子感兴趣,你可以在 Kaggle 上找到它

请继续关注本系列的最后一篇文章,在这篇文章中,我将展示神经网络是如何在 Core ML 的帮助下导入并用于 iOS 应用程序的。

阅读下一部分:

跑还是走(第 4 部分):在 iOS 中使用 Keras 神经网络分类器与核心 ML

原文:https://towardsdatascience.com/run-or-walk-part-4-using-keras-neural-network-classifier-in-ios-with-core-ml-a29723ab3235?source=collection_archive---------1-----------------------

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

阅读前几部分: -跑或走(第一部分):用机器学习和核心 ML 检测运动数据活动 -跑或走(第二部分):以正确的方式收集设备运动数据-跑或走(第三部分):> 99%准确率的神经网络分类器用于检测运动活动

终于,我走到了这段旅程的最后一步。现在是时候利用我们在第三部分中训练的模型在 iOS 应用中预测用户的运动活动了。

保存 Keras 模型

首先,我必须将训练好的模型序列化到 JSON 中,并保存它的权重。

Keras 提供了一个简单的 API 来实现这一点:

将模型的权重保存到磁盘上的*.h5 文件的简单方法相同:

将 Keras 模型转换为核心 ML

现在是时候将我保存的模型转换成 Core ML 格式了。由于我有一个 Keras 模型神经网络,我可以使用苹果的核心 ML 工具 Python 包,它为我完成了转换模型的工作:

在 iOS 应用程序中使用转换后的核心 ML 模型

将核心 ML 模型导入到我的 iOS 应用程序就像拖放到 Xcode 项目一样简单。我刚才用于设置模型元数据、输入和输出描述的值现在可以在 Xcode 中的核心 ML 模型窗口中看到。

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

Core ML model window in Xcode

由于 Xcode 已经为导入的 accel_x_model Core ML 模型自动生成了一个自定义 API,我已经准备好为模型提供传感器数据并读取其预测。

终点线

看到检测运动数据活动的想法如何演变成这样一个有趣的项目真的很酷,这不仅需要我学习关于机器学习及其在 iOS 中的 Core ML 应用的新知识,还需要我在为模型收集数据时有机会减肥。

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

iOS app detects motion activity in real time

像苹果的 Core ML 这样一个在移动应用中应用机器学习的简单方法,会有什么新的可能性,这真是令人惊讶!

关注我,了解我在机器学习和 iOS 方面的最新实验!

使用 Python 中的掷骰子数据运行卡方测试

原文:https://towardsdatascience.com/running-chi-square-tests-in-python-with-die-roll-data-b9903817c51b?source=collection_archive---------2-----------------------

在本世纪初的某个时候,我赶上了棋盘游戏热潮。大约每个月,我都会在 BoardGameGeek 、【BGG】、评分最高的游戏中搜寻新的桌游来购买。BGG 网站上有成千上万的棋盘游戏,很多都有评论和批评。我最喜欢的策略游戏不是一个不寻常的选择。相反,它目前是 BGG 有史以来排名第四的游戏,之前排名第一。那个游戏是暮光之城之战

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

《暮光之城之战》是一款以“冷战”为主题的卡牌驱动 2 人策略游戏。从某些方面来说,这感觉像是国际象棋和扑克的结合。一方扮演美国,一方扮演苏联。这个游戏和真正的冷战有着相同的偏执感,因为你必须不断地猜测你的对手可能有哪些牌,以及他们如何用这些牌来伤害你。

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

虽然技能在 TS 中非常重要,但运气在结果中也起着重要作用。该游戏包括政变、重组、战争卡和太空竞赛,所有这些都由掷骰子决定。

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

The Soviets never foresaw The Giant Cat Invasion from the Middle East

几年前,在一次成功的众筹活动之后,一个在线版本的《暮光之城之战》在 PC 和 MAC 上发布了(Steam 上有)。玩了几百个在线游戏后,我决定尝试创建一个运气测量系统来评估我自己的结果。在这个过程中,我开始收集“政变”和“战争卡”的掷骰结果。这就是事情变得有趣的地方:我的掷骰子样本有令人惊讶的分布。

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

279 卷之后,我的平均卷数是 3.254。303 滚之后,我对手的平均分是 3.855。我想知道这个分布有多不寻常,所以我用 Python 进行了一些卡方测试。

了解卡方检验

然而,在我们看这些测试之前,我将更详细地解释卡方。

卡方统计检验用于确定预期分布和实际分布之间是否存在显著差异。它通常用于教育程度、肤色或性别等分类数据。

掷骰子是适合卡方检验的数据的一个很好的例子。如果我们掷一个标准的六面骰子一千次,我们知道每个数字出现的概率大约是 1/6(即 16.66667%)。卡方检验有助于确定骰子是否是“公平”的,或者掷骰发生器(如软件中使用的那些)是否产生“随机”结果。

然而,在“预期分布”已知的情况下,掷骰子就是一个变量的例子。情况并非总是如此。有时候,我们的‘预期分布’是通过数据估算出来的。

假设我们不知道掷骰子的预期频率。我们必须通过数据样本来估计预期的频率。让我们做几个样本来确定每次滚动的频率。我决定手动做 4 个骰子滚动的样本(即实际骰子),前 3 个样本各 35 个,最后一个样本 45 个。这些样本比我们想要的要小,但是我想给我们一些真实的数据。这是我的面包卷分布,四个样品用字母“a”、“b”、“c”和“d”表示。

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

根据我们对概率的了解,对于 150 次掷骰子,我们应该预计每个数字出现大约 25 次(即 150 次的 1/6)。我们可以看到,1、5 和 6 都出现了这种情况,但 4 出现的次数比预期的多,2 和 3 出现的次数有点少。这可能是由于我们的样本量相对较小(见"大数定律"),但我们会处理它。

让我们对这个数据集的列联表中的变量进行独立的卡方检验。首先我要输入数据。

import numpy as npa1 = [6, 4, 5, 10]
a2 = [8, 5, 3, 3]
a3 = [5, 4, 8, 4]
a4 = [4, 11, 7, 13]
a5 = [5, 8, 7, 6]
a6 = [7, 3, 5, 9]dice = np.array([a1, a2, a3, a4, a5, a6])

然后,我使用 SciPy Stats 库运行测试

from scipy import stats

stats.chi2_contingency(dice)

不幸的是,尽管它是一个非常有用的工具,但 SciPy 并没有以最漂亮的方式提供结果。

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

我会解释这一切意味着什么。第一个值(16.49)是卡方统计。跳到输出中的第三个数字;这就是“自由度”这可以通过将行数减 1,然后将该结果乘以列数减 1 来计算。

在这种情况下:

行数= 6[模具辊 1–6]

列= 4[样本]

所以我们用(6–1)乘以(4–1)得到 15 个自由度。

利用卡方统计和自由度,我们可以找到 p 值。p 值是我们用来确定显著性(或本例中的独立性)的值。根据测试的不同,我们通常会在 0.05 或 0.01 处寻找一个阈值。如果我们得到一个低于阈值的 p 值,我们的测试是有意义的(即我们拒绝零假设)。

出于我们的目的,我们将使用 0.01 作为阈值。在这个特殊的例子中,p 值(输出中的第二个数字:0.3502)远为 0.01,因此我们没有达到统计显著性的阈值。

既然我已经解释了每件事的含义,我们可以在 SciPy 中创建更易读的输出代码。

chi2_stat, p_val, dof, ex = stats.chi2_contingency(dice2)print("===Chi2 Stat===")
print(chi2_stat)
print("\n")print("===Degrees of Freedom===")
print(dof)
print("\n")print("===P-Value===")
print(p_val)
print("\n")print("===Contingency Table===")
print(ex)

这将产生更加一致的输出:

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

最后,输出末尾的数组是列联表,其中包含基于所有样本的期望值。注意,在这种情况下,我们的列联表产生的值,在某些情况下,与我们所知道的掷骰子的期望值相差甚远。这是因为我们使用的样本太少,无法准确测量总体。

运行大样本以获得预期的人口分布

我们可以运行一个更大的样本,看看这种方法如何更好地工作。由于我不愿意手动掷骰子数千次,我们将使用 Python 来做这件事。我们需要 np.random.randintnp.unique 。我做了 5 个样本,每个样本 1000 个骰子点数。

r1 = np.random.randint(1,7,1000)
r2 = np.random.randint(1,7,1000)
r3 = np.random.randint(1,7,1000)
r4 = np.random.randint(1,7,1000)
r5 = np.random.randint(1,7,1000)

然后通过 np.unique 保存结果。

unique, counts1 = np.unique(r1, return_counts=True)
unique, counts2 = np.unique(r2, return_counts=True)
unique, counts3 = np.unique(r3, return_counts=True)
unique, counts4 = np.unique(r4, return_counts=True)
unique, counts5 = np.unique(r5, return_counts=True)

现在,我们结合我们的数组来运行 stats.chi2_contingency:

dice = np.array([counts1, counts2, counts3, counts4, counts5])

让我们进行测试。

chi2_stat, p_val, dof, ex = stats.chi2_contingency(dice)

这是结果。

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

注意我们的列联表现在产生了一个更均匀的期望分布。它仍然稍有偏差(在 1,000 个掷骰子的样本中,我们预计每个数字会出现大约 166.7 次),但我们已经非常接近这个分布了。

我决定再运行一次测试,这次使用 10,000 个骰子点数的 5 个样本。

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

我们可以看到我们的分布更加接近已知的总体分布(每个数字的概率为 16.667%,即样本中 10,000 卷中的 1,666.7)。有趣的是,由于我们知道真实的期望分布,我们可以看到样本如何让我们估计总体分布。

暮光之城奋斗骰子卡方测试

现在,让我们进入我们的在线暮光之城奋斗骰子数据。

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

对于我们的实际测试,我们不需要列联表。我们知道期望分布。对于 6 面骰子,每个数字预计出现的时间约为 1/6。既然我们知道预期分布,我们可以使用 scipy.stats.chisquare 而不是 chi2_contingency。

对于我的暮光之城奋斗骰子数据,我有两个样本:我自己的掷骰子和我对手的掷骰子。我们的零假设是骰子是随机分布的(因此是均匀分布的)。

我的数据是,我滚了 279 次。我们除以 6,得到期望的分布(每个数字 46.5)。运行 scipy.stats.chisquare 时,要注意确保参数的顺序正确;否则,你会得到不准确的结果。第一个参数(f_obs)是“实际结果”,而第二个参数(f_exp)是“预期结果”。

my_rolls_expected = [46.5, 46.5, 46.5, 46.5, 46.5, 46.5]
my_rolls_actual =  [59, 63, 37, 38, 32, 50]stats.chisquare(my_rolls_actual, my_rolls_expected)

运行这个测试,我们得出 p 值为 0.0037。

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

这低于 0.01,具有统计学意义。这意味着如果骰子真的是随机的,我们只有 0.4%的机会看到这个结果。

接下来让我们看看我的对手掷骰子。我的对手掷出了 303 次。我们再一次除以 6,得到 50.5 的期望分布。我们与实际分布进行比较。

opp_rolls_expected = [50.5,50.5,50.5,50.5,50.5,50.5]
opp_rolls_actual =  [39,39,46,54,53,72]stats.chisquare(opp_rolls_actual, opp_rolls_expected)

我们发现了类似的结果。

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

我们的 p 值是 0.0097,也低于 0.01,这表明如果掷骰子是真正随机的,我们观察到这种分布的概率略低于 1%。

虽然我已经有趣地注意到了掷骰子中的奇怪模式(我之前已经放弃了“观察偏差”),但我实际上对这些结果有点惊讶。对于我们 2 个随机样本中的我的掷骰子和对手的掷骰子,我们可以拒绝骰子是真正随机的无效假设。

这很有趣,我决定继续收集数据,看看我是否能在未来复制这些结果。不幸的是,我可能还需要几个月的时间来构建一些更有意义的数据样本。

结论

卡方是比较涉及分类数据的结果的一个很好的工具。我们可以看到样本是如何偏离预期分布的。Python 的 SciPy 库为运行卡方测试提供了很好的工具。

更多资源

为了更好地了解卡方,我推荐可汗学院的优秀系列视频

在 15 分钟内在谷歌云平台上运行 Jupyter 笔记本

原文:https://towardsdatascience.com/running-jupyter-notebook-in-google-cloud-platform-in-15-min-61e16da34d52?source=collection_archive---------0-----------------------

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

最近,当我使用卷积神经网络做计算机视觉的研究项目时,我发现我的 8GB RAM 笔记本电脑毫无用处。我花了一个小时才从一个时代学会。因此,我没有花 1500 美元买一台新的基于 GPU 的笔记本电脑,而是在谷歌云上免费完成了这项工作。(谷歌云提供 300 美元信用,我有 3 个 gmail 账户和 3 张信用卡:D)

所以,让我们不要再浪费时间,直接在 GCP 运行 jupyter 笔记本。

第一步:在谷歌云中创建一个 300 美元的免费账户

在这一步,你必须输入你的支付信息并验证你的账户。这是最简单的一步。如果这一步你失败了,合上你的笔记本电脑,想想你的人生将走向何方。

步骤 2:创建新项目

点击下图中的三个点,然后点击+号创建一个新项目。

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

步骤 3:创建一个虚拟机实例

单击左上角的三行,然后在计算选项中,单击“计算引擎”

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

现在,单击“创建新实例”。命名您的实例,选择 zone 为“us-west1-b”。选择您的“机器类型”。(我选的是 8v CPUs)。

选择您的启动磁盘为“Ubuntu 16.04 LTS”。在防火墙选项下勾选“http”和“https”(非常重要)。然后,选择磁盘选项卡,取消选中“删除实例时删除引导磁盘”。

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

如果您点击“自定义”,您将能够找到使用 GPU 的选项。您可以在 2 个 NVIDIA GPUs 之间进行选择。

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

一些防火墙设置:-

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

现在点击“创建”,您的实例就准备好了!

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

您的新 VM 实例应该看起来像这样。记下外部 IP。

重要提示:完成后,不要忘记通过点击上图中的三个点并选择停止来停止 GPU 实例。否则 GCP 会继续按小时收费。

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

步骤 4:将外部 IP 地址设为静态

默认情况下,外部 IP 地址是动态的,我们需要使它成为静态的,以使我们的生活更容易。单击左上方的三条水平线,然后在“网络”下,单击“VPC 网络”,然后单击“外部 IP 地址”。

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

将类型从短暂更改为静态。

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

步骤 5:更改防火墙设置

现在,点击“网络”下的“防火墙规则”设置。

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

点击“创建防火墙规则”并参考下图:

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

在协议和端口下,您可以选择任何端口。我选择了 tcp:5000 作为我的端口号。现在点击保存按钮。

步骤 6:启动您的虚拟机实例

现在启动您的虚拟机实例。当您看到绿色勾号时,单击 SSH。这将打开一个命令窗口,现在你在虚拟机内。

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

第七步:安装 Jupyter 笔记本和其他软件包

在 SSH 终端中,输入:

wget [http://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh](http://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh)
bash Anaconda3-4.0.0-Linux-x86_64.sh

并按照屏幕上的说明进行操作。默认设置通常很好,但是对于最后一个关于将安装位置添加到 PATH 的问题,回答是:

Do you wish the installer to prepend the 
Anaconda3 install location to PATH 
in your /home/haroldsoh/.bashrc ? 
[yes|no][no] >>> yes

要立即使用 Anaconda,请使用您的 bashrc:

source ~/.bashrc

现在,安装其他软件:

pip install tensorflowpip install keras

步骤 8:设置虚拟机服务器

打开到您的虚拟机的 SSH 会话。检查您是否有 Jupyter 配置文件:

ls ~/.jupyter/jupyter_notebook_config.py

如果不存在,请创建一个:

jupyter notebook --generate-config

我们将在您的 Jupyter 配置文件中添加几行内容;该文件是纯文本的,所以您可以通过您喜欢的编辑器(例如,vim、emacs)来完成。确保将端口号替换为您在步骤 5 中允许防火墙访问的端口号。

c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = <Port Number>

它应该是这样的:

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

步骤 9:启动 Jupyter 笔记本

要运行 jupyter 笔记本,只需在您所在的 ssh 窗口中键入以下命令:

jupyter-notebook --no-browser --port=<PORT-NUMBER>

一旦运行该命令,它应该会显示如下内容:

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

现在,要启动您的 jupyter 笔记本,只需在浏览器中键入以下内容:

http://<External Static IP Address>:<Port Number>

其中,外部 ip 地址是我们设置为静态的 ip 地址,端口号是我们允许防火墙访问的地址。

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

恭喜你!您成功地在 GCP 上安装了 jupyter 笔记本!

我们连线:https://www.linkedin.com/in/aankul

在媒体上跟随我:【https://medium.com/@aankul.a

注意——看在上帝的份上!不要忘记停止虚拟机实例!!

编辑:
所有面临’
ERR _ CONNECTION _ TIMED _ OUT’错误的人。请在评论中尝试 庸碌口才的解决方案。

运行随机森林?使用此代码检查特性的重要性

原文:https://towardsdatascience.com/running-random-forests-inspect-the-feature-importances-with-this-code-2b00dd72b92e?source=collection_archive---------2-----------------------

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

A Random Forest | FPhoto by Robert Bye on Unsplash

随机森林和其他集成方法是一些数据科学任务的优秀模型,尤其是一些分类任务。它们不像其他方法那样需要太多的预处理,并且可以接受分类变量和数值变量作为输入。简单的决策树不是很健壮,所以集成方法运行许多决策树并聚集它们的输出进行预测。该过程控制过度拟合,并且通常可以产生非常健壮、高性能的模型。随机森林和其他一些 boosting 方法是简单的现成模型,我经常在建模过程的早期使用它们来查看它们如何处理我的数据。此外,它们还有一个非常有用的特性,叫做特性重要性。

这些方法最常用于预测,但是查看特征重要性可以让您了解哪些变量在这些模型中影响最大。您可以使用该信息来设计新的功能,删除看起来像噪音的功能,或者只是在您继续构建模型时通知您。

决策树以及基于决策树的集成方法通过将数据分成子集来工作,这些子集主要属于一个类别。该树将继续构建不同的子集,直到它理解并表示变量与目标的关系。提升集成树更进一步,从错误中学习,迭代地调整树以更好地分类数据。所有种类的树方法都是通过数学方法来计算它们的分裂,确定哪一个分裂将最有效地帮助区分类。因为这是他们的方法,所以这些模型的 sklearn 实例有一个.feature_importances_属性,它返回每个特性在确定分割时的重要性的数组。

查看这些会非常有帮助,但是.feature_importances_属性只是打印一个数字数组。它不会告诉你哪些数字对应哪些变量。我将运行一段代码,这段代码将在一个日期框中返回特性的重要性以及它们各自的变量名。

这是我将要使用的数据集。我曾在其他帖子中使用过这套工具,所以你可能会认出它。这是银行营销数据集,在这里可以从 UCI 机器学习资料库获得。看一看:

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

任务是对银行在营销活动中的哪些目标将认购新的定期存款进行分类。以下是运行随机森林模型的代码:

## Import the random forest model.
from sklearn.ensemble import RandomForestClassifier 
## This line instantiates the model. 
rf = RandomForestClassifier() 
## Fit the model on your training data.
rf.fit(X_train, y_train) 
## And score it on your testing data.
rf.score(X_test, y_test)

如您所见,这很容易实现。现在谈谈特性的重要性。下面的代码片段将从模型中检索特性的重要性,并将它们制作成数据帧。

import pandas as pd
feature_importances = pd.DataFrame(rf.feature_importances_,
                                   index = X_train.columns,
                                    columns=['importance']).sort_values('importance',                                                                 ascending=False)

运行该代码将得到以下结果:

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

现在,您可以很容易地看出哪些功能对您的模型很重要,哪些不重要。尽情享受吧!

俄罗斯虚假推文可视化

原文:https://towardsdatascience.com/russian-fake-tweets-visualized-6f73f767695?source=collection_archive---------6-----------------------

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

Fake Tweet Cloud

合著者:大卫·凯斯

随着俄罗斯调查扭曲了总统选举的热情,以及臭名昭著的脸书/剑桥分析丑闻仍然占据国内每日头条,我们清楚地看到,“假新闻”和俄罗斯用户仍然普遍存在,但概念模糊。这些假用户伪装成谁?这些假用户是怎么忽悠人的?他们是如何影响人们的?因此,凭借我们在自然语言处理、数据可视化方面的背景,以及对技术和政治相结合的兴趣,用 Python 和 Plotly 检查假俄罗斯用户的 Tweet 数据是很自然的。特别是,我们分析了:

用户和推文概述

  1. 这些假冒用户的身份——姓名和描述
  2. 当假账户被创建的时候
  3. 当虚假账户在推特上最活跃的时候
  4. 这些报道涵盖了哪些主题

大多数成功(或不成功)用户的案例研究

  1. 推特速度
  2. 推特极性
  3. 推特主观性

数据

NBC 新闻发布了超过 20 万条推文的数据库,推特将其与 2016 年美国总统大选期间与俄罗斯相关的账户的“恶意活动”联系在一起。这些账户,作为大型网络的一部分,协同工作,发布了数十万条煽动性的推文。这里的数据可以找到

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

Figure 1: Joined User and Tweet Data Provided by NBC

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

Figure 2: Example of a (non-fake) Twitter Account with Highlighted Description and Tweet

现在我们有了数据,让我们开始分析:

这些假冒用户是谁?

Figure 3: First and Last “Names” of the Users

如果我们看看我们的假用户的面值,我们可以看到有三个不同类别的假帐户名称。第一个组合由美国发音的名(如“Chris”、“Rick”或“Jeremy”)和美国发音的姓(如“Green”、“Roberts”或“Cox”)组成。第二个组合由正式的新闻来源组成,如“纽约时报”或“今日亚特兰大”。最后,第三种组合由纯粹的外国名字组成。从这一点上,我们可以看到,仅仅根据名字很难判断哪些账户是假的,因为它可能是任何普通人、新闻网站或无法识别的名字。

他们的简介是什么?

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

Figure 4: Topics Within the Descriptions of Fake Users

创建 Twitter 账户的一个独特之处在于,你可以选择简单描述自己是谁。用户经常发布他们的总结和意识形态给其他人看。具体来说,上图显示了一个与虚假账户相同的话题——宗教。通过使用诸如“上帝”、“InGodWeTrust”和“GodBlessAmerica”这样的词,这些虚假账户可以与一大群人联系起来。其他 bios 包括黑人生活问题主题、官方新闻声音描述(如“体育”、“天气”和“官方”)以及外国主题。因此,通过快速地(如果不是立即地)与这个虚假用户相关联,用户更有可能关注或同意虚假账户的推文。更多关于这种相似吸引现象的信息可以在这里阅读

它们是什么时候制造的?

Figure 5: Russian Fake Accounts Created from 2009 to 2017

在被认为是假俄罗斯账户的 454 个账户中,我们可以看到假账户的创建始于 2009 年,并在 2013 年达到创建高峰,然后在 2017 年初慢慢减少。有趣的是,这意味着大多数虚假账户是在 2016 年总统选举前几年创建的,可能是为了在选举前引起我们读者的冲突和分裂。

他们来自哪里?

我们查看了假冒用户的来源,发现在 454 个值中,大约有一半的值丢失了。在列出的 287 个地点中,124 个被列为某种形式的“美国”,68 个被列为美国的大型大都市(即:旧金山、纽约、亚特兰大、洛杉矶),37 个值在外国,其余 58 个值是虚构的,如“位于幸福健康的拐角处”或“沿街的街区”。因此,由于数据大部分缺失并且很可能是假的,我们选择不进一步分析数据。

他们的影响力有多大?

Figure 6: Followers vs. Number of Tweets of Fake Accounts

从高层次来看,我们可以看到推文的数量随着关注者的数量而增加。这是有道理的,因为这些假账户正在利用他们在社交媒体上的受欢迎程度来接触和影响更多的人。其中一个著名的虚假用户是臭名昭著的 Jenna Abrams 账户,其种族主义、有争议和虚假的推文一度被主流媒体报道。在这一点上,可以肯定地说,这些推文肯定对大众有影响。

他们什么时候发布?

Figure 7: Heat Map of Fake User Tweet Activity

从上面的热图中,我们可以看到,假用户主要在一年中的后几个月(即:8 月、9 月、10 月、11 月和 12 月)的周日和周二发帖。因此,我们可以预料这不是偶然的;当下半年选举和其他重大事件发生时,假冒用户明白他们的内容在周末而不是工作日到达更多的个人。

他们在说什么?

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

Figure 8: Topical Modeling of Tweet Content

类似于对虚假用户的描述,我们看了一下实际 tweet 内容中包含的主题。在上图中,我们可以看到,黑人生活问题和其他种族问题是俄罗斯报道的一个主题,其中包括“警察”、“黑人生活问题”、“犯罪”等词,以及圣贝纳迪诺的枪击事件,特别是关于罪犯是少数族裔的问题。用户关注的其他话题包括希拉里·克林顿的私人电子邮件服务器、ISIS、支持特朗普的口号、对选举辩论的诽谤以及校园枪击事件。这些令人心酸和受欢迎的事件是一个特别容易的话题,虚假的报道可以添加他们的宣传观点,因为个人已经愤怒了,并对如何对这些事件做出反应产生了分歧。

案例研究—深入了解前 20 名用户

我们现在知道了典型的假账户是什么样的,但是一个成功的(或者不成功的)俄罗斯假账户是什么样的呢?他们是如何获得关注的?从图(散点图)中,我们看到了关注者数量和推文数量之间的正相关关系。因此,下面的图表从速度、情绪和主观性的角度考察了他们的推特行为,随着时间的推移,前 20 名被关注的虚假俄罗斯账户。

推文速度

Figure 9: Number of Tweets Tweeted by Fake Accounts

就纯粹的推文量而言,我们可以看到假账户几乎不存在的趋势,直到 2016 年 6 月左右,推文量急剧增加——在 2016 年 10 月达到顶峰。2016 年 11 月(选举月)后,推文数量下降,2016 年 12 月左右最后一次复苏,然后回到几乎不活跃的状态。这种令人担忧的趋势显示了虚假账户的机会主义行为,在选举热情最紧张和最重要的时刻发布推文。

推特情绪和主观性

下图是前 20 名被关注用户所发推文的平均情绪和主观性。在推文中,情绪被定义为一种态度、思想或判断。特别是,可以通过使用 Textblob 包来分析推文的情绪,负面情绪推文的得分为-1,正面情绪推文的得分为+1。最后,推特环境中的主观性通常被视为给定推特的固执己见程度。在 Textblob 中,分数从 0 到 1 不等,0 代表非常客观,1 代表非常主观或固执己见。

Figure 10: Average Sentiment and Subjectivity of Top 20 Followed Users

时间序列点分析

Figure 11: Time Series Tweets with Hash Tags

利用后见之明的力量和美国时事的维基百科,我们可以看到一些值得注意的峰值与什么有关:

2016 年 8 月 4 日:散列标签#obamaswishlist 的峰值,这些帖子是关于奥巴马“想要”的稀奇古怪和被认为虚伪的物品

2016 年 8 月 17 日:散列标签#trumpsfavoriteheadline 的峰值,这些是关于唐纳德·特朗普将支持的讽刺性标题的推文

2016 年 9 月 28 日:# ihavearighttoknow 通过虚假账户了解希拉里·克林顿的电子邮件

2016 年 10 月 5 日:#ruinadinnerinonephrase 实际上被视为政治支持和非政治支持,有些人提到了希拉里·克林顿,而其他人则利用这个标签制作了迷因

2016 年 10 月 17 日:#makemehateyouinonephrase,另一个被视为模因文化或政治制度一部分的哈希标签运动

2016 年 11 月 14 日:# reallifemagicspells 用于参考黑人生活问题和特朗普的家人

2016 年 12 月 7 日:#idrunforpresidentif“我早知道我需要毫无经验”和其他关于总统选举的讽刺性评论

也许巧合与否,最初的峰值都与同时使用标签嘲笑总统和总统候选人的虚假账户有关。这些推文显然是基于政治的,实际候选人的名字被删除了。然而,随着时间的推移,这些推文之间的区别因素变得不那么明显,因为虚假账户使用的是实际流行的标签,而不是明显的政治标签。此外,在特朗普实际当选之前,这些推文似乎是针对所有候选人而不是某个特定候选人的——此时所有的攻击都是针对特朗普的。

结论

从我们的分析中,我们了解到,这些虚假账户伪装成(1)普通美国人,(2)以大都市名字命名的新闻网站,或(3)以相关话题如政治和宗教信仰描述自己的国际名字;他们通过在机会性时间发布主观和极端的推文来达到影响 Twitter 用户的目的,比如在丑闻和大型公告发生的周末。最后,他们通过微妙地加入流行标签并在其中注入宣传,对自己明显的帖子变得有感觉。

感谢您花时间阅读我们对俄罗斯虚假推文的分析。如果你现在可以谈论虚假的推文而不听起来虚假,认为我们应该分析任何其他事情,或者有任何意见,请留下赞或评论。欢迎在 LinkedIn 上关注或联系斯蒂芬和/或大卫,因为我们将发布更多有趣的文章和教程!

参考文献:

  1. Plotly 用于可视化
  2. Pyldavis 用于局部建模
  3. NBC 俄罗斯虚假推文数据集
  4. 詹娜·艾布拉姆斯在主流媒体上的报道
  5. 文本块用于自然语言处理(NLP)
  6. 美国历史事件
  7. 相似吸引心理学
  8. 圣贝纳迪诺枪击案
  9. 图形和预处理代码 Github

Rust 编程语言介绍。

原文:https://towardsdatascience.com/rust-off-the-grid-introduction-to-rust-programming-language-58df4f2a5664?source=collection_archive---------2-----------------------

Rust 是一种专注于安全性、速度和并发性的系统编程语言。它通过在不使用垃圾收集的情况下保持内存安全来实现这些目标。

Rust 是一种非常现代的语言。它在后端使用 LLVM。Rust 支持命令式过程、并发角色、面向对象和纯函数式风格的混合。它还有助于静态和动态技术中的泛型编程和元编程。

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

装置

如果你使用的是 Linux 或 Mac,安装 Rust 所需要做的就是启动你的终端并运行:

$ curl -sf -L [https://static.rust-lang.org/rustup.sh](https://static.rust-lang.org/rustup.sh) | sh

如果你用的是 Windows,请下载并运行 32 位安装程序64 位安装程序

如果你已经安装了 Rust,你可以打开你的外壳,输入:

$ rustc — version
rustc 1.20.0

它打印正在运行的 rust 版本。

这里是官方的安装指南

入门!!

向铁锈问好。

现在让我们开始我们的传统程序,“Hello World”
我们的程序从 main 函数开始,main 函数之后的语句将在编译时执行。

println!作为一个类似于函数的宏调用,但以一个感叹号/bang“!”结束,但不是函数调用,宏被扩展成源代码,与程序的其余部分一起编译。

现在首先运行我们的程序,我们需要使用命令“rustc file_name.rs”编译我们的代码,然后生成一个应该执行的二进制文件。

$rustc hello_rust.rs
$./hello_rust
Hello World!

评论

正如我们所知,每种编程语言都需要注释,Rust 支持一些不同种类的注释,这些注释被编译器忽略了。

这些是我们经常使用的评论类型。

// — Single line comments which go the end of the line.
/* */ — Multiple line comments which go to the closing delimiter.

变量

变量是包含一个值的存储块。在 Rust 中,很容易定义一个变量并为其设置一个值。假设您想将数字 1 存储在一个名为 one 的变量中。

let one = 1

就这么简单!你刚刚把变量 one 赋值给了值 1,let 用来引入一个绑定。

类型注释

Rust 允许你声明自己大小的变量,因为 rust 是一种静态类型语言,我们可以预先指定我们的类型,并且在编译时检查它们。

下面是一个声明 32 位有符号整数的示例。我们使用 let 进行绑定,后跟一个变量名和类型,大小,跟在冒号(:)后面。

let x: i32 = 19;

Rust 有许多不同的原始整数类型。它们以 i 开头表示有符号整数,以 u 开头表示无符号整数。可能的整数大小为 8、16、32 和 64 位。

易变性

在 Rust 中,当你声明一个变量时,绑定是不可变的,这意味着我们不能改变变量的值。

这段代码给出了一个错误,它显示了不可变变量` x '的重新赋值!

$rustc rust_mut.rs
./rust_mut
--> rust_mut.rs:3:2
  |
2 |  let x = 5;
  |      - first assignment to `x`
3 |  x = 10;
  |  ^^^^^^ re-assignment of immutable variable

如果你希望一个绑定是可变的,你可以使用关键字*。*

数据类型

Rust 中的原始数据类型

1.布尔代数学体系的

一个标准的布尔值。可以是真也可以是假。

2.特性

到目前为止,我们只处理了布尔值和数字,但是 Rust 也支持字母。Rust 的char类型是该语言最原始的字母类型,下面的代码展示了使用它的一种方法:

3.数字类型

整数

这些类型包括 i8、i16、i32、i64、isize、u8、u16、u32、u64、usize。字母表示它是有符号的(I)还是无符号的(u),数字表示整数的大小。因此,i8 是一个 8 位整数,u64 是一个无符号的 64 位整数。isize 和 usize 取决于计算机的架构。

漂浮物

这些类型包括 f32 和 f64。浮点数就是我们通常所说的十进制数。

4.数组

数组是固定大小的相同类型元素的集合。

声明如下:

*let name: [type; size] = [elem1, elem2, elem3, elem4];*

5.元组

不同(或相同)数据类型元素的固定大小有序列表

元组的声明类似于数组。我们用“()”代替“[ ]”。

元组在默认情况下也是不可变的,即使有了 mut ,它的元素计数也不能改变。此外,如果您想要更改元素的值,新值应该与以前的值具有相同的数据类型。

6.用线串

str 是“字符串片段”,是最原始的字符串类型。

现在有些人在开始使用 rust 时会犯的错误是打印变量’ { } '。为了打印它,我们需要写:

这类似于 Python 格式。

7.向量

在 Rust 中,向量在堆上将它们的内容存储为 T 的连续数组。这意味着它们必须能够在编译时知道 T 的大小(即存储一个 T 需要多少字节?).

你可以用 vec 创建它们! 宏:

控制流

我们总是需要检查条件并相应地改变程序行为的能力。条件语句给了我们能力。最纯粹的形式是‘if’语句。

让您控制 Rust 代码执行流程的最常见的结构是 if 表达式和循环。

如果-否则

所有的if表达式都以关键字if开头,后跟一个条件。我们还可以包含一个else表达式,在条件评估为 false 时,为程序提供一个可供选择的代码块来执行。

带有 else-if 的多个条件

Rust 目前提供了三种方法来执行某种迭代活动。它们是:for、while 和 loop。每种方法都有自己的一套用法。

For 循环

rust 中的 For 循环用于基于给定的开始位置和结束位置进行迭代。Rust 的 for loop 看起来不像这个“C 风格”的 for loop,是这样的。

在这个例子中,变量 x 从 0 迭代到 9,并打印一直到 9 的数字。

While 循环

Rust 也有一个 while 循环。当条件为真时,循环运行。当条件不再为真时,调用break,停止循环。

看起来是这样的:

关键字loop告诉 Rust 一次又一次地执行一段代码,直到你明确地告诉它停止。为了停止这个无限循环,我们需要通过键盘快捷键(CRTL + C)来中断它。

功能

函数是执行特定任务的可重用代码块。它是一个小的计算单元,可以接受参数,也可以返回值。

每个 Rust 程序至少有一个功能,主要功能:

*fn main() {
//body
}*

在 Rust 中声明函数时,我们使用 fn 关键字,后跟函数名和一些括号,如果有参数的话,我们可以在括号中包含参数。

现在让我们写一个函数,可以把两个整数相加。

这些函数在主函数中被声明调用,并在主函数外被声明。

无论是调用函数还是声明函数,都要用逗号分隔参数。

返回类型的函数

默认情况下,函数返回空元组()。如果要返回值,必须在 - > 后指定返回类型。

这是一个返回数字的函数的例子。

在上面的程序中,函数 plus_one()plus_two() 返回整数类型,我们将它们赋给主函数中的变量。

恭喜您刚刚完成了基本的 Rust 编程!

向所有阅读并支持这篇报道的人致敬。

感谢阅读。如果你觉得这个故事有帮助,请点击下面的👏去传播爱。

源代码位于:

* [## 维哈尔/鲁斯特-丽莎

rust-lisa -几分钟学会 rust!即将发布。

github.com](https://github.com/vihar/rust-lisa)

参考资料:

[## 生锈文件

关于参考文献的另外几句话:它保证是准确的,但不完整。我们的政策是…

doc.rust-lang.org](https://doc.rust-lang.org/)*

2018 年莱德杯-美国通配符(来自数据)

原文:https://towardsdatascience.com/ryder-cup-2018-us-wildcards-from-the-data-d53d5e0c843f?source=collection_archive---------12-----------------------

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

Photo by Markus Spiske on Unsplash

随着 2018 年莱德杯的快速临近,对于双方的团队组成有很多猜测。自动资格赛已经有以下球员参加了 Le Golf National 的比赛:

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

Rankings accurate as of August 30th 2018, ahead of the Dell Technologies C’ship & Made in Denmark

欧洲队仍然有一些有潜力的人可以加入积分争夺最后一名,丹麦制造活动是索比约恩·奥尔森、马特·菲茨帕特里克和埃迪·佩珀雷尔争夺第 8 号球衣的机会。

然而,美国已经锁定了他们的八个人。剩下的就是吉姆·福瑞克选择他的四个外卡球员来组成球队。每个人都有自己的观点,认为哪些人应该被选中,以及他们拥有什么样的品质使他们成为理想的人选。在做出选择时,经验和性格都是典型的考虑因素,高尔夫媒体已经指定了一些他们认为应该出现在福瑞克球队名单上的明星球员。

在这么多意见被公布的情况下,做出这样的决定并不容易。数据告诉我们什么?在这篇博文中,我们将使用几个不同的指标来更深入地了解美国顶级非自动化项目的形式(不仅仅是 RC 点)。

(所有 Python 代码可在https://github.com/jjaco/rydercup2018获得)

一个有趣的起点是看看本赛季美国球员 PGA 巡回赛每周的结束情况。如果我们获得了到目前为止至少 10 次出局的每个球员的最终位置,我们就可以粗略估计他们每周在球场上的表现。

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

Weekly rank data in 2018 for US players making 10 cuts in the regular season (thru Northern Trust)

上面的插图概括了每个球员的所有每周排名数据:空白对应于错过的比赛或跳过的比赛,蓝色越多意味着成绩越差,而红色越多表明成绩越好,最深的红色表示获胜。如果我们计算一下每周的平均排名,按照这个值对玩家进行排序,看看表现最好的玩家,事情会变得更清楚一些:

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

Top 20 US players by mean weekly rank (thru Northern Trust)

不出意外,世界排名第一的达斯汀·约翰逊以非常出色的平均排名第 6 位遥遥领先。他是本赛季唯一一个平均最终排名前 10 的球员。

美国其他自动入围者也表现不错:除了布巴沃森(Bubba Watson)之外,所有人都排在前 20 名,他的每周平均排名约为 36 位。这可能是因为布巴在戴尔技术比赛中的胜利没有被计算在内(抱歉,布巴,至少这与莱德杯有关)。

非资格赛的名人是(按平均排名):老虎伍兹(12.07),帕特里克坎特莱(12.88),托尼菲瑙(12.9),菲尔米克尔森(13.94)和布赖森德尚博(14.95)。这一结果让泰格的回归更加令人印象深刻,本赛季他每次出场的场均排名都在前 15 名之内。与菲尔一起,你必须预计这些人将是福瑞克的前两个选择:他们所有的经验加上 2018 年的良好表现将是无价的。

对于剩下的两个槽点,让我们继续从目前的分析来看领跑者:菲瑙、德尚博和坎特莱。由于平均每周成绩不考虑平局或最终位置之间的相对差距,让我们看看一个不同的指标来找出更多信息:与最终赢家的相对击球数。这是该球员相对于该周最佳球员表现的大致情况。

这是通过计算一名选手四轮比赛的总成绩和最终获胜者的总成绩之差得出的:请注意,赢得一场比赛的结果是相对击球数为 0,这是理想值。

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

Histograms of relative strokes from winner for Finau, DeChambeau & Cantlay, with average relative strokes annotated

Finau 在这 3 项指标中的平均得分最低,但本赛季没有赢过 DeChambeau 和 Cantlay 的 2 场和 1 场。从这个角度来看,只有达斯汀·约翰逊和贾斯汀·托马斯在相对击球方面比菲瑙好,分别为+5.31 和+7.33。同样值得注意的是,Cantlay 和 DeChambeau 在美国选手中的相对击球数分别排名第 5 和第 9。

这三个家伙本赛季显然打得很好,他们每个人都有很强的理由成为球队的一部分。但是只剩下两个名额了。

有大量的统计数据和指标可以用来量化高尔夫表现,包括球员比赛的细节。也许我们需要开始审视这些个人属性,以确定最适合这份工作的两个人。PGA 巡回赛跟踪一切,从驾驶距离,到从接近获得的击球,到反弹能力——几乎有太多的选择来做出决定性的选择。为了解决这个问题,我们为每个玩家构建了一个被称为的特征向量,由以下关键绩效指标组成(旨在涵盖尽可能多的“精彩表现”支柱):

  • 击球次数:开球,接近,果岭周围,推杆,球座到果岭,总杆数
  • 驾驶:距离、准确度
  • 百分比:规则中的果岭,节省的沙地
  • 平均分:老鹰(每洞数),小鸟,得分

这个 13 分量向量充当每个玩家的表现签名。利用这一点,我们可以开始直接比较球员,测量相似性,并将相似的比赛风格聚集在一起。

以下是加工前达斯汀·约翰逊的特征示例:

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

Pre-scaling feature vector for Dustin Johnson

每一个都相对于巡回赛中的其他活跃球员(不仅仅是美国人,就像之前的分析一样)进行缩放,以使他们在全球特征空间中直接可比。所有这些都是通过减去平均值并除以每列的标准偏差来对值进行范围归一化。

这为每个球员创建了一个较少人工解释但更具统计鲁棒性的签名,这使我们能够测量两个给定球员的每个特征之间的距离,例如,谁在驾驶推杆时最像 DJ?在特征空间中有几种计算距离的方法,但是我们使用一种叫做余弦相似度的技术来衡量两个玩家有多相似。这提供了一个在[1,-1]范围内的值,1 是最大相似度,-1 是完全不相似。

如果我们假设自动合格的团队成员代表了美国莱德杯球员的理想品质,我们可以通过对他们的后处理特征向量取平均值来构建他们的组合。这已经充当了团队中八个玩家的某种“重心”,并且是团队围绕其存在的特征向量空间中的锚点。我们可以看看谁的特征向量和这个最相似。

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

Overview of ‘most like US Ryder Cup team’ method

那么三位候选人中谁最像这位‘理想的美国莱德杯选手’或者‘美国队主播’呢?计算所有不合格美国选手的余弦相似度:

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

德尚博,坎特雷,菲瑙都还在上面!这可能并不令人惊讶,因为好的锦标赛结果是建立在好的发挥上的,但请注意,我们的特征向量表示并不像前两个指标那样考虑锦标赛位置或获胜者的击球数(尽管获得的击球数肯定是相关的)。

从这个结果中,我们可以得出结论,从统计数据来看,布赖森是最像自动合格的非合格人员,从数据来看,他将是团队的一个极好的补充(这并不奇怪)。

至于 Finau vs. Cantlay,那真的是一个很艰难的选择。这种势头可能与 Finau 最近的结果和更高姿态的巡回赛有关,但正如我们在这里看到的,Cantlay 确实有数据支持它(实际上在某些方面胜过 Tony)。

祝吉姆·福瑞克和他的选择好运,也祝美国好运。我们去欧洲吧!

致谢

销售分析:改善销售策略和绩效

原文:https://towardsdatascience.com/sales-analytics-improving-sales-strategy-and-performance-30b770de68fc?source=collection_archive---------4-----------------------

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

销售分析的出现让销售专业人士开始关注每天的电话和电子邮件等指标,以跟踪潜在客户。至于绩效衡量,管道价值和成功率是考虑的指标。这是销售人员刚刚开始理解数据分析的价值和潜力的时期。

然后,企业开始使用更好的工具来提高他们的分析能力。这些工具使他们能够发现更多的销售业绩指标,如配额达成率和销售线索周转率,这对收入有相当大的影响。

当今的传统销售分析平台(CRM 分析等。)的确在许多方面给企业带来了好处,超出了人们的想象。然而,它们似乎有其局限性。以下来自 Salesforce.com 和 Hubspot 的统计数据解释了企业销售的现状。由于传统平台在机器学习和人工智能等概念的应用方面仍然落后,因此销售业绩和有效性存在差距。当然,仍有很大的改进空间。这就是 销售决策引擎 发挥作用的地方。

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

销售决策引擎

为了克服上述限制,分析和技术解决方案提供商 BRIDGEi2i Analytics Solutions 开发了一个高级销售支持平台——销售决策引擎(SDE ),以帮助企业:

  1. 全面了解客户细分、销售、收入和渠道
  2. 做出准确可靠的销售预测
  3. 识别最有可能转化的机会
  4. 使销售团队能够识别和衡量需要改进的领域
  5. 识别战略干预点,以便销售团队提高达成交易的成功率

SDE 使不同角色和需求的销售人员(销售代表或经理)能够更好地预测结果,制定数据驱动的行动,并提高绩效和效力。

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

SDE 是如何运作的

SDE 采用了可扩展和灵活的架构,由先进的机器学习算法和人工智能驱动。因此,该平台能够识别和适应市场动态、销售流程和业务需求的变化。

该平台分析从相关来源(营销自动化系统、CRM 系统和内部仓库)收集的数据。然后,它利用专有的统计模型和算法进行异常检测、监督和非监督分类、时间序列预测和场景规划等操作。最后,该平台使用预先构建的可视化工具(force.com、Tableau、QlikView 等)。)帮助专业人士改进销售策略和决策。

因此,SDE 使销售组织能够对他们的业务采取度量驱动的方法。该平台不仅仅是为了解决某些销售问题或痛点;它有助于将高级分析功能嵌入他们的决策系统,以实现持续的业务影响。

现在,让我们讨论一下 SDE 对销售策略和效率有所贡献的几种方式。

预测销售速度和渠道绩效

SDE 在销售分析过程中引入了游戏化的概念。该平台有助于领导和销售代表跟踪个人层面的销售业绩。它计算销售速度,并根据当前绩效预测销售代表在特定时间内可能达到的价值。销售代表可以实时了解当前的实际价值、他或她可能达到的总价值以及预测价值和实际目标之间的差距。

通过基准测试识别风险团队并获得可见性

借助 SDE,销售经理可以生成包含详细信息的报告,如总体销售目标、实际价值、与目标的差距、漏斗中的剩余价值、平均销售周期和成功率。此外,销售代表可以进行基准测试,以评估相对绩效。这些见解有助于及时干预;它们有助于识别“有风险”的团队或个人,以便采取适当的措施来提供支持并改善他们的成果。

提高机会得分

SDE 提出了关于可能具有更高转换率的机会的说明性建议。机会分越高,转化的概率越大。因此,销售代表可以根据这些可行的建议来确定其机会的优先级。

至于销售漏斗进展,有几个阶段,例如:

  • 初次接触
  • 资格
  • 会议
  • 建议
  • 谈判

通常,某些机会不会以预期的速度从一个阶段过渡到另一个阶段。SDE 帮助确定这些“不同步”的机会。这种见解有助于销售代表或经理根据业务需求采取最合适的行动。

总之,高级销售分析解决方案在有效部署后,可以显著改善销售战略和利润。然而,这里的关键词是“有效部署”。部署和优化数据分析需要时间、投资和努力。对于企业来说,认识到这一点并理解建立一个“分析第一”的组织是持续业务增长的关键是至关重要的。SDE 是接受相同商业理念的结果。该平台出现在 Gartner 于 2016 年 9 月 7 日发布的面向 B2B 销售和营销的 SaaS 预测分析应用市场指南中。

在这一点上,学习销售决策引擎的所有方法和内容;并请求试玩,这里

这篇文章最先出现在 BRIDGEi2i 博客 上,部分文章最先发表在 Analytics India 杂志 上。

销售水晶球——人工智能驱动的 B2B 销售平台

原文:https://towardsdatascience.com/sales-crystal-ball-an-ai-driven-b2b-sales-platform-3a16213aae7?source=collection_archive---------4-----------------------

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

人工智能和机器学习正在让企业的每个可能领域都能感受到它的存在。

销售和营销组织正在慢慢加入到这个聚会中来。

对于营销和销售组织来说,一些长期得不到解答的问题是:

企业能否预测哪些潜在客户转化的可能性非常高?

企业能否预测哪些现有客户表现出大量生产的高概率?

企业能否识别显示高购买倾向的潜在客户?因此是理想的目标?

在这篇文章中,我探讨了一家具有代表性的大型 IT 公司的销售和营销部门所面临的挑战,以及错过一些销售机会的原因。以及人工智能驱动的智能销售平台(ISP)如何帮助应对这些挑战,从而提高成功率、交易速度和规模。

这些场景涉及销售代表、销售开发代表(SDR)、营销人员等角色。主要来自销售组织和营销组织。

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

销售漏斗中隐藏的地雷

#1 —销售线索评分

“不适合与适合”:营销团队经常面对大量的潜在客户。虽然这是一个令人垂涎的场景,但这些线索大多是不合格/原始的线索。通过手动处理来确认潜在客户的资格通常繁琐、耗时且效率低下。传统的销售线索评分系统(简单的双轴方法:人口统计、公司地理)显示出严重的局限性。因此,最终的结果是,营销组织将“不适合”的领导交给了销售团队。销售代表在最终不会购买的客户身上投入了宝贵的时间。

#2 —细分

传统的基于规则或简单的公司图分割常常不能描绘出客户群的正确特征。这导致了营销努力和金钱的浪费。

挑战 1—优先考虑客户

在预算和资源有限的情况下,并不是所有的客户都能成为营销活动的目标。对于营销人员来说,从数千个显示高购买倾向(适合度、意向)的账户中分离和分层是一场噩梦。这导致在没有任何优先顺序的情况下,在所有客户之间进行“糟糕的”通用营销预算分配。

挑战 2 —交叉销售和追加销售

许多公司严重依赖于发掘现有客户群,而不是寻找新客户。并非所有现有账户都有资格获得类似的关注。销售代表和 SDR 应该更多地关注显示高购买倾向的客户。但在现实中,高质量的数据——关于顾客表现出强烈购买信号的数据——通常很难找到。

挑战 3 —需求挖掘

无法找到并跟踪表现出强烈购买兴趣的潜在客户是销售漏斗中的一个关键瓶颈。营销团队通常依赖于基本的代理,如谁下载了白皮书,谁观看了网络研讨会等,来预测兴趣。有大量的数字足迹/信号尚未开发,如果客户表现出强烈的意向,这些数字足迹/信号可以忠实地建模。在缺乏技术支持的情况下,营销人员无法挖掘这些信息流。

以上所有挑战的共同点是:缺少关于客户的丰富和可操作的洞察力(例如:“意图”和“适合”)

抱负

在优先级方面,销售和营销组织通常希望实现以下部分或大部分目标:

  • 提高销售线索转化率
  • 提高续订率
  • 增加交叉/向上销售量
  • 加快销售周期
  • 减少客户流失
  • 提高活动效果
  • 改进管道卫生的预测和测量

在这种背景下,让我们看看智能销售平台(ISP)如何应对一些挑战,并推动流程朝着上述目标前进

智能销售平台(ISP)能当水晶球吗?

注入人工智能的智能销售平台是一种应用程序,它从内部和外部来源、模型(机器学习)消费客户数据,并为营销人员、SDR 和销售代表提供智能见解。“智能”意味着正确使用“机器”的平台-收集、处理相关数据,并具有强大的内置模型,可以规定正确的行动方针。

智能销售平台(ISP)的一些关键特性是什么?

关键特性#1:智能分段

传统的静态细分方法无法充分发挥海量客户数据的威力。

在智能销售平台(ISP)中,使用内部 CRM 数据和外部来源的数据,创建了丰富的 360 度客户档案。这些记录最初是为现有客户创建的。然后使用机器学习对数据集进行建模,以创建非常准确的“理想客户”细分市场。任何属于这些细分市场的公司都有很高的转化机会。

智能平台可以根据这些细分市场检查任何未来的入站销售线索,并显示转换潜力。

关键特征#2:交叉销售/ups 销售机会评级

在智能销售平台中,使用围绕购买模式的内部 CRM 数据和来自外部来源的数据,首先训练机器学习模型。随后,模型忠实地预测交叉销售机会的可能性。

关键特征#3:呼入销售线索评分

使用智能销售平台可以从噪音中过滤出令人畏惧的高质量铅。该平台会根据转化的可能性对入站销售线索进行评分。销售团队只能追踪得分高于阈值的销售线索。

内部智能销售平台使用 CRM 数据和从不同来源收集的许多数据点。这些集合在一起是为了详细查看每个历史客户。例如,线索评分可以考虑公司的许多有趣的“特征”(用机器学习术语来说),例如:

公司的核心信息:收入、成本、利润、核心产品领域、地理位置、员工数量

增长信息:同比收入增长、季度招聘增长、新收购、高管职位变动

购买意向:各种网络平台的近期参与度指标(执行搜索、阅读博客、参加网络研讨会)

技术堆栈(适用于 IT 销售人员):CRM、ERP、HRM、云等中使用的技术

关键特征#4:人物角色草图

从关于购买者概况的历史数据(资历、背景、头衔等),机器学习模型可以建立购买者的高保真度的角色。销售代表可以利用这种角色来锁定合适的人,并组织对话,从而获得更高的说服机会。

功能#5:通信优化

基于沟通模式、沟通频率、沟通模式,ML 模型可以理解什么可行,什么不可行。这些见解可用于未来的项目,以复制成功。

智能销售平台(ISP)的机制

ISP 可以像 SaaS 一样建立(或购买)在私有或公共云上。机器学习模型可以是应用的组件。

应用程序可以使用 Rest APIs 访问外部信息(例如,来自第三方信息管理者的公司信息)。此外,应用程序可以使用原始格式的信息,随后使用数据管理引擎进行清理,并使用 NLP 引擎提取结构化数据块。存储结构化的、扩充的数据用于机器学习模型的训练。经过训练的模型在 ISP 中存档。

当新的潜在客户到来时,这些信息通过特定的模型提供,模型可以预测转化的可能性。类似地,细分模型也可以勾画出多个客户概况(这是公司追逐的理想选择)

减去

设定您的目标:如果您正在考虑在您的销售和营销工作流程中注入更多“智能”,您可能想要实现的主要目标可能是:提高销售线索转化率、提高续购率、增加交叉/向上销售量、加快销售周期、减少客户流失、提高活动有效性、提高管道卫生的预测和测量。提前设定目标。

构建/购买平台:在构建/购买人工智能解决方案时,您可以考虑以下三组最具影响力的能力:智能细分能力、呼入销售线索评分、交叉/向上销售机会评级。构建或购买人工智能解决方案只是通往最终结果的整个旅程的一部分。现有的流程必须保持一致,必须建立正确的人类技能集(尤其是围绕人工智能),以增加成功的机会。

持续测量成功和支点:在一定的时间间隔内(例如每个季度),必须根据一组目标来测量进度。执行计划必须围绕这一点。

很想听听你的想法。

我的坐标:@saunakdg 在 Twitter

图片提供:任务和目的http://taskandpurpose . com/movie-kilo-two-Bravo-offers-unfifthed-look-at-the-ground-war-in-Helmand/和 Joblohttp://www . Joblo . com/horizon-movies/news/mine-goes-click-movie-review-155

抽样技术

原文:https://towardsdatascience.com/sampling-techniques-a4e34111d808?source=collection_archive---------0-----------------------

采样对研究有很大帮助。这是决定研究/调查结果准确性的最重要因素之一。如果你的样本出了什么问题,那么它会直接反映在最终的结果中。有很多技术可以帮助我们根据需要和情况收集样本。这篇博客文章试图解释其中的一些技巧。

首先,让我们看一下一些基本术语

人口

样品

抽样

人口是具有某种或其他共同特征的要素的集合。人口中要素的数量就是人口的规模。

样本是总体的子集。选择样本的过程称为抽样。样本中的元素数就是样本大小。

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

Sampling

有许多抽样技术,分为以下两类

  • 概率抽样
  • 非概率抽样

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

两者的区别在于样本选择是否基于随机化。在随机化的情况下,每个元素都有同等的机会被选取并成为研究样本的一部分。

概率抽样

这种抽样技术使用随机化来确保总体中的每个元素都有平等的机会成为所选样本的一部分。也就是所谓的随机抽样。

简单随机抽样

分层抽样

系统抽样

巢式抽样法

多阶段抽样

**简单随机抽样:**每个元素被选为零件样本的机会相等。当我们没有任何关于目标人群的先验信息时,就会用到它。

**例如:**随机抽取 20 名学生组成 50 人的班级。每个学生都有平等的机会被选中。这里选择的概率是 1/50

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

Single Random Sampling

分层抽样

该技术基于相似性将群体的元素划分为小的子组(层),使得该组内的元素在所形成的其他子组中是均匀和不均匀的。然后从这些层中的每一层随机选择元素。我们需要有关于人口的先验信息来创建子群体。

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

Stratified Sampling

整群抽样

我们的整个人口被分为集群或部分,然后集群是随机选择的。集群的所有元素都用于采样。使用诸如年龄、性别、位置等细节来识别集群。

可以通过以下方式进行集群采样:

单阶段整群抽样

整群随机抽样。

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

Single Stage Cluster Sampling

两阶段整群抽样

这里,我们首先随机选择集群,然后从这些选择的集群中随机选择用于采样的元素

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

Two Stage Cluster Sampling

系统聚类

这里,除了第一个元素之外,元素的选择是系统的,而不是随机的。样本中的元素是在群体的规则间隔中选择的。首先将所有元素按顺序放在一起,每个元素都有同等的机会被选中。

对于大小为 N 的样本,我们将大小为 N 的总体分成 k 个元素的子组。

我们从 k 个元素的第一子组中随机选择第一个元素。

要选择样品的其他元素,请执行以下操作:

我们知道每组元素的数量是 k,即 N/n

所以如果我们的第一个元素是 n1,那么

第二个元素是 n1+k,即 n2

第三个元素 n2+k,即 n3,依此类推…

以 N=20 为例,n=5

每个子组中的元素数量是 N/n,即 20/5 =4= k

现在,从第一个子组中随机选择第一个元素。

如果我们选择 n1= 3

n2 = n1+k = 3+4 = 7

n3 = n2+k = 7+4 = 11

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

Systematic Clustering

多阶段采样

它是上述一种或多种方法的组合。

将群体划分为多个聚类,然后基于相似性将这些聚类进一步划分和分组为各种子组(层)。可以从每个层中随机选择一个或多个集群。这个过程一直持续到集群不能再分为止。例如,国家可以分为州、城市、城市和农村,所有具有相似特征的地区可以合并在一起形成一个阶层。

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

Multi-Stage Sampling

非概率抽样

它不依赖于随机化。这项技术更依赖于研究人员为样品选择元素的能力。抽样的结果可能会有偏差,使得所有的人口元素很难平等地成为样本的一部分。这种类型的抽样也称为非随机抽样。

方便抽样

立意抽样

定额抽样

转诊/滚雪球抽样

方便取样

在这里,样本是根据可用性选择的。这种方法用于样品稀缺且价格昂贵的情况。因此,基于方便选择样本。

例如:在调查研究的初始阶段,研究人员更喜欢这种方式,因为这种方式可以快速轻松地提供结果。

目的性抽样

这是基于学习的意图或目的。只有那些元素会从最适合我们研究目的的群体中选出。

**例如:**如果我们想了解对攻读硕士学位感兴趣的人的思维过程,那么选择标准应该是“你对……感兴趣吗…?"

所有回答“否”的人将被排除在我们的样本之外。

配额抽样

这种类型的采样取决于一些预设的标准。它从总体中选择有代表性的样本。样本中特征/性状的比例应与总体相同。选择元素,直到获得特定类型数据的确切比例或收集到不同类别的足够数据。

例如:如果我们的人口中女性占 45%,男性占 55%,那么我们的样本应该反映相同的男女比例。

转诊/滚雪球抽样

这种技术用于人口完全未知和稀少的情况。

因此,我们将从我们为总体选择的第一个元素中获得帮助,并请他推荐符合所需样本描述的其他元素。

所以这种推荐技术继续下去,像滚雪球一样增加人口数量。

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

Referral /Snowball Sampling

例如:它用于高度敏感的话题,如艾滋病,人们不会公开讨论和参与调查来分享有关艾滋病的信息。

并非所有的受害者都会回答问题,因此研究人员可以联系他们认识的人或志愿者,与受害者取得联系并收集信息

在我们无法接触到足够的具有我们所寻求的特征的人的情况下提供帮助。从找人学习开始。

希望现在你们都对取样和它的技术有了很好的了解。

感谢阅读!

SAS 客户智能 360 —将数据转化为体验

原文:https://towardsdatascience.com/sas-customer-intelligence-360-turn-data-into-experience-a6289f097e38?source=collection_archive---------7-----------------------

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

不久前, SAS 的安吉拉·科普斯科姆联系了我,向我介绍了 SAS 的客户决策中心的概念。

他们的客户决策中心是一个解决方案概念,将允许组织从与外部方的交互中获得洞察力并触发行动,如基于规则和所获得的洞察力的客户。

例如,客户决策中心协调确定下一个最佳行动,并允许使用分析和决策逻辑实时响应传入的请求。同时,基于相同的规则集,标准通信可能会被禁止。

换句话说,客户决策中心基于通过组织分析和处理的入站信号来促进客户参与。

我听到你问,这有什么了不起的?

它之所以引人注目,是因为 SAS Software 首先是一家分析公司,在高端性能和价位的企业分析方面享有盛誉。SAS 在 LinkedIn 上将自己描述为“商业分析软件和服务的领导者,商业智能市场上最大的独立供应商。通过创新的解决方案,SAS 帮助超过 70,000 个站点的客户提高性能,并通过更快地做出更好的决策来提供价值。自 1976 年以来,北欧航空公司一直致力于让世界各地的客户了解真相。”

SAS 并不是一家因积极参与客户参与市场而广为人知的公司(双关语)。

所以我很好奇。你也应该如此。

最后,几天前,我有点不稳定的日程安排允许我与新西兰 SAS 软件公司的特洛伊·库萨布进行后续会谈,这是他早些时候提出的。特洛伊让我对这个概念有了更多的了解,并告诉我 SAS 软件是如何支持用生命填充它的。它基于 SAS 数字智能和个性化平台“SAS 客户智能 360”。SAS Customer Intelligence 360 的目的是允许企业根据数据创建相关的客户约定,从而带来更好的客户体验。SAS 称之为“创造相关的、令人满意的、有价值的客户体验”。

SAS Customer Intelligence 360 由两个应用程序组成,它们位于 SAS 分析系统之上,通过实现实时决策、智能营销和活动管理功能来支持营销。这些应用程序被命名为 SAS 360 Discover 和 SAS 360 Engage,它们允许从数字交互中收集数据,从这些交互中获得洞察力,然后使用这种洞察力通过 web、聊天、电子邮件和移动应用程序与客户进行有意义的互动。人们可以粗略地说,SAS 360 Discover 提供了分析引擎,SAS 360 Engage 使用了分析结果。

企业可以定义和维护数据收集和规范化规则,并基于这些规则分配个性化规则。使用网站或应用程序代码等简单的增强功能来跟踪客户互动,这有助于建立他们的档案,首先是匿名档案,在可能的情况下识别和合并这些技术档案。这些数据在一个数据集市中进行聚合,并可以通过来自企业拥有的其他来源的数据进一步丰富,如产品信息和来自 CRM 和其他系统的信息。然后,可以利用 SAS 的核心优势,即强大的分析系统,将这些信息用于进一步的合作。

这种参与是 SAS 360 Engage 应用程序的工作,它允许将消息和资产结合到营销任务中,这些任务被聚合到客户旅程中,被 SAS 称为活动。这同样受到 SAS 分析功能的支持,包括预测分析和机器学习。

整个系统运行在 AWS 上,并被强制设计为开放平台。API 和 ETL 功能提供了与源系统的连接。

我的看法

很高兴看到传统的分析供应商站出来,帮助他们的客户构建一个集成的解决方案,使他们能够利用他们所拥有的数据宝库。客户参与和客户体验是最热门的话题,这是展示这种能力的好机会。当然,SAS 也为决策管理、欺诈检测和风险管理提供解决方案。

SAS 能够将领先的分析引擎与业务逻辑相结合,这是一个非常有说服力的案例。分析是达到目的的一种手段,即商业目的。这种情况得到了 API 方法和提供开放平台声明的支持。

尽管如此,SAS Customer Intelligence 360 所覆盖的市场是一个竞争非常激烈的市场。像 SAP、微软、甲骨文和 Salesforce(或 Adobe)这样的商业应用软件供应商也试图垄断它。他们可能没有强大的分析引擎,但他们掌握了大量的业务逻辑和业务知识。然后是专业厂商,这里我只想提一下 Kitewheel 和 Thunderhead。这些公司在发现和参与方面表现出色,并拥有旨在支持其专业化的分析引擎,他们正在提供与主要业务(主要是 CRM 系统)的现成(OOB)集成。

整合是一个重要的话题。虽然提供 API 是关键,但是拥有 OOB 集成的信息是非常强大的。

最后,它是关于信息和哲学的。查看“开始使用”信息图在此说明。这种想法是以公司为中心,而不是以客户为中心。因此,它不必要地限制了自己。虽然有人提到客户“善变”,但这是假设客户的旅程可以由公司预先规划,这是错误的。公司可以提供许多接触点,客户可以在任何给定的时间点从中选择他认为最方便的接触点。真诚地传递信息是关于与 客户交谈,而不是与 客户交谈 。将消息传递转变为由外向内的观点,然后进一步改进解决方案,可以帮助 SAS 真正脱颖而出。

SAT 数据— 2001 年

原文:https://towardsdatascience.com/sat-data-2001-8e86f1671840?source=collection_archive---------3-----------------------

在我们的第一个大会数据科学沉浸式项目中,该班级获得了一些 2001 年的 SAT 数据。这些数据包括各州的参与率、各州的平均语言成绩以及各州的平均数学成绩。

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

Sample of the data in excel — (please don’t tell anyone I opened this in excel!)

首先,我在 excel 中打开 csv 文档。excel 表格很有趣,我可以用它对数据进行一些基本的推断——高分和低分,计算一些基本的统计数据,等等。然而,我真的想以一种能给我更多控制的格式来查看这些信息,所以我把所有的东西都导入了一个 jupyter 笔记本。

因为我被告知不要在这个项目中使用 pandas dataframes,所以我将所有内容导入到一个 list 列表中,并使用字典来处理数据。导入过程看起来像这样:

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

Importing………………

一旦它成为列表格式的列表,我就可以制作一些图表和可视化效果来真正利用这些数据。第一步是值的直方图。

直方图是每个范围内数值数量的条形图。在这种情况下,它显示分数出现在某个范围或“bin”内的州的数量

(我用 matplotlib 在 jupyter 笔记本上制作了所有这些图表,但为了让它们看起来更漂亮,我在 tableau 中重新制作了它们)

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

https://public.tableau.com/views/DCDSIProject1-HIstograms/Dashboard3?:embed=y&:display_count=yes

从这些信息中我们能马上看出什么? 这些都不是正态分布!

没有更多的数据很难说,但我猜想整个美国的 SAT 分数可能更接近正态分布。由于各州人口的差异,各州得分的平均值并不能告诉我们太多关于整个人口的直方图是什么样子。

下一步是绘制散点图,直观地显示数据是如何分布的。

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

https://public.tableau.com/views/DCDSIProject1-LinePlots/Dashboard2?:embed=y&:display_count=yes

现在我们可以看到一些有趣的关系。

参加测试的合格学生越多,平均分就越低。这是有道理的:在中西部各州,要求 SAT 的学校较少,只有申请竞争更激烈、通常是沿海学校的学生才会参加 SAT,而不是 ACT。

让我们看看这个假设是否支持沿海和内陆州的划分。幸运的是,tableau 将让我们制作一个热图,以查看地理上哪些州的参与率较高。

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

是的,沿海各州以及德克萨斯州和伊利诺伊州的参与率较高。

也许还有其他因素在起作用。

德克萨斯州、伊利诺伊州和沿海各州的另一个特点是人口水平高。让我们看看人口(2000 年)如何与参与率相关联。

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

这是一个很好的尝试,但是这个数据没有太多的人口相关性。至少我验证了我的假设。

那么,非沿海州的学生不参加 SAT 考试,而是在做什么呢?

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

ACT Participation Rates 2001

采取行动。

我在网上找到了一个 2001 年 ACT 参与率的列表(https://forms . ACT . org/news room/data/2001/States . html https://forms . ACT . org/news room/data/2001/States . html)。这些分数的分布图几乎是 SAT 分数分布图的逆分布。

我从现有的数据中获得了一些有趣的见解,但我想用更多的时间和大学委员会的数据来考虑几个问题:

还有哪些信息可以与每个州的参与率和分数相关联?

我们怎样才能把结果按州分开,这样就不会像参与度那样重要了。我们能否将这些分数标准化,以便更好地进行跨州比较?

那些问题将不得不等待另一天。

沙特股票市场分析和预测(Tadawul)——第一部分

原文:https://towardsdatascience.com/saudi-stock-market-analysis-and-forecasting-tadawul-part-i-a22254c7a95b?source=collection_archive---------10-----------------------

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

这是我在金融行业的第一个项目,尤其是在花了大量时间在医疗保健领域进行机器学习项目(如英国的 A & E 出勤和急诊,以及乳腺癌细胞类型分类器)之后。所以,我决定在中东最大的股票市场之一——沙特阿拉伯股票市场(Tadawul)发挥我的技能。虽然,数据获取和收集是一个具有挑战性的部分。但是多亏了 Tadawul,这才变得很容易!在那里,我必须浏览所有在他们网站上发布的沙特市场活动年度报告,提取所需的数据,并最终将它们合并到一个 CSV 文件中。最终,我得到了一个从 2006 年 1 月到 2018 年 8 月沙特阿拉伯市场活动的数据集。

关于 Tadawul 的更多信息:Tadawul 是在沙特阿拉伯王国被授权作为证券交易所(以下简称“交易所”)的唯一实体。它主要进行证券的上市和交易,以及在交易所交易的证券的存管、转让、清算、结算和所有权登记

该项目旨在分析从 2006 年开始到 2018 年 8 月的沙特阿拉伯股票市场数据,并对 12 个月(2018 年 9 月到 2019 年 8 月)进行预测/预报。我将完成这个项目的一系列,其中每一部分将详细讨论不同的主题。

第一部分—加载数据集、数据争论、数据分析和探索

加载数据集

首先,我们加载所需的库,然后是数据集:

library(dplyr)library(urca)library(forecast) library(repr)library(data.table)library(psych)library(dygraphs)require(ggplot2)

这是我从 Tadawul reports and publications(4x 152)整合的月度市场活动数据集的截图。所有货币单位均为沙特里亚尔:

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

正在加载数据集:

df <- read.csv ( file= "… /Tadawul/Datasets/Monthly Market Activity.csv", 
                 header= TRUE )
head(df)

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

按如下方式更改标题名称:

月:日期

股票交易价值(SAR): VST

股票交易数量:NST

交易:Tra

setnames(df, old=c("Month","Value.of.Shares.Traded","Number.of.Shares.Traded", "Transactions"), 
             new=c("Date", "VST", "NST","Tra"))
head(df)

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

数据角力

检查数据类型:

class(df$Date)
class(df$VST)
class(df$NST)
class(df$Tra)> 'factor'
> 'numeric'
> 'numeric'
> 'numeric'

列“日期”的类别是“因子”。对于时间序列分析,我们应该有日期和时间数据类型。但首先,让我们检查是否有任何缺失的数据存在:

summary(is.na(df$Date))
summary(is.na(df$VST))
summary(is.na(df$NST))
summary(is.na(df$Tra))*>   Mode   FALSE* 
*> logical     152*
*>
>   Mode   FALSE*
*> logical     152*
*>
>   Mode   FALSE*
*> logical     152*
*>
>   Mode   FALSE*
*> logical     152*

没有丢失数据,将“日期”列类型更改为日期和时间类“POSIX CT”“POSIX t”:

to.POSIXct <- function(col){ dateStr <- paste(as.character(col))
  as.POSIXct( strptime(dateStr, "%d/%m/%Y"))
}df$Date <- to.POSIXct(df$Date)
class(df$Date)> 'POSIXct'  'POSIXt'

创建“月”列,它有助于数据可视化和探索:

df$month = month(df$Date)
df$month = month.abb[df$month]
head(df)

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

数据分析、可视化和探索

让我们首先检查数据帧摘要:

summary(df[,2:5])>  VST                 NST                 Tra              month          
> Min.   :3.240e+10   Min.   :1.557e+09   Min.   :    3185   Length:152        
> 1st Qu.:8.006e+10   1st Qu.:3.503e+09   1st Qu.: 1969411   Class :character  
> Median :1.163e+11   Median :4.669e+09   Median : 2707780   Mode  :character  
> Mean   :1.487e+11   Mean   :4.875e+09   Mean   : 3254791                     
> 3rd Qu.:1.731e+11   3rd Qu.:6.125e+09   3rd Qu.: 3787704                     
 Max.   :8.284e+11   Max.   :1.383e+10   Max.   :12105358

时间段(2006 年 1 月-2018 年 8 月)内交易股份价值散点图(VST),用交易股份数量(NST)进行颜色编码:

ggplot(df, aes(Date, VST, color = NST)) +
  geom_point(shape = 16, size = 2, show.legend = TRUE) +
  theme_minimal()

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

检查数据分布(直方图)以及交易股票价值、交易股票数量和交易数量之间的关系;

pairs.panels(df[,1:3], method = "pearson", # correlation method hist.col = "#00AFBB", density = TRUE,  # show density plots ellipses = TRUE # show correlation ellipses)

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

很明显,在 VST、NST 和 Tra 中有异常值或大数据会扭曲分布曲线,大部分是 2006-2008 年的数据。我们将在时间序列绘图和分析中看到这些数字的确切位置。然而,股票交易价值(VST)和交易数量(Tra)之间存在明显的线性关系。因此,更高的交易数量意味着更高的股票交易价值。皮尔逊相关法通过显示 VST 和 Tra 之间的线性关系强度(0.89)可以肯定地证明这一点。

事实上,我有兴趣了解更多关于(2006 年至 2018 年)期间每股交易的平均价值。但是首先,我们必须创建这个功能,并将其命名为(Avg。v)通过将 VST 除以 NST:

*# Average value of each share Avg.V*
df$Avg.V <- df$VST/df$NST
summary(df$Avg.V)> Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
>  13.97   21.25   24.53   29.60   32.39  104.78

检查每个份额分布的平均值:

ggplot(df, aes(x =Avg.V))  + geom_histogram()

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

平均散点图。“v”与“日期”相对,带有“nst”颜色编码:

ggplot(df, aes(Date, Avg.V, color = NST)) +
  geom_point(shape = 16, size = 2, show.legend = TRUE) +
  theme_minimal()

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

与 VST 类似,每股平均价值在 2007 年前很高,2010 年后波动。看起来股票数量对这些股票的价值没有影响。我将在时间序列分析中验证这一假设。

创建每列的时间序列数据:

*# create ts data*
VST.ts <- ts(df[,'VST'], frequency = 12, start=c(2006,1), end= c(2018,8))
NST.ts <- ts(df[,'NST'], frequency = 12, start=c(2006,1), end= c(2018,8))
Tra.ts <- ts(df[,'Tra'], frequency = 12, start=c(2006,1), end= c(2018,8))

绘制股票交易价值 VST 时间序列:

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

随着时间序列的绘制,我们注意到股票交易的最高价值是在 2006 年初,然后曲线开始呈指数衰减。最高数字超过 8,000 亿沙特阿拉伯里亚尔,最低数字低于 2,000 亿沙特阿拉伯里亚尔。为了更好地了解趋势,让我们按季度和年度累计数据,然后再次绘制时间序列。

绘制每季度交易股票的价值:

plot.ts(VST.ts.qtr, main = "Value of Shares Traded - Quarterly", 
         xlab = "Year", ylab = "Value")

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

plot.ts(VST.ts.yr, main = "Value of Shares Traded - Yearly", 
        xlab = "Year", ylab = "Value")

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

如季度图和年度图所示,沙特股票市场受到了 2007-2008 年全球经济危机的影响。当时,交易股票价值严重缩水,在 2010 年达到最糟糕的水平。

为了同时了解三个特征的行为,为了更好地显示,我将在基本缩放后一起绘制三个时间序列(VST、NST、Tra ):

options(repr.plot.width=8, repr.plot.height=6)
plot(VST.ts/10000, col = "red", xlab = "Date", ylab = "Value", 
     main = "Saudi Stock Market Activities 2006 - 2018")
lines(NST.ts/600,col = "blue")
lines(Tra.ts*5, col = "black")
grid() 
legend("topleft",lty=1,col=c("red", "blue", "black"), cex = 0.65,
       legend=c("Value of Shares Traded x10^4", 
       "Number of Shares Traded x10^3", "Transactions /5"))
axis(1, at=1:152, labels= (df$Date))

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

同样,绘制 VST、NST 和 Tra 时间序列—每年:

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

如图所示,2010 年 VST、NST 和 Tra 值最低。然而,三条线基本上是一致的。

交易股票价值柱状图(VST.ts):

hist(VST.ts, breaks = 30, 
     main = paste('Value of Shares Traded Distribution'), xlab = "VST")

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

VST 每月箱线图:

boxplot(VST.ts ~ cycle(VST.ts), xlab = "Month", ylab = "VST", 
         main = "Monthly Value of Shares Traded - Boxplot")

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

从月度箱线图中,我们可以注意到最低的交易值发生在八月和十月。而交易量最高或最热的月份是二月、三月和四月。

应用移动平均技术对 VST 时间序列 12 年间的概貌。我们将计算 6、12、24 和 36 个月的平均值,以控制趋势平滑度。

par(mfrow = c(2,2))
plot(VST.ts, col="gray", main = "Half Year Moving Average Smoothing")
lines(ma(VST.ts, order = 6), col = "red", lwd=3)
plot(VST.ts, col="gray", main = "1 Year Moving Average Smoothing")
lines(ma(VST.ts, order = 12), col = "blue", lwd=3)
plot(VST.ts, col="gray", main = "2 Year Moving Average Smoothing")
lines(ma(VST.ts, order = 24), col = "green", lwd=3)
plot(VST.ts, col="gray", main = "3 Year Moving Average Smoothing")
lines(ma(VST.ts, order = 36), col = "yellow4", lwd=3)

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

在 AWS 上节省一分钟

原文:https://towardsdatascience.com/save-that-one-minute-on-aws-88dab5a37233?source=collection_archive---------7-----------------------

自动化日志记录和到 EC2 实例的隧道

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

更多的时候,为了不参与我的项目,我不得不求助于 AWS 来满足我的计算需求。有时候是我的 128 GB 本地机器存储不足,有时候是需要 GPU 运行深度学习模型。AWS EC2 实例并不便宜,尤其是如果您使用的是支持 GPU 的实例。我使用每小时 0.9 美元的 p2xlarge,在我完成工作后,我需要停止(而不是终止)它,这样我就不会被收取不必要的费用。除非您使用的是保留的实例,否则每次重新启动实例时,都会为您分配一个新的 IP。然后,您必须经历将 IP 复制到 ssh 命令以登录的枯燥过程。

#ssh login
ssh -o ServerAliveInterval=60 -i yourkey.pem [ec2-user@ec2-xx-xxx-xx-xxx.us-west-2.compute.amazonaws.com](mailto:ec2-user@ec2-34-210-18-190.us-west-2.compute.amazonaws.com)

然后,如果您想要隧道进入您的实例,您必须为您的隧道命令再重复一次这个过程。

#ssh tunneling
ssh -o ServerAliveInterval=60 -i yourkey.pem [ec2-user@ec2-xx-xxx-xx-xxx.us-west-2.compute.amazonaws.com](mailto:ec2-user@ec2-34-210-18-190.us-west-2.compute.amazonaws.com) -L9000:127.0.0.1:8888

对于像我这样一天要多次停止和重启实例的人来说,这很快就会变得令人恼火。在这篇文章中,我将谈论一个在某种程度上避免这一过程的巧妙技巧。

弹性 IP

拼图的第一块是 AWS 上的弹性 IP 功能。

弹性 IP 地址是与您的 AWS 帐户相关联的静态 IPv4 地址

您可以将此 IP 分配给一个实例,然后每次都可以使用此 IP 登录到您的实例。这将解决不断变化的 IP 问题。这方面的成本可以忽略不计。如果 IP 连接到正在运行的实例,则不会产生任何成本。但是,如果 IP 连接到一个停止的实例,这是您所需要的,它将花费您每小时 0.005 美元。如果我们粗略计算一下,50 天内每天 20 小时的停止实例将花费您 5 美元。一点都不差!!

以下是您预订弹性 IP 的方式:

步骤 1: EC2 仪表板→网络和安全→弹性 IP

第二步:点击分配新地址,并按照步骤

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

步骤 3:选择新 IP →操作→关联地址

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

步骤 4:选择要将此 IP 附加到的实例

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

对于选定的实例,公共 IP 将永久更改为弹性 IP,除非您将其释放。现在,您不需要一次又一次地更改日志和隧道命令的 IP 部分。

只是用弹性 IP 会节省你的时间。但是仍然有提高效率的空间,所以继续吧。

用于日志和隧道的 SSH 脚本

在这里,我将讨论创建 ssh 脚本的一系列步骤,您可以从您的终端运行该脚本,它不仅可以登录到您的实例,还可以创建从您的本地主机到您的实例的隧道。

**第一步:**输入你的。ssh 目录。

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

步骤 2: 记住,您需要 pem 文件来登录到您的实例。将这个 pem 文件复制到 ssh 目录。

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

步骤 3: 现在使用任何文本编辑器在同一个目录中创建一个 ssh 配置文件。我用纳米来做这个。并在配置文件中定义实例细节。

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

Host <any name you like> <elasticIP>.us-west-2.compute.amazonaws.com
 HostName <elasticIP>.us-west-2.compute.amazonaws.com
 User ec2-user
 IdentityFile <location of pem file>
 IdentitiesOnly yes
 ForwardAgent yes
 LocalForward 9000 localhost:8888

注:

  • 在上面的配置文件中,如果你使用的是 ubuntu 实例,用户将是 ubuntu
  • LocalForward 9000 localhost:8888 会将本地主机上的端口 9000 转发到 EC2 实例的本地主机。您也可以使用任何其他端口来代替 9000

完成后,每当您想要重启实例时,只需调用这个命令即可

ssh DL-box

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

希望这个小技巧能省下那一分钟。这篇推文要旨启发了我写这篇帖子。

使用简单的决策树分类器在 Naira 节省数百万美元

原文:https://towardsdatascience.com/saving-millions-in-naira-with-simple-decision-tree-classifier-1c52ed44439c?source=collection_archive---------3-----------------------

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

随着最近尼日利亚商业界对数据科学的大量谈论,相当多的从业者可能会忽视其真正的本质。根据一份关于数据科学的 Cloudera 培训材料,数据科学最终旨在发现组织的商业价值,然后将其作为可操作的见解传达给利益相关方。

在很高的层面上,数据科学旨在解决业务问题。要么降低成本,要么增加收入。这种解决商业问题的方法非常科学,非常有条理,并且以研究为基础。因此,我们不只是在谈论用一些 Python/R 库来处理数据。我们参与解决现实生活中的问题,以创造真正的价值。

用例

问题陈述

电子商务行业面临着尼日利亚经济特有的诸多挑战,从市场成熟度、对在线支付系统的信任、严酷的经济现实到人类行为倾向。

为了从在尼日利亚运营电子商务平台的微薄利润中挤出利润,提高客户保留率(如商品推荐引擎)和终身价值或降低运营开销是关键。高运营开销的一个主要原因是客户诱导的订单取消。一般来说,订单可能会因为各种原因被取消,例如支付网关故障、技术故障、客户不满等。我们的用例关注的是在电子商务平台上成功完成流程后被客户取消的订单。

我们的问题是一个分类问题{A 类:完成订单,B 类:取消交付 },我们的目标是预测客户订单在任一类中的概率。

商业目标

将客户导致的订单取消减少 X %。实现上述业务目标将通过减少因取消订单造成的收入损失以及在退货流程中产生的运营费用,对组织的底线产生积极影响。

假设

解决上述问题的方法是科学的,而不是头脑知识,我们必须定义一个假设:

如果我们知道产品的订单历史和客户行为的历史,那么我们应该能够预测客户下的特定订单最终取消交付的概率。

分析管道阶段

在保持简单性的同时,确保我们不偏离我们的科学方法,我们强调了以下分析管道阶段:

  1. 识别数据集中的模式(又名探索性数据分析 — EDA)。
  2. 从现有特征中提取固有特征以揭示潜在模式(特征提取和工程)。
  3. 将发现传达给涉众,以就模型公式的特征达成一致(领域专业知识)
  4. 模型组成
  5. 生产部署
  6. 确保分析中的可重复研究可移植到组织内的其他用例。

模型、算法和库

由于定义的假设是一个二元分类问题,我们部署了分类技术,如逻辑回归,决策树,随机森林(集成算法)和支持向量机(SVM)。在预测准确性、速度、模型解释和生产部署的便利性方面的性能比较用于确定算法的选择。

对于第一次迭代,使用了 决策树分类器 并在 Python 中进行分析,然而分析可以在 RScala 中重现。使用的库包括:

结果和评价

我们训练模型的方法很简单:

  1. 列车组
  2. 测试装置
  3. 交互效度分析

测试集和交叉验证的准确率分别为 77%74% 。这可能没有那么高,但是决策树分类器的优点在于它的可解释性。

在生产中,我们在预测 A 类时达到了大约 70% 的准确率,在预测 b 类时达到了大约 40% 的准确率。

总体结果是,在 3 个月的时间内,由于确定的问题陈述而产生的间接成本减少了 26% MoM

结论

我们在这里讨论的是一个真实的使用案例,其中我们用数据科学技术处理了一个业务问题,从而创造了真实的、可衡量的业务价值。完成的大部分工作是团队工作,这导致需要数据科学团队,而不是数据科学家。

我希望这能推动企业挑战他们的数据团队,不要讨论最新机器学习工具的花哨,而是与他们一起创造直接的商业价值。

请随时给我留言,通过 LinkedIn电子邮件联系,讨论您的数据机会。

Scala vs Kotlin:务实程序员的实际考虑

原文:https://towardsdatascience.com/scala-vs-kotlin-practical-considerations-for-the-pragmatic-programmer-d50bcc96765f?source=collection_archive---------0-----------------------

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

source: superkotlin.com

Java 不仅仅是一门语言;这是一个生态系统。您可以不用编写任何 Java 就能为 JVM 编写代码。这让你可以选择使用更现代的语言。Java 的一些缺点是很明显的。这会让你写很多样板代码。它只在事后才支持函数式编程;lambda 特性是一个组装品。NullPointerException 是每个 Java 程序员的祸根。

2004 年,由马丁·奥德斯基领导的一个小组发布了该语言的更新版本,名为 Scala (“可扩展语言”)。它增加了一些特性,比如所有事物的对象、作为可分配数据的函数、类型推断和模式匹配。它编译成 Java 字节码,并且可以与 Java 代码混合使用。

另一种目标相同的语言是由 JetBrains 于 2012 年发布的 Kotlin 。它建立在人们使用 Scala 的经验之上。对 Scala 的一个常见抱怨是编译速度慢,而 Kotlin 提供了与 Java 相当的编译速度。它最近得到了谷歌的大力支持,谷歌宣称它是安卓开发的一流语言。

如果 Java 的一些特性经常让你烦恼,你会发现两种语言都有你喜欢的地方。如果你烦到要跳下去,你该走哪条路?应该选择 Scala 的成熟还是 Kotlin 的新鲜?对双方都有好处。

解题方法不同

Kotlin 和 Scala 和 Java 一样,都是静态类型的。无论一个变量开始是什么类型,它都将在整个生命周期中保持不变。但是这两种方法都省去了你声明每个变量的努力。可以用初始值设定项隐式声明类型。用任何一种语言你都可以写

var count = 1

这使得计数为整数。请注意,不需要分号。这两种语言的区别在于 Scala 在允许隐式转换方面走得更远。如果你使用了 x.transmogrify() ,并且 x 属于一个没有 transmogrify 函数的类,那不一定是错误。你可以创建一个隐式类,它有一个转换方法,编译器会在不需要你做任何转换的情况下,判断出它是否可以介入来完成这项工作。

科特林的创造者发现这有点太自由了。它允许您在一个类上定义扩展方法,添加自定义功能。即使在标准数据类型上也可以这样做。(记住,一切都是对象,所以每个数据类型都是一个类。不再需要简单数据类型的装箱。)

空值在 Java 中是一个非常令人头疼的问题。Scala 从几个方面缓解了这个问题。首先,变量必须初始化。您可以将它们初始化为默认值( var a:Int = _ ),这个值通常为空,但至少它让您意识到您正在这么做。其次,Option 类有助于保证参数和返回值的空安全性。这是这种语言中比较难理解的特性之一,但是它给了你很大的控制权。

科特林直奔主题。默认情况下,它不允许变量的值为空。如果你真的需要,你可以声明一个变量为可空,方法是在类型后面加一个问号。如果您使用过 Swift,这种方法听起来会很熟悉。如果使用可为空的值,编译器会进行大量的检查,以确保不会使它们面临 NullPointerException 的风险,如果会,它会给出一个编译时错误。

如果您只想将一些数据打包到一个对象中,Java 会让您使用常规类或枚举。Scala 和 Kotlin 提供了一些更好的选择。Scala 为您提供了 case 类,它是数据对象的专用类。它自动定义访问器函数(为什么 Java 不这样做呢?).实例通过结构而不是引用进行比较。自动提供一个复制功能来进行浅层复制。

Kotlin 的数据类做了几乎相同的事情。主要区别是 Scala 有一个强大的模式匹配特性,这是 Kotlin 没有的。一个匹配语句就像一个仿生增强的 case 语句。模式不仅可以检查文字值,还可以检查类型、列表和范围。Scala 可以对所有类型的对象进行匹配,但是这个特性对于 case 类尤其强大。

Scala 为 XML 提供了强大的支持。您可以将 XML 直接放入 Scala 代码中,并将其分配给一个 XML 对象。这造成了复杂性,因为后面没有空格的 < 操作符可能被解读为 XML 表达式的开始。Kotlin 使用更传统的类方法来处理 XML 对象。

类型类是 Scala 的一个特性,在 Kotlin 中没有对应的特性。类型类定义了一组成员类必须支持的操作。这不像 Java 中的子类化;可以将类型类添加到已经存在的类型中。它允许开发人员用现有类型创建新的多态类型。Kotlin 中的扩展函数不是一回事,但是它们允许您为不同的类型添加共同点,因此它们解决了一些相同的需求。

语言的感觉

好吧,这两种语言之间是有差异的,但它们的目标或多或少是一样的。哪个都可以学。选择这个或那个有更大的,更哲学的原因吗?

对一些人来说,区别在于 Scala 更旨在探索新的想法,而 Kotlin 更专注于获得结果。Kotlin 对快速编译的强调和对 Scala 一些深奥特性的去除反映了这一点。Scala 只是让你做很多事情。操作员姓名**?:+** 看起来是合法的,也许你想用它是有原因的。科特林的限制更多。有人会说更理智。

如果你喜欢函数式编程,Scala 比 Kotlin 拥有更多的特性。类型类是一种函数式编程特性。再比如,Scala 支持 currying 和 partial application,这是分解接受多个参数的函数的方法。这为使用参数列表提供了额外的灵活性。科特林提供了做同样事情的方法,但它们可能没有数学上的优雅。

学过 Scala 的人彻底爱死它了。这需要更多的努力,但它让开发人员可以做他们在 Kotlin 中做不到的事情。科特林的追随者经常发现,灵活性更令人困惑,而不是有用的。

实际考虑

有时候你想做的事情的现实是主要因素。你需要选择能让你做这项工作的语言,即使你不太喜欢它。如果你打算做 Android 开发,Kotlin 是唯一的选择。Android 不使用 Oracle 的 JVM,所以你不能使用任何旧的兼容 JVM 的语言。Kotlin 拥有在 Android 上编译、调试和运行软件的工具。是 Android Studio 内置的,从 3.0 版本开始。

在 Android 之外,Kotlin 的选择更加有限。您致力于为您的 IDE 开发 Eclipse 吗?在某种程度上,您可以使用它来处理这两种语言。Eclipse 的 Scala IDE 比 Kotlin 插件更成熟,设置起来有点痛苦。一些用户报告说他们很难使用后者。NetBeans 的情况类似。随着科特林越来越受欢迎,一两年后情况可能会更加平等。如果您喜欢从命令行工作,IDE 环境不是问题,Kotlin 有所有必要的工具。

Kotlin 仍在不断成熟,但许多 Java 人发现采用它比 Scala 更容易。哪一个最适合你的需求将取决于你的个人风格和你的实际目标。在做决定之前仔细看看这两者。

解释机器学习的可扩展方法

原文:https://towardsdatascience.com/scalable-methods-for-explaining-machine-learning-f28f2b8f9f13?source=collection_archive---------8-----------------------

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

机器学习通常被称为人工智能的一部分。然而,越来越多的人感到不安,我们并不真正理解它为什么如此有效。还有对算法失控的担忧。这些批评并不完全公平。设计了一些最成功的算法的该领域的中坚分子确实明白事情为什么会这样。然而,这是一种既模糊又深刻的理解形式。机器学习算法很复杂,解释复杂的对象从来都不容易。但是,随着机器学习作为一个领域的成熟,并在软件中变得无处不在,也许是时候谈论更多有形的理解和解释形式了。

在这篇文章中,我将讨论为什么我们传统的理解方法对机器学习不是很有用。然后我会讨论另一种理解方法,这种方法可能更适合机器学习的特定环境。我在这篇文章中讨论的东西都不是新的。对于经验丰富的从业者来说,这应该是非常熟悉的。这只是我试图把这个领域中一些隐含的智慧表达出来。

复杂系统中的决策

机器学习对于复杂系统中的决策问题最为有用。目标是在给定的特定环境下预测最合适的行动,以引出最理想的反应。在现实生活中,问题几乎从来不用可观察量来表述。因此,第一步是用可观测的量来表述这个问题。这远不是微不足道的,但这不是机器学习的一步。无论你选择哪种解决问题的方法,你都需要采取这一步。

一旦你用可观察的形式描述了这个问题,下一步就是发展一个解决方案的数学形式。解总是被公式化为描述复杂系统的数学函数。这个函数被称为系统的模型。

模型的输入和输出将取决于你的公式。例如,输入可以是上下文动作对,输出是预期反应,或者输入可以是上下文,输出是最佳动作和预期反应,或者您可以选择概率公式,在这种情况下,输入可以是上下文动作反应三元组,输出是这种三元组出现的概率。没有选择配方的通用指南。哪一种方法最有效在很大程度上取决于问题的具体情况。

一旦你选择了你的数学公式,那么你剩下的核心任务就是确定模型。该模型必须与我们对复杂系统的感知一致。我们的感知可以分为两个部分:假设和数据驱动的洞察力。

假设是你对系统做出的独立于任何可用数据的陈述。假设可以进一步分为两个部分:已知的事实和猜测。众所周知的事实是每个人都同意的关于系统的事实,不需要争论。猜测是那些对你来说特定的假设,可以被质疑。猜测可能来自您以前使用类似系统的经验,在这种情况下,它们将是有根据的猜测,并且是可以辩护的。它们也可能仅仅来自你的直觉,在这种情况下,它们很可能是错误的猜测,也很可能不那么有说服力。

当谈到数据驱动的洞察力时,概括地说,有两种方法可以从数据中提取洞察力:手动和自动。人工方式主要包括分析数据趋势,以确定变量之间的函数关系。人工洞察的质量在很大程度上取决于获得这些洞察的人的能力和偏见。但它们确实有更容易解释的好处,因为获得洞见的人应该能够陈述获得所述洞见的逻辑步骤。自动化方式主要包括使用数学优化来确定变量之间的函数关系。给定优化目标的选择,自动洞察的质量独立于任何人。但这也使它们更难解释,因为人们不知道优化方法为获得这些见解所采取的确切逻辑步骤;如果人们知道确切的步骤,那么就不需要自动化的方法,人们可以简单地手动推导它们。手动和自动模式之间没有明显的分界线。相反,在一端完全手动和另一端完全自动化之间有一个连续体。

一般来说,你的假设越强、越多,数据驱动的洞察力在确定模型时的作用就越小。如果你想减少一个或几个特定的人对你的模型的影响,那么你会想减少猜测和人工洞察提取的作用。让我们先来看看这个程序的两个极端:无数据区和无理论区。

在无数据区,你将完全摆脱对数据的依赖,并根据已知事实做出决策。为了能够做到这一点,已知的真理本身应该能够提供一个复杂系统的完整描述。换句话说,你需要一个复杂系统的完整的实用理论。在有趣的现实生活问题中,从来不会出现这种情况——要么我们没有完整的系统理论,要么即使我们有,我们也没有办法计算上述理论的结果。

在无理论区,你可以完全抛弃假设,只根据数据构建模型。从数学上来说,这意味着你需要模型所有可能的输入和输出数据。除了这种数据永远不可用这一事实之外,这完全违背了建立模型的初衷。您可能希望构建一个模型,以便它可以从一个样本推广到整个人群。如果你有整个人口的数据,那么就没有必要建立一个模型。

因此,仅仅基于假设或仅仅基于数据建立模型既不可行也没有用。机器学习的价值在于从决策过程中完全消除猜测和手动洞察的作用,并提供完全基于已知事实和全自动数据驱动洞察的解决方案。不幸的是,我们还没有到那一步。此时,每个机器学习模型都会包含一些猜测和人工数据驱动的洞察。

正如我们所讨论的,已知的真理不需要解释。猜测和人工洞察相对容易解释。解释机器学习的关键在于解释自动化数据驱动的见解。这种解释意味着什么?一个解释与期望的概念密切相关。通常,如果我们能以某种方式表明某件事的行为与我们的预期一致,我们就说我们对这件事有了解释。因此,解释取决于能否形成预期。

为了解释机器学习模型,我们需要能够形成对它的期望,独立于用于构建它的过程。此外,这种形成预期的方法应该比构建模型的过程更简单,否则我们将需要另一种方法来解释预期形成方法——这将违背解释的全部目的。这立即排除了精确和全面预期的可能性。如果我们确实有一个更简单的方法,可以用来准确预测模型在所有可能场景中的行为,那么我们将简单地使用该方法来构建模型,而不是原来的方法。因此,我们能达到的最好目标是近似的和/或部分的解释。

如何不解释

在我们讨论一个可能行得通的解释方法之前,让我们先讨论一些几乎肯定行不通的解释方法。我们可以把这些方法看作后验方法。换句话说,这些方法以某种方式试图将最终优化的模型分解成部分,并解释这些部分。例如,我们可能希望将模型的输出视为以某种方式独立地受到具有某些权重的输入的影响。对于强相关系统来说,这是非常危险和完全错误的。这里很好地解释了为什么在机器学习模型中基于特征权重来判断变量重要性不是一个好主意。因此,如果输入变量是相关的,这种方法根本不起作用。

另一种选择是用小块拼出模型的区域,这样在每个小块上,你可以用一个简单的函数得到模型的精确的局部近似。然后,我们可以将整个模型想象成这些简单的局部近似的拼凑,并询问这些局部近似的行为是否与我们的预期一致。这种方法非常类似于使用等价类划分来理解和测试传统软件的方式。

问题是我们认为什么是简单函数?对大多数人来说,很难想象三维空间以外的情况,这意味着一个简单的函数最多只能有两个独立变量。此外,我们会发现很难对具有一个或两个以上极值的函数进行推理。当我们将这些约束强加到一个简单函数的定义中时,我们将会看到,所需的面片数量随着输入变量的数量和模型极值的数量呈指数增长。

如果我们在操作上将函数的复杂性定义为输入的数量、极值的数量和变量之间的相关性的强度的某种组合,那么上述解释方法就不起作用,因为它们在复杂性方面不能很好地扩展。这些方法没有规模,因为它们试图建立一个后验还原近似。一个可伸缩的方法不需要考虑最终的模型,而是优化方法本身。为了扩大规模,它需要为如何做出决策建立全局近似,而不是为每个单独的决策建立近似。

从对称性开始

首先,我们需要阐述我们的术语。在机器学习中,人们从已知的真相、猜测和人工数据驱动的见解开始。这些在数学上表示为部分定义的多元函数,称为算法。除了输入和输出,算法还将有一组未确定的参数。通过用数据训练算法来固定参数。训练算法本质上是以自动化的方式从数据中提取洞察力,它通常涉及解决优化问题。用数据训练算法的结果是一个完全定义的函数,称为训练模型。到目前为止,我们讨论的模型都是经过训练的模型。优化的目标函数以这样的方式设置,即最小化它将意味着训练的模型捕获与该特定问题相关的数据中的稳定模式。

解释的第一步是清晰。在我们解释任何事情之前,我们需要明确起点。在机器学习中,起点是已知的真相、猜测和人工数据驱动的见解。对于任何给定的问题,我们只能在给定这些出发点的情况下提供一个解释。因此,需要非常清楚和全面地陈述它们。

问题几乎总是用领域的语言来表述。然后你可以用一种表示法把它转化成一个数学问题。当你做这个翻译时,问题的复杂性就显现出来了。任何解释如果能够根据问题领域的期望来提供,而不是根据为解决方案选择的特定表示来提供,那么它也将具有更高的效力。因此,起点有更好的机会随着复杂性扩展,并且如果它们按照领域的语言而不是表示的语言来陈述,它们将具有更高的解释能力。

但是,当我们说应该用领域的语言来陈述起点时,我们到底是什么意思呢?在机器学习的情况下,起点通常是关于什么与问题相关的陈述。让我们考虑机器学习最成功的应用之一的例子:图像识别。深度学习是机器学习的一种,已经被证明在分类图像方面非常成功。不仅如此,我们实际上对深度学习为什么对图像识别如此有效有了相当好的理解。这种成功和理解的主要原因之一是我们设计了将图像域的相关对称性编码到相关算法(深度神经网络)中的方法。在这种情况下,对称本质上是一种不改变结果的变换。对于图像,这些对称性是分辨率、旋转、平移等的变化。卷积神经网络本质上是神经网络语言中这些对称性的编码。

对称是以一种整体的方式陈述我们关于相关性的知识的最经济的方式。对称告诉你什么是不相关的。除此之外,其他一切都可能是相关的。它们使我们能够以独立于数据的方式识别对于给定领域什么是相关的,什么是不相关的。他们对算法的函数形式进行约束,而不是对模型的局部行为进行陈述。为任务选择的算法类别必须足够强大,以适应域的对称性。如果训练数据具有足够高的质量和数量,那么模型行为不当的主要原因将是错误的对称性被无意中编码到算法中。

对于图像识别,我们有一个清楚的例子,当对称性被用作它们的基础时,产生的算法是成功的和可理解的。毫无疑问,形式化一个领域的相关对称性并将其编码到机器学习算法中是非常重要的。图像识别是一个“简单”的例子,因为我们对图像的对称性非常熟悉。然而,我认为对称性对于理解机器学习至关重要。只要有可能,一个算法的起点应该被表述为定义域的对称性。

逐次全局逼近法

对称性会对算法的参数空间施加一些限制。剩余的参数欠定将通过训练来消除。我们现在需要一条将对称性连接到模型的路径。这相当于在施加对称性和模型中完全定义的参数之后,找到连接算法中部分确定的参数的路径。我们将使用的方法是逐次全局逼近法。

我举个例子说明一下。假设您请求一个地图服务(如 Google maps)来查找一个城市中两个位置之间在旅行时间方面的最佳路线。为了节省时间,地图服务的算法通常会生成一条包含许多转弯的路径。如果你手边没有地图服务,如果你像大多数人一样,那么你可能会选择最少混乱的路线,即转弯次数最少的路线。本质上,您是在解决地图服务算法问题的一个受限版本。您首先要检查是否有一条完全没有转弯的路线。如果是这样的话,你会选择这条路线。如果这样的路线不存在,那么你将寻找一个转弯的路线。如果这样的路由存在并且是唯一的,那么您将选择该路由。如果有多条这样的路线,那么你会选择花费最少时间的一条。如果没有这样的路线,那么你可以尝试一条有两个转弯的路线,以此类推。

理解地图服务生成的路径的一种方法是继续上述过程,直到到达地图服务生成的路径。假设您的解决方案有两个转弯,而地图服务生成的解决方案有五个转弯。你现在可以尝试依次寻找三圈、四圈、五圈和六圈的解决方案。在每种情况下,你都可以看到增加一个转弯节省了多少时间。当从五个转到六个转时,你应该能够看到增加一个转并不能节省更多的时间,也许还会增加旅行时间。

注意,在上面的方法中,我们并没有试图孤立地理解地图服务产生的每个转弯。相反,我们着重于把整个解决方案理解为一系列近似的终点。一般来说,人类的大脑还不能很好地从整体上把握复杂功能的行为。但它相当擅长理解基于两个复变函数之间差异的“有效理论”。这就是为什么上面的方法是理解的有用工具的原因。

在研究复杂系统的许多不同学科中也使用了类似的方法。事实上,即使在机器学习中,我们在针对基线模型对模型进行基准测试时也使用类似的想法。例如,当试图确定一个分类器有多好时,人们会将其性能与随机分类器的性能进行比较。基准模型只不过是优化问题的解决方案,附加的约束条件使解决方案“更简单”。我们可以通过显式地构建连续的基准作为约束优化问题的解决方案,将这种基准测试方法转变为一种解释方法,其中在每个连续的步骤中,我们移除一些约束。换句话说,我们将优化的解决方案解释为一系列逐次逼近的最终结果。

面对复杂性,逐次逼近的次数应该是可伸缩的,这在上下文中意味着该次数应该是独立的,或者在最坏的情况下弱依赖于算法中参数的数量。确保这一点的一种方法是将导致近似的约束框定在与参数的表示相邻的表示中——广义傅立叶空间。逐次逼近可以看作是在解中逐渐包含高阶波动。

与对称性相似,构造连续的全局近似并不容易。一个人需要有非常深厚的专业知识,才能对一个复杂的系统进行全局而非局部的思考。但是复杂系统之所以被称为复杂是有原因的,如果认为我们能够理解它们,并在没有必要的专业知识的情况下以解释的形式传达这种理解,那就太天真了。

机器学习是游戏规则的改变者。它已经被证明是非常成功的,毫无疑问,它是我们目前所知的为复杂系统构建软件的最强大的方法。但是,成功之后一定会有智慧。我们理解软件的传统方法不足以理解机器学习软件,因为它们不能很好地适应复杂性。另一方面,对称性和连续的全局近似确实与复杂性成比例。我试图讨论当一起使用时,它们如何能够提供一种可扩展的方法来解释机器学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值