SAS中文论坛

标题: 假如我们面对1000万列的数据该怎么聚类? [打印本页]

作者: shiyiming    时间: 2010-1-26 16:58
标题: 假如我们面对1000万列的数据该怎么聚类?
同题,有没有高手知道?
作者: shiyiming    时间: 2010-1-27 11:56
标题: Re: 假如我们面对100万列的数据该怎么聚类?
选好需要的变量 recode 之后
用fastclus
聚到一两百类里
再用每个需要的变量在这个类内的平均指标做cluster
作者: shiyiming    时间: 2010-1-27 16:06
标题: Re: 假如我们面对100万列的数据该怎么聚类?
非常感谢楼上的答复。不过问题似乎没有这么简单,我不知道你有没有做过这样的数据?SAS会崩溃的。我们要做的似乎是自己开发代码,而绝非用SAS现成的子程序K-means过程步proc fastclus那么简单。还有什么层次聚类过程proc cluster,你想都不用想,它的计算复杂度是O(n的平方)^_^。
作者: shiyiming    时间: 2010-1-28 16:02
标题: Re: 假如我们面对100万列的数据该怎么聚类?
百万列的 我用fastlus做过 没问题
作者: shiyiming    时间: 2010-1-29 17:14
标题: Re: 假如我们面对100万列的数据该怎么聚类?
100万,绝对没问题,除非你用自己的笔记本来跑。
作者: shiyiming    时间: 2010-1-30 19:49
标题: Re: 假如我们面对100万列的数据该怎么聚类?
哦,我倒是没有试过,不过100万只是一个假设,事实上可能在千万级以上。另外,proc fastclus可能只做欧式距离数据,不能对夹角余弦实现聚类,而我恰恰需要用夹角余弦。非常感谢两位的实验结果!
作者: shiyiming    时间: 2010-2-3 19:07
标题: Re: 假如我们面对100万列的数据该怎么聚类?
才一百万而已。。。
作者: shiyiming    时间: 2010-2-7 17:41
标题: Re: 假如我们面对100万列的数据该怎么聚类?
你是说100万列还是100万行的数据,这是非常不同的概念?SAS数据文件只支持最大到3万多个变量(列),你的100万列文件是没法全部load的。

如果你有100万列,但是行数很少的话,又需要对row (subject)做partition clustering,可以用kernelization的方法,就是转置,再求内积,再应用kernel函数(可以是identity,也可以是高斯,uniform,quadratic等),对这个新矩阵做PCA或者SVD,求出right eigenvector matrix,再用这个right eigenvector matrix对原数据做线性变换,得到的前几个score就足够用PROC FASTCLUS来做partition clustering,比如k-means clustering

--------------------
我的博客: <!-- m --><a class="postlink" href="http://sas-programming.blogspot.com">http://sas-programming.blogspot.com</a><!-- m -->
作者: shiyiming    时间: 2010-2-8 15:00
标题: Re: 假如我们面对100万列的数据该怎么聚类?
非常感谢楼上两位的答复。不过,两位似乎有点粗心,只看标题不看回复。
我已经说过了,一百万列只是个假设,实际上列数可能达到千万级以上乃至上亿。另外,谁说SAS只能load三万多列?依据是什么?能给出引述出处吗?非常感谢你说的几个解决步骤,不过这些似乎都是纸上谈兵,实际上我已经试过了,我想你也可以试一下,等结果出来我们再探讨一下。注意:希望你最好用至少[b:f0m6i70s]1千万行×500万列[/b:f0m6i70s]数据测试。另外,SAS的fastcluster过程步不能做夹角余弦,而我的需求必须要夹角余弦。
多谢!
作者: shiyiming    时间: 2010-2-8 16:12
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
我不是学统计的,不知道什么是聚类。看过大家的讨论,有些摸不着头脑,不过有一点我觉得很奇怪,那就是:我们现在有了关系型数据库概念了,为什么还要假设一个上万列甚至以百万为单位的数据表格形式呢?
搬门弄斧,各位莫怪啊,呵呵。
作者: shiyiming    时间: 2010-2-8 23:12
标题: Re: 假如我们面对100万列的数据该怎么聚类?
SAS 9.1以上支持超过32K的变量个数,但是依然受pagesize和操作系统的限制,不是想多大就多大,你列的这个级别在PC上没法做,至少是32位windows下不行。1000万行X500万列的数据我觉得用分布式集群做,自己写代码,而不是用SAS来做。google自己做pagerank和其他数据挖掘都是数亿列,数百亿行的矩阵,都是自己写的专有代码。

为啥我说的是纸上谈兵?你的依据是啥?

另外你需要用vector之间夹角来算,就自己来算这个夹角呗。只是&gt;500万个features这么高维的vector,夹角怕是分不出来区别的。
作者: shiyiming    时间: 2010-2-9 10:06
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
oloolo,多谢!所有的回复只有你最后的回复符合我的本意。的确如此,这么高维的数据我也猜测SAS作不出来了。你提到的Google的Pagerank,和我的估计一模一样,我不知道你是否愿意share关于Google的Pagerank?愿意留下你的QQ吗?再次感谢!
作者: shiyiming    时间: 2010-2-11 01:22
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
我不在google工作,具体的了解不多。
作者: shiyiming    时间: 2010-2-11 18:45
标题: Re: 偶来打个酱油
偶来打个酱油:实际业务中需要直接对1000万个变量做聚类吗?即使技术上支持这么做,其结果又如何解释、应用?
作者: shiyiming    时间: 2010-2-17 02:18
标题: Re: 偶来打个酱油
to em_2002

