《机器学习》周志华课后习题答案——第四章 (1-5已完结)

《机器学习》周志华课后习题答案——第四章 (1-5已完结)



一、试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为 0)的决策树.

因为决策树是通过属性来划分,相同属性的样本最终肯定会进入相同的叶节点。-个叶节点只有一个分类,如果样本属性相同而分类不同,必然产生训练误差。反之,决策树只会在当前样本集合是同一类或者所有属性相同时才会停止划分,最终得到训练误差为0的决策树。

二、试析使用“最小训练误差”作为决策树划分选择准则的缺陷.

最小训练误差并不可靠,由于过度学习样本特性导致严重的过拟合,从而没有泛化能力。

三、试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树.

伪代码如下:
输入:训练集D = {(x,y),(xm, … ym)}; .
属性集A = {a1, a2…ad}
过程:函数TreeGenerate(D, A)
1:生成结点node;
2: if D中样本全属于同一类别C then
3: 将 node标记为C类叶结点; return
4: end if
5:if A=空集 OR D中样本在A上取值相同then
6: 将node标记为叶结点,其类别标记为D中样本数最多的类; return
7:end if
8:调用信息熵函数()
9: for a的每一个值av do
10: 为node生成一个分支;令Dv表示D中在a上取值为av的样本子集;
11: if Dv为空then
12: 将分支结点标记为叶结点,其类别标记为D中样本最多的类; return
13: else
14: 以TreeGenerate(Dv, A \ {a*})为分支结点
15: end if
16: end for
输出:以node为根结点的一棵决策树

信息熵函数大致步骤:
1.根据当前杨门集合D中第K类样本所占比例算出信息熵Dv
2.不同分支节点所包含样本数不同,赋权重
3.算出信息增益

四、试编程实现基于基尼指数进行划分选择的决策树算法,为表4.2中数据生成预剪枝、后剪枝决策树,并与未剪枝决策树进行比较.

%{
   
	x:训练样本属性 连续变量直接用数值,离散变量用123区别
	y:训练样本分类值 1-2-不好
	x:测试样本属性 连续变量直接用数值,离散变量用123区别
	y:测试样本分类值 1-2-不好
	tree:生成的树形结构,用数组表示 按先根遍历编号 值为父节点编号 1为根节点
	treeleaf:标记是否为叶子节点
	treeres:每组3个变量
		1:如果是叶子节点则记录分类 如果是非叶节点记录当前节点的分类属性
		2:离散属性直接记录父节点分类的具体属性 连续属性1-小于 2-大于
		3:如果是连续属性,记录阀值,离散属性为0
ptr:节点数目累加变量
%}
global x y x_test y_test fenlei fenlei1 xigua;
global tree treeleaf treeres ptr;
%其实这样多次读取文件很慢
x = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'A1:K6');
y = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'A9:K9');
x_test = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'L1:Q6');
y_test = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'L9:Q9');
%西瓜属性的中文标识
fenlei1={
   '色泽', '根蒂', '敲声', '纹理', '脐部' ,'触感'};
fenlei={
   '青绿','蜷缩', '浊响', '清晰', '凹陷', '硬滑',;
'乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '软粘',;
'浅白', '硬挺', '清脆', '模糊', '平坦', '无',;};
xigua = {
   '好瓜','坏瓜'};
[m,n]=size(y);
[tm,tn]=size(y_test);
%set集合提前分配空间 集合中存放所有样本的编号
for i=n:-1:1
	set(i) = i;
end
#使用了一个新的函数TreeGenerate_pre和前面的TreeGenerate区分,当然主体还是一样,只是加了剪枝的计算与判断。当然还有一个TreeGenerate_aft,不过由于和TreeGenerate_pre几乎完全一样,就不贴了,会在TreeGenerate_pre里面注释
for i=tn:-1:1
	test_set(i) = i;
end

tree=zeros(1,100);
treeleaf=zeros(1,100);
treeres=cell(3,100);
ptr = 0;

%{
   
手动设置的变量:修改输入数据时要收到修改
pf:属性的编号,按顺序编号
pu:属性是连续还是离散的0-离散 1-连续
pt:属性对应的分类数,连续属性用不着(可以设为0)
%}

pf=[1 2 3 4 5 6];
pu=[0 0 0 0 0 0];
pt=[3 3 3 3 3 2];
TreeGenerate_pre(0
### 周志华机器学习》第二章课后习题答案 #### 2.10 Friedman检验中使用式(2.34)(2.35) 的区别 Friedman检验是一种非参数统计方法,适用于多组相关样本之间的差异分析。当处理多个模型在同一测试集上的性能评估时尤为有用。 - **式(2.34)** 主要用于计算各算法排名的平均值及其方差,从而构建出一个衡量不同算法之间相对表现的标准。具体来说,该公式帮助量化每种算法在整个实验中的总体表现位置[^3]。 - **式(2.35)** 则进一步利用上述得到的信息来决定是否存在显著性的差别。通过引入临界值的概念,可以据此判断所观察到的表现差距是否超出了随机波动所能解释的程度之外。如果实际计算所得的结果超过了设定好的阈值,则说明至少有两个被比较的对象间确实存在明显不同的效果。 为了更直观理解这两个公式的应用过程以及它们各自的作用: ```python import numpy as np from scipy.stats import friedmanchisquare # 示例数据:假设有三个分类器A、B、C分别在五个数据集上进行了测试 data = [ [87, 92, 85], # 数据集1上的准确率 [89, 90, 88], [91, 93, 86], [88, 91, 87], [90, 94, 89] ] chi_statistic, p_value = friedmanchisquare(*np.array(data).T) print(f"Chi-square statistic: {chi_statistic}") print(f"P-value: {p_value}") if p_value < 0.05: print("At least two classifiers have significantly different performances.") else: print("No significant difference among classifier performances.") ``` 这段Python代码展示了如何运用SciPy库执行Friedman检验,并依据返回的卡方统计量和P值做出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值