每个程序员都应该知道的 40 个算法(二)(2)

简介: 每个程序员都应该知道的 40 个算法(二)

每个程序员都应该知道的 40 个算法(二)(1)https://developer.aliyun.com/article/1506331

进行简单的欺诈分析

欺诈分析的简单技术是基于这样一个假设:在一个网络中,一个人的行为受到他们所连接的人的影响。在一个网络中,如果两个顶点与彼此相关联,那么它们更有可能具有相似的行为。

基于这一假设,我们设计了一种简单的技术。如果我们想找到某个节点a属于F的概率,概率表示为P(F/q),计算如下:

让我们将这应用到前面的图中,其中Neighborhood[n]代表顶点n的邻域,w(n, nj)代表nn**j之间连接的权重。此外,degree[q]是节点q的度。然后,概率计算如下:

根据这个分析,这个人涉及欺诈的可能性为 67%。我们需要设定一个阈值。如果阈值为 30%,那么这个人就高于阈值,我们可以安全地标记他们为 F。

请注意,这个过程需要针对网络中的每个新节点重复进行。

现在,让我们看一种进行欺诈分析的高级方法。

介绍了瞭望塔欺诈分析方法

之前的简单欺诈分析技术有以下两个限制:

  • 它不评估社交网络中每个顶点的重要性。与涉及欺诈的中心的联系可能与与一个远离的孤立个人的关系有不同的含义。
  • 当在现有网络中将某人标记为已知的欺诈案例时,我们不考虑犯罪的严重程度。

瞭望塔欺诈分析方法解决了这两个限制。首先,让我们看一些概念。

评分负面结果

如果一个人已知涉及欺诈,我们说与这个人相关联的是一个负面结果。并非每个负面结果的严重程度或严肃程度都相同。一个已知冒充另一个人的人将会有一个更严重类型的负面结果与他们相关联,而不仅仅是试图以创新的方式使用过期的 20 美元礼品卡使其有效的人。

从 1 到 10 的评分中,我们对各种负面结果进行如下评分:

负面结果 负面结果分数
冒充 10
涉及信用卡盗窃 8
假支票提交 7
犯罪记录 6
无记录 0

请注意,这些分数将基于我们对欺诈案例及其在历史数据中的影响的分析。

怀疑程度

怀疑程度(DOS)量化了我们对一个人可能涉及欺诈的程度。DOS 值为 0 意味着这是一个低风险的人,DOS 值为 9 意味着这是一个高风险的人。

对历史数据的分析显示,专业的欺诈者在他们的社交网络中拥有重要的地位。为了纳入这一点,首先我们计算网络中每个顶点的四个中心度指标。然后我们取这些顶点的平均值。这反映了该特定人在网络中的重要性。

如果与一个顶点相关联的人涉及欺诈,我们将使用前面表格中显示的预先确定的值对这个人进行评分,以反映犯罪的严重程度。

最后,我们将中心度指标的平均值和负面结果分数相乘,得到 DOS 的值。我们通过将其除以网络中 DOS 的最大值来标准化 DOS。

现在,让我们计算前一个网络中每个九个节点的 DOS:

节点 1 节点 2 节点 3 节点 4 节点 5 节点 6 节点 7 节点 8 节点 9
中心度度 0.25 0.5 0.25 0.25 0.25 0.13 0.63 0.13 0.13
中介中心度 0.25 0.47 0 0 0 0 0.71 0 0
接近中心度 0.5 0.61 0.53 0.47 0.47 0.34 0.72 0.4 0.4
特征向量 0.24 0.45 0.36 0.32 0.32 0.08 0.59 0.16 0.16
中心度指标的平均值 0.31 0.51 0.29 0.26 0.26 0.14 0.66 0.17 0.17
负面结果分数 0 6 0 0 7 8 10 0 0
DOS 0 3 0 0 1.82 1.1 6.625 0 0
标准化 DOS 0 0.47 0 0 0.27 0.17 1 0 0

