第一章

数据挖掘

1.1

什么是数据挖掘?在你的回答中,强调以下问题:

  1. 它是又一种广告宣传吗?
  2. 它是一种从数据库、统计学、机器学习和模式识别发展而来的技术的简单转换或应用吗?
  3. 我们提出了一种观点,说数据挖掘是数据库技术进化的结果。你认为数据挖掘也是机器学习研究进化的结果吗?你能基于该学科的发展历史提出这一观点吗?针对统计学和模式识别领域, 做相同的事。

答:数据挖掘是一种综合性技术,它结合了数据库技术、统计学、机器学习和模式识别的方法和理论,用于从大量数据中自动发现有意义的模式和知识。

数据挖掘不仅仅是一种广告宣传。 尽管在商业领域,数据挖掘技术经常被用于市场分析和客户洞察,以支持营销策略和广告宣传,但它的应用范围远远超过这些。数据挖掘在医疗、金融、生物信息学、网络安全等众多领域中都有重要应用,目的是揭示数据中隐藏的模式、趋势和关联,以支持决策制定。

数据挖掘是从数据库技术、统计学、机器学习和模式识别发展而来的综合技术,而不仅仅是简单的技术转换或应用。 数据挖掘涉及复杂的算法和方法,它们源于这些领域的深刻理解和研究。例如,从统计学中借鉴的概率模型和推断方法,从机器学习中引入的分类和回归技术,以及从模式识别中获得的特征提取和图像分析等,这些都是数据挖掘中不可或缺的组成部分。

数据挖掘既是数据库技术也是机器学习研究进化的结果,同样适用于统计学和模式识别。 从历史角度看,早期的数据库技术主要关注数据的存储、检索和管理,随着技术的发展,人们开始寻求从这些庞大的数据集中提取有价值的信息,这推动了数据挖掘技术的诞生。类似地,机器学习的研究最初关注于算法的开发,使计算机能够从数据中学习。随着时间的推移,这些算法被应用于更大规模的数据处理任务中,从而促进了数据挖掘技术的进步。统计学提供了数据分析的基本工具和理论,而模式识别的技术使得从数据中识别和分类复杂模式成为可能。这些领域的进步相互促进,共同推动了数据挖掘技术的发展。

1.2

数据仓库与数据库有何不同?它们有哪些相似之处?

答:

不同之处:

  1. 设计目的:
    • 数据库设计用来处理日常的事务操作,如增、删、改、查(CRUD操作),它支持应用程序和用户的实时数据处理需求。
    • 数据仓库设计用来进行复杂的查询和分析,如数据挖掘和报表生成。它旨在存储历史数据,支持决策制定过程。
  2. 数据结构:
    • 数据库通常采用标准化结构,以避免数据冗余,优化事务处理的速度和效率。
    • 数据仓库采用去标准化的结构,例如星型模式或雪花模式,以优化查询性能和简化复杂的分析查询。
  3. 数据更新:
    • 数据库中的数据经常更新,以反映最新的事务状态。
    • 数据仓库中的数据更新频率较低,通常是定期批量更新,以反映历史数据的累积。
  4. 查询类型:
    • 数据库处理的是简单且频繁的查询,主要是针对单条记录的操作。
    • 数据仓库处理的是复杂的分析查询,这些查询往往需要扫描大量数据。

相似之处:

  1. 数据存储: 数据库和数据仓库都是用来存储数据的系统。它们都需要有效地管理数据,包括数据的保存、检索、更新和管理。
  2. 数据管理: 无论是数据库还是数据仓库,都需要数据库管理系统(DBMS)来管理数据。这包括维护数据的完整性、安全性和可访问性。
  3. 支持查询语言: 它们通常都支持SQL(结构化查询语言)或类似的查询语言,使用户能够编写查询来检索或分析数据。
  4. 技术基础: 尽管数据库和数据仓库在使用目的和设计上有所不同,但它们的技术基础相似,都依赖于数据库管理技术和数据模型的概念。

1.3

定义下列数据挖掘功能:特征化、区分、关联和相关性分析、分类、回归、聚类、离群点分析。使用你熟悉的现实生活中的数据库,给出每种数据挖掘功能的例子。

