《机器学习》(周志华)第一章课后习题参考答案

《机器学习》(周志华)第一章课后习题参考答案

1.1 求版本空间

题目:表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。
P5:与训练集一致的“假设集合”我们称之为版本空间。本题即在假设空间中搜索包含正例且不包含反例的所有假设。(详细说明见后思考)
首先,用一个六位二进制数将整个假设空间表示出来,每两位描述一个属性。前两位取01表示色泽的取值为“青绿”,10表示色泽取值为“乌黑”,11表示色泽取值为 *。后四位分别表示根蒂与敲声的取值,以此类推.注意题中只包含1和4两个样例,因此假设空间中色泽的取值范围为:* ,乌黑、青绿;根蒂的取值范围为:*,蜷缩、稍蜷;敲声的取值范围为:*,浊响、沉闷。

假设空间

序号 色泽 根蒂 敲声 二进制表示
1 * * * 111111
2 * * 浊响 111101
3 * * 沉闷 111110
4 * 蜷缩 * 110111
5 * 稍蜷 * 111011
6 青绿 * * 011111
7 乌黑 * * 101111
8 * 蜷缩 浊响 110101
9 * 蜷缩 沉闷 110110
10 * 稍蜷 浊响 111001
11 * 稍蜷 沉闷 111010
12 青绿 * 浊响 011101
13 青绿 * 沉闷 011110
14 乌黑 * 浊响 101101
15 乌黑 * 沉闷 101110
16 青绿 蜷缩 * 010111
17 青绿 稍蜷 * 011011
18 乌黑 蜷缩 * 100111
19 乌黑 稍蜷 * 101011
20 青绿 蜷缩 浊响 010101
21 青绿 蜷缩 沉闷 010110
22 青绿 稍蜷 浊响 011001
23 青绿 稍蜷 沉闷 011010
24 乌黑 蜷缩 浊响 100101
25 乌黑 蜷缩 沉闷 100110
26 乌黑 稍蜷 浊响 101001
27 乌黑 稍蜷 沉闷 101010

若两个假设的二进制表示分别为A和B,则 A | B==A ⇒ B⊂A,A&B==B ⇒ B⊂A.(任意一个等式都可以判断出假设A是否包含假设B)
设P为假设1(正例),N为假设4(反例),假设H只要满足H | P==H && H | N != H为真,那么假设H就应该被包含在版本空间内。遍历假设空间内的所有假设进行上述判断,就可以获得版本空间内的所有假设。

#include<stdio.h>

int hypo_const[27] = {
  0x3f,0x3d,0x3e,0x37,0x3b,0x1f,0x2f,0x35,0x36,0x39,0x3a,0x1d,0x1e,0x2d,0x2e,
                      0x17,0x1b,0x27,0x2b,0x15,0x16,0x19,0x1a,0x25,0x26,0x29,0x2a};

void main()
{

    int sample[2] = {
  0x15,0x2a},sum=0;
    for(int i=0;i<27;i++)
    {
        if( (hypo_const[i] | sample[1] ) != hypo_const[i] && (hypo_const[i] | sample[0]) == hypo_const[i] )  
        {
            sum++;
            printf("%x  %d\n",hypo_const[i],i+1);
        }
    }
    printf("\nsum:%d\n\n",sum);
}

求得版本空间为假设2、4、6、8、12、16、20.

版本空间

序号 色泽 根蒂 敲声 二进制表示
2 * * 浊响 111101
4 * 蜷缩 * 110111
6 青绿 * * 011111
8 * 蜷缩 浊响 110101
12 青绿 * 浊响 011101
16 青绿 蜷缩 * 010111
20 青绿 蜷缩 浊响 010101