下图显示了每个节点及其标准化 DOS:

为了计算已添加的新节点的 DOS,我们将使用以下公式:

使用相关数值,我们将按如下计算 DOS:

这将指示与系统中添加的新节点相关的欺诈风险。这意味着在 0 到 1 的范围内,这个人的 DOS 值为 0.42。我们可以为 DOS 创建不同的风险区间,如下所示:

DOS 的值 风险分类
DOS = 0 无风险
0<DOS<=0.10 低风险
0.10<DOS<=0.3 中等风险
DOS>0.3 高风险

根据这些标准,可以看出新个体是高风险人员,应该被标记。

通常,在进行这种分析时不涉及时间维度。但现在,有一些先进的技术可以在图的增长随时间推移时进行分析。这使研究人员能够观察网络演化时顶点之间的关系。尽管图的时间序列分析会使问题的复杂性增加许多倍,但它可能会提供对欺诈证据的额外见解,否则是不可能的。

总结

在本章中,我们了解了基于图的算法。经过本章的学习,我希望我们能够使用不同的技术来表示、搜索和处理以图形表示的数据。我们还开发了能够计算两个顶点之间的最短距离并在问题空间中构建邻域的技能。这些知识应该帮助我们使用图论来解决诸如欺诈检测之类的问题。

在下一章中,我们将专注于不同的无监督机器学习算法。本章讨论的许多用例技术与无监督学习算法相辅相成,这将在下一章中详细讨论。在数据集中找到欺诈证据就是这样的用例示例。

第二部分:机器学习算法

本节详细解释了不同类型的机器学习算法,如无监督机器学习算法和传统监督学习算法,并介绍了自然语言处理算法。本节以介绍推荐引擎结束。包括在本节中的章节有:

  • 第六章,无监督机器学习算法
  • 第七章,传统监督学习算法
  • 第八章,神经网络算法
  • 第九章,自然语言处理算法
  • 第十章,推荐引擎

第六章:无监督机器学习算法

本章是关于无监督机器学习算法的。本章以介绍无监督学习技术开始。然后,我们将学习两种聚类算法:k 均值聚类和层次聚类算法。接下来的部分将介绍一种降维算法,当我们有大量输入变量时可能会很有效。接下来的部分展示了无监督学习如何用于异常检测。最后,我们将看看最强大的无监督学习技术之一,关联规则挖掘。本节还解释了从关联规则挖掘中发现的模式如何代表跨交易中各种数据元素之间的有趣关系,这可以帮助我们进行基于数据的决策。

在本章结束时,读者应该能够理解无监督学习如何用于解决一些现实世界的问题。读者将了解目前用于无监督学习的基本算法和方法论。

在本章中,我们将涵盖以下主题:

  • 无监督学习
  • 聚类算法
  • 降维
  • 异常检测算法
  • 关联规则挖掘

介绍无监督学习

无监督学习的最简单定义是,它是通过发现和利用数据的固有模式来为非结构化数据提供某种结构的过程。如果数据不是由某种随机过程产生的,它在其多维问题空间中的数据元素之间将具有一些模式。无监督学习算法通过发现这些模式并利用它们来为数据集提供一些结构。这个概念在下图中显示:

请注意,无监督学习通过发现现有模式的新特征来添加结构。

数据挖掘生命周期中的无监督学习

理解无监督学习的作用,首先要看数据挖掘过程的整体生命周期。有不同的方法论将数据挖掘过程的生命周期划分为不同的独立阶段,称为阶段。目前,有两种流行的表示数据挖掘生命周期的方式:

  • CRISP-DM跨行业标准数据挖掘过程)生命周期
  • SEMMA样本、探索、修改、建模、访问)数据挖掘过程

