WordPress 最佳实践

使用 WordPress 写博客也有几年时间了,多多少少总结了一些所谓的最佳实践,主要包括站点设置和常用插件方面。WordPress 作为目前最流行的博客系统,积累了大量的插件,但也因此导致 WordPress 的大多漏洞是由于相应插件引起的,个人认为常用的操作可以使用相关插件,而不常用的操作可直接进行相关设置。

继续阅读

为什么程序员应该使用Windows 10

这篇文章不会说明Windows相较于Linux和macOS对程序员的优势所在,它们三者之间各有优势,本文只想强调相较于之前的Windows版本,程序员更应该使用Windows 10,或许标题应该叫做”为什么程序员应该升级为Windows 10“更为贴切一点。

版本

微软曾经宣布Windows 10将会成为最后一版的Windows,这也意味着之后的Windows将是基于Windows10的改进和更新。直到本文写作之时,已经历过几个重要的Windows 10更新,如下:

  1. 2015年7月:Windows 10发布,代号Threshold 1,版本1507
  2. 2015年11月:代号Threshold 2,秋季更新,版本1511
  3. 2016年8月:代号Redstone 1,周年更新,版本1607
  4. 2017年4月:代号Redstone 2,创意者更新,版本1703
  5. 2017年10月:代号Redstone 3,秋季创意者更新,版本1709
  6. 2018年4月:代号Redstone 4,春季创意者更新,版本1803

每一个重要的版本更新都会引入许多新的功能,比如在创意者更新中加入了游戏模式Windows Defender安全中心等,秋季创意者更新中引入了微软Fluent Design体系等,春季创意者更新中增加了时间线就近共享等功能。要了解自己的Windows版本可以在运行窗口中输入winver查看。

继续阅读

计算几何(一)——凸包(Convex Hull)

凸包问题是计算几何(Computational Geometry)的一个重点,同样,如何构造凸包也是一个重要的研究方向,生活中许多问题都会用到构造凸包的知识,比如颜料混合,即如何从已有的颜料中通过混合得到未知的颜料。在这篇文章中,我将介绍5种重要的凸包构造算法,分别是极点算法极边算法增量式策略Jarvis MarchGraham Scan等,同时也将通过归约得到凸包构造算法时间复杂度的下界。

继续阅读

机器学习(五)——神经网络的学习算法

代价函数与反向传播

神经网络是当今最强大的学习算法之一,我将开始讲述一种在给定训练集下,为神经网络拟合参数的学习算法,正如我们讨论大多数学习算法一样,我们准备从拟合神经网络参数的代价函数开始讲起,我准备重点讲解神经网络在分类问题中的应用。我还是和以前一样,用m表示训练样本的数量,用大写字母L来表示神经网络结构的总层数,然后我准备用sl表示第L层的单元的数量,也就是神经元的数量,这其中不包括L层的偏差单元,输出层也就是sL,因为L本身等于总层数。我们将会讨论两种分类问题,第一种是二元分类,在这里y只能等于0或1,也就是神经网络的输出结果h(x)会是一个实数,在这类问题里,输出单元的个数sL将是1,为了简化记法,我会把K设为1,这样你可以把K看作输出层的单元数目。我们要考虑的第二类分类问题,就是多类别的分类问题,也就是会有K个不同的类,我们的假设输出就是一个K维向量,输出单元的个数就等于K,通常这类问题里,我们都有K大于或等于3,因为如果只有两个类别,我们就不需要使用这种一对多的方法。我们在神经网络里使用的代价函数,应该是逻辑回归里使用的代价函数的一般化形式,对于逻辑回归而言,我们通常使代价函数J(θ)最小化,也就是-1/m 乘以后面这个代价函数,然后再加上这个额外正则化项,这里是一个j从1到n的求和形式,因为我们并没有把偏差项0正则化。

继续阅读

机器学习(四)——神经网络的表层结构

动机

神经网络实际上是一个相对古老的算法,并且后来沉寂了一段时间,不过到了现在,它又成为许多机器学习问题的首选技术,既然我们已经有线性回归和逻辑回归算法了,为什么还要研究神经网络?有时我们要解决的问题可能依赖于研究复杂的非线性分类器,在此之前,我们只是简单的增加二次项或者三次项之类的逻辑回归算法,但这并不是一个解决复杂非线性问题的好办法,因为当n很大时,将会产生非常多的特征项,最后的结果很有可能是过拟合的,此外,在处理这么多项时,也存在运算量过大的问题。然而对于许多实际的机器学习问题,特征个数n是很大的,比如计算机视觉,神经网络在解决复杂的非线性分类问题上,被证明是一种好得多的算法,即使你输入特征空间或输入的特征维数n很大也能轻松搞定。

继续阅读

机器学习(三)——逻辑回归与正则化

分类及表示

