Python 算法资源整理

注释比较详细,算法比较全。

Minimal examples of data structures and algorithms in Python

https://github.com/keon/algorithms

代码非常全,但是注释相对较少。

All Algorithms implemented in Python
https://github.com/TheAlgorithms/Python

针对 LeetCode ,有一定的讲解,目标更清晰

LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。)
https://github.com/azl397985856/leetcode

你好,这里有一份2019年目标检测指南

译者|Arno
来源|medium

目标检测(Object detection)是一种计算机视觉技术,旨在检测汽车、建筑物和人类等目标。这些目标通常可以通过图像或视频来识别。

目标检测在视频监控、自动驾驶汽车、人体跟踪等领域得到了广泛的应用。在本文中,我们将了解目标检测的基础知识,并回顾一些最常用的算法和一些全新的方法。

目标检测的原理

目标检测定位图像中目标的存在,并在该目标周围绘制一个边界框(bounding box)。这通常包括两个过程:预测目标的类型,然后在该目标周围绘制一个框。现在让我们来回顾一些用于目标检测的常见模型架构:

  • R-CNN
  • Fast R-CNN
  • Faster R-CNN
  • Mask R-CNN
  • SSD (Single Shot MultiBox Defender)
  • YOLO (You Only Look Once)
  • Objects as Points
  • Data Augmentation Strategies for Object Detection

R-CNN 模型

该技术结合了两种主要方法:使用一个高容量的卷积神经网络将候选区域(region-proposals)自底向上的传播,用来定位和分割目标;如果有标签的训练数据比较少,可以使用训练好的参数作为辅助,进行微调(fine tuning),能够得到非常好的识别效果提升。

论文链接: https://arxiv.org/abs/1311.2524?source=post_page—————————

进行特定领域的微调,从而获得高性能的提升。由于将候选区域(region-proposals)与卷积神经网络相结合,论文的作者将该算法命名为R-CNN(Regions with CNN features)。

该模型在对每张图片提取了约2000个自底向上的候选区域。然后,它使用一个大型CNN计算每个区域的特征。然后,利用专门针对类别数据的线性支持向量机(SVMs)对每个区域进行分类。该模型在PASCAL VOC 2010上的平均精度达到53.7%。

该模型中的目标检测系统由三个模块组成。第一个负责生成类别无关的候选区域,这些区域定义了一个候选检测区域的集合。第二个模块是一个大型卷积神经网络,负责从每个区域提取固定长度的特征向量。第三个模块由一个指定类别的支持向量机组成。

该模型采用选择性搜索(selective search)方法来生成区域类别,根据颜色、纹理、形状和大小选择搜索对相似的区域进行分组。在特征提取方面,该模型使用CNN的一个Caffe实现版本对每个候选区域抽取一个4096维度的特征向量。将227×227 RGB图像通过5个卷积层和2个完全连接层进行前向传播,计算特征。论文中所解释的模型与之前在PASCAL VOC 2012的结果相比,取得了30%的相对改进。

而R-CNN的一些缺点是:

  • 训练需要多阶段: 先用ConvNet进行微调,再用SVM进行分类,最后通过regression对 bounding box进行微调。
  • 训练空间喝时间成本大: 因为像VGG16这样的深度网络占用了大量的空间。
  • 目标检测慢: 因为其需要对每个目标候选进行前向计算。

Fast R-CNN

下面的论文中提出了一种名为Fast Region-based Convolutional Network(Fast R-CNN)目标检测方法。

https://arxiv.org/abs/1504.08083?source=post_page—————————

它是用Python和c++使用Caffe实现的。该模型在PASCAL VOC 2012上的平均精度为66%,而R-CNN的平均精度为62%。

与R-CNN相比,Fast R-CNN具有更高的平均精度、单阶段训练,训练更新所有网络层并且特征缓存不需要磁盘存储。

在其架构中, Fast R-CNN接收图像以及一组目标候选作为输入。然后通过卷积层和池化层对图像进行处理,生成卷积特征映射。然后,通过针对每个推荐区域,ROI池化层从每个特征映射中提取固定大小的特征向量。

然后将特征向量提供给完全连接层。然后这些分支成两个输出层。其中一个为多个目标类生成softmax概率估计,而另一个为每个目标类生成4个实数值。这4个数字表示每个目标的边界框的位置。

Faster R-CNN

论文链接: https://arxiv.org/abs/1506.01497?source=post_page—————————

论文提出了一种针对候选区域任务进行微调和针对目标检测进行微调的训练机制。

Faster R-CNN模型由两个模块组成:负责提出区域的深度卷积网络和使用这些区域的Fast R-CNN探测器。候选区域网络(Region Proposal Network)以图像为输入,生成矩形目标候选的输出。每个矩形都有一个objectness score。

Mask R-CNN

论文链接: https://arxiv.org/abs/1703.06870?source=post_page—————————

论文提出的模型是上述Faster R-CNN架构的扩展。它还可以用于人体姿态估计。

在该模型中,使用边界框和对每个像素点进行分类的语义分割对目标进行分类和定位。该模型通过在每个感兴趣区域(ROI)添加分割掩码(segmentation mask)的预测,扩展了Faster R-CNNR-CNN。Mask R-CNN产生两个输出:类标签和边界框。

SSD: Single Shot MultiBox Detector

论文链接: https://arxiv.org/abs/1512.02325?source=post_page—————————

论文提出了一种利用单个深度神经网络对图像中目标进行预测的模型。该网络使用应用于特征映射的小卷积滤波器为每个目标类别生成分数。

这种方法使用了一个前馈卷积神经网络,针对那些方框里的目标类别实例,产生一个固定大小的边界框的集合和分数。增加了卷积特征层,允许多比例特征映射检测。在这个模型中,每个特征映射单元(feature map cell)都链接到一组默认的边界框(default box)。下图显示了SSD512在动物、车辆和家具上的性能。

You Only Look Once (YOLO)

论文提出了一种基于神经网络的图像边界框和类概率预测方法。

论文链接: https://arxiv.org/abs/1506.02640?source=post_page—————————

YOLO模型每秒实时处理45帧。YOLO将图像检测看作是一个回归问题,使得它的管道非常简单。因为这个简单的管道,它非常快。

它可以实时处理流视频,延迟小于25秒。在训练过程中,YOLO可以看到整个图像,因此能够在目标检测中包含上下文。

在YOLO中,每个边界框都由整个图像的特征来预测。每个边界框有5个预测:x, y, w, h,和置信度。(x, y)表示边界框的中心相对于网格单元格的边界。w和h是整个图像的预测宽度和高度。

该模型作为卷积神经网络实现,并在PASCAL VOC检测数据集上进行了评价。网络的卷积层负责提取特征,全连接层负责预测坐标和输出概率。

该模型的网络架构受到了用于图像分类的GoogLeNet模型的启发。该网络有24个卷积层和2个全连接层。该模型的主要挑战在于,它只能预测一个类,而且在鸟类等小目标上表现不佳。

该模型的平均精度达到52.7%,但有可能达到63.4%。