解:

  1. 特征化 (Characterization)

    • 定义: 数据特征化是一种数据挖掘技术,旨在提炼出一个数据集的一般特征。它通常用于数据摘要和概述。
    • 现实例子: 电商网站的用户数据库。通过对购买历史数据的特征化,可以概述出不同用户群体的购买习惯,如最常购买的产品类别、平均消费额等。
  2. 区分 (Discrimination)

    • 定义: 数据区分是将数据集中的不同类别或群体对比,以识别它们之间的显著差异。
    • 现实例子: 银行的客户数据库。银行可以使用区分技术比较信用良好和信用不良客户的特征,比如年收入、贷款违约次数等,以此来优化信贷政策。
  3. 关联和相关性分析 (Association and Correlation Analysis)

    • 定义: 关联和相关性分析用于发现数据项之间的频繁共现模式、关联规则或相关性。关联规则挖掘寻找项目之间的关系,而相关性分析更关注于变量之间的线性关系。
    • 现实例子: 超市的销售数据库。分析购物篮数据可以揭示某些商品(如啤酒和尿布)经常一起购买的模式,这有助于商品的布局和推广活动。
  4. 分类 (Classification)

    • 定义: 分类是一种数据挖掘技术,旨在根据一组预定义的类别将数据项进行分类。它使用历史数据来训练模型,以便预测新数据的分类。
    • 现实例子: 电子邮件服务提供商的邮件数据库。使用分类算法来识别和过滤垃圾邮件,根据邮件内容和发件人等特征将邮件分类为"垃圾邮件"或"正常邮件"。
  5. 回归 (Regression)

    • 定义: 回归分析预测数值型数据的值。它寻找因变量和一个或多个自变量之间的关系。
    • 现实例子: 房地产网站的房产数据库。通过回归分析,可以预测房产价格基于其位置、面积、房间数等特征。
  6. 聚类 (Clustering)

    • 定义: 聚类是一种探索性数据分析技术,用于将数据对象分组成为多个类别或"簇",使得同一簇内的对象比其他簇的对象更为相似。
    • *现实例子:** 社交媒体平台的用户数据库。通过聚类分析,可以根据用户的兴趣、活动和社交网络将用户分组,以便于推荐内容和广告定向。
  7. 离群点分析 (Outlier Detection)

    • 定义: 离群点分析旨在识别那些与大多数数据显著不同的数据点。这些数据点可能代表了错误、异常条件或新发现。
    • 现实例子: 信用卡交易数据库。通过离群点分析,可以识别出不寻常的交易模式,这些可能是欺诈行为的迹象,比如在非常短的时间内进行的大量高额交易。

1.5

解释区分和分类、特征化和聚类、分类和回归之间的区别和相似之处。

答:

区分和分类

相似之处:

  • 目的: 两者都旨在识别数据集中的不同类别或群组,并了解它们之间的差异。
  • 应用: 都可以用于数据分析和决策支持系统,帮助理解和预测数据的行为。

区别:

  • 区分(Discrimination) 是比较两个或多个已存在的类别或群组,以发现它们之间的区别。区分强调在现有类别间找出区别性特征。
  • 分类(Classification) 是将数据项分配到预定义的类别中。它使用已有的数据(训练集)来训练模型,然后用这个模型预测新数据项的类别。

特征化和聚类

相似之处:

  • 数据理解: 两者都用于理解数据集的结构和内容,帮助人们对数据有更深入的了解。
  • 无监督学习: 聚类通常被视为一种无监督学习方法,而特征化在数据挖掘过程中也不依赖于预定义的类别。

区别:

  • 特征化(Characterization) 是对已有的数据集进行总结和描述,旨在提炼出整个数据集或数据子集的一般特征。
  • 聚类(Clustering) 是将数据集中的对象根据相似性分组成多个类别或“簇”,它不依赖于预先定义的类别,而是试图发现数据自身的分布结构。

分类和回归

相似之处:

  • 监督学习: 两者都属于监督学习方法,这意味着它们使用已经标记的数据(训练集)来学习,并对新的未标记数据进行预测。
  • 预测目的: 两者都用于预测,但是预测的内容和方式不同。

