根据天气和时间动态更换的博客背景图

之前博客的背景图是一个永恒的晴天……
因为一开始就是当成一个可以根据时间和天气轮换的设计,但是懒得去写 js ,于是就是如大家所见的那样。

刚刚闲得无聊,把整个逻辑补完了。用到的是新浪的天气 js 接口,然后用一组图片搞定了他们。

核心代码如下:

var t = Math.floor(((new Date()).getHours() + 6) / 5),
    f = 'bright' + t;
if (w.indexOf('雨')>=0 || w.indexOf('雪') >= 0) {
    f = 'rainy';
} else if (w.indexOf('云')>=0 || w.indexOf('阴') >= 0) {
    f = 'cloudy' + t;
}
if (document.body.clientWidth > 600) {
    document.body.style.backgroundImage = 'url("' + f + '.jpg")';
}

具体的效果,可以参考本博客背景,也可以移步演示页面

相应的几张背景图为原创,谢绝扒图。如需自用,请联系我。

机器学习 – 第一周:单变量线性回归

模型表达

单变量线性回归是一种最简单、最典型的监督式学习算法。我们将用于训练的数据称为“数据集”(dataset),则有以下几个定义:

  • $$m$$ 代表训练数据集的大小(即有多少个训练样本);
  • $$x$$ 代表模型的输入(即模型的输入特征数量);
  • $$y$$ 代表模型的输出(即最终预测的结果);
  • 我们用上标 $${^{(i)}}$$代表数据集中的第 i 组数据,如 $${x^{(i)}}$$ 代表数据集中第二个输出;
  • $$h$$ 则是我们用于预测的函数,具体表述如下:
    将学习算法通过训练数据集训练之后得出函数 $$h$$ 中的不确定参数项,此时 $$h$$ 为一确定的函数;
    将任意的输入 $$x$$ 代入 $$h$$ 中,即可得到对应的输出 $$y$$。
    在单变量线性回归中,我们使用的 $${h_\theta}(x)$$$${h_\theta }(x) = {\theta _0} + {\theta _1}x$$

成本函数

线性回归要达到的目标,即将上述 $${h_\theta}(x)$$ 函数中的 $$\theta$$ 求出。如何选择 $$\theta$$ 们就成了要解决的问题。

给出成本函数 $$J({\theta _0},{\theta _1}) = {1 \over {2m}}\sum\limits_{i = 1}^m {({h_\theta }({x^{(i)}}) - {y^{(i)}})} $$
此函数是线性预测函数 $$h$$ 与实际数据 $$y$$ 的误差的方差值。

则我们的问题就转化为了,如何求成本函数 $$J({\theta _0},{\theta _1})$$ 的最小值。

梯度下降法

选用一种算法,使 $$\theta$$ 从任意位置开始,都能下降到一个局部最小值。

梯度下降法的具体做法是,每次迭代都将 $$\theta$$ 减少一个值,这个值是学习速率 $$\alpha$$ 乘以成本函数 $$J$$ 对 $$\theta_i$$ 的偏导数。具体公式如下:

repeat until convergence {
$$\theta_{j}:=\theta_{j}-\alpha\frac{\partial}{\partial\theta_{j}}J(\theta_{0},\theta_{1})$$ (for j=0 and j=1)
}

** 值得注意的是,此处的 $$\theta$$ 的更新是同步的,亦即计算$$\theta_2$$时使用的$$\theta_1$$是本次更新前的值。**

由于每次更新变量 $$\theta$$ 都是减去一个和梯度线性相关的值,故此算法将会在迭代的过程中自行调整每次下降的幅度,
从而减小迭代次数。如当初始值很高,函数图像很陡峭时,此时梯度足够大,故下降的速率也足够大,
从而在单次的迭代中下降足够多的幅度。
而当 $$\theta$$ 已经位于最小值附近时,由于函数图像的缓和,梯度下降,故下降速率会自行变小。
这就是梯度下降算法的优越之处。

在单变量线性回归算法中,梯度下降算法中的偏导数部分可以求解如下:

$$${\theta _0}: = {\theta _0} - \alpha {1 \over m}\sum\limits_{i = 1}^m {({h_\theta }({x^{(i)}}) - {y^{(i)}})} $$$
$$${\theta _1}: = {\theta _1} - \alpha {1 \over m}\sum\limits_{i = 1}^m {({h_\theta }({x^{(i)}}) - {y^{(i)}})} \cdot {x^{(i)}}$$$

机器学习 – 简介

最近在 Coursera 上参加 Andrew Ng 的 Machine Learning 课程,感觉颇为良好, AN 的课讲得很是生动,也比较深入浅出,适合我这种低智商人群学习。

于是,这里是对其中的“Introduction”亦即“介绍”部分,做一个中文版的提纲,以便自己查阅。接下来的学习时间里,我也会整理出相应的提纲资料,一方面是为了自己查询方便(读中文还是比英文舒坦),另一方面也算是给后来者留下一个参考。想要阅读相关的其它文章的话,请点击 ml-006 这个标签。

注意,以下内容均为本人理解(除引用外),本人不对以下信息的准确性负任何责任。转载请参考右边 CC 协议。

定义

A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.
—- Tom Mitchell (1998)

Google 找了一番,没有找到确切的翻译,我就随便翻译一下吧。

所谓机器学习,即能够完成任务 T 的程序,其自行从 E 中学习经验,用 P 来衡量其表现;且在 T 任务上的表现 P 能够由经验 E 来提升。

举个例子:

比如我们平常所用的 GMail 的 SPAM 判定,就是一个典型的机器学习程序:
任务T:判断一封邮件是否为 SPAM
经验E:用户对 SPAM 邮件的标记(“这是垃圾邮件”)
表现P:对垃圾邮件的识别率

模型形态

广为人知的,机器学习分为两种形态,即监督式学习和非监督式学习。两种模型形态的区别主要在于训练数据集。

监督式学习(Supervised learning)

Supervised learning is the machine learning task of inferring a function from labeled training data (via wikipeia).

监督式学习的数据集中的每个点都是“right answers”,即所有的测试数据都是已知的且有着正确的标记。例如预测房价的学习算法,其每个点都是明确已知的:500 ㎡ 的房子卖 $ 100,000 美元。

而监督式学习主要用于回归分析(Regression,即输出是连续的)和数据分类(Classification,输出是离散的)。

非监督式学习(Unsupervised learning)

In machine learning, the problem of unsupervised learning is that of trying to find hidden structure in unlabeled data (via wikipedia).

相对的,非监督式学习即一组没有经过标记的数据——我们只知道这些数据在那里,并不知道这些数据之间的联系、这些数据是什么。例如 Google News 的“相关新闻”聚类:我们只有海量的新闻数据,而并不知道其意味着什么。

非监督式学习主要应用于聚类分析(Cluster analysis)。