刚开始看《深入理解计算机系统》的时候,我觉得自己是个傻子

编程学习:从《深入理解计算机系统》看学习路径
本文作者阿秀分享了自己阅读《深入理解计算机系统》的体验,指出这本书虽被誉为神书,但因其深度和厚度可能不适合初学者。建议学习编程时选择适合自己的资料,逐步积累前置知识。推荐了《编码-隐匿在计算机软硬件背后的语言》、《汇编语言》和《C-语言程序设计》作为辅助学习资源。强调学习过程需耐心,不必急于求成,建议先理解计算机基础,如计算机组成原理和操作系统,再深入学习其他技术。

59151c5da3cb1f71ddfaf11db0ead343.png

作者:阿秀
阿秀的求职笔记:https://interviewguide.cn

你好,我是阿秀。

今天简单聊聊编程学习这个话题,以《深入理解计算机系统》这本书为例简单聊聊,我刚开始看这本书的时候觉得自己像个傻子3325a416d5606063b9c9b2f25baf6ea6.png

如果你像我一样是个知乎重症玩家,而你关注的一些话题又是计算机、编程、程序员相关,那你估计很容易刷到一些编程书单,很多人都会在社交媒体上分享自己读过的编程类书籍。

b61f49807dc080bcee4310864a83c0ee.png

以前读研时的书桌

1、神书

我相信,有一本书你一定不陌生,那就是《深入理解计算机系统》,也就是《CSAPP》。

知乎上关于这本书的讨论也有很多。
a5998e4b19538a5f334b17d8d8192efa.png

差不多有15,000关注这个问题

这是本神书,去豆瓣读书上看下它的评分就能知道它确实是本神书。

首先在豆瓣读书上选中编程的标签,然后你就可以发现豆瓣读书编程类最高分就是9.7分。

其中Top5,能够兼顾分值和评论人数的编程类书籍只有这本CSAPP,它不仅有着9.7分的高分,同时也有着高达 2926 人的评论人次。

7b92c5abb604c7e5400b83ddb2aa0235.png

这本书好吗?

肯定好,有多达3000人给出了自己的评分,最后得到了平均分为9.7.肯定好。

那,请问你看得下去吗?

我想大多数人跟最开始的我一样,根本看不下去。

看不下去的原因应该有很多,但下面两个应该是最高频的:

第一,太厚了,这本书就跟那本800多页的《C++ Primer 5th》 一样,又厚又重,多达700多页。

最适合垫泡面了,大多数人还没开始看就直接被劝退了。

bc81a6e240ac8b56753fd09d365549d8.png

C++系列圣经

为啥我记得C++ Primer 5th有八百多页呢?因为我看了两三遍...

第二,看不懂

我想更多人是被第二个原因劝退了。

那为什么会看不懂?

看不懂的原因先放在一边,先来看看这本书的主要内容有哪些?

老实说这本书的覆盖面其实真的很广,它不仅仅只是计算机系统,更准确的说是计算机基础中的《计算机组成原理》和《操作系统》的混合体。

从机器级别的指令、CPU的工作方式、存储结构和优化,到程序I/O、计算机网络、程序性能优化,甚至并行程序设计都有所涉及,其中很多话题都能再次展开,并深入。

毫不客气的说,这一本经典可以继续演变成N本经典

这本书的主要内容其实可以分为以下六个主题:

  • 计算机信息的表示(如何使用二进制表示数字,比如整型、浮点数等)

  • C语言和汇编语言的学习(通过汇编语言更深入地理解C语言是什么)

  • 计算机体系结构的基本介绍(比如存储层次结构、局部性原理、处理器体系结构等)

  • 编译链接(可执行文件是怎么来的、静态链接和动态链接的区别)

  • 操作系统的使用(异常控制流、虚拟内存等)

  • 网络及并发编程(并发、并行、系统调用)

2、原因

看到这里,其实你应该已经知道你看不懂这本书的原因了:这是本好书,但很可能不适合现阶段的你

因为看这本书需要很多前置知识,你至少应该懂最基本的C语言以及一部分的汇编知识再来看这本书。

CSAPP这本书是我在14年,上大二的时候就买的,当时买的还是印影版,后来读研的时候实验室有图书报销机会,我去买了第三版正版。

现在我床头边就放着三本书,一本是余华老师的《活着》,一本是DDIA,也就是《设计数据密集型应用》。

还有一本就是《深入理解计算机系统》,经常会翻一翻。

CASPP这本书一开始我也是看不懂,后来重复地翻开,断断续续的去看,每次看都会有不一样的感受。

所以编程学习也是类似,有时候可能并不是你太笨学不会一些语言或者技术,而是是你学习的方式有误或者你使用的资料暂时不适合你。