思考:书中P5提到,版本空间的求法为遍历假设空间,不断删除与正例不一致的假设和(或)与反例一致的假设。按照我的理解,版本空间有以下3种不同的求法。

  • 删除不能包含所有正例以及包含任意反例的假设
  • 删除不能包含所有正例的假设
  • 删除包含任意反例的假设
  • 本题使用了第一种方法来求版本空间,三种求法的选择应该属于归纳偏好的范畴。

    1.2 求假设空间大小

    题目:与使用单个合取式来进行假设表示相比,使用“析合范式”将使得假设空间具有更强的表示能力。若使用最多包含k个合取式的析合范式来表达表1.1西瓜分类问题的假设空间,试估算有多少种可能的假设。
    分析:本题可以延续上一题的假设表述方法,每个合取式用一个8位二进制整数来表示,则一共有48个数待选。遍历C(48,k)种可能的选取组合,求出每种组合中k个合取式的合并结果,再去掉重复和冗余的情况,就是包含k个合取式的析合范式所能表达的假设空间大小。请注意,题目所述为“最多包含k个合取式的析合范式”,也就是说1,2,3…k个合取式组成的析合范式都满足条件,而不是仅考虑k个合取式组成的析合范式。
    难点:
    1. 假设空间太大,穷举所有组合不现实。
    2. 合取式的合并结果(析取式)如何求,如何用一个整数表示。

    先来看难点2
    前文所述的表示方法,合取式的合并算法十分低效,因此有必要定义一种新的表达方式。在48个基本假设(基本合取式)中,有2*3*3=18个叶子假设(叶子合取式):每个特征的取值都为具体值。任何合取式、析取式都可以用这18个叶子合取式的组合来表示。因此可以用一个18位的二进制整数来表示任意假设:将18个叶子合取式编号,若某假设包含序号为1的叶子合取式,则该假设第一位为1,否则第一位为0。其它位类推。在这种新的表达方式下,合并合取式(或析取式)A,B,只需作 C=A|B 的按位或运算,C即为表示A、B合并析取式的整数。(C语言按位或运算的速度非常快)
    新的表达方式下,代表每个假设整数的求法如下:
    1.将48个基本合取式的旧表达式存在数组hypo_old中
    2.将18个叶子合取式的旧表达式存在数组hypo_leaf中
    3.对hypo_old中的每个元素,循环对hypo_leaf中的18个元素xi作如下判断:若A|xi==A,则Anew中第i位为1,否则Anew中第i为为0.
    将新的表达结果(48个整数)存在hypo_const中。
    这种表达方式不仅大大提高了合并合取式算法的效率,还让我们有了一个额外发现:本题的最大假设空间大小为262143.为什么会有这个结论呢?原因就是18位二进制整数所能表示的最大范围即262143,又因为析取范式不考虑空集∅,即整数不为0,因此假设空间的大小即262143.这个结论非常重要,甚至一定程度上它就是本道题的答案(k足够大)。

    难点1
    如图所示,以k=3时为例,遍历C(48,3)中所有组合的情况实际上就是3个标记依次不断向右移动的过程。序号大的标记,总是在序号小的标记的右侧。
    组合过程
    在移动过程中,我们总是先确定标记1的位置(初始记为1),然后在标记1的右侧确定标记2的位置(初始记为1+1)……直到确定标记k的位置(初始记为k-1+1,这么写有些奇怪,原因下面会讲)。每确定完一次标记k,就形成一次组合。之后,将标记k自增,若标记k≤48,则又形成新的组合,继续自增;若标记k>48,则标记k越界,转而向前先寻找标记k-1的位置(自增),若k-1也越界(标记k-1>47),继续向前寻找标记k-2位置(自增),直到向前寻得标记k-i自增后不越界(标记k-i≤48-i),此时调转趋势,向后寻找标记k-i+1的位置(递增,值为标记k-i的值+1),直到标记k的位置(标记k-1的值+1)。
    确定方式:每个标记有两种可能的确定方式。若是从后面的标记越界返回,则改变方式为自增,若是从前面的标记顺序向下确定,则改变方式为递增(上一个标记的值+1)。额外规定:1.形成一次组合后,标记k的改变方式为自增。2.标记1的改变方式总为自增。
    优化方法:
    动态申请长度为k的一维数组poslist和hypo_process,poslist用来保存k个标记的位置,hypo_process用来保存前k个合取式合并的结果。用整数posflag来记录当前需要确定的标记序号。
    每次确定完标记poslist[posflag]后(自增并通过越界判断),则将前posflag个合取式的合并结果存进hypo_process[posflag],即hypo_process[posflag]=hypo_process[posflag-1]|hypo_const[poslist[posflag]]hypo_process[posflag]==hypo_process[posflag-1] || hypo_process[posflag]==0x3ffff&&posflag<k说明出现冗余,当前标记自增,即poslist[posflag]++,先进行越界判断,再进行上述判断。都通过后,posflag++,进而确定下一个标记的位置(递增ÿ

  • 187
    点赞
  • 604
    收藏
    觉得还不错? 一键收藏
  • 42
    评论
1. 什么是泛化能力?泛化能力和过拟合之间有什么关系? 泛化能力是指模型在新的、未见过的数据上的现能力。模型的泛化能力与其对训练数据的拟合程度有关,通常来说,过拟合的模型泛化能力较差。 2. 什么是交叉验证?交叉验证的作用是什么? 交叉验证是一种通过将数据集分成若干个子集来进行模型评估的方法。具体地,将数据集分成k个子集,每个子集都轮流作为测试集,其余子集作为训练集,重复k次,最终得到k个模型的评估结果的平均值。交叉验证的作用是提高模型评估的可靠性和泛化能力。 3. 留出法、k折交叉验证和留一法的区别是什么?它们各自适用于什么情况? 留出法是将数据集分成两部分,一部分作为训练集,另一部分作为测试集。留出法适用于数据集较大的情况。 k折交叉验证是将数据集分成k个子集,每个子集都轮流作为测试集,其余子集作为训练集,重复k次,最终得到k个模型的评估结果的平均值。k折交叉验证适用于数据集较小的情况。 留一法是k折交叉验证的一种特殊情况,即将数据集分成n个子集,每个子集都作为测试集,其余子集作为训练集,重复n次。留一法适用于数据集较小且样本数较少的情况。 4. 为什么要对数据进行预处理?数据预处理的方法有哪些? 数据预处理可以提高模型的现,并且可以减少过拟合的风险。数据预处理的方法包括:标准化、归一化、缺失值填充、特征选择、特征降维等。 5. 什么是特征选择?特征选择的方法有哪些? 特征选择是指从所有特征中选择出对模型预测结果有重要贡献的特征。特征选择的方法包括:过滤式方法、包裹式方法和嵌入式方法。其中,过滤式方法是基于特征间的关系进行特征选择,包裹式方法是基于模型的性能进行特征选择,嵌入式方法是将特征选择嵌入到模型训练中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值