CRISP-DM 是由一些数据挖掘者联合开发的,他们来自包括克莱斯勒和SPSS社会科学统计软件包)在内的各种公司。SEMMA 是由SAS统计分析系统)提出的。让我们看看这两种数据挖掘生命周期的表示之一,CRISP-DM,并尝试理解无监督学习在数据挖掘生命周期中的位置。请注意,SEMMA 在其生命周期内有一些类似的阶段。

如果我们看 CRISP-DM 生命周期,可以看到它包括六个不同的阶段,如下图所示:

让我们逐个了解每个阶段:

  • 阶段 1:业务理解:这是收集需求的阶段,涉及从业务角度深入全面地理解问题。根据机器学习ML)的要求定义问题的范围,并适当地重新表述它是这个阶段的重要部分。例如,对于二元分类问题,有时将需求用可以证明或拒绝的假设来表述是有帮助的。本阶段还涉及记录将在下游阶段 4 中训练的机器学习模型的期望。例如,对于分类问题,我们需要记录可以部署到生产中的模型的最低可接受准确性。

CRISP-DM 生命周期的第一阶段是业务理解,重点是需要做什么,而不是如何做。

  • 第二阶段:数据理解:这是关于理解可用于数据挖掘的数据。在这个阶段,我们将找出是否有适合解决问题的正确数据集。在确定数据集之后,我们需要了解数据的质量和结构。我们需要找出可以从数据中提取的模式,这些模式可能会引导我们获得重要的见解。我们还将尝试找到可以根据第一阶段收集的要求用作标签(或目标变量)的正确特征。无监督学习算法可以在实现第二阶段目标方面发挥强大作用。无监督算法可以用于以下目的:
  • 在数据集中发现模式
  • 通过分析发现的模式来理解数据集的结构
  • 识别或推导目标变量
  • 第三阶段:数据准备:这是为我们将在第四阶段训练的 ML 模型准备数据的阶段。可用的标记数据被分成两个不相等的部分。较大的部分称为训练数据,用于在第四阶段训练模型。较小的部分称为测试数据,在第五阶段用于模型评估。在这个阶段,无监督机器学习算法可以用作准备数据的工具,例如,它们可以用于将非结构化数据转换为结构化数据,提供可以帮助训练模型的额外维度。
  • 第四阶段:建模:这是我们使用监督学习来制定已发现模式的阶段。我们需要根据所选的监督学习算法的要求成功准备数据。这也是确定将用作标签的特定特征的阶段。在第三阶段,我们将数据分为测试集和训练集。在这个阶段,我们形成数学公式来表示我们感兴趣的模式中的关系。这是通过使用第三阶段创建的训练数据来训练模型完成的。如前所述,最终的数学公式将取决于我们选择的算法。
  • 第五阶段:评估:这个阶段是关于使用第三阶段的测试数据测试新训练的模型。如果评估符合第一阶段设定的期望,那么我们需要再次迭代所有前面的阶段,从第一阶段开始。这在前面的图像中有所说明。
  • 第六阶段:部署:如果评估符合或超过第五阶段描述的期望,那么训练好的模型将被部署到生产环境中,并开始为我们在第一阶段定义的问题提供解决方案。

CRISP-DM 生命周期的第二阶段(数据理解)和第三阶段(数据准备)都是关于理解数据并为训练模型做准备。这些阶段涉及数据处理。一些组织为这个数据工程阶段雇佣专家。

很明显,提出问题的解决方案的过程完全是数据驱动的。结合监督和无监督机器学习用于制定可行的解决方案。本章重点介绍解决方案的无监督学习部分。

数据工程包括第二阶段和第三阶段,是机器学习中最耗时的部分。它可能占据典型 ML 项目时间和资源的 70%。无监督学习算法在数据工程中可以发挥重要作用。

以下各节提供了有关无监督算法的更多细节。

无监督学习的当前研究趋势