等过一段时间你再来看以前被你搁置在一旁的书,你可能会觉得怎么看怎么懂了。

向上攀登更重要的是选对方向去攀登

类似的还有《算法导论》就好像知乎上有人问怎么学数据结构与算法一样,很多人一推荐就是那本经典的《算法导论》。

a8d05a0488f51a9972b431af1283cdc1.png
又一本大黑书

这也是本好书,但推荐它的人十个里可能没有一个完整看完这本书的,更甚者可能有的人自己都没翻过这本书就跑去给别人推荐。

Always learn from the best!

3、多说(水)两句

学习的过程是不能急的,特别是还在上大学的学弟学妹们,你们有大把连续的时间,这就是你们的资本。

资本运用好了叫资本,没运用好就不叫资本了

如果你真的想学好编程,甚至日后把编程作为自己的主业,依靠编程谋生的话,建议你好好的学一下计算机的前世今生,做到彻头彻尾的理解计算机的原理。

而不是仅仅停留在表面,直接照猫画虎、照葫芦画瓢,这样的基本都会被淘汰,无法从事程序设计工作,最终整天从事重复性工作。

话都说到这里了,如果你打算看CSAPP,给你推荐一些切实可行而非直接劝退学习资源吧。

《编码 - 隐匿在计算机软硬件背后的语言》能帮你了解计算机是如何表示数字的;

《汇编语言》不要被书名吓到了,王爽老师的这本书绝对会让你感到相见恨晚;

《C-语言程序设计》,这个就不介绍了吧。

除此之外,对于操作系统、计算机网络、数据库等知识的学习也是如此,不要在最开始的时候就去看一些大头书,妥妥的劝退自己

最近在和几个朋友一起写点比较好入手的学习资料&路线,至少学起来不会劝退&打击自己,对一些像我这样自学过来的同学比较友好,已经更新完计算机网络、操作系统、C++和Golang的知识了。

44c970f79e4e4c842afd5126fcd2c497.png

剩下的都会慢慢更新&同步上来:https://github.com/awesome-cs-community/developer-roadmap-zh-CN

剩下的会慢慢更新,今天就先水到这里吧,溜了溜了cf10efe1921f897600bac8d5ccec78ea.png

参考文献:https://zhuanlan.zhihu.com/p/38584767

我是阿秀,一个平凡的互联网打工仔,我们下期再见。

2f7dfafe44edae83bf85664ff02f3c52.png

推荐👍:求职硬实力(操作系统、计算机网络、数据库MySQL、Redis等)

推荐👍:总有人在你不知道的时候,默默前行(他人经验)

推荐👍:求职软实力(面试、话术、简历)

你好,我是阿秀,本硕均于普通双非学校就读,现于抖音旗下担任全栈研发工程师,前后端全能。一路走来,很累也很不容易,希望能帮助到更多像我一样的普通学校的学生。我踩的坑不希望你再踩,我走过的路希望你照着走下来

