k-means 算法
下面我们讨论聚类问题(clustering)的算法。给定n个p维空间上的样本点,如何把它们分为k类,使得距离相近的点尽量在同一类里?k-means算法是这样做的:首先我们随机k个坐标点μ1,⋯,μk,称为聚类中心(cluster centroids)。对于每个样本点xi,我们找到距离xi最近的那个聚类中心作为xi的类别。具体地,取ci=argjmin∥xi−μj∥2。接着,我们调整聚类中心的位置,使每个中心的位置等于当前属于这一类的所有坐标点的均值。具体地,μj′=∑i1[ci=j]∑i(1[ci=j]⋅xi)。得到新的聚类中心之后,我们再次更新ci,接着再次更新μj,不断重复上述过程。我们期待聚类中心的坐标最终会渐渐收敛,这样就得到了聚类的结果。
k-means算法一定会收敛吗?大体上来说是肯定的。我们定义distortion function如下:J(c,μ)=i=1∑n∥xi−μci∥2,表示每个样本点与其对应的聚类中心的距离平方和。我们发现,随着算法的进行这个函数一定是单调递减的:当我们固定μ重新分配ci时,每个xi都会选择使得∥xi−μci∥最小的ci,因此J一定减小;当我们固定ci重新计算μ时,我们会把聚类中心移到每个类别的均值的位置,这对于每个类都一定会减小距离平方和。综上根据单调有界必收敛,J(c,μ)最终一定会收敛到某个值。虽然在某些极端例子中,J收敛并不能保证c和μ也收敛,但即便那样聚类中心的位置也可以被认为是基本没有变化了。所以k-means一般就可以被认为是收敛的。
我们注意到,J函数并不是凸函数,因此k-means得到的可能只是局部最优解,这取决于初始时随机的情况。所以实际应用时,我们一般会多执行几次这个算法,取最优的结果。
期望最大化算法(Expectation-Maximization algorithm, EM)
依然考虑聚类问题。类似高斯判别分析,我们建立这样的模型:假设样本点是根据k个不同的高斯分布生成的,模型有一个参数向量ϕ,ϕj表示生成第j类点的概率;有每个类别的期望和协方差矩阵μj,Σj。我们希望找到这样的ϕ,μ,Σ,使得样本点这样的分布是参数ϕ,μ,Σ下概率最大的分布。具体地,我们的假设下的模型生成一列点(u1,⋯,um)的概率是i=1∏mp(ui∣ϕ,μ,Σ)。因此我们训练的目标就是最大化i=1∏np(xi∣ϕ,μ,Σ),取对数等价于最大化i=1∑nlogp(xi∣ϕ,μ,Σ)。其中,为了计算p(xi∣ϕ,μ,Σ),必须用到全概率公式枚举所有可能的类别的概率p(xi∣ϕ,μ,Σ)=z=1∑kp(xi∣z,μ,Σ)p(z,ϕ)。
遗憾的是,尽管看上去和高斯判别分析很类似,以上目标函数梯度为零的方程却是没有封闭解的。原因在于,我们引入了隐变量z(latent variable)。如果我们能提前给出每个样本点应该属于哪一类,那么目标函数的求导就和高斯判别分析中一样了,也就有封闭解了。为此,我们每一次先猜测z,然后代入z优化得到ϕ,μ,Σ。接着再次猜测,再次优化,直到猜测收敛位置。这就是EM算法,猜测的过程称为E-step,优化的过程称为M-step。具体地,在E-step中我们不给出每个z的具体值而是计算分布:wj(i)=p(z=j∣xi,ϕ,μ,Σ)(这可以直接由多元高斯分布的density表达式计算得到)。在M-step中,仿照高斯判别分析的结果得到ϕj=n1i=1∑nwj(i),μj=i∑wj(i)i∑wj(i)xi,Σj=i∑wj(i)i∑wj(i)(xi−μj)(xi−μj)⊤,也即新的类别分布取决于上一阶段每个点位于每种类别的概率之和,新的均值点和方差是上一阶段每个点在该类别上的概率加权平均。重复以上过程直到收敛以后,对于每个样本点输出概率最大的那个高斯分布即可。
主成分分析(Principle component analysis, PCA)
对于高维空间中的样本点(假设是p维的),它们可能在某些方向上有较大的方差,有些方向上则有较小的方差。如果我们选取若干个两两垂直的方差最大的方向(不妨设k维),把样本点投影到这k个方向向量上,我们就可以看作把样本点降到了k维。由于我们舍弃的是方差最小的方向,我们认为这样做损失的样本信息是较少的。这个降维方法就称为主成分分析。
假设我们有n个p维的样本点xi,k个主方向wi,那么降维的过程可以写作矩阵乘法:x1⊤⋮xn⊤[w1⋯wk]=t1⊤⋮tn⊤,其中ti=(⟨xi,w1⟩,⋯,⟨xi,wk⟩)。我们把上式简记为XW=T。
如何选取主方向呢?首先我们假设所有样本点的期望就落在原点,不然我们可以先做平移。为了选取方差最大的第一主方向w1,我们就是要使得样本点在这个方向上投影的方差(平方和)最大,也即maxi=1∑n⟨xi,w1⟩2,其中∥w1∥=1。注意到,i=1∑n⟨xi,w1⟩2=∥Xw1∥2,因此等价于最大化(Xw1)2=w1⊤X⊤Xw1,∥w1∥=1。这等价于max∥w1∥2w1⊤X⊤Xw1。在组合数学中我们学过Rayleigh Quotient,这个最大值就是矩阵X⊤X的最大特征值λ1,当w1取λ1对应的特征向量时取到。这样我们就找到了第一主方向。接下来要求第二主方向,我们首先所有样本点在w1方向上的分量:x^i=xi−(w1⊤xi)w1。这样所有样本点都与w1垂直了,换言之样本点已经没有w1方向上的维度了。我们再用同样的方法求新的矩阵X^⊤X^的最大特征值与特征向量,得到的方向一定是与w1垂直的方向上样本点方差最大的方向, 这就是第二主方向。以此类推,一般地,求第k主方向的方法是:x^i=xi−j=1∑k−1(wj⊤xi)wj,求max∥wk∥2wk⊤X^⊤X^wk。