环境:PyCharm Professional 2019.1 + Python 3.7 + win 10

一共三个属性,分别有 2, 3 , 3 个属性值。假设空间规模 3 × 4 × 4 + 1 = 49 。去除空还剩 48,其中不含通配符的假设有 2 × 3 × 3 = 18 个。其余假设均可以由不含通配符的假设析取获得。
由递归和迭代两种方式实现求解,其中递归方式更容易理解

递归方式:

#!/use/bin/env python3
# -*- coding: utf-8 -*-
import time# 所有假设映射为二进制,三种属性,属性值分别为 2 3 3 个,故可以用 8 位二进制位表示
hypo_old = [0xff, 0xf9, 0xfa, 0xfc, 0xcf, 0xd7, 0xe7, 0x7f,0xbf, 0xc9, 0xca, 0xcc, 0xd1, 0xd2, 0xd4, 0xe1,0xe2, 0xe4, 0x79, 0x7a, 0x7c, 0xb9, 0xba, 0xbc,0x4f, 0x57, 0x67, 0x8f, 0x97, 0xa7, 0x49, 0x4a,0x4c, 0x51, 0x52, 0x54, 0x61, 0x62, 0x64, 0x89,0x8a, 0x8c, 0x91, 0x92, 0x94, 0xa1, 0xa2, 0xa4]# 不含有通配符的假设映射为二进制
hypo_leaf = [0x49, 0x4a,0x4c, 0x51, 0x52, 0x54, 0x61, 0x62, 0x64, 0x89,0x8a, 0x8c, 0x91, 0x92, 0x94, 0xa1, 0xa2, 0xa4]# 每个假设可以由哪些不含通配符的假设构成
hypo_const = []
for i in range(48):hypo_const.append(0)
# print(hypo_const)
# print(len(hypo_const))# 一共十八个不含通配符的假设,用十八位来表示
new_leaf = [0x20000, 0x10000,0x08000, 0x04000, 0x02000, 0x01000,0x00800, 0x00400, 0x00200, 0x00100,0x00080, 0x00040, 0x00020, 0x00010,0x00008, 0x00004, 0x00002, 0x00001]n_count = 0
n_n = 48# 假设应当选取的个数,假设的析取是否出现,当前选取假设的个数,当前析取的结果,当前开始的下标
def count(n_k: int, hypo_appear: list, cur_k: int, cur_process: int, begin: int):# 找够 k 个假设if n_k == cur_k:# 如果不重复,n_count 加一global n_countif hypo_appear[cur_process] == 0:n_count += 1hypo_appear[cur_process] = 1pass# print('count', ' ', n_count)# input('next')return# 越界检查,防止越界,这里用不到# if begin == n_n:#     returnfor i in range(begin, n_n):tmp = cur_process | hypo_const[i]# 如果相等说明 hypo_const[i],对于最终析取的结果没有影响,可以去掉,# 则成为了 n_k - 1 个假设构成的析取,(已经求过了)故剪枝剪掉if tmp == cur_process:continuepass# print(i, end=' ')count(n_k, hypo_appear, cur_k+1, tmp, i+1)passreturnif __name__ == '__main__':# 计算每个假设是由哪几个不含通配符的假设构成的for i in range(48):for j in range(18):if hypo_old[i] | hypo_leaf[j] == hypo_old[i]:hypo_const[i] = hypo_const[i] | new_leaf[j]for x in hypo_const:print(x)change = 0hypo_appear = []for i in range(262144):hypo_appear.append(0)start_time = time.time()for i in range(1, 19):# print(i, end=' ')# 假设应当选取的个数,假设的析取是否出现,当前选取假设的个数,当前析取的结果,当前开始的下标count(i, hypo_appear, 0, 0, 0)print('length% -2d : %-10d' % (i, n_count))passend_time = time.time()print('处理时间:')print(end_time - start_time, ' ', 's')pass

运行结果如下,其中运行时间为 172.41316294670105 秒
length 1 : 48
length 2 : 897
length 3 : 8385
length 4 : 41742
length 5 : 115821
length 6 : 201303
length 7 : 248853
length 8 : 260787
length 9 : 262143
length 10 : 262143
length 11 : 262143
length 12 : 262143
length 13 : 262143
length 14 : 262143
length 15 : 262143
length 16 : 262143
length 17 : 262143
length 18 : 262143
处理时间:
172.41316294670105 s

迭代方式:

