webdancer's Blog

PCA

PCA是一种降低数据特征维度的技术。它通过将高维空间数据正交投影到低维子空间,使投影空间中数据的方差最大来实现。另外的一种理解是它通过将高维空间数据正交投影到低维子空间,最小化从投影数据恢复到原数据的误差。PCA带来的好处是数据压缩后,能有更小的存储要求,有更快的分类速度;但是带来的坏处就是,在数据压缩的过程中,可能会丢失一些特征。

继续阅读

Neural Networks笔记1

1.继续八卦NN的历史

人工神经网络的研究者,试图创造一个大脑和机器处理信息的统一模型,在这个模型中,信息按照同意的规则进行处理。正如Frank Rosenblatt所希望的:

"the fundamental laws of organization which are common to all information handling systems, machines and men included, may eventually be understood."

继续阅读

应用梯度下降和随机梯度下降时的几个注意点

随机梯度下降算法的基本思想,在前面已经说过了。在应用梯度下降的时候有几个要注意的点,再重新记录一下。

1.收敛

我们在应用梯度下降的时候,一定要关注是否收敛。一般来说,$\mathbb E(\theta)$收敛到一定的值,所求出来的参数也是基本相同的。能使用梯度下降的求解的问题,影响我们求解的是它的学习速率(可以参考前面的内容)。速率过大,可能不收敛;速率过小,收敛速度过慢,所以我们必须恰当的选择学习速率$\eta$。通过下面的例子看以看到[1]:

继续阅读

机器学习入门

机器学习主要是设计和分析使计算机能够“学习”的算法,这些算法能从经验数据集中发现规律,并根据规律对未知数据做预测。

  1. 那么到底什么是学习呢?我的理解是:广义上来说, 学习就是程序能够根据经验提高自己性能,狭义上来说,从概率图模型的角度,一个完整的建模过程包括:表示,推断,学习,这里的学习就是确定模型中的参数。
  2. 经验数据:那么这些经验数据又从拿来呢?一般来说,可以是人手工整理的数据或是从网络中整理收集的数据。这些数据,或多或少都会混杂着人类的经验。例如:在图像分类的数据集中,可能图片已经由人类手工标注过了。

机器学习已经有了十分广泛的应用,例如:数据挖掘(CV)、计算机视觉(CV)、自然语言处理(NLP)、生物特征识别、搜索引擎(IR)、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人运用等。

Tom Mitchell 对机器学习经典的定义[1]:
 A computer program is said to learn from experience E with respect to some class of tasks T and performace measure P, if its performance at tasks T, as measured by P, improves with experience E.
Herbert Simon认为:
Learning is any change in a system that produces a more or less permanent change in its capacity for adapting to its environment.
看以看出,机器学习描述中,涉及到三个基本方面:
  1. 任务T。我们要处理的是一个什么样的任务,是无人汽车设计问题,语言识别,还是人脸识别等等。我们必须对我们要处理的任务有一个清晰的认识。
  2. 性能标准P。我们使用什么样的标准来说明我们模型的好坏,这对我们后面设计学习的目标函数时候有指导作用,我们根据标准P来设计和调整模型,满足我们的任务要求。
  3. 训练经验E。从那里获取训练经验可能对我们系统学习的好坏有非常直接的影响,必须自己选择。
模式识别是通过计算机算法来研究模式的自动处理和判读,也就是从数据中发现规律,并采取相应的动作。模式是指环境和客体,对人类来说,两类很重要的模式是光学和声学信号。现在模式识别的一个常用的手段就是机器学习。在AI领域的两个常见的问题是图像识别和语音识别。举例,一个经典的例子就是“手写字符识别“。我们设计一个learner从一个巨大的手写字符图片库中进行学习,当有新的手写字符图片时,我们希望我们的learner能够做出正确的判断。

两类问题-分类和回归

对于一般的机器学习问题,可以认为去估计一个函数$f:\mathcal{X}\rightarrow \mathcal{Y}$.

