table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
34、写一篇文章,总结较窄置信区间与可能需要购买昂贵测试样本之间的权衡。
在机器学习评估中,较窄的置信区间和购买昂贵测试样本之间存在着明显的权衡关系。
较窄的置信区间
能够提供更精确的估计,让我们对分类器性能有更准确的了解。这意味着我们可以更有信心地判断分类器是否达到预期效果,从而做出更可靠的决策。
然而,要获得较窄的置信区间,往往需要更多的数据:
获取这些数据可能意味着
购买昂贵的测试样本
,这会增加成本,尤其是当数据收集、标注等过程复杂且昂贵时。
对于资源有限的项目来说,这可能是一个难以承受的负担。
此外:
即使投入大量资金购买了测试样本,也不能保证一定能获得理想的较窄置信区间。
数据质量、分布等因素
也会影响置信区间的宽度。
因此,在实际应用中,需要综合考虑项目的需求、预算和目标:
如果对分类器性能的精确评估至关重要,且项目有足够的资金支持,那么可以考虑购买更多的测试样本以获得较窄的置信区间。
但如果预算有限,或者对性能估计的精度要求不是极高,那么可以适当放宽对置信区间宽度的要求,采用更经济的方式进行评估。
35、说明在使用二元关联原则时,辅助训练集将如何创建。
对于第i个类别(i ∈ [1, N]),创建一个训练集 $ T_i $,它包含与原始训练集 $ T $ 相同的示例,唯一的区别在于标签。
在 $ T_i $ 中,如果示例在 $ T $ 中的类别标签列表包含 $ C_i $,则该示例的类别标签为 1;否则,标签为 0。
创建新训练集后,对每个训练集应用一个基线学习器来诱导单个分类器,通常对每个 $ T_i $ 使用相同的基线学习器,如感知机学习、决策树归纳等机器学习技术。
36、对于同一个训练集,为类别聚合创建辅助训练集,需要多少个这样的训练集?
需要的辅助训练集数量取决于原训练集中实际出现的类别组合数量。
例如,在一个有三个类别的领域中,理论上类别标签组合总数不超过七个,但实际的训练集 $ T $ 中仅遇到五种组合,所以需要创建五个训练集,且该方法仅处理原训练集中出现过的组合。
37、为包含以下四个类别(决策树、机器学习、分类和剪枝)的领域提出分类器链模式。
分类器链模式
分类器链模式需按类别依赖关系排序构建分类器链。顺序如下:
机器学习
分类
决策树
剪枝
构建流程:
首先基于数据构建预测“机器学习”类别的分类器。
“机器学习”的输出作为特征输入到预测“分类”类别的分类器。
“分类”的预测结果又作为特征输入到预测“决策树”的分类器。
最后,“决策树”的预测结果作为特征输入到预测“剪枝”的分类器。
38、考虑一个领域,其中大多数训练示例每个仅标记有一个类别,而一小部分示例(例如5%)标记有多个类别。请提出一种从这些数据中归纳可靠分类器的机器学习方法。
可以采用二元关联方法,为每个类别分别归纳一个二元分类器,然后并行使用这些分类器。更高级的版本可以通过利用类别之间的相互关系来提高分类性能,还可以采用类别聚合机制。
39、假设你有理由认为少数类别之间存在很强的相互依赖关系,而其余大多数类别相互独立。你正在考虑使用堆叠法。什么问题可能会影响所诱导分类器的性能?你能提出一种克服这个陷阱的方法吗?
问题:
若坚持在相互独立的类别间建立依赖关系,新添加的属性可能无关紧要,从而损害归纳效果,影响分类器性能。
方法:
选择能够消除无关属性的基线学习器,如决策树或 WINNOW,以此减轻问题。
40、请提出一种机制,以缓解在具有层次结构类别的多标签归纳过程中的误差传播问题。提示:在测试运行后,考虑用‘有问题的’示例来‘丰富’训练集。
在测试运行后,将‘有问题的’示例加入到训练集中,以此‘丰富’训练集,从而缓解误差传播问题。
41、解释将属性向量归一化为单位长度与将各个属性归一化到单位区间[0, 1]之间的区别。
将属性向量归一化为单位长度,是把向量中每个属性值除以原属性向量的长度,使新向量长度为1,常用于SOFM中神经元权重初始化等场景。
而将各个属性归一化到单位区间[0, 1],是通过找出属性的最大值和最小值,用每个属性值减去最小值再除以最大值与最小值的差,使属性值都落在[0, 1]内,可解决一些与尺度相关的问题。
42、开发一种机器学习方法,该方法首先使用聚类分析技术对训练示例进行预处理,然后将其用于分类目的。
以下是开发这种机器学习方法的步骤:
数据收集
:收集用于训练的示例数据,这些数据可以是任何类型,如文本、图像、数值等。
聚类分析
:对收集到的训练示例进行聚类分析,将相似的示例归为一组。
– 聚类分析的输入是一组由属性值向量描述但无类别标签的示例。
– 输出是由这些示例形成的两个或更多的簇。
– 可以使用如 k-means 算法、层次聚合等方法进行聚类。
特征提取
:从每个簇中提取有用的特征。
– 例如,每个簇可以由一组不同的相关属性来标记,了解这些属性有助于预测未知属性值。
分类器训练
:利用聚类得到的簇和提取的特征来训练分类器。
– 例如,簇的质心可以作为贝叶斯分类器的高斯中心,或用于定义径向基函数(RBF)网络中的神经元。
分类应用
:使用训练好的分类器对新的数据进行分类,将新数据划分到相应的类别中。
评估与优化
:使用评估指标(如准确率、召回率等)评估分类器的性能,并根据评估结果对方法进行优化。
– 例如调整聚类参数、更换分类算法等。
43、编写一个程序,判断一对(通过 k – 均值算法得到的)聚类是否应该合并。最简单的方法是将这两个聚类之间的距离与给定聚类集合中聚类间的平均距离进行比较。
以下是一个Python示例程序,用于判断一对聚类是否应该合并。该程序首先计算所有聚类对之间的距离,然后计算平均聚类间距离,最后比较给定聚类对的距离与平均距离,若小于平均距离则应合并。
import numpy as np
from scipy.spatial.distance import euclidean
def calculate_centroid(cluster):
return np.mean(cluster, axis=0)
def calculate_cluster_distances(clusters):
num_clusters = len(clusters)
distances = []
for i in range(num_clusters):
centroid_i = calculate_centroid(clusters[i])
for j in range(i + 1, num_clusters):
centroid_j = calculate_centroid(clusters[j])
distance = euclidean(centroid_i, centroid_j)
distances.append(distance)
return distances
def should_merge(clusters, cluster_index_1, cluster_index_2):
distances = calculate_cluster_distances(clusters)
average_distance = np.mean(distances)
centroid_1 = calculate_centroid(clusters[cluster_index_1])
centroid_2 = calculate_centroid(clusters[cluster_index_2])
pair_distance = euclidean(centroid_1, centroid_2)
return pair_distance < average_distance
# 示例使用
clusters = [
np.array([[1, 2], [2, 3], [1, 3]]),
np.array([[4, 5], [5, 6], [4, 6]]),
np.array([[7, 8], [8, 9], [7, 9]])
]
cluster_index_1 = 0
cluster_index_2 = 1
if should_merge(clusters, cluster_index_1, cluster_index_2):
print("这对聚类应该合并。")
else:
print("这对聚类不应该合并。")
在这个程序中,
calculate_centroid
函数用于计算一个聚类的质心,
calculate_cluster_distances
函数用于计算所有聚类对之间的距离,
should_merge
函数用于判断给定的聚类对是否应该合并。最后,通过示例数据调用
should_merge
函数并输出结果。
44、假设输入图像由一个28×28像素的矩阵表示。假设将这784个特征输入到一层,该层有八个5×5的卷积核,采用有效填充(valid padding),水平步长Sx = 2,垂直步长sy = 2。这一层的输出数量是多少?
对于采用有效填充的卷积操作,输出矩阵的尺寸计算公式为:
Outputsize=Inputsize−KernelsizeStride+1Outputsize=Inputsize−KernelsizeStride+1
水平方向:
28−52+1=1228−52+1=12
垂直方向同理也是 12。
每个卷积核会产生一个 12×12 的输出矩阵,一共有 8 个卷积核,所以输出数量为:
12×12×8=115212×12×8=1152
45、说明对一组数据应用平均池化会发生什么
平均池化与最大池化的区别在于,它不是取给定方块中的最大值,而是计算
平均值
。
例如,对于一组数据中左上角的方块,其平均值(四舍五入到整数)为:
(534+604+601+508)/4=562(534+604+601+508)/4=562
该值并非仅取决于单个最大值,而是受方块中
所有数字的影响
。
46、在进行折扣计算时,奖励 rk = 1 通过公式 R = γ ^k * rk 进行缩减,其中 k 是从行动到目标所采取的步数。假设 γ = 0.8,R 降至 0.01 以下需要多少步 k?
本题可根据公式 $ R = gamma^k imes r_k $ 来计算 $ k $ 的值。已知 $ r_k = 1 $,$ gamma = 0.8 $,要使 $ R < 0.01 $,即 $ 0.8^k < 0.01 $。
对不等式两边取以 10 为底的对数可得:
klg0.8<lg0.01klg0.8<lg0.01
因为 $ lg 0.8 < 0 $,所以:
k>lg0.01lg0.8k>lg0.01lg0.8
其中,$ lg 0.01 = -2 $,$ lg 0.8 approx -0.0969 $,则:
k>−2−0.0969≈20.64k>−2−0.0969≈20.64
由于 $ k $ 为步数,必须为整数,因此 $ k $ 至少为
21
步。
47、在使用 ϵ – 贪心和软最大值策略时,这些策略的局限性是什么?你能提出一种克服这些局限性的方法吗?
贪心策略的局限性在于,当 ϵ 值较高时,若当前认为的最佳行动正确,智能体仍会在一定比例的试验中选择次优行动;当 ϵ 值较低时,若对最佳行动的假设错误,探索不足可能导致难以发现真正的最佳行动。
软最大值策略中,若 z < 1,最佳行动被赋予最小概率,不符合需求。
克服方法:
对于 ϵ – 贪心策略,在实验初期,当“当前最佳”行动较随意时,采用较高的 ϵ 值进行频繁探索,后期有足够证据后降低 ϵ 值;
对于软最大值策略,始终选择 z > 1。
48、强化学习的原理已经通过简单的玩具领域进行了解释。你能想出一个有趣的现实世界应用吗?你将如何对其进行表述,以便可以使用强化学习?
一个有趣的现实世界应用是
自动驾驶汽车
。为了使用强化学习来解决这个问题,可以这样表述:
状态定义
:车辆的速度、加速度、方向盘角度、与周围物体的距离、交通信号状态等。
动作定义
:加速、减速、左转、右转、保持当前状态等。
奖励设计
:主要目标是安全、高效地到达目的地。如果成功到达目的地且没有发生碰撞,给予正奖励;如果发生碰撞或违反交通规则,给予负奖励;行驶速度接近最佳速度、合理利用道路资源等情况也可给予一定正奖励。
环境模拟
:在模拟环境中,加入各种交通场景,如不同的道路状况、天气条件、其他车辆和行人的随机行为等,让自动驾驶系统在模拟中学习。
训练过程
:从初始状态开始,智能体根据当前状态选择一个动作,环境根据动作反馈下一个状态和奖励,智能体根据奖励更新策略,不断重复这个过程,直到达到目标或满足终止条件。然后开始新的一轮训练,逐渐优化策略。
49、计算井字棋示例的状态 – 动作对的数量。在4×4棋盘的情况下有多少个状态?
对于井字棋示例,状态 – 动作对数量:
先手玩家有9个位置可放
对手有8个位置
不同动作总数上限是9的阶乘,即
$ 9! = 362880 $ 个
4×4棋盘状态数量:
第一个玩家有16个位置可放
第二个玩家有15个位置,以此类推
状态数量上限为16的阶乘,即
$ 16! = 20922789888000 $ 个
50、考虑一个简单迷宫。假设所有状态的值都初始化为V(si) = 0。进一步假设,目标状态的即时奖励为1,其他任何状态的即时奖励为0。在智能体的第一次随机游走过程中,各个状态的V值将如何更新?使用公式V(st) = V(st) + α[rt + γV(st + 1) – V(st)]进行值更新。
在智能体第一次随机游走时,设智能体在时间 $ t $ 处于状态 $ s_t $,选择动作后到达状态 $ s_{t+1} $ 并获得即时奖励 $ r_t $。
根据以下公式进行更新:
奖励计算公式:
R=rt+γV(st+1)R=rt+γV(st+1)
状态值函数更新公式:
V(st)=V(st)+α[rt+γV(st+1)−V(st)]V(st)=V(st)+α[rt+γV(st+1)−V(st)]
具体更新情况如下:
若 $ s_t $
不是
目标状态,则 $ r_t = 0 $,此时 $ V(s_t) $ 的更新取决于 $ gamma V(s_{t+1}) $。
若 $ s_t $ 是目标状态,则 $ r_t = 1 $,此时:
V(st)=V(st)+α(1−V(st))V(st)=V(st)+α(1−V(st))
典型参数取值范围:
折扣因子 $ gamma in (0.8, 1) $
学习率 $ alpha in (0.05, 0.15) $
随着游走进行,靠近目标状态的状态值函数 $ V $ 会逐渐增大。
51、使用 SARSA 和 Q – learning 进行强化学习的 Q 值更新练习。请说明这两种算法更新 Q 值的公式,并给出重复练习时进行 Q 值更新的具体步骤。
Q 值更新公式与步骤
更新公式
SARSA
更新 Q 值的公式为:
Q(st,at)=Q(st,at)+α[rt+γQ(st+1,at+1)−Q(st,at)]Q(st,at)=Q(st,at)+α[rt+γQ(st+1,at+1)−Q(st,at)]
Q-learning
更新 Q 值的公式为:
Q(st,at)=Q(st,at)+α[rt+γmaxaQ(st+1,a)−Q(st,at)]Q(st,at)=Q(st,at)+α[rt+γmaxaQ(st+1,a)−Q(st,at)]
更新步骤
设置 $ t = 0 $,确定初始状态 $ s_0 = S $。
对 $ s_t $ 应用由用户指定策略选择的动作 $ a_t $。
观察新状态 $ s_{t+1} $ 和奖励 $ r_t $。
对于 SARSA:
– 在新状态 $ s_{t+1} $ 中,使用用户指定策略选择动作 $ a_{t+1} $;
对于 Q-learning:
– 在新状态 $ s_{t+1} $ 中,选择最佳动作。
– 根据对应公式更新值。
如果 $ s = G $,转到步骤 1 开始新的回合;否则,将 $ t $ 加 1,转到步骤 2。
52、假设一个马尔可夫过程由以下状态转移概率和初始状态概率定义:状态转移矩阵A = [[0.7, 0.3], [0.2, 0.8]],初始状态概率向量π = [0.4, 0.6]。索引0对应的状态是x,索引1对应的状态是y。那么系统在t = 1时刻处于状态y的概率是多少?
系统在 $ t = 1 $ 时刻处于状态 $ y $ 的概率可根据公式
P(s1=Y)=P(Y|X)⋅P(X)+P(Y|Y)⋅P(Y)P(s1=Y)=P(Y|X)⋅P(X)+P(Y|Y)⋅P(Y)
计算。
其中
– $ P(X) = 0.4 $
– $ P(Y) = 0.6 $
– $ P(Y|X) = 0.3 $
– $ P(Y|Y) = 0.8 $
代入可得
P(s1=Y)=0.3×0.4+0.8×0.6=0.12+0.48=0.6P(s1=Y)=0.3×0.4+0.8×0.6=0.12+0.48=0.6
所以系统在 $ t = 1 $ 时刻处于状态 $ y $ 的概率是
0.6
。
53、请给出一个可以使用隐马尔可夫模型(HMM)形式化方法进行分析的系统示例。该系统的状态和观测值是什么?系统可以从哪些状态和观测值序列中学习?
以股票市场为例,系统的状态可分为
牛市
、
熊市
和
震荡市
。
观测值可以是每日的股票成交量(
高
、
中
、
低
)。
系统可以学习的状态序列如:
牛市 -> 震荡市 -> 熊市
对应的观测值序列可能是:
高成交量 -> 中成交量 -> 低成交量
系统通过分析这些序列,可对未来股票市场状态和成交量情况进行预测。
54、在隐马尔可夫模型(HMM)第三个问题的求解的最大化步骤中,会使用特定公式更新A矩阵和B矩阵的值。请用文字解释为什么这些公式确实有助于改进这两个矩阵的内容。
在最大化步骤中,更新A矩阵和B矩阵是为了让模型更好地符合观测数据。
对于A矩阵:
相关公式中的分子是从状态qi到状态qj的观测转移次数。
分母是系统处于状态qi的次数。
这样计算出的ai,j能反映出在当前观测下,从状态qi转移到状态qj的实际概率,使转移概率更贴合观测数据,从而改进A矩阵。
对于B矩阵:
相关公式的分子是观测为Ok且系统处于状态j的γ值之和。
分母是所有γ值之和。
该公式通过计算在状态j下观测到Ok的相对频率,来更新bi(Oj),也就是在状态i下看到Oj的概率,让B矩阵中的概率更符合实际观测,进而改进B矩阵。
55、为解决隐马尔可夫模型(HMM)第三个问题的算法建议一个停止准则(不仅仅是预先指定的迭代次数)。
当$ P(O|lambda) $不再增加时停止算法,即若在某次迭代中$ P(O|lambda) $未增加,则停止;若$ P(O|lambda) $增加,则继续迭代。
56、考虑一个由 λ = (A, B, π) 描述的隐马尔可夫模型(HMM)。编写一个程序,针对给定的观测序列计算所有的 α 值和 β 值。其中,A 是状态转移概率矩阵,B 是观测概率矩阵,π 是初始状态概率向量,观测序列用 O 表示,状态个数为 N,观测序列长度为 T。
以下是计算 α 值和 β 值的步骤及思路,可根据此编写程序:
计算 α 值(前向算法)
对于所有状态 $ q_i $,在初始时间步 $ t = 0 $ 计算 $ alpha_0(i) $:
α0(i)=πi⋅bi(O0)α0(i)=πi⋅bi(O0)
其中 $ pi_i $ 是初始状态概率向量 $ pi $ 中的第 $ i $ 个元素,$ b_i(O_0) $ 是观测概率矩阵 $ B $ 中第 $ i $ 行对应观测序列 $ O $ 中第 0 个观测值的概率。
对于其余时间步 $ t = 1, …, T – 1 $,以及所有状态 $ q_i $,通过以下公式递归计算 $ alpha_t(i) $:
αt(i)=[∑j=0N−1αt−1(j)⋅aj,i]⋅bi(Ot)αt(i)=[∑j=0N−1αt−1(j)⋅aj,i]⋅bi(Ot)
其中 $ a_{j,i} $ 是状态转移概率矩阵 $ A $ 中第 $ j $ 行第 $ i $ 列的元素。
计算 β 值(后向算法)
初始化最后一个时间步 $ T – 1 $ 的 $ eta $ 值:
βT−1(i)=1βT−1(i)=1
从 $ T – 2 $ 时间步开始,递归计算 $ eta_t(i) $:
βt(i)=∑j=0N−1ai,j⋅bj(Ot+1)⋅βt+1(j)βt(i)=∑j=0N−1ai,j⋅bj(Ot+1)⋅βt+1(j)
直到计算到所需的时间步,其中 $ a_{i,j} $ 是状态转移概率矩阵 $ A $ 中第 $ i $ 行第 $ j $ 列的元素,$ b_j(O_{t+1}) $ 是观测概率矩阵 $ B $ 中第 $ j $ 行对应观测序列 $ O $ 中第 $ t + 1 $ 个观测值的概率。
57、手动模拟遗传算法。选择一个适应度函数,确定不同的初始种群,随机选择单点交叉位置,模拟遗传算法过程。之后,使用两点交叉,随机确定两个交叉位置,重复模拟过程。记录各步骤的数据,如种群个体的二进制表示、对应十进制值、适应度函数值、生存概率、选择次数等。
遗传算法模拟步骤
本题需手动模拟遗传算法,步骤如下:
选择适应度函数
首先,选择一个适应度函数。
确定初始种群
确定不同的初始种群。
单点交叉模拟
– 随机选择交叉位置。
– 模拟遗传算法过程。
两点交叉模拟
– 同样随机确定两个交叉位置。
– 重复模拟过程。
数据记录
记录各步骤的数据,包括:
– 种群个体的二进制表示
– 对应十进制值
– 适应度函数值
– 生存概率
– 选择次数
58、列举自然进化及其计算机模型之间的一些差异。推测是否能从自然界获得更多灵感。
差异方面,计算机程序不必复制生物学,可摒弃生物世界的一些限制,如允许部分个体‘永生’;
在基础版本中,新染色体仅通过重组或突变等操作产生,个体一生染色体不变,而拉马克提出进化可能由个体需求驱动,即个体获得的特征可遗传给后代,这与计算机模型不同。
关于从自然界获取灵感:
自然界有许多复杂且精妙的进化机制和现象,计算机模型虽可进行创新和突破,但自然界仍有大量未知和独特的模式,所以很有可能从中获得更多灵感。例如:
自然界生物的群体协作
适应环境的方式
这些都可能为计算机模型提供新的思路和方法。
59、从UCI库中选择一个足够大的数据集。留出30%的样本用于测试。对于训练,分别使用剩余样本的10%、20%……70%。绘制一个图表,其中横轴表示用于学习的样本数量,纵轴表示归纳所花费的计算时间。再绘制另一个图表,其中纵轴表示测试集上的错误率。讨论结果。
随着用于学习的样本数量增加,计算时间可能会上升,因为需要处理更多数据;而测试集上的错误率可能会先下降,因为更多数据能让模型学习到更全面的特征,但当样本数量增加到一定程度,错误率可能趋于稳定,因为模型已经充分学习到数据的特征,继续增加数据可能不会带来显著的性能提升。
60、编写一个程序,将顺序覆盖算法应用于用谓词演算描述的示例。
编写这样的程序可按以下步骤:
先理解顺序覆盖算法和谓词演算的原理
定义谓词和示例的表示方式
实现顺序覆盖算法的核心逻辑,包括规则生成、规则特化等
将算法应用到谓词演算描述的示例上
可使用 Python、Java 等语言实现,在实现过程中要处理好谓词的逻辑关系和示例的匹配