多年来,对机器学习算法的研究更多地集中在监督学习技术上。由于监督学习技术可以直接用于推断,因此它们在时间、成本和准确性方面的优势相对容易衡量。无监督机器学习算法的潜力最近才被认识到。由于无监督学习不受指导,因此它不太依赖假设,并且可能在任何维度上收敛解决方案。尽管更难控制无监督学习算法的范围和处理要求,但它们有更多潜力发现隐藏的模式。研究人员还在努力将无监督机器学习技术与监督学习技术相结合,以设计新的强大算法。

实际例子

目前,无监督学习用于更好地理解数据并为其提供更多结构,例如,它用于市场细分、欺诈检测和市场篮分析(稍后在本章中讨论)。让我们看几个例子。

语音分类

无监督学习可以用于对语音文件中的个别声音进行分类。它利用了每个人的声音具有独特的特征这一事实,从而创建可能可分离的音频模式。这些模式可以用于语音识别,例如,谷歌在其 Google Home 设备中使用这种技术来训练它们区分不同人的声音。一旦训练完成,Google Home 可以个性化地为每个用户提供响应。

例如,假设我们有一段录制的三个人互相交谈半个小时的对话。使用无监督学习算法,我们可以识别数据集中不同人的声音。请注意,通过无监督学习,我们为给定的非结构化数据集添加了结构。这种结构为我们的问题空间提供了额外有用的维度,可以用于获取见解并为我们选择的机器学习算法准备数据。以下图表显示了无监督学习用于语音识别的情况:

请注意,在这种情况下,无监督学习建议我们添加一个具有三个不同级别的新特征。

文档分类

无监督机器学习算法也可以应用于非结构化文本数据的存储库,例如,如果我们有一组 PDF 文档的数据集,那么无监督学习可以用于以下目的:

  • 发现数据集中的各种主题
  • 将每个 PDF 文档与发现的主题之一关联起来

无监督学习用于文档分类的情况如下图所示。这是另一个例子,我们在非结构化数据中添加了更多的结构:

图 6.4:使用无监督学习进行文档分类

请注意,在这种情况下,无监督学习建议我们添加一个具有五个不同级别的新特征。

理解聚类算法

在无监督学习中使用的最简单和最强大的技术之一是基于通过聚类算法将相似模式分组在一起。它用于理解与我们试图解决的问题相关的数据的特定方面。聚类算法寻找数据项中的自然分组。由于该组不是基于任何目标或假设,因此被归类为无监督学习技术。

各种聚类算法创建的分组是基于在问题空间中找到各种数据点之间的相似性。确定数据点之间的相似性的最佳方法将因问题而异,并且将取决于我们正在处理的问题的性质。让我们看看可以用来计算各种数据点之间相似性的各种方法。

量化相似性

聚类算法创建的分组的可靠性是基于这样一个假设:我们能够准确量化问题空间中各种数据点之间的相似性或接近程度。这是通过使用各种距离度量来实现的。以下是用于量化相似性的三种最流行的方法:

  • 欧几里得距离度量
  • 曼哈顿距离度量
  • 余弦距离度量

让我们更详细地看看这些距离度量。

欧几里得距离

不同点之间的距离可以量化两个数据点之间的相似性,并且广泛用于无监督机器学习技术,如聚类。欧几里得距离是最常见和简单的距离度量。它通过测量多维空间中两个数据点之间的最短距离来计算。例如,让我们考虑二维空间中的两点A(1,1)B(4,4),如下图所示:

要计算AB之间的距离——即d(A,B),我们可以使用以下毕达哥拉斯公式:

请注意,此计算是针对二维问题空间的。对于n维问题空间,我们可以计算两点AB之间的距离如下:

曼哈顿距离

在许多情况下,使用欧几里得距离度量来测量两点之间的最短距离将无法真正代表两点之间的相似性或接近程度——例如,如果两个数据点代表地图上的位置,则使用地面交通工具(如汽车或出租车)从点 A 到点 B 的实际距离将大于欧几里得距离计算出的距离。对于这类情况,我们使用曼哈顿距离,它标记了两点之间的最长路线,并更好地反映了在繁忙城市中可以前往的源点和目的地点之间的接近程度。曼哈顿和欧几里得距离度量之间的比较如下图所示:

曼哈顿距离始终大于或等于相应的欧几里得距离。

余弦距离

欧几里得和曼哈顿距离度量在高维空间中表现不佳。在高维问题空间中,余弦距离更准确地反映了多维问题空间中两个数据点之间的接近程度。余弦距离度量是通过测量由两个连接到参考点的点所创建的余弦角来计算的。如果数据点接近,则角度将很窄,而不管它们具有的维度如何。另一方面,如果它们相距很远,那么角度将很大:

文本数据几乎可以被视为高维空间。由于余弦距离度量在高维空间中表现非常好,因此在处理文本数据时是一个不错的选择。

请注意,在前面的图中,A(2,5)B(4.4)之间的角的余弦是余弦距离。这些点之间的参考点是原点——即X(0,0)。但实际上,问题空间中的任何点都可以充当参考数据点,并且不一定是原点。

K 均值聚类算法

k-means 聚类算法的名称来自于它试图创建k个聚类,通过计算均值来找到数据点之间的接近程度。它使用了一个相对简单的聚类方法,但由于其可扩展性和速度而仍然受欢迎。从算法上讲,k-means 聚类使用了一个迭代逻辑,将聚类的中心移动到它们所属的分组的最具代表性的数据点。

重要的是要注意,k-means 算法缺乏聚类所需的非常基本的功能之一。这个缺失的功能是,对于给定的数据集,k-means 算法无法确定最合适的聚类数。最合适的聚类数k取决于特定数据集中自然分组的数量。这种省略背后的哲学是尽可能简化算法,最大限度地提高其性能。这种精益简洁的设计使 k-means 适用于更大的数据集。假设将使用外部机制来计算k。确定k的最佳方法将取决于我们试图解决的问题。在某些情况下,k直接由聚类问题的上下文指定,例如,如果我们想将一类数据科学学生分成两个聚类,一个由具有数据科学技能的学生组成,另一个由具有编程技能的学生组成,那么k将为 2。在其他一些问题中,k的值可能不明显。在这种情况下,将不得不使用迭代的试错程序或基于启发式的算法来估计给定数据集的最合适的聚类数。

k-means 聚类的逻辑

本节描述了 k-means 聚类算法的逻辑。让我们逐一看一下。

初始化

为了对它们进行分组,k-means 算法使用距离度量来找到数据点之间的相似性或接近程度。在使用 k-means 算法之前,需要选择最合适的距离度量。默认情况下,将使用欧氏距离度量。此外,如果数据集中有异常值,则需要制定机制来确定要识别和删除数据集的异常值的标准。

k-means 算法的步骤

k-means 聚类算法涉及的步骤如下:

步骤 1 我们选择聚类的数量k
步骤 2 在数据点中,我们随机选择k个点作为聚类中心。
步骤 3 基于所选的距离度量,我们迭代地计算问题空间中每个点到k个聚类中心的距离。根据数据集的大小,这可能是一个耗时的步骤,例如,如果聚类中有 10,000 个点,k=3,这意味着需要计算 30,000 个距离。
步骤 4 我们将问题空间中的每个数据点分配给最近的聚类中心。
步骤 5 现在我们问题空间中的每个数据点都有一个分配的聚类中心。但我们还没有完成,因为初始聚类中心的选择是基于随机选择的。我们需要验证当前随机选择的聚类中心实际上是每个聚类的重心。我们通过计算每个k聚类的组成数据点的平均值来重新计算聚类中心。这一步解释了为什么这个算法被称为 k-means。
步骤 6 如果在步骤 5 中聚类中心发生了变化,这意味着我们需要重新计算每个数据点的聚类分配。为此,我们将回到步骤 3 重复这个计算密集的步骤。如果聚类中心没有发生变化,或者我们的预定停止条件(例如,最大迭代次数)已经满足,那么我们就完成了。