两个基本问题是分类和回归问题:
  1. 分类问题输出$\mathcal{Y}$是离散的,例如在二类问题中,输出值通常为:$\{-1,+1\}$;
  2. 回归问题输出$\mathcal{Y}$则是连续的,例如:在曲线拟合问题中,输出为:$\mathbb R$。
分类问题关心的是类别是否匹配,代表每个类别的数字只是一个符号而已,可以换成任意其他符号,并且这些符号之间一般没有什么关系,例如,原本是数字 8 ,把它分类成 7 或者 2 都同样是错误的,并不会因为 7 (从数值上)更接近 8 就是一个更好的结果。在这种情况下,0-1 loss 是最自然的损失函数。而回归问题不一样,比如,今天的气温是 28 度,预测为 25 度很自然地比预测为 2 度要好。说白了就是分类问题中输出是离散的,用了离散度量来衡量相似度,而回归问题中则用了$\mathbb R$上的欧氏度量。对于很多现实问题我们都可以转化为这两类问题。比如:在很多的Email系统中都可以判断一封邮件是否是垃圾邮件,这里涉及到了二类问题。如果我们希望根据以前的二手房成交数据来预测未来的交易价格,则是一个回归问题,我们希望得到的一个具体的价格。

模式识别问题的过程

学习过程中涉及到的名词:feature vector, target vector, data set, training set, test set,performance measure.
  1. feature vector:  $x^i=(x_1,x_2,\dots,x_m);$
  2. target vector: $y^i=(y_1,y_2,\dots.y_k);$
  3. data set:    $X=(x^1,x^2,\dots,x^n); Y=(y^1,y^2,\dots,y^n);$
在上面的表示中,$x^i,y^i$分别表示一个实例的输入和输出;而$x_i$则表示输入的某个特征。m表示输入变量的特征空间;k表示是一个多标签问题,k代表着标签的数目;n则是data set的数目。
  1. 首先,通常是特征提取和选择。特征提取就是将输入的数据转化为特征集合,从而得到特征向量。特征提取就是选择特征的一个子集。特征提取和选择是维度下降(dimension reduction)的主要方法;
  2.  然后,我们就要设计算法,实现一个学习器以满足不同的任务。通常要根据实际应用看是什么问题,从而选择不同的算法类型;
  3. 最后,在不同的数据集上评价我们的模型。

机器学习的不同类型

大多数的机器学习和模式识别识别算法在本质上是基于概率的,使用统计推断的方式给实例加标签。根据算法的不同,我们通常可以做一下的分类[2]:
  1. 监督学习。在监督学习中,训练集合(training set)中的实例是输入值和期望的输出值(通常是人们手工标注的标签或其他值)的二元组。在监督学习中,有训练集合得到一个分类器(分类问题)和回归函数(回归问题),能够对任何的有效输入值做出预测。
  2. 非监督学习。在非监督学习中,训练集合中的实例是由输入值构成的,没有输出值(标注的标签)。在半监督学习中,学习的目标是发现训练数据的结构特征。通常用到的算法有聚类等。
  3. 半监督学习。在半监督学习中,我们使用有标签数据(即上面所说的二元组形式)和无标签的数据一起来构建分类器。
  4. 增强式学习。在增强式学习中,关注在给出的环境中,采取恰当的措施,以取得最大的回报。它最重要的一个特征就是平衡exploration和exploitation的关系,取得一个最优的解。
  5.  其他

评价标准

  1. Accuracy. 指正确分类的数目占总的数目的比例,写成数学公式

\[Accuracy=\frac{right}{total}\]

  1.  Weighted Accuracy. 针对不同类型的错误,加上权值。根据不同的情况赋予不同的值,这样我们就能区别不同的错误。
  2. Precision and Recall。 这个衡量指标常用到文档检索中,查准率(Precision)表示了我们检索出的相关信息占我们检索出信息的比例;而查全率(Recall)则表示了我们检索出的相关信息在整个系统相关文档中的比例。
  3.  F1. 把Precision 和 Recall 这两个指标结合起来的指标是F1 ,定义如下:
  \[F_1= 2 \frac{Precison+Recall}{Precision times Recall}\]
 
  1.  ROC(Receiver Operating Characteristic). ROC是最近很流行的一个评价指标,通过作ROC曲线,计算ROC面积,可以衡量模型作出的预测好坏。