Objects as Points

论文提出将目标建模为单个点。它使用关键点估计来找到中心点,并回归到其他目标属性。

论文链接: https://arxiv.org/abs/1904.07850v2?source=post_page—————————

这些属性包括3D位置、姿态和尺寸。它使用了CenterNet,这是一种基于中心点的方法,比其他边界框探测器更快、更准确。

目标大小和姿态等属性是由图像中心位置的特征回归得到的。该模型将图像输入卷积神经网络,生成热力图。这些热力图中的峰值表示图像中目标的中心。为了估计人体姿态,该模型检测关节点(2D joint)位置,并在中心点位置对其进行回归。

在COCO上,该模型以每秒1.4帧的速度实现了45.1%的平均精度。下图显示了与其他研究论文的结果进行比较的结果。

Learning Data Augmentation Strategies for Object Detection

数据增广包括通过旋转和调整大小等操作原始图像来创建新图像数据的过程。

论文链接: https://arxiv.org/abs/1906.11172v1?source=post_page—————————

虽然这本身不是一个模型结构,但论文提出了可以应用于可以转移到其他目标检测数据集的目标检测数据集的变换的创建。转换通常在训练时应用。

该模型将增广策略定义为训练过程中随机选择的n个策略集合。该模型中应用的一些操作包括颜色变化、图像几何变化以及只变化bounding box annotations的像素内容。

在COCO数据集上的实验表明,优化数据增广策略可以使检测精度提高到+2.3以上的平均精度。这使得单个推理模型的平均精度达到50.7。

总结

现在,我们应该对在各种上下文中进行目标检测的一些最常见的技术(以及一些最新的技术)有所了解。
上面的论文/摘要也包含它们的代码实现的链接。希望能看到你在测试这些模型后得到的结果。

关于在Windows、Linux和Mac上安装设置Python的问题

译者|VK
来源|Analytics Vidhya

概述

  • 在Linux、Mac或Windows机器上安装Python时遇到的问题
  • 一步一步安装Python及流行的数据科学工具

介绍

在你的机器上安装Python是不是很困难?这实际上是我在数据科学初学者中看到的一个非常常见的问题。安装在理论上可能看起来很简单,但在现实中可能会有点问题。

我个人在尝试在我的Linux和Windows机器上安装Python时曾遇到过各种各样的问题。一般在出问题之前安装总是很顺利。出了问题之后要么是兼容性问题,要么是关于某种依赖性缺失的问题。

如果你曾经在尝试在你的机器上安装Python时遇到过这种琐碎的问题,那么本文就是为你准备的。在我出现问题之时我一般需要查找几个论坛或网站来解决我的问题,这不是一个好的过程,所以我决定把所有的东西整理一下,放在一个地方分享给你。

我提供了一个循序渐进的过程,你可以通过以下三个平台上设置Anaconda来安装Python:

  • Linux
  • macOS
  • Windows

目录

  1. 数据科学的重要工具
  2. 在Linux上安装Python的步骤
  3. 在macOS上安装Python的步骤
  4. 在Windows上安装Python的步骤

 数据科学的重要工具

数据科学家的工具箱可能会让你大吃一惊,因为工作的不同方面可能需要多个工具。然而,有些工具比其他工具更重要(或使用得更广泛)。以下是每个数据科学家(无论是新手还是有经验的),都需要的一些必备工具:

  1. Python: Python是数据科学中使用最广泛的编程语言。与其他语言相比,几乎每一个机器学习的新开发都是先在Python中进行的。它之所以被广泛采用,是因为Python中有一些非常有用的库。
  2. Pandas:在数据处理和分析方面,没有什么能比得上Pandas。Pandas是一个Python库。一般在执行任何分析或构建机器学习模型之前都需要操作数据,在操作数据时它非常有用。
  3. NumPy:和Pandas一样,NumPy也是一个非常受欢迎的Python库。NumPy引入了支持大型多维数组和矩阵的函数。它还引入了高级数学函数来处理这些数组和矩阵
  4. Matplotlib: Matplotlib是Python中最流行的数据可视化库。它允许我们生成和构建各种各样的图
  5. Scikit-Learn:就像用于数据操作的Pandas和用于可视化的Matplotlib一样,Scikit-Learn在构建实际模型是佼佼者
  6. Jupyter Notebook: Jupyter Notebook是一个非常有用的IDE,可以进行数据科学实验,它甚至可以记录你的方法,并根据你的代码实验创建演示文稿和幻灯片。

最棒的是Miniconda和Anaconda默认配置了以上所有工具!

什么是Anaconda和Miniconda?

当你学习数据科学时,Python是一个非常重要的软件。它允许我们安装几乎所有的库和工具,这些库和工具是我们在使用Python进行数据科学之旅时所需要的。它有一个非常简单的接口,让我们只用几行代码就可以完成大多数数据科学任务。

Miniconda是Anaconda的一个轻量级版本。如果你的计算机上没有足够的磁盘空间的话,Miniconda是一个很好的选择。

让我们来看看如何在我们自己的机器上同时设置Anaconda和Miniconda!

 在Linux上安装Python的步骤

Linux是数据科学界广泛喜爱的平台。它为我们执行的数据科学任务提供了极大的灵活性。但是这里有一个小警告——如果你是Linux初学者,在Linux上安装软件可能相当棘手!

以下是在Linux上安装Python和流行数据科学工具的步骤。

第一步:获取Miniconda

你可以从下面这个链接下载Miniconda:

https://docs.conda.io/en/latest/miniconda.html

你可以选择Linux版本的安装程序,建议的Python版本应该是任何大于Python 3.5的版本。

第二步:安装Miniconda

现在已经下载了Miniconda文件,下一步是在系统中安装它。为此,首先进入下载文件的目录:

cd directory_name

然后,为了启动安装脚本,使用bash命令输入Miniconda文件名:

bash miniconda_file_name

如果要求确认,请按回车键继续。

一旦你看到许可条款,请继续按enter键,直到接受这些条款为止。然后输入”yes”接受条款。然后它会要求你选择安装位置:

你可以提供一个单独的位置,或者按enter键选择默认位置。除非我的主驱动器有空间问题,否则我通常更喜欢默认选项。 在这里我给出了另一个安装位置。

在此之后,这个过程相当简单,因为你只需要说”yes”并按下Enter键即可。请记住,安装可能需要一些时间,所以当你的机器在安装所有东西时,可以去喝杯咖啡了!

完成上述步骤后,将要求你打开另一个终端以激活Miniconda,打开一个新的终端,我们开始处理接下来的步骤

第三步:创建新环境

环境基本上就是你的”工作区”。你想怎么设置就怎么设置。这非常酷!

你可以选择环境中Python库的版本,这可以帮助你更好地控制数据科学工作。

现在,Miniconda环境的好处是它允许你创建多个这样的环境。你可以管理多个独立的环境,每个环境用于一个单独的任务!

让我用一个例子来解释一下。假设我们正在使用一个最先进的框架(比如用于自然语言处理的PyTorch-Transformers),并且我们需要依赖库的所有最新版本。接下来就是环境派上用场的地方。

例如我们有一个旧的遗留项目,并且我们被迫使用项目所需的某些版本的库。我们可以让这个最新版本的安装与这些老版本的库共存

你可以使用以下命令创建一个环境:

conda create -n av python=3 anaconda

“av”是环境的名称(这个名称你可以任意给出)。python=3是我们想要使用的python版本。

若要检查环境是否已成功创建,请键入以下命令:

conda env list

这将给我们一个当前安装在系统中的环境列表。

第四步:激活新环境

现在,要开始使用你创建的新环境,输入以下命令:

source activate av

为了确保在活动环境中工作正常,我们可以使用以下命令查看在该环境中安装的库的列表:

conda list

上面的命令应该会给你这样的输出:

一旦你完成了一个环境的工作,你想要停用它,你可以使用:

source deactivate av

因此,现在所有的设置已经完成,接下来检查是否如预期的那样工作。让我们进入下一步。

第五步:启动Jupyter Notebook

打开Jupyter Notebook 命令如下:

jupyter notebook

这将启动浏览器中的Jupyter Notebook:

接下来,你只需点击”新建”,并选择”python3″,就可以开始使用python3的Notebook了:

很简单,不是吗?

恭喜你!现在,你已经成功地在系统上安装了Anaconda。由于Anaconda默认配置了Python和所有数据科学库(比如Pandas、Numpy、Scikit-Learn等)一起提供,所以现在你的系统中也包含了所有这些库!

如果你仍然有疑问或在任何步骤卡住,这里是整个安装过程的视频^1:

在macOS上安装Python的步骤

macOS的安装步骤非常类似于Linux的安装步骤。它们都具有相同的bash终端。唯一的区别是需要下载的Miniconda安装文件。

你可以从这个连结下载Miniconda for macOS:

https://docs.conda.io/en/latest/miniconda.html

这一次,你必须选择macOS “bash installer”,建议的Python版本应该是任何大于Python 3.5的版本。

下载了上面的文件之后,只需按照Linux安装步骤中的步骤2到5进行操作,就可以开始了。

观看视频^2,获得在macOS上安装Python的完整运行过程:

在Windows上安装Python的步骤

让我们看看在Windows上安装Python和其他数据科学库的步骤。

第一步:获取Anaconda

你可以从这个链接下载Anaconda:

https://www.anaconda.com/distribution/

你可以选择安装程序的Windows版本,建议的Python版本应该是Python 3.5以上的任何版本。

现在你将看到两个选择分别是32位64位安装程序。选择一个与你的系统兼容的(如果你不确定的话,右键点击”我的电脑”来查看)。

 第二步:安装Anaconda

下载安装文件后,转到”Downloads”文件夹,双击文件。将打开一个新的安装窗口:

然后单击”Next”,这将带你进入许可协议。点击”I Agree”接受:

然后,它会询问你是否只想为该用户安装此软件,还是只想为系统的所有用户安装此软件。这完全是你的选择。我通常会选择”recommended(推荐)”选项:

现在你可以选择安装软件的位置:

现在,在下一个窗口中,你将得到几个”高级选项”。你现在可以取消这两个选项,然后单击Install。这一步可能需要一些时间:

安装完成后,点击”下一步”:

你可以跳过安装微软的VSCode:

单击finish。

完成了,这时Python已经为你开始分析数据和构建机器学习模型做好了准备。

第三步:启动Jupyter Notebook

为了确保一切安装正确,我们将打开Jupyter Notebook。要做到这一点,首先去开始菜单和搜索”Jupyter Notebook”:

点击”Jupyter Notebook”选项,将会在浏览器中打开Jupyter Notebook:

现在你只需点击”new”,然后选择”python3″,就可以开始使用python3 Notebook了:

如果你更喜欢通过可视化的格式来学习,这里的一段视频^3详细介绍了如何在Windows上安装Python。

最后指出

这就是在所有流行平台上安装Python的全部内容。我在这里的目的是让你熟悉安装过程,消除你可能存在的疑问。

2019年最好的7个人工智能聊天机器人

2019年最好的7个人工智能聊天机器人

作者:panchuang.net
来源:hubspot

无论是Facebook Messenger,他们的网站,还是聊天软件,越来越多的品牌正在利用聊天机器人为客户提供服务,营销他们的品牌,甚至销售他们的产品。

但即使大多数聊天机器人都可以处理中等复杂的对话,例如欢迎对话和产品发现交互,但是为其会话功能提供支持的if / then逻辑可能会受到限制。例如,如果客户询问您在设计聊天机器人逻辑时没有考虑到的一个独特而紧迫的问题,那么它无法回答他们的问题,这会让您的客户陷入困境并最终使他们对您的客户服务不满意。

解锁技巧,系统和推荐资源,以保持领先于技术曲线。
幸运的是,可以解决这个问题的聊天机器人技术的下一个进步正在获得能量 - 人工智能的聊天机器人。通过利用机器学习和自然语言处理,基于AI的聊天机器人可以了解客户请求背后的意图,在与客户交互时记录每个客户的整个会话历史记录,并以自然,人性的方式回答他们的问题。

如果您当前正在使用标准聊天机器人,但想要升级到AI驱动的聊天机器人,那么我们已经为2019年制作了最佳人工智能聊天机器人列表。请继续阅读,找到合适的人选。

最好的AI聊天机器人

* Watson Assistant
* Bold360
* Rulai
* LivePerson
* Inbenta
* Ada
* Vergic

1.沃森助理(Watson Assistant)


图片来源:IBM

由AI领域的领导者之一IBM开发的Watson Assistant是市场上最先进的人工智能聊天机器人之一。通过预先培训您的特定行业内容,Watson Assistant可以了解您的历史聊天或通话记录,在您的知识库中搜索答案,要求客户更清晰,将其引导至人工代表,甚至为您提供培训建议以提升它的会话能力。

Watson Assistant可以在您的网站,消息传递渠道,客户服务工具和移动应用程序上运行。聊天机器人还附带了一个可视化对话框编辑器,因此您无需任何编码经验即可开发它。

2. Bold360


图片来源:Bold360

受到Intuit,Edible Arrangements和Vodafone等客户的信赖,Bold360获得了自己的自然语言处理技术专利,帮助品牌建立聊天机器人,无需关键字匹配即可了解客户的意图,并学习如何为他们提供最准确的答案。

Bold360的会话AI可以解释复杂的语言,记住整个会话的背景,并自然的回答客户。客户甚至可以通过聊天机器人购买您的产品。您还可以为聊天机器人提供自己的个性,并在大多数消息传递渠道上运行它。

3. Rulai


图片来源:Rulai

基于深度学习的自然语言理解和自适应多任务功能,Ruali是一款面向企业品牌的人工智能聊天机器人,可以理解对话的背景,预测用户行为,掌握客户偏好,采取行动,切换到不同的任务,并要求客户进一步说明。