在分类问题中,你要预测的变量y是离散的值,我们将学习一种叫做逻辑回归(Logistic Regression)的算法,这是目前最流行、使用最广泛的一种学习算法。在所有的这些问题中,我们想要预测的变量是变量y,我们可以认为它能够取两个值0或1,是或者不是垃圾邮件,是或者不是欺诈,恶性或良性。标记为0的类,还有一个名字,叫做负类(negative class),标记为1的类,也叫做正类(positive class)。因此0可能代表良性肿瘤,1可能标记一个恶性肿瘤,将两个类别标记为正类或负类,0或1是任意的,其实怎样都可以,但是通常从直觉上来讲,负类总是表达缺少某样东西的意思,比如缺少恶性肿瘤,而正类就会表示存在某样我们寻找的东西,但是哪个是负类,哪个是正类的定义,有时是任意的,它并不太重要。现在,我们要开始研究只有两类0和1的分类问题,以后我们将讨论多类别问题,多类别问题中的变量y的取值可以是 0 1 2 和 3,或更多,这就是所谓的多类分类问题。那我们怎样开发一个分类算法呢?应用线性回归来解决分类问题通常不是一个好主意,通常来说,对一组数据使用线性回归,你可能会很幸运,但往往不是一个好想法,所以我不会用线性回归算法来解决分类问题。这里还有一个有趣的事情,如果我们要用线性回归算法来解决一个分类问题,对于分类,我们知道y取值为0或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于1或者远小于0,这看起来有点儿奇怪,所以我们在接下来要研究的算法就叫做逻辑回归算法,这个算法的性质是,它的输出值永远在0到1之间,并不会大于1也不会小于0。顺便说一下,逻辑回归算法是分类算法,有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,这只是因为历史原因而被这样称呼,所以千万不要被迷惑。

继续阅读

机器学习(二)——多变量线性回归

多变量线性回归

我们将开始介绍一种新的更为有效的线性回归形式,这种形式适用于多个变量,或者多特征量的情况。先简单介绍一下记法,现在我们有四个特征量,我要用x下标1 、x下标2等等,来表示这种情况下的四个特征量,然后仍然用Y来表示,我们所想要预测的输出变量,我要用小写n来表示特征量的数目,之前我们是用的“m”来表示样本的数量,然后我要用x上标(i)来表示第i个训练样本的输入特征值,x上标(2)这样表示,就是一个四维向量,事实上更普遍地来说,这是n维的向量,我用x上标(i)下标j来表示第i个训练样本的第j个特征量,因此具体的来说x上标(2)下标3代表着,第2个训练样本里的第3个特征量。既然我们有了多个特征量,我们的假设形式应该是怎样的,我们就不能再使用以前那种简单的表示方式了,取而代之的,我们将把线性回归的假设改成这样:

继续阅读

机器学习(一)——单变量线性回归

监督学习与无监督学习

监督学习(Supervised learning),意指给出一个算法,需要部分数据集已经有正确答案。比如给定房价数据集,对于里面每个数据,算法都知道对应的正确房价,即这房子实际卖出的价格。算法的结果就是算出更多的正确价格。监督学习中的一种即回归问题,意指要预测一个连续值的输出,比如房价。虽然从技术上来说,一般把房价记到美分单位,所以实际还是个离散值,但通常把它看作实际数字,是一个标量值,一个连续值的数,而术语回归,意味着要预测这类连续值属性的种类。另一个监督学习的例子是:你能否估算出一个概率,即肿瘤为恶或为良的概率?专业地说,这是个分类问题。分类是要预测一个离散值输出,这里是恶性或良性。事实证明,在分类问题中,有时输出的值可能超过两种。监督学习中,对于数据集中的每个数据,都有相应的正确答案,(训练集)算法就是基于这些来做出预测。回归问题,即通过回归来预测一个连续值输出。分类问题,目标是预测离散值输出。

继续阅读

大话排序

伟大的计算机科学家D.E.Knuth曾指出,四分之一以上的CPU时间都用于执行同一类型的计算:按照某种约定的次序,将给定的一组元素顺序排列,比如将n个整数按通常的大小次序排成一个非降序列。这类操作统称排序(sorting)。

继续阅读

词典

词典(dictionary)这种数据结构在编程语言中很常见,比如Java中的HashMap与Hashtable、Python中的字典等等,一个键值对可以称为一个词条,即entry = (key, value),而映射(map)就是词条的集合,但其中各词条(的关键码)互异,词典与映射基本相同,但允许词条的(关键码)雷同,进一步,关键码之间可以定义全序关系的词典称为有序词典(sorted dictionary),映射和词典都是动态的,统称符号表(symbol table)。实现词典的重要技术便是散列(hash),与其说散列是一种技术,不如说散列是一种思想,它重点解决的问题是数据结构在空间效率上的提高,而依照散列思想所实现的数据结构的访问方式不妨称为寻值访问(call-by-value),这种方式更为自然,适用范围也更广泛。 继续阅读