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]:
机器学习入门
机器学习主要是设计和分析使计算机能够“学习”的算法,这些算法能从经验数据集中发现规律,并根据规律对未知数据做预测。
- 那么到底什么是学习呢?我的理解是:广义上来说, 学习就是程序能够根据经验提高自己性能,狭义上来说,从概率图模型的角度,一个完整的建模过程包括:表示,推断,学习,这里的学习就是确定模型中的参数。
- 经验数据:那么这些经验数据又从拿来呢?一般来说,可以是人手工整理的数据或是从网络中整理收集的数据。这些数据,或多或少都会混杂着人类的经验。例如:在图像分类的数据集中,可能图片已经由人类手工标注过了。
机器学习已经有了十分广泛的应用,例如:数据挖掘(CV)、计算机视觉(CV)、自然语言处理(NLP)、生物特征识别、搜索引擎(IR)、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人运用等。
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.
Learning is any change in a system that produces a more or less permanent change in its capacity for adapting to its environment.
- 任务T。我们要处理的是一个什么样的任务,是无人汽车设计问题,语言识别,还是人脸识别等等。我们必须对我们要处理的任务有一个清晰的认识。
- 性能标准P。我们使用什么样的标准来说明我们模型的好坏,这对我们后面设计学习的目标函数时候有指导作用,我们根据标准P来设计和调整模型,满足我们的任务要求。
- 训练经验E。从那里获取训练经验可能对我们系统学习的好坏有非常直接的影响,必须自己选择。
两类问题-分类和回归
对于一般的机器学习问题,可以认为去估计一个函数$f:\mathcal{X}\rightarrow \mathcal{Y}$.
- 分类问题输出$\mathcal{Y}$是离散的,例如在二类问题中,输出值通常为:$\{-1,+1\}$;
- 回归问题输出$\mathcal{Y}$则是连续的,例如:在曲线拟合问题中,输出为:$\mathbb R$。
模式识别问题的过程
- feature vector: $x^i=(x_1,x_2,\dots,x_m);$
- target vector: $y^i=(y_1,y_2,\dots.y_k);$
- data set: $X=(x^1,x^2,\dots,x^n); Y=(y^1,y^2,\dots,y^n);$
- 首先,通常是特征提取和选择。特征提取就是将输入的数据转化为特征集合,从而得到特征向量。特征提取就是选择特征的一个子集。特征提取和选择是维度下降(dimension reduction)的主要方法;
- 然后,我们就要设计算法,实现一个学习器以满足不同的任务。通常要根据实际应用看是什么问题,从而选择不同的算法类型;
- 最后,在不同的数据集上评价我们的模型。
机器学习的不同类型
- 监督学习。在监督学习中,训练集合(training set)中的实例是输入值和期望的输出值(通常是人们手工标注的标签或其他值)的二元组。在监督学习中,有训练集合得到一个分类器(分类问题)和回归函数(回归问题),能够对任何的有效输入值做出预测。
- 非监督学习。在非监督学习中,训练集合中的实例是由输入值构成的,没有输出值(标注的标签)。在半监督学习中,学习的目标是发现训练数据的结构特征。通常用到的算法有聚类等。
- 半监督学习。在半监督学习中,我们使用有标签数据(即上面所说的二元组形式)和无标签的数据一起来构建分类器。
- 增强式学习。在增强式学习中,关注在给出的环境中,采取恰当的措施,以取得最大的回报。它最重要的一个特征就是平衡exploration和exploitation的关系,取得一个最优的解。
- 其他
评价标准
- Accuracy. 指正确分类的数目占总的数目的比例,写成数学公式
\[Accuracy=\frac{right}{total}\]
- Weighted Accuracy. 针对不同类型的错误,加上权值。根据不同的情况赋予不同的值,这样我们就能区别不同的错误。
- Precision and Recall。 这个衡量指标常用到文档检索中,查准率(Precision)表示了我们检索出的相关信息占我们检索出信息的比例;而查全率(Recall)则表示了我们检索出的相关信息在整个系统相关文档中的比例。
- F1. 把Precision 和 Recall 这两个指标结合起来的指标是F1 ,定义如下:
- ROC(Receiver Operating Characteristic). ROC是最近很流行的一个评价指标,通过作ROC曲线,计算ROC面积,可以衡量模型作出的预测好坏。
实例:多项式曲线拟合
\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}
\]
\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)
引用