Rulai还集成了大多数消息传递渠道,客户服务软件,企业业务软件和云存储平台。您可以使用其拖放式设计控制台从头开始构建Ruali聊天机器人,让其AI适应您的客户,或者您可以部署预先训练的聊天机器人,该聊天机器人已经从您的特定行业提供数据。

4. LivePerson


图片来源:LivePerson

通过收集超过20年的消息传输数据并将其提供给人工智能聊天机器人,LivePerson可以自动化几乎所有行业的消息传递,并与大多数消息传递渠道集成,如您的网站,移动应用程序,Apple Business Chat,短信,Google Rich Business消息,Line,Facebook Messenger,WhatsApp和Google AdLingo。

LivePerson的BotStudio还允许您从头开始构建聊天机器人,没有任何编码知识,其分析仪表板可以跟踪实时情绪,机器人遏制率,机器人对话时间,总对话时间,平均订单价值和机器人包含销售等指标,允许你要掌握你的聊天机器人对你的业务底线的影响。

5. Inbenta


图片来源:Inbenta

Inbenta的聊天机器人专为企业品牌设计,利用机器学习和自己的自然语言处理引擎来检测每个客户对话的背景并准确回答他们的问题。 Inbenta还提供了一个对话管理器,允许您创建自定义对话流和路径。

此外,当Inbenta的聊天机器人意识到您的一个客户需要与人交谈时,它会将对话升级到相应的人工客服。为了使您的聊天机器人看起来更加人性化,您也可以为它创建一个自定义头像。

6. Ada


图片来源:阿达

受到Medium,Shopify和MailChimp等客户的信赖,Ada是一款基于人工智能的聊天机器人,具有拖放式构建器,可用于训练,向某些消息添加GIF以及存储客户数据。

Ada还可以与大多数消息传递渠道和客户服务软件集成,向您的客户发送个性化内容,询问客户反馈,并报告您的机器人的时间,精力和成本节省。根据他们的网站,Ada为客户节省了超过1亿美元的节省和10亿分钟的客户服务费用。

7. Vergic


图片来源:Vergic

Vergic提供了一个人工智能的聊天机器人,可以作为您企业的第一线客户支持,处理交易聊天,并将更复杂的问题转移给您的实际客户服务代理。它就像一个混合聊天机器人,可以提高员工的工作效率。

通过利用自然语言处理和自然语言理解,Vergic还可以执行情绪分析,共享文档,突出显示页面,管理会话工作流程以及报告聊天机器人分析。

以上都是英文的聊天机器人,下面推荐一个中文人工智能聊天机器人。

8.BotMind 

图片来源:磐创AI

BotMind 是人工智能时代的人机交互方式,基于人工智能 + 自然语言处理 + 大数据 创造出全新的人机交互体验。

应用场景:智能机器人,智能机器人的核心之一是让其拥有与人类沟通交流的能力,BotMind 就是机器人的大脑。基于 BotMind 可以打造出聊天机器人、早教机器人、陪护机器人等。智能家居,通过BotMind将家居生活相关的设施进行统一管理,作为人和家居设施沟通的媒介,打造全新的生活体验。智能设备,基于BotMind的智能音箱,在获得全新交互体验的同时为用户增添了更多的乐趣。除了智能音箱,BotMind可以接入任何可以有人机交互的设备。虚拟人物,虚拟人物可以作为虚拟的品牌形象,虚拟化的游戏人物等。BotMind能够赋予这些虚拟人物部分真人的属性,让虚拟人物更加真实。私人助理,基于BotMInd打造的私人助理,能够辅助日程管理、事件提醒、购票、订餐以及娱乐等。

英文原文:https://blog.hubspot.com/marketing/best-ai-chatbot
中文原文:http://panchuang.net/2019/08/26/7-of-the-best-ai-chatbots-for-2019/

聊天机器人,智能客服尽在磐创AI:http://panchuangai.com

十个python图像处理工具

by – 小韩

原文:https://towardsdatascience.com/image-manipulation-tools-for-python-6eb0908ed61f

1_qYrPvxRwUeZAc7UmjH158Q

介绍

如今的世界存在了大量的数据,图像数据是重要的组成部分。如果要利用这些图片,需要对图像进行处理,提高图片质量或提取图片内容信息。

图像处理的常见操作包括图像显示,基本操作如裁剪,翻转,旋转等,图像分割,分类和特征提取,图像恢复和图像识别。Python是图像处理的合适选择,因为它作为一种科学编程语言日益普及,并且提供了许多免费实用的图像处理工具。

下面将介绍10个用于图像处理的python库,它们在处理图像等方面都提供了简单方便的方法。

1. scikit Image