区别:

  • 分类(Classification) 的目标是预测数据项属于哪一个类别。它的输出是离散的类别标签。
  • 回归(Regression) 的目标是预测一个连续值的量,如价格、温度等。回归试图找出输入变量和输出变量之间的关系。

1.7

离群点经常被当做噪声丢奔。然而, 一个人的垃圾可能是另一个人的宝贝。例如,信用卡交易中的异常可能帮助我们检测信用卡的欺诈使用。以欺诈检測为例,提出两种可以用来检測离群点的方法,并讨论哪种方法更可靠。

答:

基于统计的离群点检测方法利用统计模型来识别异常值。这些方法通常假设数据遵循某种已知的分布(例如正态分布),并将远离数据平均值的点视为离群点。例如,可以计算交易金额的平均值和标准差,然后标记那些超过平均值几个标准差的交易为异常。

基于机器学习的离群点检测方法使用算法来学习数据的正常模式,并识别出与之显著不同的异常模式。这些方法不依赖于数据的先验分布假设,可以是无监督的或是监督的

对于数据分布已知且相对简单的情况,基于统计的方法可能就足够有效。然而,鉴于信用卡交易数据的复杂性以及欺诈行为的不断进化,基于机器学习的方法通常提供更高的灵活性和更好的检测性能。

1.9

与挖掘少量数据(例如,几百个元组的数据集合)相比,挖据海量数据(例如。数 十亿个元组)的主要挑战是什么?

答:

  1. 数十亿个元组的数据集需要高效的存储系统来确保数据的可访问性和完整性。传统的数据库系统可能难以处理这种规模的数据
  2. 海量数据的处理需要大量计算资源
  3. 在海量数据上运行复杂的数据挖掘算法会导致执行时间显著增长
  4. 海量数据中噪声和不一致的数据比例可能更高

第二章

2.2

假设所分析的数据包括属性 age,它在数据元组中的值为 13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70

  1. 该数据的均值是多少?中位数是什么?
  2. 该数据的众数是什么?讨论数据的模态(即二模、三模等)
  3. 该数据的中列数是多少
  4. 你能(粗略地)找出该数据的第一个四分位数和第三个四分位数吗
  5. 给出该数据的五数概括
  6. 绘制该数据的盒图
  7. 分位数-分位数图和分位数图有何不同

均值为

中位数是 25

众数是 25 和 35,是一个二模分布

中列数为

五数概括为

盒图表示为

“img-2024-03-28 17-51-38.png” could not be found.

分位数图提供了一种简单有效的方式来观察单一变量数据的分布情况。它首先展示了给定属性的所有数据的分布,并且提供了分位数的信息。此外,分位数-分位数图通过显示同一属性的不同样本的数据分布情况,使用户能够轻松比较这些样本之间的差异或相似性。

2.3

设给定数据集已经分组到区间,这些区间和对应频率如下所示

age frequency
1-5 200
6-15 450
16-20 300
21-50 1500
51-80 700
81-110 44

计算该数据的近似中位数

解:

2.5

简要概述如何计算如下属性描述的对象的相异性

  1. 标称属性
  2. 非对称的二元属性
  3. 数据属性
  4. 词频向量

解:

对于标称属性,记 为匹配的数目, 为全部属性的数目,则数据对象 之间的相异性可以表示为

对于非对称性二元属性,采用 Jaccard 系数来评价两个对象之间的相似度。

数据属性可以用距离衡量。有三种常见距离

Euclidean 距离

Manhattan 距离

Minkowski 距离

对于词频向量,可以用余弦相似度来表示相似度,进而表示相异度。给定两个属性向量 ,其余弦相似度由点积和向量长度给出

3.1

数据质量可以从多方面评估,包括准确性、完整性和一致性问题。对于以上每个问题,讨论数据质量的评估如何依赖于数据的应用目的,给出例子,提出数据质量的另外两个尺度

解:

  • 准确性:由于技术的限制或人为的失误,有些需要准确投入营销比如生日折扣等的商品可能会失去作用。
  • 完整性:由于故意隐瞒和设置、转移数据时没有加入,有些需要完整信息的例如快递行业会在业务经营中遇到障碍。
  • 一致性问题:由于某些不可抗因素导致的数据不一致,例如多个数据源命名不一致时会影响数据集成等。