下图显示了在二维问题空间中运行 k-means 算法的结果:

(a)聚类前的数据点;(b)运行 k 均值聚类算法后的结果集群

请注意,在运行 k 均值后创建的两个结果集群在这种情况下有很好的区分度。

停止条件

对于 k 均值算法,默认的停止条件是在第 5 步中不再移动集群中心。但是与许多其他算法一样,k 均值算法可能需要很长时间才能收敛,特别是在处理高维问题空间中的大型数据集时。我们可以明确定义停止条件,而不是等待算法收敛,如下所示:

  • 通过指定最大执行时间:
  • 停止条件如果 t>t[max],其中t是当前执行时间,*t[max]*是我们为算法设置的最大执行时间。
  • 通过指定最大迭代次数:
  • 停止条件如果 m>m[max],其中m是当前迭代次数,*m[max]*是我们为算法设置的最大迭代次数。

编写 k 均值算法

让我们看看如何在 Python 中编写 k 均值算法:

  1. 首先,让我们导入编写 k 均值算法所需的软件包。请注意,我们正在导入sklearn软件包进行 k 均值聚类:
from sklearn import cluster import pandas as pd
import numpy as np
  1. 要使用 k 均值聚类,让我们在二维问题空间中创建 20 个数据点,这些数据点将用于 k 均值聚类:
dataset = pd.DataFrame({
    'x': [11, 21, 28, 17, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 62, 70, 72, 10],
    'y': [39, 36, 30, 52, 53, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 18, 7, 24, 10]
})
  1. 让我们有两个集群(k=2),然后通过调用fit函数创建集群:
myKmeans = cluster.KMeans(n_clusters=2)
myKmeans.fit(dataset)
  1. 让我们创建一个名为centroid的变量,它是一个包含形成的集群中心位置的数组。在我们的情况下,k=2,数组的大小将为 2。让我们还创建另一个名为label的变量,表示每个数据点分配给两个集群中的一个。由于有 20 个数据点,这个数组的大小将为 20:
centroids = myKmeans.cluster_centers_
labels = myKmeans.labels_
  1. 现在让我们打印这两个数组,centroidslabels

请注意,第一个数组显示了每个数据点与集群的分配,第二个数组显示了两个集群中心。

  1. 让我们使用matplotlib绘制并查看这些集群:

请注意,图中的较大点是由 k 均值算法确定的中心点。

k 均值聚类的局限性

k 均值算法旨在成为一种简单快速的算法。由于其设计上的故意简单性,它具有以下限制:

  • k 均值聚类的最大限制是初始集群数量必须预先确定。
  • 集群中心的初始分配是随机的。这意味着每次运行算法时,可能会得到略有不同的集群。
  • 每个数据点只分配给一个集群。
  • k 均值聚类对异常值敏感。

层次聚类

k 均值聚类使用自上而下的方法,因为我们从最重要的数据点开始算法,即集群中心。还有一种聚类的替代方法,即不是从顶部开始,而是从底部开始算法。在这种情况下,底部是问题空间中的每个单独数据点。解决方案是在向上移向集群中心的过程中不断将相似的数据点分组在一起。这种替代的自下而上方法由层次聚类算法使用,并在本节中讨论。

层次聚类的步骤

层次聚类涉及以下步骤:

  1. 我们在问题空间中为每个数据点创建一个单独的集群。如果我们的问题空间包含 100 个数据点,那么它将从 100 个集群开始。
  2. 我们只将彼此最接近的点分组。
  3. 我们检查停止条件;如果停止条件尚未满足,则重复步骤 2。

生成的集群结构称为树状图

在树状图中,垂直线的高度决定了物品的接近程度,如下图所示:

请注意,停止条件显示为上图中的虚线。

编写一个分层聚类算法

让我们学习如何在 Python 中编写一个分层算法:

  1. 我们将首先从sklearn.cluster库中导入AgglomerativeClustering,以及pandasnumpy包:
from sklearn.cluster import AgglomerativeClustering import pandas as pd
import numpy as np
  1. 然后我们将在二维问题空间中创建 20 个数据点:
dataset = pd.DataFrame({
    'x': [11, 21, 28, 17, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 62, 70, 72, 10],
    'y': [39, 36, 30, 52, 53, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 18, 7, 24, 10]
})
  1. 然后我们通过指定超参数来创建分层集群。我们使用fit_predict函数来实际处理算法:
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward') 
cluster.fit_predict(dataset) 
  1. 现在让我们看一下每个数据点与创建的两个簇的关联:

您可以看到分层和 k 均值算法的集群分配非常相似。

评估聚类

良好质量的聚类的目标是属于不同簇的数据点应该是可区分的。这意味着以下内容:

  • 属于同一簇的数据点应尽可能相似。
  • 属于不同簇的数据点应尽可能不同。

人类直觉可以用来通过可视化集群结果来评估集群结果,但也有数学方法可以量化集群的质量。轮廓分析是一种比较 k 均值算法创建的集群中的紧密度和分离度的技术。轮廓绘制了一个图,显示了特定集群中每个点与相邻集群中其他点的接近程度。它将与每个集群关联的数字范围为[-0, 1]。以下表显示了此范围中的数字表示什么:

范围 意义 描述
0.71–1.0 优秀 这意味着 k 均值聚类导致的组在相当程度上是可区分的。
0.51–0.70 合理 这意味着 k 均值聚类导致的组在某种程度上是可区分的。
0.26–0.50 这意味着 k 均值聚类导致了分组,但不应依赖分组的质量。
<0.25 未找到任何聚类 使用选择的参数和使用的数据,无法使用 k 均值聚类创建分组。

请注意,问题空间中的每个簇将获得一个单独的分数。

聚类的应用

聚类用于我们需要在数据集中发现潜在模式的地方。

在政府使用案例中,聚类可用于以下目的:

  • 犯罪热点分析
  • 人口社会分析

在市场研究中,聚类可用于以下目的:

  • 市场细分
  • 定向广告
  • 客户分类

主成分分析(PCA)也用于通常探索数据并从实时数据中去除噪音,例如股票市场交易。

降维

我们数据中的每个特征对应于问题空间中的一个维度。将特征的数量最小化以使问题空间更简单称为降维。可以通过以下两种方式之一来完成:

  • 特征选择:选择在我们试图解决的问题的上下文中重要的一组特征
  • 特征聚合:使用以下算法之一组合两个或多个特征以减少维度:
  • PCA:线性无监督 ML 算法
  • 线性判别分析(LDA):线性监督 ML 算法
  • 核主成分分析:一种非线性算法

让我们更深入地了解一种流行的降维算法,即 PCA。

主成分分析

PCA 是一种无监督的机器学习技术,可以使用线性变换来降低维度。在下图中,我们可以看到两个主成分PC1PC2,它们显示了数据点的分布形状。PC1 和 PC2 可以用适当的系数来总结数据点:

让我们考虑以下代码:

from sklearn.decomposition import PCA
iris = pd.read_csv('iris.csv')
X = iris.drop('Species', axis=1)
pca = PCA(n_components=4)
pca.fit(X)

现在让我们打印我们的 PCA 模型的系数:

请注意,原始的 DataFrame 有四个特征,Sepal.LengthSepal.WidthPetal.LengthPetal.Width。前面的 DataFrame 指定了四个主成分 PC1、PC2、PC3 和 PC4 的系数,例如,第一行指定了可以用来替换原始四个变量的 PC1 的系数。

根据这些系数,我们可以计算我们输入 DataFrame X 的 PCA 组件:

