贝叶斯分类器(上)

1. 背景

在很多应用中,属性集和类变量之间的关系是不确定的。也就是说,尽管测试记录的属性集和某些训练样例相同,但是也不能正确地预测它的类标号。这种情况产生的原因可能是噪声,或者出现了某些影响分类的因素却没有包含在分析中。

这篇博文将介绍一种对属性集和类变量的概率关系建模的方法—贝叶斯分类器(bayesian classifier)。首先将介绍贝叶斯定理;然后解释贝叶斯定理在分类问题中的应用;接下来描述贝叶斯分类器的两种实现:朴素贝叶斯(naive bayesian classifier)和贝叶斯信念网络(bayesian belief networks),考虑到篇幅的问题,这篇博文只介绍朴素贝叶斯,贝叶斯信念网将在下篇博文介绍;最后将通过例子说明朴素贝叶斯分类的应用。

阅读全文 »

KNN分类

1. 什么是KNN

KNN的全称是K Nearest Neighbour,即K最近邻分类算法,其中的$K$表示最接近自己的$K$个数据样本。与K-Means算法不同的是,KNN算法用于分类,也就是样本空间中的每个样本都有一个类标号,现在要把未知的样本分配到某一类,而K-Means聚类将样本空间中的样本进行分组,根据某种相似度度量,将相近的元素划分为一组,不相近的元素划分为另一组。

KNN算法将样本空间中的每个样本看作$d$维空间上的一个数据点,其中$d$表示属性(特征)个数。给定一个测试样例,通过使用某种相似度度量,计算该测试样本与训练集中其他数据点的邻近度(相似度),给定测试样例$z$的K最近邻是指和$z$距离最近的$K$个数据点,然后根据这$K$个数据点所属的类别,将出现类别数最多的类标号作为测试样例$z$的类别。

用数学的语言描述如下:
假设样本空间中有$n$个样本点$(X_1, X_2, \cdots, X_n)$,它们所属的类标号是$(Y_1, Y_2, \cdots, Y_n)$,给定一个测试样本$Z$,通过使用某种相似度度量,计算出训练样本中与测试样本$Z$最近的$K$个样本点,假设这$K$个样本点的类标号是$(y_1, y_2, \cdots, y_k)$,则测试样本的类标号$C$为:

$$
C = mode(y_1, y_2, \cdots, y_k)
$$

即$C$等于序列$y_1,y_2,\cdots,y_k$的众数,也就是出现次数最多的数。

阅读全文 »

决策树分类

1. 背景

在日常生活中,当我们做决策的时候,经常会提出一系列问题,以让决策的结果能符合对方或者我们的期望。比如,现在Bill想买一台智能手机,他向朋友Martin咨询,有如下对话:

Bill: Martin,我想买一台智能手机,不知有什么可以推荐的?
Martin: 你是想要iPhone,Android还是Windows Phone的?(问题1)
Bill: Android。
Martin: 那大概想要什么价位的?(问题2)
Bill: 大概2000到3000的样子。
Martin: 好的,那你倾向于国产手机还是国外手机?(问题3)
Bill: em…国产手机。

Martin: OK,根据我最近的观察,给你推荐这款手机。
Bill: 谢谢,我试一下。

阅读全文 »

Unix时间戳

1. 什么是Unix时间戳

Unix时间戳(Unix time, POSIX time或Unix timestamp等)是指从1970年的1月1号00:00:00(世界标准时间,UTC)开始所经过的秒数,但不考虑闰秒。内核版本比较低的Linux系统由于将Unix时间戳存储为32位,它能被表示的最后时间是2038年1月19日03:14:07(UTC),因此会导致2038年问题。根据表示的精确度的不同,Unix时间戳有10位(秒级),也有13位(毫秒级),也有19位(纳秒级)等。

2. Unix时间戳转为普通时间

Unix时间戳可以很方便地转为标准时间,可以用Shell、Python和Java等。

2.1 Shell

利用date命令,可以将Unix时间戳转为普通时间,格式为:

1
$ date -d @UnixTimeStamp

比如将Unix时间戳1430297168转为普通时间,可以用如下命令:

1
$ date -d @1430297168

输出Wed Apr 29 16:46:08 CST 2015,可以通过增加选项控制输出的格式,比如

1
$ date -d @1430297168 +%Y%m%d-%T

阅读全文 »

Shell之数据处理

1. 背景

当有一些数据需要我们处理时,比如查找、替换、排序、求和等,我们可能会用Excel软件进行处理。在数据量较小的情况下,这是一种可行的方法,但当数据量比较大时,比如对大小1G的文件,如果还用Excel打开,则它可能挂掉了。这时我们可能会通过编写程序进行处理,比如用R或Python等,这对一些有编程基础的人而言,只是小菜一碟,但对没有编程基础的人而言,则不是那么简单,这时Shell登场了,虽然Shell也是一门编程语言,但完成一般的数据处理只需用几个简单的命令就可以了。

2. Shell简介

Shell是Unix/Linux系统中的脚本编程语言,它经常用于系统管理工作、数据和文本处理。使用Shell脚本主要有以下三个优点:

  • 简单。可以通过几个简单的命令就完成复杂的数据操作
  • 可移植。使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行
  • 开发容易。可以在短时间内完成一个功能强大又好用的脚本

阅读全文 »

K-Means聚类

1. 什么是聚类

“物以类聚,人以群分”,聚类就是将数据划分成有意义或有用的组(簇)。给定一个元素集合D,其中每个元素具有n个特征(或者说可观察属性),聚类的目标是将元素进行分组,使得组内的元素相互之间是相似的(相关的),而不同组中的元素是不同的(不相关的)。组内的相似性(同质性)越大,组间差别越大,则聚类的效果就越好。

阅读全文 »

Logistic回归

1. 背景

Logistic回归是一种概率统计分类模型,它可以看成是对线性回归分析的进一步扩充。当因变量是定性变量(比如分类变量)时,则无法使用线性回归模型,这时可考虑使用LR(Logistic regression)模型。LR回归模型可进行二类分类(Binomial logistic regression)和多类分类(Multinomial logistic regression)。二类分类处理因变量只有两种类别(用0和1表示)的情况,而多类分类则处理因变量有多种类别的情况,这里只讨论二类分类的问题。

二分类的问题在实际中很常见。例如,用户点击网页上的广告,受到很多因素的影响,如广告的图片、广告的大小,广告的文本等等,但最终的结果只有两个,要么点击,要么不点击。我们不妨把$y=1$定义为点击,$y=0$定义为不点击,即
$$
y = \left\{
\begin{array}{ll}
1, & 点击 \\
0, & 不点击 \\
\end{array}
\right.
$$

阅读全文 »