<think>嗯,用户现在需要从零开始学习如何用KNN做手写数字识别。首先,我需要确定用户的基础。他说“我是傻子”,可能是真的零基础,或者只是自嘲,但无论如何,我需要用最简单易懂的方式解释。 首先,KNN的基本概念。得先简单介绍一下KNN是什么,但不需要太深入,重点放在应用步骤上。然后,手写数字识别通常用的是MNIST数据集,但可能需要先处理数据,比如加载数据、查看数据结构,这些步骤用户可能不熟悉,需要详细说明。 接下来是数据预处理。可能需要解释为什么需要归一化,因为像素值范围是0-255,归一化到0-1之间有助于模型训练。然后拆分训练集和测试集,这里要说明为什么需要拆分,以及如何拆分,比如用train_test_split函数。 然后是KNN模型的构建和训练。要解释KNN的原理,比如计算距离,选择最近的K个邻居,然后投票。这里可能需要提到如何选择合适的K值,比如交叉验证,但用户是零基础,可能先简单用默认值,比如K=3,后面再调优。 预测和评估部分,需要展示如何用测试集评估准确率,可能还要提到混淆矩阵或者其他指标,但先以准确率为主,保持简单。 可视化部分,用户可能想看实际预测结果,比如显示一些测试图片和预测标签,这样更直观。但需要确保代码正确,比如用matplotlib显示图像,可能需要调整图像尺寸。 最后,调优部分,可以介绍如何用交叉验证选择最佳K值,但用户可能刚开始不需要太复杂,所以放在最后作为进阶内容。 还要注意代码的注释,每一行都解释清楚,避免用户看不懂。同时,检查是否有LaTeX公式,比如KNN的公式,但用户可能不需要太深入的数学,所以可能暂时不需要,或者简单带过。 需要确保所有步骤都是按顺序的,用户能一步步跟着做,不会有遗漏。同时,考虑用户可能遇到的问题,比如库的安装,可能需要提醒安装sklearn、numpy、matplotlib等,但用户可能已经知道,所以放在最后作为提醒。 最后,用鼓励的话语结尾,让用户有信心继续学习。整个流程要清晰,步骤明确,语言简单,避免术语过多,必要时解释术语。</think>好的!我会从零开始,手把手教你用 **K近邻算法(KNN)** 实现手写数字识别。只需跟着以下步骤操作即可,保证清晰易懂! (**注:** 代码部分我会逐步解释,确保你理解每一行意义) --- ### **第一步:环境准备** 1. **安装必要库**(若未安装,在终端输入): ```bash pip install numpy matplotlib scikit-learn ``` --- ### **第二步:理解问题** - **目标**:用KNN算法识别手写数字图片(0~9)。 - **数据集**:使用经典的 **MNIST 数据集**(内置在sklearn中)。 --- ### **第三步:代码实现(逐行解释)** #### **1. 加载数据集** ```python from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784', version=1) X, y = mnist["data"], mnist["target"] ``` - **解释**: - `mnist_784` 是MNIST数据集名称,每张图片是28x28像素(共784个特征)。 - `X` 是特征矩阵(每行是一张图片的像素值),`y` 是对应的数字标签。 #### **2. 查看数据形状** ```python print(X.shape) # 输出 (70000, 784) → 7万张图片,每张784像素 print(y.shape) # 输出 (70000,) → 7万个标签 ``` #### **3. 显示一张图片(验证数据正确性)** ```python import matplotlib.pyplot as plt # 取第5张图片(随便选一个) digit = X.iloc[4].values.reshape(28, 28) plt.imshow(digit, cmap="binary") plt.axis("off") plt.show() print("标签是:", y[4]) # 应显示真实标签 ``` - **效果**:显示一个手写数字图片,标签可能是5或其他。 #### **4. 数据预处理** ```python # 将像素值从0~255缩放到0~1(提高模型性能) X = X / 255.0 # 划分训练集和测试集(前6万训练,后1万测试) X_train, X_test = X[:60000], X[60000:] y_train, y_test = y[:60000], y[60000:] ``` #### **5. 训练KNN模型** ```python from sklearn.neighbors import KNeighborsClassifier # 创建KNN分类器(k=3表示看最近的3个邻居) knn = KNeighborsClassifier(n_neighbors=3) # 训练模型(可能需要几分钟,耐心等待) knn.fit(X_train, y_train) ``` #### **6. 预测并评估模型** ```python # 在测试集上预测 y_pred = knn.predict(X_test) # 计算准确率 from sklearn.metrics import accuracy_score accuracy = accuracy_score(y_test, y_pred) print("测试集准确率:", accuracy) # 约96%~97% ``` #### **7. 查看预测错误的例子(可选)** ```python import numpy as np # 找出预测错误的索引 errors = np.where(y_pred != y_test)[0] # 显示第一个错误样本 index = errors[0] wrong_digit = X_test.iloc[index].values.reshape(28, 28) plt.imshow(wrong_digit, cmap="binary") plt.title(f"预测值: {y_pred[index]}, 真实值: {y_test.iloc[index]}") plt.axis("off") plt.show() ``` --- ### **第四步:调优与改进** - **调整k值**:尝试 `k=1,3,5` 并比较准确率。 ```python for k in [1, 3, 5]: knn = KNeighborsClassifier(n_neighbors=k) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) print(f"k={k} 准确率:", accuracy_score(y_test, y_pred)) ``` - **交叉验证**:用 `GridSearchCV` 自动选择最佳k值(代码略复杂,可后续学习)。 --- ### **第五步:总结** - **KNN原理**:对测试样本,找训练集中最近的k个邻居,根据它们的标签投票决定预测结果。 - **优点**:简单易实现,无需训练过程(但预测时计算量大)。 - **缺点**:数据量大时速度慢,需预处理和调参。 --- ### **附:完整代码** ```python # 导入库 from sklearn.datasets import fetch_openml from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt import numpy as np # 加载数据 mnist = fetch_openml('mnist_784', version=1) X, y = mnist["data"], mnist["target"] # 数据预处理 X = X / 255.0 X_train, X_test = X[:60000], X[60000:] y_train, y_test = y[:60000], y[60000:] # 训练模型 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) # 预测与评估 y_pred = knn.predict(X_test) print("准确率:", accuracy_score(y_test, y_pred)) ``` --- 如果遇到问题(如代码报错),随时告诉我,我会帮你排查! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拓跋阿秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值