#!/use/bin/env python3
# -*- coding: utf-8 -*-
import time
# 所有假设映射为二进制
hypo_old = [0xff, 0xf9, 0xfa, 0xfc, 0xcf, 0xd7, 0xe7, 0x7f,0xbf, 0xc9, 0xca, 0xcc, 0xd1, 0xd2, 0xd4, 0xe1,0xe2, 0xe4, 0x79, 0x7a, 0x7c, 0xb9, 0xba, 0xbc,0x4f, 0x57, 0x67, 0x8f, 0x97, 0xa7, 0x49, 0x4a,0x4c, 0x51, 0x52, 0x54, 0x61, 0x62, 0x64, 0x89,0x8a, 0x8c, 0x91, 0x92, 0x94, 0xa1, 0xa2, 0xa4]# 不含有通配符的假设映射为二进制
hypo_leaf = [0x49, 0x4a,0x4c, 0x51, 0x52, 0x54, 0x61, 0x62, 0x64, 0x89,0x8a, 0x8c, 0x91, 0x92, 0x94, 0xa1, 0xa2, 0xa4]# 每个假设可以由哪些不含通配符的假设构成
hypo_const = []
for i in range(48):hypo_const.append(0)
# print(hypo_const)
# print(len(hypo_const))# 一共十八个不含通配符的假设,用十八位来表示
new_leaf = [0x20000, 0x10000,0x08000, 0x04000, 0x02000, 0x01000,0x00800, 0x00400, 0x00200, 0x00100,0x00080, 0x00040, 0x00020, 0x00010,0x00008, 0x00004, 0x00002, 0x00001]
n_count = 0
n_n = 48def count(n_n: int, n_k: int, hypo_appear: list):global n_count# 记录选取的假设的位置pos_list = []# 记录前 i 项假设由哪几个不含通配符的假设析取得到hypo_process = []# 初始化for i in range(n_k):pos_list.append(-1)hypo_process.append(0)# print(i)pass# 已经析取的假设的个数pos_index = 0# 当第一个假设选取的位置超过 n_n - n_k 时,一定选不够 n_k 个假设了while pos_list[0] <= n_n - n_k:# 如果是第一个假设if pos_index == 0:pos_list[pos_index] += 1# print(pos_index, ' ', pos_list[pos_index])# 第一个假设选取的位置超过 n_n - n_k,一定选不够 n_k 个假设了if pos_list[pos_index] > n_n - n_k:breakpass# 直接赋值hypo_process[pos_index] = hypo_const[pos_list[pos_index]]# 如果提前到达了 0x3ffff 跳过此轮if hypo_process[pos_index] == 0x3ffff and pos_index < n_k - 1:continuepass# 否则,选取下一个假设,标记一下现在是上升趋势else:pos_index += 1trend = 1  # 上升趋势passpasselse:# 是上升趋势if trend == 1:# 从前一个假设所在位置的下一个开始继续选取pos_list[pos_index] = pos_list[pos_index - 1] + 1pass# 不是上升趋势else:# 自增,pos_list[pos_index] += 1pass# 选取的假设,使后续假设个数不够,则回退,上升趋势标记为 0if pos_list[pos_index] > n_n - n_k + pos_index:pos_index -= 1trend = 0continuepass# 析取上当前假设hypo_process[pos_index] = hypo_process[pos_index - 1] | hypo_const[pos_list[pos_index]]# 提前到达 0x3ffff ,跳过此轮if hypo_process[pos_index] == hypo_process[pos_index - 1] or \(hypo_process[pos_index] == 0x3ffff and pos_index < n_k - 1):trend = 0continuepasspos_index += 1trend = 1pass# 选够 n_k 个假设if pos_index == n_k:pos_index -= 1trend = 0if hypo_appear[hypo_process[pos_index]] == 0:hypo_appear[hypo_process[pos_index]] = 1n_count += 1passpasspassreturnif __name__ == '__main__':# 计算每个假设是由哪几个不含通配符的假设构成的for i in range(48):for j in range(18):if hypo_old[i] | hypo_leaf[j] == hypo_old[i]:hypo_const[i] = hypo_const[i] | new_leaf[j]print('hypo_const : ')for x in hypo_const:print(x)change = 0hypo_appear = []for i in range(262144):hypo_appear.append(0)start_time = time.time()for i in range(1, 19):# print(i, end=' ')# 总假设个数,需要的个数,记录总数,是否出现count(48, i, hypo_appear)print('length %-2d : %-10d' % (i, n_count))passend_time = time.time()print('处理时间:')print(end_time - start_time, ' ', 's')pass

运行结果如下,其中运行时间为 193.14354753494263 秒
length 1 : 48
length 2 : 897
length 3 : 8385
length 4 : 41742
length 5 : 115821
length 6 : 201303
length 7 : 248853
length 8 : 260787
length 9 : 262143
length 10 : 262143
length 11 : 262143
length 12 : 262143
length 13 : 262143
length 14 : 262143
length 15 : 262143
length 16 : 262143
length 17 : 262143
length 18 : 262143
处理时间:
193.14354753494263 s

周志华《机器学习》习题1.2相关推荐

  1. 周志华-机器学习西瓜书-第三章习题3.3 编程实现对率回归

    本文为周志华机器学习西瓜书第三章课后习题3.3答案,编程实现对率回归,数据集为书本第89页的数据 使用tensorflow实现过程 # coding=utf-8 import tensorflow a ...

  2. 《机器学习》周志华课后习题答案——第一章(1-3题完结)

    <机器学习>周志华课后习题答案--第一章 文章目录 <机器学习>周志华课后习题答案--第一章 一.表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间 二.与使用单个 ...

  3. 《机器学习》周志华课后习题答案——第三章 (1-7题)

    <机器学习>周志华课后习题答案--第三章 (1-7题) 文章目录 <机器学习>周志华课后习题答案--第三章 (1-7题) 一.试析在什么情形下式(3.2)中不必考虑偏置项b. ...

  4. 机器学习 周志华 课后习题3.5 线性判别分析LDA

    机器学习 周志华 课后习题3.5 线性判别分析LDA 照着书上敲了敲啥都不会,雀食折磨 python代码 # coding=UTF-8 from numpy import * # 我安装numpy的时 ...

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

    <机器学习>周志华课后习题答案---第五章 (1-2已完结) 文章目录 <机器学习>周志华课后习题答案---第五章 (1-2已完结) 一.如图所示 二.如图所示 一.如图所示 ...

  6. 周志华机器学习(6):支持向量机

    周志华机器学习(6):支持向量机 6 支持向量机 6.1 间隔与支持向量 6.2 对偶问题(dual problem) 6.3 核函数 6.4 软间隔与正则化 基本是大段摘录西瓜书加上一些自己的解释补 ...

  7. 周志华机器学习--绪论

    周志华机器学习–绪论 第一章 绪论 第二章 模型评估与选择 第三章 线性模型 第四章 决策树 第五章 支持向量机 第六章 神经网络 第七章 贝叶斯分类器 第八章 集成学习和聚类 文章目录 周志华机器学 ...

  8. 周志华机器学习(西瓜书)学习笔记(持续更新)

    <周志华机器学习>笔记 第1章 绪论 1.1 引言 1.2 基本术语 1.3 假设空间 1.4 归纳偏好 1.5 发展历程 1.6 应用现状 第2章 模型评估与选择 2.1 经验误差与过拟 ...

  9. 【读书笔记】周志华 机器学习 第二章 模型评估和选择

    第二章 模型评估和选择 1 欠拟合和过拟合 偏差和方差 1.1 欠拟合和过拟合 1.2 偏差和方差 2 评估方法 性能度量 2.1 评估方法 2.1.1 留出法 2.2.2 交叉验证法 2.2.3 自 ...

  10. 周志华机器学习--模型评估与选择

    周志华机器学习–模型评估与选择 第一章 绪论 第二章 模型评估与选择 第三章 线性模型 第四章 决策树 第五章 支持向量机 第六章 神经网络 第七章 贝叶斯分类器 第八章 集成学习和聚类 文章目录 周 ...

最新文章

  1. 多路径配置udev_ASM磁盘多路径及udev配置
  2. Python模块filecmp 文件比较
  3. boost::smart_ptr模块boost/pointer_cast.hpp 的测试
  4. Android逆向笔记-通过tracerPid对抗IDA调试
  5. java底部菜单_安卓开发笔记——TabHost组件(一)(实现底部菜单导航)
  6. VS2015用nuget包管理器离线安装nupkg包
  7. Tomcat常见内存溢出的解决方案
  8. 分布式系统架构的优缺点
  9. 计算机enter代表什么意思,enter是什么意思
  10. WIN11电脑如何使用IE浏览器进行正常办公操作-以建行网银为例
  11. 零极限:关于蓝色太阳水原理
  12. Craps 赌博游戏 含押注
  13. redis 基本原理及安装
  14. Outlook客户端解析Html类型邮件样式问题
  15. 智能微模块一体化机柜
  16. 如何去掉google map上导航和GPS按钮
  17. android6.0按键处理浅析
  18. 为什么每个女生都比较避讳别人问年龄问题?于是我偷偷写了一款年龄检测器,公司同事的年龄都被我知道了~
  19. 开源 word 替代_5种Google文档的开源替代品
  20. 如何在YesDev,多团队协作程序员客栈的整包项目?

热门文章

  1. oracle select ora-16000,ORA-00604, ORA-16000: 打开数据库以进行只读访问
  2. Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection
  3. 一文搞懂什么是GPA
  4. 有趣!10个你不得不知的Linux终端游戏
  5. 主进程、子进程和守护进程
  6. AD元件库构建及维护之——DbLib公共元件库的使用教程
  7. 目前住院病人需要护士护理,这样做不仅需要大量护士,而且由于不能随时观察病人情况,还可能会延误抢救时即。某医院呢打算开发一个以计算机为中心的患者监护系统,试写出问题定义,并分析开发这个系统的可行性
  8. CCF计算机认证考试201709-2:公共钥匙盒 非算法弱鸡版
  9. 国产操作系统都有哪些功能?普通人能满足日常使用吗?
  10. 微课竞赛系统的设计与实现所需工作条件_启升微课丨从软件设计开发着手准备医疗器械软件描述文档...