Random Projection在k-means的应用
1. 随机投影 (Random Projection)
首先,这是一种降维方法。之前已经介绍过相对普遍的PCA的降维方法,这里介绍另一种降维方法Random Project。相比于PCA,他的优势可以这样说:
Random Projection与PCA不一样,其操作简单,只要构建一个投影矩阵即可,而PCA降维还要做SVD,计算开销比较大
1.1 Brief Introduction
随机投影的理论依据是J-L Lemma,公式的核心思想总结一句话就是:在高维欧氏空间里的点集映射到低维空间里相对距离得到某误差范围内的保持。至于为什么要保持,主要是很多机器学习算法都是在以利用点与点之间的距离信息展开计算分析的(如k-means)。
1.2 Johnson–Lindenstrauss lemma
其实并不想这么数学,但是这么重要的定理不说不行。
定理表示:对于任意一个样本大小为m的集合,如果我们通过随机投影将其维度降到一个合适的范围 \(n>8ln(m)/ \epsilon^2\) 内,那么我们将以较高的概率保证投影后的数据点之间的距离信息变化不大。这样我们在做K-mean之类的算法时,就可以先将高维度的数据利用随机投影进行降维处理,然后在执行算法。
上式中,\(f\)为投影到n维空间的正交投影。显然,这样的正交投影操作通常会减少样本点之间的平均距离。该定理Lemma可以看成这样操作:首先,你通过算法获得随机投影,这可能减少平均距离,然后你scale up这个距离,以便平均距离返回到其先前的值。 这个操作将不再是一个NP-hard问题,时间复杂度降为多项式复杂度。
1.3 Method
介绍完JL Lemma,接下来就简单了。如果\(X_{d \times N}\) 是d维的原始样本矩阵,那么\(X^{RP}_{k \times N} = R_{k\times d}X_{d \times N}\)是降维后的k维样本矩阵。这个计算过程十分简单,生成随机矩阵\(R\)且将\(X\)映射从\(d\)为到\(k\)维空间中的时间复杂度为\(O(nkd)\)。
1.4 高斯随机投影 Gaussian random projection
可以使用高斯分布生成随机矩阵 \(R\)。随机矩阵的第一行是从\(S^{d-1}\)均匀选择的随机单位向量,第二行是来自与第一行正交的空间的随机单位向量,第三行是来自与前两行正交的空间的随机单位矢量,依此类推。 在这种选择 \(R\) 的方式中,\(R\) 是正交矩阵(其转置的倒数),并且满足以下属性:
- 球对称(Spherical symmetry):对于任何正交矩阵\(A \in O(d)\),\(RA\) 和 \(R\) 具有相同的分布。
- 正交性:R的行彼此正交。
- R的行是单位长度向量。
要讨论高斯随机投影为什么有效,我们需要先来讨论下一个核心问题,高斯投影是否可以从理论上保证投影降维前后,数据点的空间分布距离基本保持不变呢?这个问题其实可以等价于证明另一个问题,即高斯投影能否做到将高维空间的点均匀的投影到低维空间中,如果能做到这一点,那么我们也可以证明其具备“投影降维前后,数据点的空间分布距离基本保持不变”的能力。
我们来考虑一个采样问题,就是怎样在高维单位球体的表面上均匀的采样。首先,考虑二维的情况,就是在球形的周长上采样。我们考虑如下方法:第一,先在一个包含该圆形的外接正方形内均匀的采样;第二,将采样到的点投影到圆形上。具体地说就是,第一,先独立均匀的从区间[−1,1](我们假设圆形跟正方形的中心点都在原点)内产生两个值组成一个二维的点(x1,x2);第二,将该二维点投影到圆形上。例如,如下图所示,如果我们产生点是图中的A,B两点,那么投影到圆形上就是C点,如果产生的是点D,那么投影到圆形上就是E点。但是,用这样的方法得到点在圆形上并不是均匀分布的,比如产生C点的概率将大于产生E点概率,因为可以投影到C点对应的那条直线比E点对应的那条直线要长。解决的办法是去掉圆形外面的点,也就是如果我们首先产生的点在圆形外的话(比如点B),那么我们就丢弃该点,重新在产生,这样的话产生的点在圆形上是均匀分布的。
那么,我们能否将此方法扩展到高维的情况下呢?答案是不行的。因为在高维的情况下球与正方体的体积比将非常非常小,几乎接近于零。也就是我们在正方体内产生的点几乎不可能落到球体内部,那么也就无法产生有效的点。那么,在高维的球体上,我们应该怎样才能产生一个均匀分布与球体表面的点呢?答案是利用高斯分布。即将上述第一步改成:以均值为零方差为1的高斯分布独立地产生d个值,形成一个d维的点x=(x1,x2,⋯,xd);然后第二步:将点x归一化x̃ =x/‖x‖。用这种方法产生点必定均匀分布在高维球体表面。
2. Random Projection在k-means中的应用
对于k-means来说,将样本划分为距离最近的一个聚簇,这个过程可以使用下面的式子来表示:
每个数据点样本都要和聚簇中心做一次上述操作,所以一次迭代过程中计算复杂度为 , 是 指 样本 维度。观察上面的式子, 的计算是可以预先完成的, 可以在每次迭代时预先计算好,而不必对每个样本都计算一次。所以更新的关键操作就是 的计算,即计算数据样本矩阵 和 聚簇 中心 的内积 。所以我们可以想办法在样本矩阵上做操作来减小计算的复杂度。
这时候,随机投影的降维操作就派上了用场,下图是随机投影在随机投影在k-means上操作的流程:
Reference:
- http://www.cnblogs.com/LittleHann/p/6558575.html#undefined
- https://blog.csdn.net/ljj583905183/article/details/47980169
- https://en.wikipedia.org/wiki/Random_projection
- https://zhuanlan.zhihu.com/p/45408671
Random Projection在k-means的应用的更多相关文章
- Machine Learning/Random Projection
这次突然打算写点dimension reduction的东西, 虽然可以从PCA, manifold learning之类的东西开始, 但很难用那些东西说出好玩的东西. 这次选择的是一个不太出名但很有 ...
- Random Projection
Random Projection在k-means的应用 1. 随机投影 (Random Projection) 首先,这是一种降维方法.之前已经介绍过相对普遍的PCA的降维方法,这里介绍另一种降 ...
- scikit-learn:4.5. Random Projection
參考:http://scikit-learn.org/stable/modules/random_projection.html The sklearn.random_projection modul ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- 软件——机器学习与Python,聚类,K——means
K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...
- 笔记-python-standard library-9.6 random
笔记-python-standard library-9.6 random 1. random source code:Lib/random.py 1.1. functions for ...
- python random模块
random.random() 返回[0,1)之间的浮点数 random.randrange(stop) / random.randrange(start,stop[,step]) 返回[0,st ...
- Python中的random模块,来自于Capricorn的实验室
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- 快速查找无序数组中的第K大数?
1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...
随机推荐
- python基础学习1-列表使用
python 列表相关操作方法 namelist = ['a','b','c','d','1','2','3','4'] namelist1 = ['a','b','c','d','1','2','3 ...
- linux 升级 5.0.2内核
1.下载 wet https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.2.tar.xz -o /usr/src/ cd /usr/src ta ...
- 使用 spring-boot-devtools 进行热部署
2019/3/5 更新: 发现热部署不生效,出现页面显示error的错误,然后在 application.properties 中注释了下面两行成功实现热部署(直接删掉也可以) #spring.dev ...
- JAVA 文件读取写入后 md5值不变的方法
假如我们想把某文件读入 StringBuffer 并写入新文件,新文件md5值需要保持不变(写入新文件后保证和源文件一模一样), 我们就需要在操作 StringBuffer 时附加换行符: Strin ...
- 纯 CSS 解决自定义 CheckBox 背景颜色问题
CodePen 需要使用色 #ec6337(当然可以是任意颜色),解决问题:记住密码定制 CheckBox,解释全在注释里 主要使用到 ::before 或 ::after 伪类处理,伪装成内部的那个 ...
- 如何在内网安装compass
神器compass是肿么用这里不做介绍,因为我也不清楚,可参考官网:http://compass-style.org.这里主要介绍如何在内网安装compass. 首先介绍一般是如何安装compass的 ...
- Jq_打印
利用IE自带的WebBrowser进行打印 打印判断: if(factory.object)//打印设置的判断 factory.printing.PageSetup(); else alert(& ...
- 测试开发:Python+Django实现接口测试工具
Python+Django接口自动化 引言: 最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去.出于各种花里胡哨的 ...
- idea使用actiBPM插件中文乱码
idea 安转activiti插件后,编辑流程图发现保存后中文乱码,并且idea的字符集(Settings—>Editor—>File Encodings)已经设置为UTF-8,流程图中中 ...
- 2、Arx二次开发创建第一个应用程序
一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...