代码整洁之道
最近翻了一下代码整洁之道的内容,颇受启发,将其中部分我认为对我有意义的做了摘要如下。书中还有有关类和并发编程的部分没有阅读完,等之后阅读完再补充更新。
命名
好的命名可以省掉注释
不要怕用长命名,有意义和可读性比长度更重要
尽力使命名可搜索
函数
保持函数短小,单函数尽力不超过100行
一个函数做一件事
一个函数中代码的抽象层级尽量保持一致(实际开发中这点很难保证)
需要过多参数的函数应当封装为类(面向对象编程时)
注释
尽量避免注释,用代码本身来阐述,因为程序员总是在维护代码时忘记更新注释(这是真的。。)
不要迷信别人的注释,原因同上(说起来都是泪)
一旦决定注释,提供所有所需的无歧义的信息
编码风格
向杂志排版设计学习,利用分隔符,意义相近的代码靠拢,概念有区别的用空格/空行予以水平和垂直方向上的分隔
团队保持一致的编码风格(有效提高协作效率,不过很难约束团队成员)
对象
不要盲目给私有成员添加赋值器与取值器,这样会暴露其实现:隐藏实现不是简单的在变量上加一个函数层,而是进一步的抽象,暴露其抽象接口使用户无需关心 ...
凛冬将至,巨人陨落于永恒边缘
show花了大概两周时间断断续续看完了这一套三部九本的煌煌巨著——《世纪三部曲》。要说篇幅的话,已经很久没有看这么长的小说了,上次看如此篇幅的作品,可能还是高中时看“千禧年三部曲”(龙纹身/玩火/直捣蜂窝的女孩)和三体吧。
其实看完一本半之后,对剧情的兴趣就阑珊了。但是作者这里非常狡黠地用了点小聪明,把20世纪几乎所有著名的历史事件(西方世界的)都混到人物的经历中去,这样你在看的时候就不由得想接下来该到诺曼底登陆了吧?小说人物会在里面扮演怎样的角色呢? 尼克松访华会对故事情节有什么推动呢? 这样,一种不算变态的窥私欲会不断地促使我继续读下去。但是,其实太阳底下没有新鲜事,第三部里所有的事情,都能在第一部第二部里找到对应。虽然第三部的时间轴已经到了现代,马丁路德金的黑人民权运动以及反战性解放等等都是之前没有发生过的,但是这些事件和之前的事件似乎没有本质的不同——都是被压迫的群体开始反抗,同时新的思潮开始涌动,所不同的不过是群体类别——是工人还是黑人,反抗的方法——武装夺取政权,进入议会,还是非暴力游行,以及思潮的传播方式罢了。也许,作者也是有意识地设置这一点,暗暗点出历 ...
Python文本处理中的常见编码问题
这里包涵了文本处理中常见的一些常见问题编码问题,代码示例使用python3。文末给出了一些工作中遇到的坑及其解,这部分会不定期更新。
Unicode与Utf-8/16Unicode: 通用字符编码,为了解决不兼容编码格式应运而生。用抽象的方式(数字)来处理字符,而将视觉上的演绎工作留给其他软件处理。Utf-8/Utf-16: 为了解决Unicode编码在网络传输的问题而产生,Utf-8就是8位8位地传数据,而Utf-16就是每次传16位。这类编码都是变长的以节省空间和流量。以Utf-8为例,其储存一个英文字母用到的位数是unicode的一半。
Unicode 是信源编码,目的是将Unicode字符集给数字化。Utf-8/16 是信道编码,目的是为了更好的传输和存储。
Linux系统中,file命令可以用来查看文件的编码,iconv则可以将文件的编码进行转换并输出到标准输出STDOUT。
file foo.md
foo.md: Utf-8 Unicode text
#下面的代码将macroman编码的macroman.txt文件转换为utf-8 ...
Seaborn 简明教程
seaborn是一个常见的用于绘图的python模块,相比较于matplotlib,它使得绘制较为复杂的图更加容易,并且不需要什么设置就能绘制出更为美观的图。也就是其官方语make a well-defined set of hard things easy,本质上,它就是matplotlib的高阶接口。下面简单用一下seaborn来学习一下。大部分内容来自原教程。jupyter notebook文件可以在这里下载。
模块引用和数据集读取这里我们需要用到几个模块来练习,它们分别是:
pandas
matplotlib
seaborn这里安装就不赘述了,Anconda和pip都可以安装。我们用到的数据集是一个宠物小精灵数据集。
12345# import所需库import pandas as pdfrom matplotlib import pyplot as plt%matplotlib inlineimport seaborn as sns
123# 查看数据格式 df = pd.read_csv('Pokemon.csv', inde ...
混乱与自由 香港之行
毕业旅行去香港大概也是个偶然的决定。本来的计划可能是格鲁吉亚或者敦煌,但是种种原因都放弃了,最终也就选择了香港。
做攻略的时候就发现,相比于内地的山河,香港的自然风景可能真的是乏善可陈,于是很自然的,在四天三夜的行程中,也就没有规划其他部分,主要是在九龙和香港岛上活动。第一天去维港转转,第二天在迪士尼里待一天,第三天的话就找几个博物馆,然后在晚上去太平山看夜景,最后一天就主要逛逛街,看看有什么能买的东西。头天去的时候,刚入香港就惊异于其国际化,我是指所有的标牌,无论是指路牌,广告牌,店里的告示等等,都是中(粤)英双语,熙熙攘攘的人群一眼扫去,黄种人竟然都不算多数。从机场去市区时,坐的s1转东涌线,下了s1公交车时正值十二点多,此时肚子已然咕咕作响,于是就在东涌站附近觅食。看到一家Pert A Manger,走进去店员正在和顾客用法语交流;随后由于我们又不懂粤语,店员似乎也不通普通话,只好操着我们蹩脚的法语,要了一个三明治几个牛角包。草草果腹之后去位于尖沙咀的旅店check in,走路也就到了维港附近,可惜的是维港附近的博物馆正在整修,逛到晚上又坐了香港的摩天轮,这样就结束 ...
如果年轻时你来过将军路, 那现在的你是不是很幸福
flag
接下来,就要毕业了呢。
我还记得第一次来南航时的情景,戴老师带来参加NOIP,说了一句“南航这个学校还不错的,你们以后高三填志愿的时候可以考虑考虑”,没想到一语成谶,从13年起,就在将军山旁边这儿蹉跎4年岁月。
4年,足够发生很多事了;足够光棍桥,图书馆,游泳馆和南区接连拔地而起;足够一段恋情的结束和另一段的开始;足够在怡园阳台上无数次看着星星发呆;足够在电脑前敲敲敲从大菜鸡变成不那么菜的菜鸡;但是,4年却不够我再好好说一遍再见。
对生殖器崇拜的主楼说再见,对“以湖为砚足见手笔之大”的砚湖说再见,对命途多舛前途渺茫的六食堂说再见,对自习前先得花半个小时找没被占座的带插座座位的图书馆说再见,对各类设施奇新但是最后还有9次没用掉的游泳馆说再见,对MSTC的33B说再见,对总是有屡摔屡摔屡摔的滑轮(板)的光棍广场说再见,对把我关在其内三次的宿舍老电梯说再见,对三食堂的土耳其烤肉饭说再见,对校外食堂后街说再见,对同曦金逸IMAX说再见;对常常挤不上的校车说再见,对所有记得或忘却的老师,对所有路上的偶遇和致意,对南京说再见,再对南航说再见。
我从 ...
机器能思考吗?——《剑桥五重奏》
最近无意翻到一本《剑桥五重奏》,主要讨论的大概是机器思考的本质,机器是否可能具备“智能”?或者,引用副标题的话就是:
机器能思考吗?
该书成书于1997年IBM的超级计算机深蓝二号打败了国际象棋世界冠军卡斯帕罗夫之后,很巧的是,如今距离那个年代已经又过去了20年,人工智能在其间再落再起,时至今日,又被深度学习的浪潮推到一个新的高峰,Alpha GO又打败了围棋世界冠军,关于AI技术/伦理的讨论给未来笼上未知的迷雾,此刻回头再看看20年前人们同样的迷惘,或许也是件有趣的事情。作者,数学家卡斯蒂虚构了1949年的一场晚宴,大笔一挥泼墨点下五位不同领域的巨人来讨论思维机器(thinking machine)。这五人分别是数学家,计算机的先驱阿兰·图灵;语言哲学家路德维格·维特根斯坦;量子力学奠基人之一,欧文·薛定谔;遗传学家,J.B.S.霍尔丹;以及晚宴的发起人,小说家兼物理学家CP.斯诺。作者置图灵和维特根斯坦为辩论的主要正反方,其他人或附和或反驳或补充,图灵认为人脑也不过是一个复杂的计算系统,没有任何理由显示我们不能从技术上模拟出一个具有和人脑同样智能的计算系统,而维 ...
梯度下降算法变种及各类优化使用
最近看了一些有关梯度下降的内容,在这里做一下总结,包括梯度下降的变种,学习速率的设定等等,着急的可以拉到最下看结论。
基础梯度下降变种全批量梯度下降 Batch GD将全量训练集的样本都计算梯度后再更新,对于有$n$ 个样本的训练集,$\lambda$为学习速率,每次更新参数时如下:
w= w-\lambda \sum_{i=1}^n \nabla l(x_i,w)这种方法太过耗时了,而且无法应用在在线算法上,所以一般只有数据量较小时才采用。
随机梯度下降 SGD和上面的算法相反,SGD是在每计算出一个样本的梯度时就更新参数:
w= w-\lambda \nabla l(x_i,w)相比较之下,这种算法就可以快很多,但是因为每个样本都会导致参数的立刻更新,当遇到极端样本时,很容易把参数带“跑偏”,表现在损失函数上就是损失函数下降地不稳定,但是往往经过足够多次更新后,算法表现都会稳定下来,当然为了减轻这种不稳定性,使用SGD往往需要将学习速率慢慢降低。
小批量梯度下降 mini-batch GD这种算法介于BGD和SGD之间,也就是每次通过一个mini-batch的数据来更 ...
【西瓜书】第二章 模型的评估和选择
本文是周志华老师《机器学习》第二章模型的评估和选择的学习笔记及部分习题答案。 回顾一下模型评估和选择的内容,西瓜书中有些内容也是之前没有看过的,这部分内容记下来备忘。
首先是机器学习的老对头过拟合,对于我们能否彻底避免过拟合 :
机器学习面临的问题通常是NP难甚至更难,而有效的学习算法必然使能够在多项式时间内运行完成,如果可以彻底避免过拟合,则我们通过经验误差最小化就能获得最优,这就意味着我们构造性地证明了“P=NP”,所以只要相信P$\ne$NP,过拟合就不可避免。这点倒是我之前没有想过的。
评估方法为了保证评估时能较好体现模型的泛化能力,我们评估模型时的测试集和训练集应该尽量互斥。为此我们通常有以下方法来划分训练/测试集:
留出法 直接将数据集D划分为两个互斥的集合,其中一个作为训练集,另一个作为测试集,在训练集上训练出模型后,用测试集评估其测试误差。
交叉验证法 (Cross Validation) 将数据集划分为k个大小相似的互斥子集,每次用k-1个子集的并集作为训练集,剩下的1个子集作为测试集。这样可以获得k组训练/测试集,最终返回k个 ...
【西瓜书】第九章 聚类
本文是周志华老师《机器学习》第九章聚类的学习笔记。
近来做毕业设计,要在parameter server框架下实现各类机器学习算法,准备从聚类(k-means)做起。之前在法国和coursera学的也有些淡忘了,(coursera的聚类笔记也较为浅显)因此翻出西瓜书再来看看巩固一下。
聚类任务首先明确一下什么是聚类任务,它是无监督学习的一种(常见其他无监督学习还有密度估计和异常检测),也是应用范围最广的一类学习任务。
聚类任务试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个簇(cluster),需要说明的是,簇所对应的概念语义对聚类算法而言是未知的。形式化地说,样本集 $D={x_1,x_2,…,x_m}$ 包含m个无标记样本,每个样本$x_i=(x_i1,x_i2,…,x_in)$是一个n维特征向量,则聚类算法将样本集D划分为k个不相交的簇${C_l | l=1,2,…,k}$
性能度量明确了任务之后,当然我们也需要一个指标来度量咱们的任务干的如何,但是和监督学习不同,这里的性能不太能直观地看出来。我们凭直觉来看,我们肯定希望 ...