其他章节答案请参考我的汇总统计学习方法答案汇总,都是自己写的。

8.1、题目太长,懒得打字了

因为训练数据实例的维度比书中的例子8.1的实例的维度大,也就是特征的数目比较多,因而需要进行特征选择。我在这里根据数据集里面数据的权重进行特征选择的,如果按照原始数据进行原则,那么除了强制排除已经选择的特征,否则每次构造决策树桩,都只能选择相同的特征进行构造决策树桩,这显然是不合理的。
直接上代码:

import numpy as np
def choose_character_by_data_weight(X,Y,w):'''该方法使用数据的每次迭代的权重来选择特征,如果不使用数据的权重的话,每次计算出的特征都是相同的,将无法构造分类树桩Parameters----------X : numpy array训练数据.Y : numpy array数据标签.w : numpy array数据的权重.Returns-------最佳的特征.'''s = np.shape(X)char_nums = s[1] ## 特征的个数## 下面开始计算H(D)class_ = list(set(Y)) ## 类别集合H_D = -sum([sum(np.where(Y == c, w, 0.0)) * np.log(sum(np.where(Y == c, w, 0.0))) for c in class_])## 下面开始计算信息增益比info_rate = []for i in range(char_nums):H_D_i = 0.0char_i = list(set(X[:, i]))for ch_i in char_i:w1 = sum(np.where(X[:, i] == ch_i, w, 0.0))for c in class_:w2 = sum(np.where((X[:,i] == ch_i) * (Y == c), w, 0.0)) / w1if w2 != 0.0:H_D_i -= w1 * w2 * np.log(w2)## 下面开始计算特征i的条件经验熵H_i_D = -sum([sum(np.where(X[:, i] == ch, w, 0.0)) * np.log(sum(np.where(X[:, i] == ch, w, 0.0))) for ch in char_i])info_rate.append((H_D - H_D_i) / H_i_D)# print('2 is :', info_rate)return info_rate.index(max(info_rate))def create_Tree(X,Y,w):#首先选择特征char = choose_character_by_data_weight(X,Y,w) ## 根据权重选择特征char_val = list(set(X[:, char])) ## 特征的取值char_val = sorted(char_val)## 下面开始确定选择特征char的取值才能是误差率最小best_tree = Nonebest_loss = 2 ** 15for i in range(len(char_val) - 1):## 只要循环特征char取值少一个就行啦tree_i = [] # 使用一个列表表示一个二叉树桩,第0个元素是选择哪个特征来进行分类,第一个元素是决策元素,第二个元素表示当小于时的类别,第三个是大于时的类别loss_i = 0ch = (char_val[i] + char_val[i + 1]) / 2 #在已经排序好的特征取值中,取两个相邻特征的中间值就可以了,将其分为两类# 下面根据数据权重计算损失并且确定决策树桩Y1 = Y[X[:, char] < ch]Y2 = Y[X[:, char] > ch]W1 = w[X[:, char] < ch]W2 = w[X[:, char] > ch]n1 = list(set(Y1))n2 = list(set(Y2))tree_i.append(char)tree_i.append(ch)if len(n1) == 1:## 此时说明只有一个类别,无需计算每个类别的损失,此时在这个子集上的分类误差是0tree_i.append(Y1[0])loss_i += 0else:## 此时说明Y1有两个类别,因为权重不是均衡的,不能按照数量的多少进行划分类别loss_1 = sum(np.where(Y1 != 1, W1, 0)) ## 类别1的损失loss_2 = sum(np.where(Y1 != -1, W1, 0)) ## 类别-1的损失if loss_1 >= loss_2:#此时说明应该取值为-1tree_i.append(-1)loss_i += loss_2else:tree_i.append(1)loss_i += loss_1if len(n2) == 1:## 此时说明只有一个类别,无需计算每个类别的损失,此时在这个子集上的分类误差是0tree_i.append(Y2[0])loss_i += 0else:## 此时说明Y1有两个类别,因为权重不是均衡的,不能按照数量的多少进行划分类别loss_1 = sum(np.where(Y2 != 1, W2, 0)) ## 类别1的损失loss_2 = sum(np.where(Y2 != -1, W2, 0)) ## 类别-1的损失if loss_1 >= loss_2:#此时说明应该取值为-1tree_i.append(-1)loss_i += loss_2else:tree_i.append(1)loss_i += loss_1if loss_i < best_loss:best_loss = loss_ibest_tree = tree_ireturn best_tree, best_lossdef boost(X,Y):init_w = np.array([0.1] * len(Y)) ## 初始的权重分类,使用原始数据训练一个决策树all_tree = [] ## 用来存储生成的决策树all_alpha = [] ## 存储每颗决策树的系数while True:tree_i, loss_i = create_Tree(X,Y,init_w) ## 生成一个决策树alpha = 0.5 * np.log((1-loss_i) / loss_i)all_tree.append(tree_i)all_alpha.append(alpha)## 下面开始计算已经得到决策树是否可以让训练的准确率足够高,这里使用完全正确分类来衡量是否跳出循环acc = 0for i in range(len(Y)):x_i = X[i,:]f = 0y_true = Y[i]for t in range(len(all_alpha)):a_t = all_alpha[t]tree_ = all_tree[t]char = tree_[0]seg = tree_[1]label_1 = tree_[2]label_2 = tree_[3]if x_i[char] < seg:f += a_t * label_1else:f += a_t * label_2acc += int(np.sign(f) == y_true)if (acc / len(Y)) == 1:return all_tree, all_alpha## 下面开始更新数据的权重for i in range(len(Y)):x_i = X[i,:]y_true = Y[i]char = tree_i[0]seg = tree_i[1]label1 = tree_i[2]label2 = tree_i[3]if x_i[char] < seg:G = label1else:G = label2init_w[i] = init_w[i] * np.exp(- alpha * y_true * G)init_w = init_w / sum(init_w)if __name__ == '__main__':X = np.array([[0,1,3],[0,3,1],[1,2,2],[1,1,3],[1,2,3],[0,1,2],[1,1,2],[1,1,1],[1,3,1],[0,2,1]])Y = np.array([-1,-1,-1,-1,-1,-1,1,1,-1,-1])tree, alpha = boost(X,Y)

2、比较支持向量机、AdaBoost、逻辑斯谛回归模型的学习策略与算法。

2.1、支持向量机的学习策略与算法

学习策略:
由目标函数函数可以看到,支持向量机的学习策略是结构风险极小化

算法有最大间隔方法、对偶算法、软间隔算法,emm,貌似对偶算法和软间隔算法是有相交关系的。

2.2、Adaboot模型的策略和算法

学习策略:经验风险极小化
学习算法:提升树算法等

2.3、逻辑斯谛回归的学习策略和算法

学习策略:经验风险极小化
算法:极大似然估计法

李航老师《统计学习方法》第八章课后习题答案相关推荐

  1. 李航 统计学习方法 第二版 课后习题答案 机器学习

    李航<统计学习方法>课后习题答案(第2版)

  2. 李航 统计学习方法 第二版 课后习题答案

    第一章 第二章 1 第二章2 第三章 第四章 1 第四章 2 第五章 1 第五章 2 第六章 第七章 1 第七章 2

  3. 统计学习方法-第二章课后习题答案整理

    2.1Minsky和Papert指出: 感知机因为是线性模型, 所以不能表示复杂的函数,如异或. 验证感知机为什么不能表示异或 参考链接: https://blog.csdn.net/yangfeis ...

  4. c语言课后答案第八章,C++第一至第八章课后习题答案

    9. 请将下列十进制数转换为二进制.八进制和十六进制数: (1) 79 (2) 127 (3) 64 (4) 512 (5) 567 (6) 128 (7) 960 (8) 100 数字 79 127 ...

  5. 【最详细】数据结构(C语言版 第2版)第八章课后习题答案 严蔚敏 等 编著

    所有章节答案合集-->传送门 1.选择题 ( 1)从未排序序列中依次取出元素与已排序序列中的元素进行比较, 将其放入已排序序 列的正确位置上的方法,这种排序方法称为() . A.归并排序 B.冒 ...

  6. 现代质量工程第五、六、八章课后习题答案

    第五章 质量控制常用技术 1.质量工程中常用的技术有哪些? 统计分析工具:老七种(分层法.调查表.排列图.因果图.直方图.散点图和控制图):新七种(关联图法.KJ法.系统图法.矩阵图法.矩阵数据分析法 ...

  7. 统计学第八版贾俊平第八章课后习题答案

    3.3一种袋装食品用生产线自动装填.每袋重量大约为50g,但由于某些原因,每袋重量不会恰好是50g.下面是随机抽取的100袋食品,测得的重量数据如表所示. 食品重量(单位:g) 要求: (1)构建这些 ...

  8. Java第八章课后习题答案

    1.String类型有什么特点? 1. 两种实例化方式: (1)String可以采用直接赋值的形式进行操作,这一点像基本数据类型的赋值操作一样. 范例:String str = "hello ...

  9. 【仅供参考】csapp第八章课后习题答案(欢迎批评指正)

    8.9 [答案] 进程对 并发? AB 否 AC 是 AD 是 BC 是 BD 是 CD 是 [解释]时间有重叠部分 8.10 [答案] setjmp:C longjmp:B execve:B for ...

最新文章

  1. JS 使用html2canvas实现截图功能的问题记录和解决方案
  2. Selenium IDE使用
  3. Python教程:import与from ... import ...的区别
  4. Object的finalize方法
  5. 移动端 c++ 开发_这 10 点值得移动端开发重点学习
  6. GlobalSign 团队与世界领先的认证机构(CAs)合作 共同加强网络安全
  7. html——原生js与jquery创建元素节点区别
  8. Swagger2-注解说明
  9. linux管理进程的数据结构,Linux 进程运行的各项指标的监测和一些管理命令的应用...
  10. 中国大学MOOC 视频字幕获取及处理方法
  11. NOIP2016普及组T1(买铅笔)题解
  12. 【论文查重】常用论文写作查重润色网站
  13. 几个冷门linux与BSD发行版中文学习论坛
  14. 经典网页设计:20个优秀的电子商务网站设计案例
  15. 微信小程序实践——实验3视频播放小程序
  16. SD SDHC SDXC
  17. QQ怎么让好友在列表里隐藏
  18. php中reset是什么意思,路由器的RESET是什么意思有什么用
  19. 怎么在pc端浏览器调试移动端页面
  20. AudioTrack过程

热门文章

  1. lucene多条件查询
  2. java发言_一次发言稿丶Java教程网-IT开发者们的技术天堂
  3. 考研计算机面试题目,计算机考研面试题目.doc
  4. tf.argmax函数说明
  5. 使用MACS2进行差异peak分析
  6. 指针铁律1:指针也是一种数据类型
  7. 擎创技术流 | Prometheus与Zabbix的融合实践
  8. 8086汇编指令笔记
  9. SSL证书错误怎么解决
  10. Voron0-150制作说明