难说| 读了几本书

作者分享了五一期间的阅读经历,重点评述了《Windows编程调试技术内幕》、《软件调试》、《Git软件开发实战》等技术书籍,提及了学习到的调试技巧和推荐的其他相关书籍。

难说| 读了几本书

前言

好久没在这个号上发表文章了,今天听群友说微信开放了私信功能,赶紧来试试。欢迎私信。

读了几本书

这个五一加了 4 天班,真是累啊,希望后面不要再卷了。最后一天陪娃去天津图书馆,又借了几本感兴趣的书,囫囵吞枣的看了好几本。简单聊聊感受。

  • 《Windows 编程调试技术内幕》

    在图书馆遇到这本书,想都没想,立刻拿到手里了。这本书我翻的比较块,应该会错过一些知识点。书里面的大部分的内容我已经有过了解了,就没细读。即使粗读,依然学到了几点。

    • 通过设置注册表 Image File Excution Option 下的 BreakOnDllLoad, 可以在 vs 中做到加载指定 dll 的时候中断下来(在 windbg就比较简单了,sxe ld:your_module_pattern 搞定)。
    • 创建进程的时候,内核会调用 nt!PspInsertProcess,又学到了一个中断的时机。
    • 一个命令行程序总会有与之对应的 conhost.exe 进程。这个进程会负责消息处理相关事宜。对,一个命令行程序也有消息需要处理,我之前以为控制台程序不会处理消息呢。
    • 控制台程序是如何响应 ctrl + c 的。
    • ……

    总体来说,这本书还是非常值得一读的,有机会一定买一本纸质版支持原作者。

    当然,谈到调试,一定要提张银奎老师的《软件调试》(第二版已经出了两卷了),《格蠹汇编》。还有《windows 高级调试》( Mario HewardtDaniel Pravat 著,聂雪军 等译),《.net 高级调试》(Mario Hewardt 著,聂雪军 等译) 。当然,还有熊力大佬的《Windows 用户态程序高效排错》,只可惜我知道这本书的时候,已经绝版了,如果有纸质版一定买一本支持作者。

  • 《Git 软件开发实战》

    之所以借这本是因为这是一本讲 git 的书。这本书很快就翻完了,一是因为自己对 git 有了一定的了解,二是因为之前买了一本《精通 Git》(有开源的中文电子版,链接在这里)。这本《Git 软件开发实战》没有特别惊艳到我的地方。当然,没太细看,很可能错过了一些精彩的地方。相比而言,我更喜欢《精通 Git》。

  • 《C++ 函数式编程》

    这本书的名字吸引了我。相信大家一定知道 c++ 是面向对象的编程语言。使用c++ 进行函数式编程?有点意思。不过这本书我很快就翻完了,没太理解这本书的精髓。也许是我功力还不够,还得继续修炼。

  • 《编程的原则》

    借这本与借另外一本——《代码质量》的出发点是一样的,想看看有没有什么好的原则提高代码质量。这本书里的观点好是好,就是少了些代码的佐证,不太符合我的预期,所以没有精读。相对而言,《代码大全》更符合我的胃口。

  • 《代码质量》

    这本应该是一本好书,但是现在没心思细读,留到后面慢慢读吧。

  • 《正则指引》

    这本书是余晟大佬写的,之前买过他翻译的正则表达式的经典之作《精通正则表达式》。这次有幸在图书馆遇到这本书,必须借回来读一读。我本身了解简单的正则语法,可以写简单的正则表达式,但是稍微复杂一些的就得查资料了,之前在用正则的时候遇到了一个因为使用不当导致的运行缓慢的问题,还特意写了几篇水文记录。感兴趣的朋友可以看这里

  • 《自制编译器》

    看名字就想读的一本书。希望能通过这本书对编译原理有更深层次的理解吧。接下来的重中之重!

  • 《数学之美》

    吴军大佬写的,非常非常值得一读。很早就买了,一直在书架上吃灰。偶然的机会翻出来读了读,越读越喜欢,能遇到这么好的书,真是三生有幸。对《浪潮之巅》也有了更高的期待,也得慢慢安排上了。

最后

请原谅我的懒惰吧

full
full
the-beauty-of-math
the-beauty-of-math

你对这几本书有什么看法吗?有什么好书推荐吗?欢迎私信我呀。

任务描述 本关任务:根据本关所学知识,完成 calcInfoGain 函数。 相关知识 为了完成本关任务,你需要掌握: 信息熵; 条件熵; 信息增益。 信息熵 信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。 直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题。信息熵这个词是香农从热力学中借用过来的。热力学中的热熵是表示分子状态混乱程度的物理量。香农用信息熵的概念来描述信源的不确定度。信源的不确定性越大,信息熵也越大。 从机器学习的角度来看,信息熵表示的是信息量的期望值。如果数据集中的数据需要被分成多个类别,则信息量 I(x i ​ ) 的定义如下(其中 x i ​ 表示多个类别中的第 i 个类别,p(x i ​ ) 数据集中类别为 x i ​ 的数据在数据集中出现的概率表示): I(X i ​ )=−log 2 ​ p(x i ​ ) 由于信息熵是信息量的期望值,所以信息熵 H(X) 的定义如下(其中 n 为数据集中类别的数量): H(X)=− i=1 ∑ n ​ p(x i ​ )log 2 ​ p(x i ​ ) 从这个公式也可以看出,如果概率是 0 或者是 1 的时候,熵就是 0。(因为这种情况下随机变量的不确定性是最低的),那如果概率是 0.5 也就是五五开的时候,此时熵达到最大,也就是 1。(就像扔硬币,你永远都猜不透你下次扔到的是正面还是反面,所以它的不确定性非常高)。所以呢,熵越大,不确定性就越高。 条件熵 在实际的场景中,我们可能需要研究数据集中某个特征等于某个值时的信息熵等于多少,这个时候就需要用到条件熵。条件熵 H(Y|X) 表示特征X为某个值的条件下,类别为Y的熵。条件熵的计算公式如下: H(Y∣X)= i=1 ∑ n ​ p i ​ H(Y∣X=x i ​ ) 当然条件熵的一个性质也熵的性质一样,概率越确定,条件熵就越小,概率越五五开,条件熵就越大。 信息增益 现在已经知道了什么是熵,什么是条件熵。接下来就可以看看什么是信息增益了。所谓的信息增益就是表示我已知条件 X 后能得到信息 Y 的不确定性的减少程度。 就好比,我在玩心术。你心里想一件东西,我来猜。我已开始什么都没问你,我要猜的话,肯定是瞎猜。这个时候我的熵就非常高。然后我接下来我会去试着问你是非题,当我问了是非题之后,我就能减小猜测你心中想到的东西的范围,这样其实就是减小了我的熵。那么我熵的减小程度就是我的信息增益。 所以信息增益如果套上机器学习的话就是,如果把特征 A 对训练集 D 的信息增益记为 g(D, A) 的话,那么 g(D, A) 的计算公式就是: g(D,A)=H(D)−H(D,A) 为了更好的解释熵,条件熵,信息增益的计算过程,下面通过示例来描述。假设我现在有这一个数据集,第一列是编号,第二列是性别,第三列是活跃度,第四列是客户是否流失的标签(0: 表示未流失,1: 表示流失)。 编号 性别 活跃度 是否流失 1 男 高 0 2 女 中 0 3 男 低 1 4 女 高 0 5 男 高 0 6 男 中 0 7 男 中 1 8 女 中 0 9 女 低 1 10 女 中 0 11 女 高 0 12 男 低 1 13 女 低 1 14 男 高 0 15 男 高 0 假如要算性别和活跃度这两个特征的信息增益的话,首先要先算总的熵和条件熵。总的熵其实非常好算,就是把标签作为随机变量 X。上表中标签只有两种(0和1)因此随机变量 X 的取值只有 0 或者 1。所以要计算熵就需要先分别计算标签为 0 的概率和标签为 1 的概率。从表中能看出标签为 0 的数据有 10 条,所以标签为 0 的概率等于 2/3。标签为 1 的概率为 1/3。所以熵为: −(1/3)∗log(1/3)−(2/3)∗log(2/3)=0.9182 接下来就是条件熵的计算,以性别为男的熵为例。表格中性别为男的数据有 8 条,这 8 条数据中有 3 条数据的标签为 1,有 5 条数据的标签为 0。所以根据条件熵的计算公式能够得出该条件熵为: −(3/8)∗log(3/8)−(5/8)∗log(5/8)=0.9543 根据上述的计算方法可知,总熵为: −(5/15)∗log(5/15)−(10/15)∗log(10/15)=0.9182 性别为男的熵为: −(3/8)∗log(3/8)−(5/8)∗log(5/8)=0.9543 性别为女的熵为: −(2/7)∗log(2/7)−(5/7)∗log(5/7)=0.8631 活跃度为低的熵为: −(4/4)∗log(4/4)−0=0 活跃度为中的熵为: −(1/5)∗log(1/5)−(4/5)∗log(4/5)=0.7219 活跃度为高的熵为: −0−(6/6)∗log(6/6)=0 现在有了总的熵和条件熵之后就能算出性别和活跃度这两个特征的信息增益了。 性别的信息增益=总的熵-(8/15)性别为男的熵-(7/15)性别为女的熵=0.0064 活跃度的信息增益=总的熵-(6/15)活跃度为高的熵-(5/15)活跃度为中的熵-(4/15)活跃度为低的熵=0.6776 那信息增益算出来之后有什么意义呢?回到心术的问题,为了我能更加准确的猜出你心中所想,我肯定是问的问题越好就能猜得越准!换句话来说我肯定是要想出一个信息增益最大(减少不确定性程度最高)的问题来问你。其实 ID3 算法也是这么想的。ID3 算法的思想是从训练集 D 中计算每个特征的信息增益,然后看哪个最大就选哪个作为当前结点。然后继续重复刚刚的步骤来构建决策树。 编程要求 根据提示,在右侧编辑器 Begin-End 部分补充代码,完成 calcInfoGain 函数实现计算信息增益。 calcInfoGain函数中的参数: feature:测试用例中字典里的feature,类型为ndarray label:测试用例中字典里的label,类型为ndarray index:测试用例中字典里的index,即feature部分特征列的索引。该索引指的是feature中第几个特征,如index:0表示使用第一个特征来计算信息增益。 测试说明 平台会对你编写的代码进行测试,期望您的代码根据输入来输出正确的信息增益,以下为其中一个测试用例: 测试输入: {'feature':[[0, 1], [1, 0], [1, 2], [0, 0], [1, 1]], 'label':[0, 1, 0, 0, 1], 'index': 0} 预期输出: 0.419973 提示: 计算 log 可以使用 NumPy 中的 log2 函数
06-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值