In business applications, the cases to cluster 10000K variables are rare, where you deal with hundreds of, or maybe several thousand, demographic/transactional variables.

But think of microarray analysis, which may involve tens of thousands of arrays, or think of face recognition. In most cases, each face image is a rectangular matrix of several hundred of rows and columns or more, and their product is easily of the magnitude of 100K+. For examle, N people, each person has a face image under X different expressions and you want to cluster these N*X images for different purposes, say cluster by person or by expression. The matrix representation of the tensor is very large. Of course, you can work with a series of thin SVD reduced pseduo images. But in any case you will have to work on a very large matrix of many columns.

On the other hand, when you use kernel method, which involves inner product of your original matrix, then you will get a square matrix of dimension of tens of thousands when your original observations is at that magnitude.

As for interpretation, that is case by case, depending on the applications.

Well, that is my $0.02.  If there are any mistakes, please don't hesitate to point them out.
作者: shiyiming    时间: 2010-2-20 12:59
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
看错了,不好意思。oloolo 所说只能load3万列的说法是不对的。

最后你要对变量(500万列)做聚类呢 还是对观测(1000万行)。对变量的话oloolo用转置是个好办法啊。

拿聚类观测做例子, 有1000万个观测,要做聚类。
夹角余弦你可以根据夹角余玄的公式把数据算成两两向量直接余玄值的矩阵(1000w*1000w),这种数据是可以用来做聚类的。只不过这么大数据不知道做起来会要多久
作者: shiyiming    时间: 2010-2-27 02:42
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
to lqq316

data like 50000K by 10000K matrix is extra large database, and need special methods to handle.
While storage nowadays is not a big issue, in such case, even using confusion matrix won't help the computation because the resulting matrix will still be 1000K-by-1000K, and the computation hurdle will be prohibitive in most affordable machines (&lt;$500K cost).

One work around would be using randomized matrix approximation. For example, select a portion of columns with given probability, and conduct matrix factorization on the confusion matrix, which will be very small if the #of columns selected is within manageble magnitude. Obtain linear transformation matrix from the matrix factorization and project full data into this new space. In some cases, you can also keep only portion of the rows with probability of your selection. There also are algorithms that do element-wise selection. Each selection schema is different from the rest and possesses its unqiue properties and application contexts.
作者: shiyiming    时间: 2010-3-2 14:18
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
嗯,在做聚类之前,基于你要分组的目的 其实可以先做一些变量筛选的步骤(如varclus方法)。把变量减少一下之后做出来的matrix应该就不会非常大了
作者: shiyiming    时间: 2010-3-2 15:48
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
应该先查查VARCLUS用的算法,对于500万-by-100万列的矩阵,基本上是practically infeasible
VARCLUS 基于principle factor analysis (PFA)。PFA 又基于SVD,时间复杂度大约是O(v^3),v是变量个数。VARCLUS所需时间又稍大于主要素分析,这么算来对100万列的矩阵来做变量聚类是基本不可行的。你不妨先在你自己的PC上用SAS对一个1万-by-1万的矩阵做一个PCA,看看需要多长时间。

另外,很多分析是不能用变量聚类抽取部分“重要”变量来分析的。比如时间序列性质的基因测试样本,很长一段时间的信用卡交易数据,数百万居民一年时间内每15分钟的电力消耗及预测【这个是智能电网的重要组成部分】,顾客在百货公司里面行走的坐标,停留时间和对应的消费量【女顾客这方面的数据量尤其大,呵呵】。这些分析重点就在整个矩阵的结构上,而不是某一些“显著”变量,所以要尽量保留多的信息。RSVD虽然只是随机sample一部分变量来做SVD,但是最后完整的的矩阵还是要投影到用小样本算出来的正交空间里面,这方面有点类似于一个依概率的插值算法,原有信息还是尽可能地保留了。

oblique的要素分析在一些经济分析里面还是很有用的,特别是可解释性很强,不过相比现代数据挖掘方法个人感觉它的用处还是不是很大。

我靠,我真闲啊,半夜2点还在发贴,版主发点奖励吧。
作者: shiyiming    时间: 2010-3-3 09:13
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
我已经有一个解决方案,多谢楼上各位的回复给了我很多灵感。
作者: shiyiming    时间: 2010-3-3 09:46
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
to today2009
介意分享一下么?迄今为止你都是idea 的接受方哈。
作者: shiyiming    时间: 2010-3-3 16:30
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
只是一个idea,我还需要和我的团队沟通一下才能最终确认是否可行。
作者: shiyiming    时间: 2010-7-18 16:06
标题: Re: 假如我们面对1000万列的数据该怎么聚类?
这么大的数据列来聚类,不知道理论上行得通的方法,结果的解释性是否合理,甚至会无法解释,当然我没有做过,还是如上面所说的,需要通过简化列的量,解除其共线性,做一下处理再来做,是不是效果会更好一点
或许也可以对数据进行分组,然后进行转置,来聚类
没有处理过,没有发言权,说出一下自己想的




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2