其他两个尺度是可信性和时效性。

3.2

在现实世界的数据中,某些属性上缺失值得到元组是比较常见的。讨论处理这一问题的方法。

解:常用方法有

  • 忽略元组。
  • 人工填写缺失值。
  • 使用一个全局常量填充缺失值。
  • 使用属性的中心度量(如均值或中位数)填充缺失值。
  • 使用与给定元组属同一类的所有样本的属性均值或中位数。
  • 使用最可能的值填充缺失值。

3.3

假设所分析的数据包括属性 age,它在数据元组中的值为 13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70

  1. 使用深度为 3 的箱均值光滑以上数据。说明你的步骤,讨论这种技术对给定数据的效果
  2. 如何确定该数据中的离群点?
  3. 还有什么方法来光滑数据?

解:分箱后得到

计算每个箱的平均值得到平滑后的数据


使用该方法可以平滑数据中的噪声。

可以使用箱线图的方法,超出上下四分位数很多的点可以被认为是离群点。

平滑方法:箱中位数光滑、箱边界光滑等

3.4

讨论数据集成所需要考虑的问题

解:

  • 实体识别:一个数据库中的域与另一个数据库中的域是相同的
  • 属性冗余:一个属性可由另一组属性表达。
  • 数据重复
  • 数据冲突值的检测与处理:表示、尺度、编码可能不同

3.5

如下规范化方法的值域是什么

  1. 最小-最大规范化
  2. 分数规范化
  3. 分数规范化。使用均值绝对偏差而不是标准差
  4. 小数标定规范化

解:

  • 最小-最大规约化:
  • 分数规范化:
  1. 分数规范化。使用均值绝对偏差而不是标准差:
  2. 小数标定规范化

3.6

使用如下方法规范化如下数据组

  1. min=0, max=1,进行最小-最大规范化
  2. 分数规范化
  3. 分数规范化。使用均值绝对偏差而不是标准差
  4. 小数标定规范化

解:

最小-最大归一化时

系统数据 200 300 400 600 1000
规约结果 0 0.125 0.25 0.5 1

分数规范化时,计算得到数据的均值为 ,标准差为

系统数据 200 300 400 600 1000
规约结果 -1.06 -0.7 -0.35 0.35 1.78

均值绝对偏差 分数规范化时,计算得到数据的均值为 ,均值绝对偏差为

系统数据 200 300 400 600 1000
规约结果 -1.25 -0.83 -0.42 0.42 2.08

对于小数标定,,并用 作为定标

系统数据 200 300 400 600 1000
规约结果 0.2 0.3 0.4 0.6 1.0

3.7

使用 3.3 给出的 age 数据,13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70,回答下面的问题

  1. 使用最小-最大规范化将 age值 35 变换到 [0.0, 1.0] 区间
  2. 使用 分数规范化变换 age 值 35,其中 age 的标准差为 12.94 岁。
  3. 使用小数定标规范化变换 age值 35
  4. 对于给定的数据,你愿意使用哪种方法。陈述你的理由。

解,若使用最小最大归一化。

若使用 分数规范化变换,首先算出均值,然后算出标准差

带入公式

若使用小数规范化,由于 ,因此按照定义

在这种情况下,最小最大规范化可能是一个比较好的选择,原因如下:

  • 数据集没有极端的离群值,所以使用最小最大规范化不会导致数据压缩到一个很小的区间。
  • 最小最大规范化可以很好地保留数据中的相对位置和分布情况,适合于需要保持数据原始结构的分析场景。
  • 考虑到数据的应用场景和分析目标可能会需要数据的绝对大小,最小最大规范化通过将数据映射到0到1的范围,便于后续处理和比较。

第三章

6.1

假设有数据集 上所有频繁项集的集合 ,以及每个闭频繁项集的支持度计数,给出一个算法,确定给定的项集 是否频繁,如果频繁的话,给出 的支持度

解:

输入:闭频繁项集的集合 ,每个闭频繁项集的支持度计数 ,支持度阈值 给定的项集