泛化(generation)是指我们的学习器对新的输入的预测能力,如果能很好的处理新输入,则泛化能力好。我们之所以很注重泛化,是因为现实中输入空间是非常大的,我们的训练集只占其中的一小部分。所以在我们考虑实现ML算法的过程中,算法的泛化能力是我们必须考虑的,所以我们要把数据集划分出测试集,在测试集上测试模型的好坏。

实例:多项式曲线拟合

曲线的拟合问题,并不陌生,不管是高中还是大学的课堂中都有接触。在曲线拟合中,我们接触到了一个评价拟合好坏的标准:误差函数(Error Function)。误差函数主要是描述的是训练集中我们的预测值与实际值的差距。常用的误差函数就是平方差的和,如下:
\[
\begin{equation}
\label{least-square-sum}
\mathbb E(w)=\frac{1}{2}\sum_{n=1}^N\{y(x_{n},w)-t_{n}\}^2
\end{equation}
\]
求解的过程一般就是对函数求导,得到关于$w$的线性函数,从而可以得到一个解析解$w^*$。
为了考虑模型的泛化能力,我们需要在测试集上计算$\mathbb E(w)$的值。在这里会出现一个问题:over-fitting。解决这个问题,经常使用的方法就是regularization,公式如下。
\[
\begin{equation}
\label{least-square-sum-with-reg}
 \mathbb E(w)=\frac{1}{2}\sum_{n=1}^N\{y(x_{n},w)-t_{n}\}^2+\frac{\lambda}{2}\|w\|
\end{equation}
\]
正则化的作用就是惩罚系数,可以使参数变得稀疏。
 

机器学习软件

现在有很多的机器学习的软件包,帮助我们快速解决问题,比如:

  • python scikit-learn 
  • shogun toolbox
  • mlpy
  • pylearn2
  • weka
  • R
  • others

当然,我们可能也要实现一些基本的算法,可能会使用具体的矩阵工具和优化工具,比如:

  • matlab/octave
  • numpy,scipy
  • R

在我的笔记中,使用matlab和scikit-learn来演示实现和使用学习算法。

scikit-learn简介

1.数据(Data):在scikit-learn中,有一些自带的数据集,我们通常关注的是数据的特征和目标值。比如数字集合,获取特征和目标值,可以使用下面的代码:

>>> from sklearn import datasets
>>> digits = datasets.load_digits()
>>> digits_data = digits.data
>>> digits_target = digits.target

如果使用‘type’查看一下digits_data和digits_target的类型,可以知道它们是numpy.ndarray类型,这样如果我们自己需要提取特征的时候,只需要保存为这种数据类型,就可以使用scikit-learn 中的方法了。

2.学习和预测:这时机器学习中最核心的部分,使用什么样的模型,确定了这种模型后,如何更快更准确的进行学习,如何改进模型,提高泛化的能力。在scikit-learn 中,进行分类(或是其他任物)的估算器(estimator)是实现了fit(X,Y)和predict(X)的python对象。

>>> from sklearn import svm
>>> clf = svm.SVC(gamma=1e-4,C=100)
>>> clf.fit(digits_data[:-1],digits_target[:-1])
SVC(C=100, cache_size=200, class_weight=None, coef0=0.0, degree=3,
  gamma=0.0001, kernel='rbf', max_iter=-1, probability=False,
  random_state=None, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict(digits_data[-1],digits_target[-1])

如果想要保存我们训练的模型,可以使用python库中的pickle模块。

>>> import pickle
>>> model = pickle.dumps(clf)
>>> clf2 = pickle.loads(model)

引用

1.机器学习,<http://www.cs.cmu.edu/~tom/mlbook.html>
 
2.http://en.wikipedia.org/wiki/Machine_learning




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee