假期发现个神博客,把博主资料拉出来膜拜Orz
Computer Science& Artificial Intelligence Laboratory (CSAIL)
The Center forBrains, Minds & Machines (CBMM)
MassachusettsInstitute of Technology (MIT)
下面笔记下聚类系列文章。
漫谈 Clustering 系列
· 漫谈 Clustering (1): k-means
K-means是将N维欧式空间中的点进行聚类的经典算法,很简单。
对于每一个 cluster ,我们可以选出一个中心点 (center) ,使得该 cluster 中的所有的点到该中心点的距离小于到其他 cluster 的中心的距离。
距离用欧式距离,就是两个向量的差的模;中心是到类内所有点的距离之和最小的位置,经计算可知中心就是所有类内点的平均值,所以叫K-means(K均值)。其中K是类别数,需要用户指定。
计算步骤 略 文中有详细讲解。复杂度O(N)
存在的问题
1. 不能自动确定 聚类个数K如何确定聚类个数呢?可以观察数据,根据先验知识自行确定(这不是废话= =);还有专门确定聚类个数的方法,大致就是用特定的目标函数衡量K,求个目标函数极值。2. 中心初值的选取影响聚类结果
抛开K-means不讲,好些方法都需要给定聚类数,pluskid后面专门写了篇文讨论聚类数的。一些方法在聚类的过程中可以对类进行分裂或组合,从而改变类的个数,使目标函数最大的类别数是非平凡的(不像K-means, 使各距离最小的聚类个数就是点数,即每个点自己一类,当然距离最小,这样平凡的结果不是我们想要的)。层次聚类的方法干脆不给出一个确定的聚类方案,各种类别数的都有,要啥随便取,绕开了类别数的问题。
想象目标函数是个大波浪线,九曲十八弯,计算过程相当于在线上走,每次都会向下走一点,直到陷入一个坑中,作为最终结果。显然,最初站位的好坏影响着最终结果。3. 容易受 噪声干扰。
中心是类内所有点的均值,如果有个噪声点,夸张点,在整体数据集的十万八千里外,一均值,它会把所在类别的中心给扯走老远。4. 聚类结果是个 球形。类内的点离中心点的欧式距离最近,这些点会以中心点为圆心成球形(或者超球体)。其他形状的就不适用了。
并且点的距离可以用欧式距离来衡量。后面介绍的方法,有些只要知道两两点之间的相似度就好了。对于K-Means,只有相似度矩阵,不能直接用,除了用相似度来代替欧拉距离外,中心也不再是简单的均值了。
· 漫谈 Clustering (2): k-medoids
有时欧氏距离是不适用的,比如数据为整数,有0和1,均值为0.5是要闹哪样= =. 所以用相似度矩阵代替吧,可以人为设定点的相似度,扩展性更好,还方便诸如半监督的改进(例如,已知某些点不在同类,减小对应相似度的值就好了)。上面提到如果用相似度矩阵代替,中心就不再是均值了,那该是什么呢?K-medoids里用数据点作为类的中心,即选择与类内点的相似度之和最大的点作为中心。计算过程与K-means类似,但是要选出中心,复杂度较高O(N^2). 相比更robust,因为中心是实际的数据点,受噪声影响更小。
· 漫谈 Clustering (番外篇): Vector Quantization
突然扯到向量量化,作为K-means的应用介绍。向量量化,我的理解就是从N维向量空间到一维实数域的映射,嗯,就是把向量压缩成一个数。乍一看,想到的是自组织映射。文中用的聚类,大致是把一堆向量聚成好几类,用类号来代表每个向量,聚类的方法当然就用经典的K-means啦。这么干有什么好处呢,比如做图像压缩,有损的压缩,每种颜色(R,G,B)就是个向量,可以把相似的颜色用一种颜色代替。哪些颜色相似呢?聚类啊!事先存个颜色表,里面是每类的中心,图像里每个像素上只要存类号即可,不用存整个颜色向量了。
说起图像压缩,之前写过几个,哈夫曼和小波。
Huffman编码,这个大家都知道的,大致思想是把数据都重新编码,希望出现频率高的数据编码短,频率低的编码长,从而降低平均码长。对于颜色比较单一的效果好,如果颜色比较多,外加存个码表,有时压缩了反而更大。。
小波编码,将图像小波变化下,分成四个频带,大部分信息都聚集在低频子带,高频子带中聚集着图像边缘和纹理信息。压缩图像,可以只取低频子带,扔掉其余的,或者再花些功夫,把高频子带编码下,常见有EZW和SPINT算法。
· 漫谈 Clustering (3): Gaussian Mixture Model
GMM和K-means很像(GMM中各类的方差和聚类系数相等,再取个ln,就相当于是K-means,再乘些常数系数)。相比K-means,GMM不仅可以给出点的类别,还能给出点属于该类的概率,称作软划分(soft),K-means就是硬划分(hard).在聚类方面,可以认为每类的点遵循一个高斯分布,均值就是类的中心。把K类的高斯分布乘上权重(聚类系数)加起来,就是高斯混合模型GMM. GMM说是可以任意程度近似任意连续函数(高大上= =),经常用来估计密度。
计算上,抛去类别数K,需要求三组参数,各类的聚类系数、均值和方差。
从似然估计的角度,希望数据出现的概率尽量大,假设各数据独立出现,这个概率就是p(xi)的乘积(i=1..N)。用这个式子(通常先取个ln,方便计算)分别对那三组参数求导,取导数为零时的极值,即为各参数的似然估计解。不过解的形式比较复杂,没方直接算,一般用EM迭代着算个局部最优解出来。
另一种角度是Bayes估计,希望类别的后验概率尽量大,和似然估计的差别是多乘了个先验概率 p(K|X)=p(X|K)*p(K)/p(X) 通常忽略p(X)不计,不影响类别。比如抛硬币,抛了10回都是正面(这人品),似然估计出来正面概率是1,反面是0,这显然不对啊。如果加上先验概率,p(正)=p(反)=0.5,后验概率顶多正面概率大些,反面不至于为零。可以看出没有先验知识的似然估计容易过拟合数据。当数据量足够大时,Bayes估计向似然估计收敛,殊途同归嘛。但是这先验概率也不是那么好加的,通常只是选择和后验概率相同形式的模型,方便计算。
具体过程见链接吧,详细推导见《Patternrecognition and Machine learning》Chapter9 讲的清楚漂亮。
计算复杂度上,GMM的EM过程比K-means慢不少,一种方法是先用K-means算个大概的均值(中心),作为GMM的初值,再EM,速度快效果好(聚类是各种算法的好助手= =~)。
文中还谈到机器学习的归纳偏执。为了将学到知识存起来,并用于新事物,人会进行归纳。对应着机器学习,就是算法假设的模型,比如假设这个概率密度是高斯分布,要做的是归纳出高斯分布的参数。归纳的太细,会过拟合数据;太宽泛,效果又不好。难点在于找到那个平衡点。
“不过人在这里相对于(现在的)机器来说有一个很大的优势:人通常不会孤立地用某一个独立的系统和模型去处理问题,一个人每天都会从各个来源获取大量的信息,并且通过各种手段进行整合处理,归纳所得的所有知识最终得以统一地存储起来,并能有机地组合起来去解决特定的问题。”
机器学习,人工智能,希望机器能像人一样学习,从而代替人来完成一些工作。问题就来了,能否像教人类一样的教机器?人类远比当今的机器复杂,某行为学习的项目研究多年,也只训练出两岁人类的智商,谷歌那边的大脑貌似有某种小动物的智商了。另一方面,机器能做到人都无法做到的,快速的计算能力,打败了棋王什么的。人都不知道的事,怎么去教机器。就像是聚类,结果出来之前,人自己都不清楚有什么,聚完之后,还得观察分析一番才知道,哦,原来这类是水果脑残粉啊。传统的方法像教人类一样地教机器。比如语音识别,希望机器从语法学起,从而识别语音,合情合理,却始终没什么进展。深度学习一蹦出来,不教你了,你自己“脑”补去吧!结果搞出翻天覆地的进展,现在语音识别遍地都是。用机器的方式来教机器。
o 漫谈 Clustering (追忆篇): Regularized GMM
这篇是讲混合高斯模型的方差,怎么计算避免平凡解。(高大上= = 好吧 我就是没看懂…)
啊,说起混合高斯模型的方差,如果某高斯模型的均值等于某数据点,那么它的方差容易得到无穷小。想象,方差越小,波峰越抖,在该数据点的概率就越大,似然估计值就越大,所以求似然估计时方差会趋向于无穷小。但是高斯模型不会有这种问题,因为还要顾及其他数据点,而混合高斯模型中有好几个高斯模型,让其他高斯模型去顾及那些数据点吧,哇哈哈(小恶魔怎么跑出来了= =)。另外Bayes估计也不会有这种问题。
· 漫谈 Clustering (番外篇): Expectation Maximization
之前求GMM的似然估计时用到的EM算法,看链接吧= =。
· 漫谈 Clustering (4): Spectral Clustering
“Spectral Clustering 其实就是通过 Laplacian Eigenmap 的降维方式降维之后再做 K-means 的一个过程。”这个降维过程,大致就是把相似度矩阵整一整,求个特征值和特征向量,保留前M小的特征值对应的特征向量,得到N*M维的矩阵,相当于从N维降到M维。文中从图分割的角度分析了原理。这么看来,谱聚类真是很适合社团检测。
谱聚类的优点
只用相似度矩阵;抓住主要矛盾,忽略次要的东西;计算复杂度比K-means小。后两项都是降了维,适用于维度非常高的问题。这么说起来,不用K-means,降了维用其他方法聚类也可以哦。
· 漫谈 Clustering (番外篇): DimensionalityReduction
Curse of dimension 说的就是维度太高导致的灾难,许多算法的复杂度都与数据的维度相关。为了减小维度,有两类方法,feature selection 和dimensionality reduction. 前者是从原有维度中选择重要的维度,后者是重新计算出新的维度。Feature selection 也看作是dimensionality reduction的特殊情况。
降维的目的通常是为了方便计算,希望尽可能地保留原有信息。于是问题转化为如何衡量对信息的保留程度。
一种衡量方式是新旧特征向量的欧氏距离(reconstruction error)。两个向量维度不同,可以用个常量把维度不足的地方补全。
另一种方式是用方差来衡量信息量,希望它尽量的大。
当降维函数为线性的,两种方式会得到同样的结果,这种方法就是主成分分析(PCA)。线性变换矩阵大致就是每一维(列向量)选择与之前的维度垂直,并且数据方差最大的方向。PCA是降维的经典方法,地位相当于聚类中的K-means。一些缺点:一是限定在线性变换,Kernel PCA用Kernel trick将PCA推广到非线性的情况。二是“PCA实际上可以看作是一个具有 Gaussian先验和条件概率分布的 latent variable 模型,它假定数据的 mean 和 variance 是重要的特征,并依靠 covariance 最大化来作为优化目标,而事实上这有时候对于解决问题帮助并不大。”还真没看出来…回头补下。
PCA的目的是保留数据信息,但并一定有助于分类等其他问题。所以如果是为了其他问题,最好以这些问题为目标函数。比如分类,如果有数据的标签,可以用线性辨别分析(LDA)。LDA也是线性映射模型,目标函数是类内方差尽量小,类间方差尽量大。
如果不知道数据的标签,可以用MDS,目标是保持降维前后数据的相对距离一致。另一种类似的方法是Laplacian Eigenmap(LE),也就是谱聚类用来降维的方法,文中详细介绍了它。不过LE需要的相似度矩阵是局部性的,如果两点离的太远,相似度应为零。“事实上,LaplacianEigenmap 假设数据分布在一个嵌套在高维空间中的低维流形上, Laplacian Matrix L 则是流形的 Laplace Beltrami operator 的一个离散近似。”
此外还介绍了和LE类似的Locally Linear Embedding(LLE),大致就是认为一个点可以通过周围局部点线性组合出来。
LE和LLE都是非线性的,数据变了需要重新算,不像PCA一样保留个变换矩阵可以继续用。于是有人提出它们的线性形式 Locality Preserving Projection 和Neighborhood Preserving Embedding。如果用Kernel Trick再把LPP非线性化,就会又回到LE,说明两者是对应的。
· 漫谈 Clustering (5): Hierarchical Clustering
文中讲的也不多,直接看链接吧。感叹下python真好用。
· 漫谈 Clustering (6):Evaluation & Visualization
还未写,作者加了个油啊
· 漫谈 Clustering (番外篇): Deciding the Number ofClusterings
聚类数,觉得这本来就是个需要看实际问题才能决定的参数,好多算法都留着各种参数来影响着这点。
文中主要介绍了实现AffinityPropagation的心酸史= =
“因为虽然各种算法都或多或少地需要指定一些参数,但是这些参数从不同的角度来阐释对应的问题”
*红字mark下待补充部分