输出:项集 是否频繁,若频繁,给出 的支持度

算法

  • 中的频繁项集支持度递减排序,得到一个有次序的闭频繁项集的集合 ,用 表示第 个闭频繁项集和它的计数
        • 输出:项集 是频繁的,支持度为
  • 输出:项集 不是频繁的

6.2

项集 称为数据集 上的「生成元」(Generator),如果不存在真子集 使得 。生成元 是频繁的生成元,如果 满足最小支持度阈值。设 是数据集 上所有频繁的生成元的集合

  1. 仅使用 和它们的支持度计数,你能否确定项集 是否频繁,并且如果 频繁,确定 的支持度吗?如果能,给出你的算法。否则,还需要什么信息?假定有所需要的信息,你能给出一个算法吗
  2. 闭项集与生成元有何关系

解:

能否确定 的集合为频繁闭项集集合,其算法类似于上一题

项集 是闭项集,如果不存在真超项集 ,使得 具有相同的支持度计数;而如果项集 是生成元,如果不存在其真子集 ,使得 具有相同的支持度计数。可见,闭项集考察的是真超项集,生成元考察的是真子集;闭频繁项集包含了关于频繁项集的完整信息,而频繁生成元集并不包含对应的频繁项集的完整支持度信息。

6.3

Apriori 算法使用子集支持度性质的先验知识

  1. 证明频繁项集的所有非空子集一定也是频繁的
  2. 证明项集 的任意非空子集 的支持度至少与 的支持度一样大
  3. 给定频繁项集 的子集,证明规则 的置信度不可能大雨 的置信度,其中, 的子集
  4. Apriori 算法的一种变形是将事务数据库 中的事务划分成 个不重叠的分区。证明在 中频繁的项集至少在 的一个分区中是频繁的

解:

6.3.1

是一个频繁项集, 是最小支持度阈值, 是所有数据库事物,则

再假设 的非空子集,则

6.3.2

由定义

同理有

由于上一小题已经证明 ,因此得到

6.3.3

由定义

类似的有

由于已经证明 ,故得到

6.3.4

采用反证法,设想频繁项集 在事务数据库 中的每个分区都不频繁。用 表示 中的总事务数;用 表示包含频繁模式 的事务总数;用 表示最小支持度门槛;用 表示 个不重叠的分区; 表示分区 中的事务总数; 表示分区 中包含 的事务总数。

因此,总事务数 ,包含 的事务数 。鉴于 是频繁项集,因此 ,即

再考虑 在每个分区中都不频繁,因此对于任意 存在矛盾。

因此,可得出结论: 中频繁的项集至少在 的某个分区中是频繁的。

6.4

是 Apriori 算法产生的 中的一个候选项集。在剪枝步,需要检查多少个长度为 的子集?根据你的答案,你能否给出一个 Apriori 算法中 has_infrequent_subset 过程的改进版本吗?

算法如下

输入:

  • :事务数据库
  • 最小支持度阈值
    输出: 中的频繁项集

方法:

定义函数

其中

解:需要检查的个数为

6.5

6.2.2 节介绍了由频繁项集产生关联规则的方法。提出一个更有效的方法,解释它为什么比 6.2.2 中的方法更有效(提示:考虑将 6.3.b 和 6.3.c 的性质结合到你的设计中)

解:


  • -
    其中

由于它仅生成并测试必要的子集,相较于第6.2.2节中的方法,这一算法显示出更高的效率。如果某个长度为k的子集未达到最低置信度要求,那么生成其子集并进行测试便毫无意义(依据先前了解到的子集支持度的先验知识)。但若x达到了最低置信度,我们便生成并测试其k-1项子集,逐步从k项集减少至1项集。另一方面,生成频繁项集的所有非空子集然后测试它们是否存在潜在的关联规则是相当低效的,因为会产生大量不必要的自身。然而,采用此方法后,我们只生成x的k-1子集,确认没有规则满足最低置信度后,避免了生成和测试更多的子集,从而减少了大量不必要的计算(剪枝)。

第四章

8.1

简述决策树分类的主要步骤

解:

决策树是一种常用的分类和回归方法。在分类问题中,决策树通过一系列规则对数据进行分割,以达到将数据分类的目的。构建决策树的主要步骤如下:

  1. 选择最优特征:在所有的特征中选择一个最优的特征进行分割。这个选择通常基于某种统计方法,比如信息增益(ID3算法)、信息增益率(C4.5算法)或基尼不纯度(CART算法)。
  2. 分割数据集:根据选定的最优特征将数据集分割成若干个子集。这一步骤是递归进行的,每个子集可以进一步被分割。
  3. 构建节点:每次分割后,会在决策树中创建一个新的节点。如果一个分割后的子集已经纯净(即,子集中的数据属于同一个类别),这个节点就是一个叶节点,标记为对应的类别。如果子集不纯净,节点就是一个决策节点,需要进一步进行分割。
  4. 递归分割:对每个子集重复步骤1至3,直到满足停止条件。停止条件可以是树达到预设的最大深度,或者节点中的数据量少于某个阈值,或者子集已经足够纯净等。
  5. 剪枝处理:为了防止过拟合,通常需要对决策树进行剪枝。剪枝可以是预剪枝(在构建树的过程中就停止树的进一步生长)或后剪枝(在树完全生成后再去掉某些分支)。
  6. 验证模型:最后,使用独立的验证数据集对模型的有效性进行评估,确保模型具有良好的泛化能力。

这些步骤构成了决策树分类的基本流程,通过这种方式,决策树模型能够对新的数据进行有效的分类。

8.3

给定决策树,选项有

  1. 将决策树转换为规则,然后对结果规则剪枝
  2. 对决策树剪枝,然后将剪枝后的树转换为规则

相对于后者,前者的优点是什么

解:

将决策树先转换为规则集,然后对这些规则进行剪枝的方法相较于先对决策树进行剪枝再将剪枝后的树转换为规则,具有以下几个潜在的优点:

  1. 更细致的剪枝控制:将决策树转换为规则后,每条规则都独立于其他规则,这使得剪枝过程可以更加精细地针对每条规则进行优化。在树结构中,剪枝一个节点可能会影响多条路径,但在规则集中,可以单独调整每条规则而不影响其他规则。
  2. 提高规则的泛化能力:在规则级别上进行剪枝,可以针对每条规则的效能和重要性进行评估,删除或修改那些可能导致过拟合的复杂规则。这有助于提升模型的泛化能力,因为简化的规则更容易适应新的、未见过的数据。
  3. 更灵活的规则修改:直接在规则集上操作,可以根据需要更容易地添加、删除或修改规则。例如,基于对业务逻辑的了解,可以手动调整某些规则以符合特定的业务需求。
  4. 简化的规则易于理解和实施:规则剪枝后通常会变得更简洁,这使得最终的规则集更易于被业务专家理解和验证。相比之下,决策树的路径可能更难直观地解释。
  5. 更好的性能调优机会:由于每条规则都是独立处理,这为调整和优化模型性能提供了更多的机会,可以针对特定规则应用不同的标准或阈值,以达到最佳的性能。

因此,如果目标是得到一组简洁且高效的规则,那么首先将决策树转换为规则集,再对这些规则进行剪枝通常是一个更优的选择。这种方法尤其适用于那些需要严格控制决策逻辑清晰度和可解释性的场景。

8.6

为什么朴素贝叶斯分类被称为「朴素」的?简述朴素贝叶斯分类的主要思想

9.1

下表选自雇员数据库的训练数据组成。数据已泛化,例如 age 31~35 表示年龄在 31-35 之间。对于给定的行,count 表示 department, status, agesalary 在该行上具有给定值的数据元组数

department status age salary count
sales senior 31~35 46K~50K 30
sales junior 26~30 26K~30K 40
sales junior 31~35 31K~35K 40
systems junior 21~25 46K~50K 20
systems senior 31~35 66K~70K 5
systems junior 26~30 46K~50K 3
systems senior 41~45 66K~70K 3
marketing senior 36~40 46K~50K 10
marketing junior 31~35 41K~45K 4
secretary senior 46~50 36K~40K 4
secretary junior 26~30 26K~30K 6

设 status 是类标号属性

  1. 为给定数据设计一个多层前馈神经网络。标记输入层和输出层节点
  2. 给定训练实例(sales, senior, 31~35, 46K~50K),用上一题中得到的多层前馈神经网络,给出反向传播算法一次迭代后的权重。指出你使用的初始权重和偏倚以及学习率

解:设计对应的神经网络

  1. 输入层
    • 输入层需要对所有的特征进行编码。给定的特征包括department, age, salary。这些特征是分类变量和区间变量,可以使用独热编码(One-Hot Encoding)转换。
    • department(4种:sales, systems, marketing, secretary)
    • age(5个区间:21~25, 26~30, 31~35, 36~40, 41~45, 46~50)
    • salary(5个区间:26K~30K, 31K~35K, 41K~45K, 46K~50K, 66K~70K)
    • 共需要14个输入节点(4+5+5)
  2. 隐藏层
    • 设计至少一个隐藏层。具体层数和每层的节点数可以根据实际需求和实验调整。这里假设有一个隐藏层,包含10个节点。
  3. 输出层
    • status是我们要预测的类标号属性,它有两个可能的值:senior和junior。因此,输出层有2个节点,分别表示这两个分类。

假设初始权重均为 0.1,偏倚为 0.1,学习率为 0.1。按照上面的定义,输入向量为

[1,0,0,0,0,0,1,0,0,0,0,0,0,1,0]

首先进行正向传播-对于每个隐藏层节点,计算输入的加权和加上偏置,然后应用Sigmoid激活函数

得到

对于输出层,类似的有

得到

接下来进行反向更新。由于样本结果为 senjor,因此样本标签应为 [0, 1],均方误差为

进行按照梯度下降进行反向更新

依据链式法则,有

其中 ,因此

因此中间层到输出层的权重矩阵变为

进一步,对于输入层到中间层,依据链式法则,有

其中 ,而 Sigmoid 的导数为

因此

根据链式法则

对于输入[1,0,0,0,0,0,1,0,0,0,0,0,0,1,0] 更新矩阵为

新的权重为

9.5

给定最近邻数 和描述每个元组的属性数 ,写一个 -最近邻分类算法

解:

解:用伪代码标识

输入

  • 训练数据集 X_train 包含 m 个样本
  • 每个样本的标签 y_train
  • 待分类的数据集 X_test 包含 n 个样本
  • 参数 k 表示最近邻的数量

输出

  • X_test 中每个样本的预测标签

过程:

  • 初始化空列表 predicted_labels
  • 对于 X_test 中的每个样本 x:
    • 初始化空列表 distance
    • 对于 X_train 中的每个样本 x_train
      • 计算距离 d = distance(x, x_train) (常用 Euclidean 距离
      • 将距离 d 添加到 distance
    • 根据 distances 对训练样本索引进行排序,获取前 k 个最小距离的索引 k_indices
    • 根据 k_indices 获取对应的标签 k_nearest_labels
    • 统计 k_nearest_labels 中出现最多的标签,将其作为 x 的预测标签
    • 将预测标签添加到 predicted_labels
  • 返回 predicted_labels

若用 Python 编程表示

def euclidean_distance(x1, x2): 
	"""计算两个点之间的欧几里得距离""" 
	return np.sqrt(np.sum((x1 - x2) ** 2)) 
class KNN:
	def __init__(self, k=3): 
		self.k = k 
	def fit(self, X, y): 
		"""接收训练数据集及其标签""" 
		self.X_train = X 
		self.y_train = y 
	def predict(self, X): 
		"""对数据集 X 中的每个点进行分类预测""" 
		predicted_labels = [self._predict(x) for x in X] 
		return predicted_labels 
	def _predict(self, x): 
		"""对单个数据点 x 进行分类预测""" 
		# 计算距离 
		distances = [euclidean_distance(x, x_train) for x_train in self.X_train] 
		# 获取最近的 k 个样本的索引 
		k_indices = np.argsort(distances)[:self.k] 
		# 获取这些样本的标签
		k_nearest_labels = [self.y_train[i] for i in k_indices] 
		# 多数投票 
		most_common = Counter(k_nearest_labels).most_common(1) 
		return most_common[0][0]