什么是数据挖掘?在你的回答中,强调以下问题:
答:数据挖掘是一种综合性技术,它结合了数据库技术、统计学、机器学习和模式识别的方法和理论,用于从大量数据中自动发现有意义的模式和知识。
数据挖掘不仅仅是一种广告宣传。 尽管在商业领域,数据挖掘技术经常被用于市场分析和客户洞察,以支持营销策略和广告宣传,但它的应用范围远远超过这些。数据挖掘在医疗、金融、生物信息学、网络安全等众多领域中都有重要应用,目的是揭示数据中隐藏的模式、趋势和关联,以支持决策制定。
数据挖掘是从数据库技术、统计学、机器学习和模式识别发展而来的综合技术,而不仅仅是简单的技术转换或应用。 数据挖掘涉及复杂的算法和方法,它们源于这些领域的深刻理解和研究。例如,从统计学中借鉴的概率模型和推断方法,从机器学习中引入的分类和回归技术,以及从模式识别中获得的特征提取和图像分析等,这些都是数据挖掘中不可或缺的组成部分。
数据挖掘既是数据库技术也是机器学习研究进化的结果,同样适用于统计学和模式识别。 从历史角度看,早期的数据库技术主要关注数据的存储、检索和管理,随着技术的发展,人们开始寻求从这些庞大的数据集中提取有价值的信息,这推动了数据挖掘技术的诞生。类似地,机器学习的研究最初关注于算法的开发,使计算机能够从数据中学习。随着时间的推移,这些算法被应用于更大规模的数据处理任务中,从而促进了数据挖掘技术的进步。统计学提供了数据分析的基本工具和理论,而模式识别的技术使得从数据中识别和分类复杂模式成为可能。这些领域的进步相互促进,共同推动了数据挖掘技术的发展。
数据仓库与数据库有何不同?它们有哪些相似之处?
答:
不同之处:
相似之处:
定义下列数据挖掘功能:特征化、区分、关联和相关性分析、分类、回归、聚类、离群点分析。使用你熟悉的现实生活中的数据库,给出每种数据挖掘功能的例子。
解:
特征化 (Characterization)
区分 (Discrimination)
关联和相关性分析 (Association and Correlation Analysis)
分类 (Classification)
回归 (Regression)
聚类 (Clustering)
离群点分析 (Outlier Detection)
解释区分和分类、特征化和聚类、分类和回归之间的区别和相似之处。
答:
区分和分类
相似之处:
区别:
特征化和聚类
相似之处:
区别:
分类和回归
相似之处:
区别:
离群点经常被当做噪声丢奔。然而, 一个人的垃圾可能是另一个人的宝贝。例如,信用卡交易中的异常可能帮助我们检测信用卡的欺诈使用。以欺诈检測为例,提出两种可以用来检測离群点的方法,并讨论哪种方法更可靠。
答:
基于统计的离群点检测方法利用统计模型来识别异常值。这些方法通常假设数据遵循某种已知的分布(例如正态分布),并将远离数据平均值的点视为离群点。例如,可以计算交易金额的平均值和标准差,然后标记那些超过平均值几个标准差的交易为异常。
基于机器学习的离群点检测方法使用算法来学习数据的正常模式,并识别出与之显著不同的异常模式。这些方法不依赖于数据的先验分布假设,可以是无监督的或是监督的
对于数据分布已知且相对简单的情况,基于统计的方法可能就足够有效。然而,鉴于信用卡交易数据的复杂性以及欺诈行为的不断进化,基于机器学习的方法通常提供更高的灵活性和更好的检测性能。
与挖掘少量数据(例如,几百个元组的数据集合)相比,挖据海量数据(例如。数 十亿个元组)的主要挑战是什么?
答:
假设所分析的数据包括属性 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
均值为
中位数是 25
众数是 25 和 35,是一个二模分布
中列数为
五数概括为
盒图表示为
“img-2024-03-28 17-51-38.png” could not be found.
分位数图提供了一种简单有效的方式来观察单一变量数据的分布情况。它首先展示了给定属性的所有数据的分布,并且提供了分位数的信息。此外,分位数-分位数图通过显示同一属性的不同样本的数据分布情况,使用户能够轻松比较这些样本之间的差异或相似性。
设给定数据集已经分组到区间,这些区间和对应频率如下所示
age | frequency |
---|---|
1-5 | 200 |
6-15 | 450 |
16-20 | 300 |
21-50 | 1500 |
51-80 | 700 |
81-110 | 44 |
计算该数据的近似中位数
解:
简要概述如何计算如下属性描述的对象的相异性
解:
对于标称属性,记
Euclidean 距离
Manhattan 距离
Minkowski 距离
数据质量可以从多方面评估,包括准确性、完整性和一致性问题。对于以上每个问题,讨论数据质量的评估如何依赖于数据的应用目的,给出例子,提出数据质量的另外两个尺度
解:
其他两个尺度是可信性和时效性。
在现实世界的数据中,某些属性上缺失值得到元组是比较常见的。讨论处理这一问题的方法。
解:常用方法有
假设所分析的数据包括属性 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
解:分箱后得到
计算每个箱的平均值得到平滑后的数据
使用该方法可以平滑数据中的噪声。
可以使用箱线图的方法,超出上下四分位数很多的点可以被认为是离群点。
平滑方法:箱中位数光滑、箱边界光滑等
讨论数据集成所需要考虑的问题
解:
如下规范化方法的值域是什么
解:
使用如下方法规范化如下数据组
min=0, max=1
,进行最小-最大规范化解:
最小-最大归一化时
系统数据 | 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.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,回答下面的问题
age
值 35 变换到 [0.0, 1.0]
区间age
值 35,其中 age
的标准差为 12.94
岁。age
值 35解,若使用最小最大归一化。
若使用
若使用小数规范化,由于
假设有数据集
解:
输入:闭频繁项集的集合
输出:项集
算法
项集
解:
能否确定
项集
Apriori 算法使用子集支持度性质的先验知识
解:
设
再假设
由定义
同理有
由于上一小题已经证明
由定义
类似的有
由于已经证明
采用反证法,设想频繁项集
因此,总事务数
再考虑
因此,可得出结论:
设 has_infrequent_subset
过程的改进版本吗?
算法如下
输入:
方法:
定义函数
其中
解:需要检查的个数为
6.2.2 节介绍了由频繁项集产生关联规则的方法。提出一个更有效的方法,解释它为什么比 6.2.2 中的方法更有效(提示:考虑将 6.3.b 和 6.3.c 的性质结合到你的设计中)
解:
由于它仅生成并测试必要的子集,相较于第6.2.2节中的方法,这一算法显示出更高的效率。如果某个长度为k的子集未达到最低置信度要求,那么生成其子集并进行测试便毫无意义(依据先前了解到的子集支持度的先验知识)。但若x达到了最低置信度,我们便生成并测试其k-1项子集,逐步从k项集减少至1项集。另一方面,生成频繁项集的所有非空子集然后测试它们是否存在潜在的关联规则是相当低效的,因为会产生大量不必要的自身。然而,采用此方法后,我们只生成x的k-1子集,确认没有规则满足最低置信度后,避免了生成和测试更多的子集,从而减少了大量不必要的计算(剪枝)。
简述决策树分类的主要步骤
解:
决策树是一种常用的分类和回归方法。在分类问题中,决策树通过一系列规则对数据进行分割,以达到将数据分类的目的。构建决策树的主要步骤如下:
这些步骤构成了决策树分类的基本流程,通过这种方式,决策树模型能够对新的数据进行有效的分类。
给定决策树,选项有
相对于后者,前者的优点是什么
解:
将决策树先转换为规则集,然后对这些规则进行剪枝的方法相较于先对决策树进行剪枝再将剪枝后的树转换为规则,具有以下几个潜在的优点:
因此,如果目标是得到一组简洁且高效的规则,那么首先将决策树转换为规则集,再对这些规则进行剪枝通常是一个更优的选择。这种方法尤其适用于那些需要严格控制决策逻辑清晰度和可解释性的场景。
为什么朴素贝叶斯分类被称为「朴素」的?简述朴素贝叶斯分类的主要思想
下表选自雇员数据库的训练数据组成。数据已泛化,例如 age 31~35
表示年龄在 31-35
之间。对于给定的行,count
表示 department
, status
, age
和 salary
在该行上具有给定值的数据元组数
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 是类标号属性
sales
, senior
, 31~35, 46K~50K),用上一题中得到的多层前馈神经网络,给出反向传播算法一次迭代后的权重。指出你使用的初始权重和偏倚以及学习率解:设计对应的神经网络
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)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]
,均方误差为
进行按照梯度下降进行反向更新
依据链式法则,有
其中
因此中间层到输出层的权重矩阵变为
进一步,对于输入层到中间层,依据链式法则,有
因此
根据链式法则
对于输入[1,0,0,0,0,0,1,0,0,0,0,0,0,1,0]
更新矩阵为
新的权重为
给定最近邻数
解:
解:用伪代码标识
输入
输出
过程:
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
若用 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]