pca_df=(pd.DataFrame(pca.components_,columns=X.columns))
# Let us calculate PC1 using coefficients that are generated
X['PC1'] = X['Sepal.Length']* pca_df['Sepal.Length'][0] + X['Sepal.Width']* pca_df['Sepal.Width'][0]+ X['Petal.Length']* pca_df['Petal.Length'][0]+X['Petal.Width']* pca_df['Petal.Width'][0]
# Let us calculate PC2
X['PC2'] = X['Sepal.Length']* pca_df['Sepal.Length'][1] + X['Sepal.Width']* pca_df['Sepal.Width'][1]+ X['Petal.Length']* pca_df['Petal.Length'][1]+X['Petal.Width']* pca_df['Petal.Width'][1]
#Let us calculate PC3
X['PC3'] = X['Sepal.Length']* pca_df['Sepal.Length'][2] + X['Sepal.Width']* pca_df['Sepal.Width'][2]+ X['Petal.Length']* pca_df['Petal.Length'][2]+X['Petal.Width']* pca_df['Petal.Width'][2]
# Let us calculate PC4
X['PC4'] = X['Sepal.Length']* pca_df['Sepal.Length'][3] + X['Sepal.Width']* pca_df['Sepal.Width'][3]+ X['Petal.Length']* pca_df['Petal.Length'][3]+X['Petal.Width']* pca_df['Petal.Width'][3]

现在让我们在计算 PCA 组件后打印 X:

现在让我们打印方差比率,并尝试理解使用 PCA 的影响:

方差比率表示如下:

  • 如果我们选择用 PC1 替换原始的四个特征,那么我们将能够捕获大约 92.3%的原始变量的方差。我们通过不捕获原始四个特征 100%的方差来引入一些近似。
  • 如果我们选择用 PC1 和 PC2 替换原始的四个特征,那么我们将捕获额外的 5.3%的原始变量的方差。
  • 如果我们选择用 PC1、PC2 和 PC3 替换原始的四个特征,那么我们现在将捕获原始变量进一步的 0.017%的方差。
  • 如果我们选择用四个主成分替换原始的四个特征,那么我们将捕获原始变量的 100%的方差(92.4 + 0.053 + 0.017 + 0.005),但用四个主成分替换四个原始特征是没有意义的,因为我们没有减少维度,也没有取得任何成果。

每个程序员都应该知道的 40 个算法(二)(3)https://developer.aliyun.com/article/1506342

相关文章
|
18天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
20天前
|
机器学习/深度学习 算法 数据挖掘
每个程序员都应该知道的 40 个算法(四)(4)
每个程序员都应该知道的 40 个算法(四)
16 1
|
20天前
|
机器学习/深度学习 人工智能 算法
每个程序员都应该知道的 40 个算法(四)(3)
每个程序员都应该知道的 40 个算法(四)
18 2
|
20天前
|
分布式计算 并行计算 算法
每个程序员都应该知道的 40 个算法(四)(2)
每个程序员都应该知道的 40 个算法(四)
19 1
|
20天前
|
分布式计算 并行计算 算法
每个程序员都应该知道的 40 个算法(四)(1)
每个程序员都应该知道的 40 个算法(四)
22 2
|
20天前
|
存储 算法 安全
每个程序员都应该知道的 40 个算法(三)(4)
每个程序员都应该知道的 40 个算法(三)
20 1
|
20天前
|
存储 算法 安全
每个程序员都应该知道的 40 个算法(三)(3)
每个程序员都应该知道的 40 个算法(三)
17 0
|
20天前
|
机器学习/深度学习 自然语言处理 算法
每个程序员都应该知道的 40 个算法(三)(2)
每个程序员都应该知道的 40 个算法(三)
17 1
|
20天前
|
机器学习/深度学习 人工智能 算法
每个程序员都应该知道的 40 个算法(三)(1)
每个程序员都应该知道的 40 个算法(三)
18 0
|
20天前
|
机器学习/深度学习 算法 程序员
每个程序员都应该知道的 40 个算法(二)(4)
每个程序员都应该知道的 40 个算法(二)
18 0