scikit-image(https://scikit-image.org/)是一个与numpy一起使用的开源Python工具。它实现了用于研究,教育和行业应用的算法和实用程序。即使是刚接触Python的人也可以轻松使用。它的代码由活跃的志愿者编写,由高质量的同行进行评审。

资源

有完善的文档和丰富的示例(http://scikit-image.org/docs/stable/user_guide.html)。

示例

导入skimage,大多数函数都在它的子模块中。下面是一些 skimage 的例子:

  • 图像过滤
import matplotlib.pyplot as plt 
%matplotlib inline

from skimage import data,filters

image = data.coins()
# ... 或者其他的 Numpy 数组
edges = filters.sobel(image)
plt.imshow(edges, cmap='gray')
1_rD3679A5Sp9HX2JeeOSGyg
1_KUHwXfcZi23wZos26Ta9uw

gallery中有更多例子。

2. Numpy

Numpy是Python的核心库之一,它为数组提供了支持。一个图像本质上是包含像素数据的标准Numpy数组。因此,通过使用基本的Numpy操作,例如切片,掩膜(mask)和花式索引(fancy indexi)等直接修改图像的像素值。可以使用skimage加载图像并用matplotlib显示。

资源

Numpy的官方文档提供了完整的文档和资源列表(http://www.numpy.org/)。

示例

使用Numpy对图像进行掩膜操作。

import numpy as np
from skimage import data
import matplotlib.pyplot as plt 
%matplotlib inline

image = data.camera()
type(image)

numpy.ndarray #图像是一个numpy数组

mask = image < 87
image[mask]=255
plt.imshow(image, cmap='gray')

3. Scipy

scipy是一个类似Numpy的核心科学计算模块,可用于基本的图像处理任务。特别是子模块scipy.ndimage提供了操作n维Numpy数组的函数。该软件包目前包括线性、非线性滤波,二值形态(binary morphology),B样条插值(B-spline interpolatio)和对象测量(object measurements)等功能。

资源

scipy.ndimage的完整函数列表:https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution

示例

SciPy高斯过滤:

from scipy import misc,ndimage

face = misc.face()
blurred_face = ndimage.gaussian_filter(face, sigma=3)
very_blurred = ndimage.gaussian_filter(face, sigma=5)

#Results
plt.imshow(<image to be displayed>)

4. PIL / Pillow

PIL(Python Imaging Library)是一个免费的Python函数库,它增加了打开、操作和保存多种不同图像格式的支持。然而,它已经停止了开发,最后一次发布是2009年。幸运的是,PIL有一个活跃的分支Pillow,它更易于安装,支持所有主要的操作系统并支持Python 3。该库包含了基本的图像处理功能,包括像素操作,使用内置卷积内核进行过滤以及颜色空间转换。

资源

文档包含了安装指引以及每个模块的示例。

示例

使用Pillow中的ImageFilter增强图像:

from PIL import Image, ImageFilter
#读入图像
im = Image.open( 'image.jpg' )
#显示图像
im.show()

from PIL import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.8).show("30% more contrast")

5. OpenCV-Python

OpenCV(Open Source Computer Vision Library)是视觉应用中使用最广的库之一。OpenCV-Python是OpenCV的python API。OpenCV-Python不仅速度快,因为后台使用C/C++编写,而且易于编码和部署(由于前端的Python包装器)。这使其成为执行计算密集型视觉程序的绝佳选择。

资源

OpenCV2-Python-Guide使你更容易上手OpenCV-Python。

示例

下面的示例是使用OpenCV-Python的金字塔融合创建名为’Orapple’的新水果的功能。

6. SimpleCV

SimpleCV也是一个构建视觉应用的开源框架。有了它,您可以使用如OpenCV等几个高性能的计算机视觉库,不需要了解位深度,文件格式,色彩空间等概念。学习难度远远小于OpenCV,并且正如他们的标语所说,“它使计算机视觉变得简单”。 SimpleCV的其他优点还有:

  • 初学者也可以编写简单的机器视觉测试
  • 摄像机,视频文件,图像和视频流可以相互操作

资源

官方文档简单易懂,还有大量的案例参考。

示例

7. Mahotas

Mahotas是另一个Python计算机视觉和图像处理库。它包含了传统的图像处理功能,如过滤和形态学操作,以及用于特征计算的计算机视觉功能,包括兴趣点检测和局部描述符。该接口使用Python,可以快速开发,算法使用C++实现,并且针对速度进行了优化。Mahotas库具有尽量少的代码甚至最小的依赖。阅读他们的{官方文章](https://openresearchsoftware.metajnl.com/articles/10.5334/jors.ac/)获取更多信息。

资源

文档包含了安装说明,示例和教程,帮助你轻松地使用mahotas。

示例

Mahotas尽量使用简单的代码实现功能。例如“Finding Wally”问题,Mahotas使用最少的代码实现了较好的结果。这里是它的源代码

8. SimpleITK

ITK(Insight Segmentation and Registration Toolkit)是一个开源的跨平台系统,为开发人员提供了一整套用于图像分析的软件工具。其中,SimpleITK是一个基于ITK的简化层,旨在促进快速原型设计,教育,解释语言中的使用。SimpleITK是一个图像分析工具包,具有大量的组件,支持过滤操作,图像分割和配准。SimpleITK使用C++编写,也可以用于包括Python在内的大量编程语言。

资源

有许多Jupyter Notebooks展示了SimpleITK在教育和研究中的使用。使用SimpleITK进行Python和R编程语言的交互式图像分析。

示例

下面是使用SimpleITK和Python实现的CT/MR配准过程的可视化。源代码

0_DEltm5w6x6UMqM9E

9. pgmagick

pgmagick是使用Python包装的GraphicsMagick库。GraphicsMagick有时被称为图像处理中的瑞士军刀。它提供了强大高效的工具和库集合,支持超过88种主要图像格式的读取,写入和操作,包括DPX,GIF,JPEG,JPEG-2000,PNG,PDF,PNM和TIFF等重要格式。

资源

Github仓库,有安装和要求说明,详细的用户指南

示例

一些使用 pgmagick 的图像操作:

图像缩放:

边缘提取:

10. Pycairo

Pycairo是cairo图形库的一组python绑定。Cairo是一个绘制矢量图形的2D图形库。矢量图形在调整大小或变换时不会丢失清晰度。Pycairo可使用Python调用cairo命令。

资源

Pycairo GitHub仓库有安装和使用的详细说明。以及Pycairo的简要教程

示例

使用Pycairo绘制线段,基本形状和径向渐变(radial gradients)。

总结

以上是Python中一些好用且免费的图像处理库。他们都值得尝试使用并了解更多它们的信息。

数据科学中必须知道的5个关于奇异值分解(SVD)的应用

数据科学中必须知道的5个关于奇异值分解(SVD)的应用

译者|Arno
来源|Analytics Vidhya

 概览

  • 奇异值分解(SVD)是数据科学中常见的降维技术
  • 我们将在这里讨论5个必须知道的SVD应用,并了解它们在数据科学中的作用
  • 我们还将看到在Python中实现SVD的三种不同方法

介绍

> “Another day has passed, and I still haven’t used y = mx + b.”

这听起来是不是很熟悉?我经常听到我大学的熟人抱怨他们花了很多时间的代数方程在现实世界中基本没用。

好吧,但我可以向你保证,并不是这样的。特别是如果你想开启数据科学的职业生涯。

线性代数弥合了理论与概念实际实施之间的差距。对线性代数的掌握理解打开了我们认为无法理解的机器学习算法的大门。线性代数的一种这样的用途是奇异值分解(SVD)用于降维。

你在数据科学中一定很多次遇到SVD。它无处不在,特别是当我们处理降维时。但它是什么?它是如何工作的?SVD应用有什么?

事实上,SVD是推荐系统的基础,而推荐系统是谷歌,YouTube,亚马逊,Facebook等大公司的核心。

我们将在本文中介绍SVD的五个超级有用的应用,并将探讨如何在Python中以三种不同的方式使用SVD。

奇异值分解(SVD)的应用

我们将在此处遵循自上而下的方法并首先讨论SVD应用。如果你对它如何工作感兴趣的,我在下面会讲解SVD背后的数学原理。现在你只需要知道四点来理解这些应用:

  • SVD是将矩阵A分解为3个矩阵–U,S和V。
  • S是奇异值的对角矩阵。将奇异值视为矩阵中不同特征的重要性值
  • 矩阵的秩是对存储在矩阵中的独特信息的度量。秩越高,信息越多
  • 矩阵的特征向量是数据的最大扩展或方差的方向

在大多数应用中,我们希望将高秩矩阵缩减为低秩矩阵,同时保留重要信息。

SVD用于图像压缩

我们有多少次遇到过这个问题?我们喜欢用我们的智能手机浏览图像,并随机将照片保存。然后突然有一天 ,提示手机没有空间了!而图像压缩有助于解决这一问题。

它将图像的大小(以字节为单位)最小化到可接受的质量水平。这意味着你可以在相同磁盘空间中存储更多图像。

图片压缩利用了在SVD之后仅获得的一些奇异值很大的原理。你可以根据前几个奇异值修剪三个矩阵,并获得原始图像的压缩近似值,人眼无法区分一些压缩图像。以下是在Python中编写的代码:

# 下载图片 "https://cdn.pixabay.com/photo/2017/03/27/16/50/beach-2179624_960_720.jpg"
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cv2

# 灰度化读取图片
img = cv2.imread('beach-2179624_960_720.jpg', 0)

# 得到svd
U, S, V = np.linalg.svd(img)

# 得到矩阵的形状
print(U.shape, S.shape, V.shape)

# 以不同component数绘制图像
comps = [638, 500, 400, 300, 200, 100]

plt.figure(figsize = (16, 8))
for i in range(6):
low_rank = U[:, :comps[i]] @ np.diag(S[:comps[i]]) @ V[:comps[i], :]
if(i  == 0):
plt.subplot(2, 3, i+1), plt.imshow(low_rank, cmap = 'gray'), plt.axis('off'), plt.title("Original Image with n_components =" + str(comps[i]))
else:
plt.subplot(2, 3, i+1), plt.imshow(low_rank, cmap = 'gray'), plt.axis('off'), plt.title("n_components =" + str(comps[i]))
Output:

如果你说即使是最后一张图像,看起来好像也不错!是的,如果没有前面的图像对比,我也不会猜到这是经过压缩的图像。

SVD用于图像恢复

我们将通过矩阵填充的概念(以及一个很酷的Netflix示例)来理解图像恢复。

矩阵填充是在部分观察的矩阵中填充缺失元素的过程。Netflix问题就是一个常见的例子。

> 给定一个评级矩阵,其中每个元素(i,j)表示客户i对电影j的评级,即客户i观看了电影j,否则该值为缺失值,我们想要预测剩余的元素以便对客户于提出好的建议。

有助于解决这个问题的基本事实是,大多数用户在他们观看的电影和他们给这些电影的评级中都有一个模式。因此,评级矩阵几乎没有独特的信息。这意味着低秩矩阵能够为矩阵提供足够好的近似。

这就是我们在SVD的帮助下所能够实现的。

你还在哪里看到这样的属性?是的,在图像矩阵中!由于图像是连续的,大多数像素的值取决于它们周围的像素。因此,低秩矩阵可以是这些图像的良好近似。

下面是结果的一张截图:

Chen, Zihan. “Singular Value Decomposition and its Applications in Image Processing.”  ACM, 2018

问题的整个表述可能很复杂并且需要了解其他一些概念。你可以参阅下面的论文^1

SVD用于特征脸

论文“Eigenfaces for Recognition”于1991年发表。在此之前,大多数面部识别方法都涉及识别个体特征,如眼睛或鼻子,并根据这些特征之间的位置,大小和关系来开发模型。

> 特征脸方法试图在面部图像中提取相关信息,尽可能有效地对其进行编码,并将一个面部编码与数据库中的模型编码进行比较。

通过将每个面部表达为新面部空间中所选择的特征脸的线性组合来获得编码。

让我把这个方法分解为五个步骤:

  • 收集面部训练集
  • 通过找到最大方差的方向-特征向量或特征脸来找到最重要的特征
  • 选择对应于最高特征值的M个特征脸。这些特征脸现在定义了一个新的面部空间
  • 将所有数据投影到此面部空间中
  • 对于新面部,将其投影到新面部空间中,找到空间中最近的面部,并将面部分类为已知或未知面部

你可以使用PCA和SVD找到这些特征脸。这是我在Labeled Faces in the Wild数据集中上执行SVD后获得的几个特征脸中的第一个:

我们可以看到,只有前几行中的图像看起来像实际的面部。其他看起来很糟糕,因此我放弃了它们。我保留了总共120个特征脸,并将数据转换为新的面部空间。然后我使用k近邻分类器来预测基于面部的姓名。

你可以在下面看到分类报告。显然,还有改进的余地。你可以尝试调整特征脸的数量或使用不同的分类器进行试验:

看看一些预测值及其真实标签:

 SVD用于谱聚类

聚类是将类似对象划分在一起的任务。这是一种无监督的机器学习技术。对于我们大多数人来说,聚类是K-Means聚类(一种简单但功能强大的算法)的代名词,但是,这并不是准确的说法。

考虑以下情况:

显然,同心圆中有2个簇。但是,n_clusters = 2的KMeans给出了以下簇:

K-Means绝对不是这里使用的合适算法。谱聚类是一种可以解决这个问题的技术,它源于图论。以下是基本步骤:

  • 从数据Affnity matrix(A)或Adjacent matrix开始。这表示一个对象与另一个对象的相似程度。在图中,这将表示点之间是否存在边缘
  • 找到每个对象的 Degree matrix (D) 。这是一个对角矩阵,其元素(i,i)等于对象i相似的对象数
  • 找到Affnity matrix的 Laplacian matrix(L) (L):L = A – D
  • 根据它们的特征值找到Laplacian matrix的最高k个特征向量
  • 在这些特征向量上运行k-means,将对象聚类为k类

你可以通过下面的链接阅读完整的算法及其数学原理^2,而scikit-learn中谱聚类的实现类似于KMeans:

from sklearn.datasets import make_circles
from sklearn.neighbors import kneighbors_graph
from sklearn.cluster import SpectralClustering
import numpy as np
import matplotlib.pyplot as plt

# s生成数据
X, labels = make_circles(n_samples=500, noise=0.1, factor=.2)

# 可视化数据
plt.scatter(X[:, 0], X[:, 1])
plt.show()

# 训练和预测
s_cluster = SpectralClustering(n_clusters = 2, eigen_solver='arpack',
affinity="nearest_neighbors").fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c = s_cluster)
plt.show()

你将从上面的代码中得到以下不错的聚类结果:

SVD用于从视频中删除背景

想一想如何区分视频背景和前景。视频的背景基本上是静态的 – 它看不到很多变化。所有的变化都在前景中看到。这是我们用来将背景与前景分开的属性。

以下是我们可以采用的步骤来实现此方法:

  • 从视频创建矩阵M — 这是通过定期从视频中采样图像快照,将这些图像矩阵展平为数组,并将它们存储为矩阵M的列。
  • 我们得到以下矩阵M的图:

你认为这些水平和波浪线代表什么?花一点时间考虑一下。

水平线表示在整个视频中不改变的像素值。基本上,这些代表了视频中的背景。波浪线显示变化并代表前景。

  • 因此,我们可以将M视为两个矩阵的总和 – 一个表示背景,另一个表示前景
  • 背景矩阵没有看到像素的变化,因此是多余的,即它没有很多独特的信息。所以,它是一个低秩矩阵
  • 因此,M的低秩近似是背景矩阵。我们在此步骤中使用SVD
  • 我们可以通过简单地从矩阵M中减去背景矩阵来获得前景矩阵

这是视频一个删除背景后的帧:

到目前为止,我们已经讨论了SVD的五个非常有用的应用。但是,SVD背后的数学实际上是如何运作的?作为数据科学家,它对我们有多大用处?让我们在下一节中理解这些要点。

SVD是什么?

我在本文中大量使用了“秩”这个术语。事实上,通过关于SVD及其应用的所有文献,你将非常频繁地遇到术语“矩阵的秩”。那么让我们从了解这是什么开始。

矩阵的秩

矩阵的秩是矩阵中线性无关的行(或列)向量的最大数量。如果向量r不能表示为r1和r2的线性组合,则称向量r与向量r1和r2线性无关。

考虑下面的三个矩阵:

  • 在矩阵A中,行向量r2是r1的倍数,r2 = 2 r1,因此它只有一个无关的行向量。Rank(A)= 1
  • 在矩阵B中,行向量r3是r1和r2之和,r3 = r1 + r2,但r1和r2是无关的,Rank(B)= 2
  • 在矩阵C中,所有3行彼此无关。Rank(C)= 3

> 矩阵的秩可以被认为是由矩阵表示的独特信息量多少的代表。秩越高,信息越高。

SVD

SVD将矩阵分解为3个矩阵的乘积,如下所示:

如果A是m x n矩阵:

  • U是左奇异向量的m×m矩阵
  • S是以递减顺序排列的奇异值的m×n对角矩阵
  • V是右奇异向量的n×n矩阵

为什么SVD用于降维?

你可能想知道我们为什么要经历这种看似辛苦的分解。可以通过分解的替代表示来理解原因。见下图:

分解允许我们将原始矩阵表示为低秩矩阵的线性组合。

在实际应用中,你将观察到的只有前几个(比如k)奇异值很大。其余的奇异值接近于零。因此,可以忽略除前几个之外而不会丢失大量信息。请参见下图中的矩阵截断方式:

总结以下3点:

  • 使用SVD,我们能够用3个较小的矩阵U,S和V表示我们的大矩阵A
  • 这在大型计算中很有用
  • 我们可以得到A的k-秩近似。为此,选择前k个奇异值并相应地截断3个矩阵。

3种在Python中使用SVD的方法

我们知道什么是SVD,它是如何工作的,以及它在现实世界中的用途。但是我们如何自己实现SVD呢?

SVD的概念听起来很复杂。你可能想知道如何找到3个矩阵U,S和V。如果我们手动计算这些矩阵,这是一个漫长的过程。

幸运的是,我们不需要手动执行这些计算。我们可以用三种简单的方式在Python中实现SVD。

numpy中的SVD

NumPy是Python中科学计算的基础包。它具有有用的线性代数功能以及其他应用。

你可以使用numpy.linalg中的SVD获取完整的矩阵U,S和V。注意,S是对角矩阵,这意味着它的大多数元素都是0。这称为稀疏矩阵。为了节省空间,S作为奇异值的一维数组而不是完整的二维矩阵返回。

import numpy as np
from numpy.linalg import svd
# 定义二维矩阵
A = np.array([[4, 0], [3, -5]])
U, S, VT = svd(A)
print("Left Singular Vectors:")
print(U)
print("Singular Values:")
print(np.diag(S))
print("Right Singular Vectors:")
print(VT)
# 检查分解是否正确
# @ 表示矩阵乘法
print(U @ np.diag(S) @ VT)

scikit-learn中的Truncated SVD

在大多数常见的应用中,我们不希望找到完整的矩阵U,S和V。我们在降维和潜在语义分析中看到了这一点,还记得吗?

我们最终会修剪矩阵,所以为什么要首先找到完整的矩阵?

在这种情况下,最好使用sklearn.decomposition中的TruncatedSVD。你可以通过n_components参数指定所需的特征数量输出。n_components应严格小于输入矩阵中的特征数:

import numpy as np
from sklearn.decomposition import TruncatedSVD
A = np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])
print("Original Matrix:")
print(A)
svd =  TruncatedSVD(n_components = 2)
A_transf = svd.fit_transform(A)
print("Singular values:")
print(svd.singular_values_)
print("Transformed Matrix after reducing to 2 features:")
print(A_transf)

scikit-learn中的Randomized SVD

Randomized SVD提供与Truncated SVD相同的结果,并且具有更快的计算时间。Truncated SVD使用ARPACK精确求解,但随机SVD使用了近似技术。

import numpy as np
from sklearn.utils.extmath import randomized_svd

A = np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])
u, s, vt = randomized_svd(A, n_components = 2)

print("Left Singular Vectors:")
print(u)

print("Singular Values:")
print(np.diag(s))

print("Right Singular Vectors:")
print(vt)

Python机器学习算法的7个损失函数的详细指南

译者|VK

来源|Analytics Vidhya

概述

  • 学习什么是损失函数以及它们如何在机器学习算法中工作
  • 损失函数实际上是我们经常使用的技术的核心
  • 本文介绍了多种损失函数与它们的工作原理以及如何使用Python对它们进行编程

介绍

想象一下-你已经在给定的数据集上训练了机器学习模型,并准备好将它交付给客户。但是,你如何确定该模型能够提供最佳结果?是否有指标或技术可以帮助你快速评估数据集上的模型?

当然是有的,简而言之,机器学习中损失函数可以解决以上问题。

损失函数是我们喜欢使用的机器学习算法的核心。但大多数初学者和爱好者不清楚如何以及在何处使用它们。

它们并不难理解,反而可以增强你对机器学习算法的理解。那么,什么是损失函数,你如何理解它们的意义?

在本文中,我将讨论机器学习中使用的7种常见损失函数,并解释每种函数的使用方法。

目录

  • 什么是损失函数?
  • 回归损失函数
  • 平方误差损失
  • 绝对误差损失
  • Huber损失
  • 二分类损失函数
  • 二分类交叉熵
  • Hinge损失
  • 多分类损失函数
  • 多分类交叉熵损失
  • KL散度(Kullback Leibler Divergence Loss)

什么是损失函数?

假设你在山顶,需要下山。你如何决定走哪个方向?

我要做的事情如下:

  • 环顾四周,看看所有可能的路径
  • 拒绝那些上升的路径。这是因为这些路径实际上会消耗更多的体力并使下山任务变得更加艰难
  • 最后,走我认为的坡度最大的路径

关于我判断我的决策是否好坏的直觉,这正是损失函数能够提供的功能。

损失函数将决策映射到其相关成本

决定走上坡的路径将耗费我们的体力和时间。决定走下坡的路径将使我们受益。因此,下坡的成本是更小的。

在有监督的机器学习算法中,我们希望在学习过程中最小化每个训练样例的误差。这是使用梯度下降等一些优化策略完成的。而这个误差来自损失函数。

损失函数(Loss Function)和成本函数(Cost Function)之间有什么区别?

在此强调这一点,尽管成本函数损失函数是同义词并且可以互换使用,但它们是不同的。

损失函数用于单个训练样本。它有时也称为误差函数(error function)。另一方面,成本函数是整个训练数据集的平均损失(average function)。优化策略旨在最小化成本函数。

回归损失函数

此时你必须非常熟悉线性回归。它涉及对因变量Y和几个独立变量$X_i$之间的线性关系进行建模。因此,我们在空间中对这些数据拟合出一条直线或者超平面。

Y = a0 + a1 * X1 + a2 * X2 + ....+ an * Xn

我们将使用给定的数据点来找到系数a0,a1,…,an。

我们将使用著名的波士顿住房数据集^1来理解这个概念。为了简单起见,我们将只使用一个特征-每个住宅的平均房间数(Average number of rooms per dwelling)(X)来预测因变量-1000美元价位的房屋的中位数价值(Median Value)(Y)。

我们将使用梯度下降(Gradient Descent)作为优化策略来查找回归线。我不会详细介绍Gradient Descent的细节,但这里提醒一下权重更新规则:

这里,$\theta_j$是要更新的权重,$\alpha$是学习率,$J$是成本函数。成本函数由$\theta$参数化。我们的目标是找到产生最小总成本的θ值。

我已经为下面的每个损失函数定义了我们将遵循的步骤:

  1. 写出预测函数f(X)的表达式,并确定我们需要找到的参数
  2. 确定每个训练样本计算得到的损失
  3. 找到成本函数(所有样本的平均损失)的表达式
  4. 找到与每个未知参数相关的成本函数的梯度
  5. 确定学习率并在固定次数中进行迭代执行权重更新规则

1.平方误差损失

每个训练样本的平方误差损失(也称为L2 Loss)是实际值和预测值之差的平方:

相应的成本函数是这些平方误差的平均值(MSE)。

在波士顿住房数据上,在不同的学习率中分别迭代了500次得到下图:

让我们再谈谈MSE损失函数,它是一个二次函数(形式为ax^2+bx+c),并且值大于等于0。二次函数的图形如下图所示:

二次函数仅具有全局最小值。由于没有局部最小值,所以我们永远不会陷入它。因此,可以保证梯度下降将收敛到全局最小值(如果它完全收敛)。

MSE损失函数通过平方误差来惩罚模型犯的大错误。把一个比较大的数平方会使它变得更大。但有一点需要注意,这个属性使MSE成本函数对异常值的健壮性降低。因此,如果我们的数据容易出现许多的异常值,则不应使用这个它。

2.绝对误差损失

每个训练样本的绝对误差是预测值和实际值之间的距离,与符号无关。绝对误差也称为L1 Loss

正如我之前提到的,成本是这些绝对误差的平均值(MAE)。

与MSE相比,MAE成本对异常值更加健壮。但是,在数学方程中处理绝对或模数运算符并不容易。我们可以认为这是MAE的缺点。

在不同学习速率中分别迭代500次后,我们得到以下图:

3.Huber损失

Huber损失结合了MSE和MAE的最佳特性。对于较小的误差,它是二次的,否则是线性的(对于其梯度也是如此)。Huber损失需要确定$\delta$参数:

我们以0.0001的学习速率分别对$\delta$参数的不同值进行500次权重更新迭代得到下图:

Huber损失对于异常值比MSE更强。它用于稳健回归(robust regression),M估计法(M-estimator)和可加模型(additive model)。Huber损失的变体也可以用于分类。

二分类损失函数

意义如其名。二分类是指将物品分配到两个类中的一个。该分类基于应用于输入特征向量的规则。二分类的例子例如,根据邮件的主题将电子邮件分类为垃圾邮件或非垃圾邮件。

我将在乳腺癌数据集^2上说明这些二分类损失函数。
我们希望根据平均半径面积周长等特征将肿瘤分类为”恶性(Malignant)“或”良性(Benign)“。为简化起见,我们将仅使用两个输入特征(X_1和X_2),即”最差区域(worst area)“和”平均对称性(mean symmetry)“用于分类。Y是二值的,为0(恶性)或1(良性)。

这是我们数据的散点图:

cancer

1.二元交叉熵损失

让我们从理解术语”熵”开始。 通常,我们使用熵来表示无序或不确定性。测量具有概率分布p(X)的随机变量X:

负号用于使最后的结果为正数。

概率分布的熵值越大,表明分布的不确定性越大。同样,一个较小的值代表一个更确定的分布。

这使得二元交叉熵适合作为损失函数(你希望最小化其值)。我们对输出概率p的分类模型使用二元交叉熵损失

元素属于第1类(或正类)的概率=p
元素属于第0类(或负类)的概率=1-p

然后,输出标签y(可以取值0和1)的交叉熵损失和和预测概率p定义为:

这也称为Log-Loss(对数损失)。为了计算概率p,我们可以使用sigmoid函数。这里,z是我们输入功能的函数:

sigmoid函数的范围是[0,1],这使得它适合于计算概率。

在不同alpha值里使用权重更新规则进行1000次迭代得到下图:

2.Hinge损失

Hinge损失主要用于带有类标签-1和1的支持向量机(SVM)。因此,请确保将数据集中”恶性”类的标签从0更改为-1。

Hinge损失不仅会惩罚错误的预测,还会惩罚不自信的正确预测。

数据对(x,y)的Hinge损失如图:

hinge.jpg

在使用三个不同的alpha值运行2000次迭代的更新函数之后,得到下图:

Hinge损失简化了SVM的数学运算,同时最大化了损失(与对数损失(Log-Loss)相比)。当我们想要做实时决策而不是高度关注准确性时,就可以使用它。

多分类损失函数

电子邮件不仅被归类为垃圾邮件或垃圾邮件(这不再是90年代了!)。它们分为各种其他类别-工作,家庭,社交,促销等。

我们将使用Iris数据集^3来理解剩余的两个损失函数。我们将使用2个特征$X_1$萼片长度(Sepal length)和特征$X_2$花瓣宽度(Petal width)来预测鸢尾花的类别(Y) –Setosa,Versicolor或Virginica

我们的任务是使用神经网络模型和Keras内置的Adam优化器来实现分类器。这是因为随着参数数量的增加,数学以及代码将变得难以理解。

这是我们数据的散点图:

1.多分类交叉熵损失

多分类交叉熵损失是二元交叉熵损失的推广。输入向量$X_i$和相应的one-hot编码目标向量$Y_i$的损失是:

我们使用softmax函数来找到概率$p_{ij}$:

“Softmax层是接在神经网络的输出层前。Softmax层必须与输出层具有相同数量的节点。”Google Developer’s Blog

最后,我们的输出是具有给定输入的最大概率的类别。

在不同的学习率经过200轮训练后成本和准确度的图如下:

2. KL散度

KL散度概率分布与另一个概率分布区别的度量。KL散度为零表示分布相同。

请注意,发散函数不对称。即:

这就是为什么KL散度不能用作距离度量的原因。

我将描述使用KL散度作为损失函数而不进行数学计算的基本方法。在给定一些近似分布Q的情况下,我们希望近似关于输入特征的目标变量的真实概率分布P. 由于KL散度不对称,我们可以通过两种方式实现:

第一种方法用于监督学习,第二种方法用于强化学习。KL散度在功能上类似于多分类交叉熵,KL散度也可以称为P相对于Q的相对熵:

在不同的学习率经过200轮训练后成本和准确度的图如下:

与多分类分类相比,KL散度更常用于逼近复杂函数。我们在使用变分自动编码器(VAE)等深度生成模型时经常使用KL散度。