转:http://blog.pluskid.org/?p=290
本文是“漫谈 Clustering 系列”中的第 7 篇,参见本系列的其他文章。
由于总是有各种各样的杂事,这个系列的文章竟然一下子拖了好几个月,(实际上其他的日志我也写得比较少),现在决定还是先把这篇降维的日志写完。我甚至都以及忘记了在这个系列中之前有没有讲过“特征”(feature)的概念了,这里不妨再稍微提一下。机器学习应用到各个领域里,会遇到许多不同类型的数据要处理:图像、文本、音频视频以及物理、生物、化学等实验还有其他工业、商业以及军事上得到的各种数据,如果要为每一种类型的数据都设计独立的算法,那显然是非常不现实的事,因此,机器学习算法通常会采用一些标准的数据格式,最常见的一种格式就是每一个数据对应欧几里德空间里的一个向量。
如果原始的数据格式不兼容,那么就需要首先进行转换,这个过程通常叫做“特征提取”(Feature Extraction),而得到的标准数据格式通常叫做 Feature 。例如,一个最简单的将一个文本 Document 转化为向量的方法如下:
- 选定特征空间,这里采用三维欧氏空间,三个维度(依次)分别由 to 、be 和 the 表示。
- 假设待提取的文档是“To be, or not to be: that is the question:”,首先对其进行一些预处理,例如去掉单词的时态后缀、滤掉标点符号等,得到“to be or not to be that be the question”。
- 统计三个维度所对应的单词出现的频率:to 2 次,be 3 次,the 1 次。
- 该文档对应的向量即
[2, 3, 1]
。
当然,在实际中我们几乎不会这样人工设定空间的各个维度所对应的单词,而通常是从一个数据集中统计出所有出现的词,再将其中的一些挑选出来作为维度。怎样挑选呢?最简单的办法是根本不做任何挑选,或者简单地只是把出现频率太低的单词(维度)去掉。
不过,事实上我们通常会做更复杂一些的处理,例如,如果你是在做 sentiment analysis ,那么你通常会更加关注语气很重的词,比如 “bad”、“terrible”、“awesome” 等的重要性就比普通的词要大,此时你可以为每一个维度设一个权重,例如,给 “bad” 设置权重 2 ,那么出现 3 次的话,向量在该维度对应的值就为 2*3 = 6
。当然这样手工指定权重只在小范围内可行,如果要为数百万个维度指定权重,那显然是不可能的,另一个稍微自动一点的办法是 tf-idf 。
tf 就是 Term Frequency ,就和刚才说的单词出现的次数差不多,而 idf 则是 Inverse Document Frequency ,通常使用如下公式进行计算:
其中 是
所对应的低维表示再重新构造出来的高维形式,就相当于是压缩之后解压出来的结果,不过虽然有许多压缩方法都是无损的,就是说这个差值会等于零,但是大部分降维的结果都是有损的。不过我们仍然希望把上面的 reconstruction error 最小化。
另外一种方式是简单地使用 variance 来衡量所包含信息量,例如,我们要把一些 D 维的向量降为 1 维,那么我们希望这一维的 variance 达到最大化,亦即:
从直观上来说,这样的目标函数的意义在于:如果原来 和
比较接近,那么
会相对比较大,这样如果映射过后
和
相差比较大的话,就会被权重
放大,因此最小化目标函数就保证了原来相近的点在映射过后也不会彼此相差太远。
令 为将
的每一行加起来所得到的对角阵,而
,被称作是拉普拉斯矩阵,通过求解如下的特征值问题
以求解出最优的局部线性重构矩阵 ,对于距离较远的点
和
,
应当等于零。这之后再把
当作已知量对下式进行最小化:
经过类似的推导,最终要求解的特征值问题如下:
得到的按照特征值从小到大排序的特征向量就组成映射矩阵 ,和 LE 不同的是这里不需要去掉第一个特征向量。另一点是在 LE 中的特征值是一个稀疏的特征值问题,在只需要求解最小的几个特征值的时候可以比较高效地求解,而这里的矩阵在乘以
之后通常就不再稀疏了,计算量会变得比较大,这个问题可以使用 Spectral Regression 的方法来解决,参见 Spectral Regression: A Unified Approach for Sparse Subspace Learning 这篇 paper 。如果采用 Kernel Trick 再把 LPP 非线性化的话,又会回到 LE 。而 LLE 的线性版本 NPE 也是采用了类似的办法来得到的,就不在这里多讲了。
另外,虽然 LE 是 unsupervised 的,但是如果训练数据确实有标签可用,也是可以加以利用的——在构造相似度矩阵的时候,属于同一类别的相似度要大一些,而不同类别的相似度则会小一些。
当然,除去聚类或分类之外,降维本身也是一种比较通用的数据分析的方法,不过有许多人批评降维,说得到的结果没有意义,不用说非线性,就是最简单的线性降维,除去一些非藏极端的特殊情况的话,通常将原来的分量线性组合一下都不会得到什么有现成的物理意义的量了。然而话也说回来,现在的机器学习几乎都是更 prefer “黑盒子”式的方法吧,比如决策树,各个分支对应与变量的话,它的决策过程其实人是可以“看到”或者说“理解”的,但是 SVM 就不那么“直观“了,如果再加上降维处理,就更加“不透明”了。不过我觉得这没什么不好的,如果只是靠可以清晰描诉出来的 rule 的话,似乎感觉神秘感不够,没法发展出“智能”来啊 ^_^bb 最后,所谓有没有物理意义,其实物理量不过也都是人为了描述问题方便而定义出来的吧。