matlab sparse

 

下了个Josef Sivic(josef@robots.ox.ac.uk)和 Rob Fergus用matlab实现的pLSA模型,

其中需要调用mex_Pw_d.c

mex_Pw_d.c中有一段需要检验作为参数的Term-Document矩阵是否为稀疏矩阵,如果不是稀疏矩阵,则报错,如代码中粗体显示部分

 

    /* sanity check of the parameters */
    if ((!(mxIsSparse(prhs[0]) ))
    ||(!((nrhs==3)||(nrhs==4)))) {
    printf("usage : C = mex_Estep(X,Pw_z,Pz_d)/n");
    printf("   or : C = mex_Estep(X,Pw_z,Pz_d,beta)/n");
    printf(" computes the normalization oonstant 'C' only for those values/n");
    printf(" which are needed (nonzeros of X). If no 'beta' is given this function/n");
    printf(" does plain EM, TEM otherwise/n");

 

代码附带的例子中有XTrain矩阵作为Term-Document,矩阵的大小是200x15302,用whos查看时显示是sparse矩阵,如下所示:

 Xtest              100x1700               97896  double    sparse   
  Xtrain             100x15304             892772  double    sparse   

可我的Term-Document矩阵只有可怜的50x30大,于是我想增加矩阵的大小,来使得矩阵成为稀疏矩阵,也就是希望其中包含更多个0元素。

怎么增减额,纵向维度30的含义是document集合中vocabulary集合的大小。因为原来用的对features进行局类的kmeans算法是从网上找的,效率不高,不当的使用repmat操作,使得我只能将vocabulary大小设为30,等于或超过40都不行,会导致matlab出现out of memory错误。这个错误折腾了我很久,在网上查了下,原因就是算法占用内存太多。刚好这时来了新机器,4G内存,于是装好新机器(这其中装机又花了不少时间,因为装win7要涉及到验证激活的问题),可是光增加物理内存还是不行,错误 依旧,out of memory,修改操作系统的启动参数,把新机器的内存和老机器调换内存,每台机子都换成3G,同时修改老机器上的xp操作系统启动参数,增加进程可以支配的2GB内存上限,改成3G,还是不行。这个算法实现的也够烂的了。

 

愁死人。突然在google kmeans时发现,matlab自带kmeans算法的,在matlab目录的toolbox/stats下就有。用这个算法试了下,发现其效率很高,内存占用也很小,而且能让我把vocabulary设到1500,只是对我的20080x128矩阵要聚类到1500个word中,在我的新机器(Dell optiplex 960 n series, 2010年3月1日出厂,4核,3G内存,320G硬盘)上,运行了4个多钟头吧,一个下午,够难等的。

 

终于拿到了我要的聚类结果,然后构造Term-document矩阵,大小是50x1500。我想这应该稀疏了吧,可是一运行的pLSA代码,到了开始时提到的部分,马上抛出同样错误。难倒这还不够稀疏吗,这个矩阵里可是有很多0元素了啊。

 

实在没办法,我把我的Term-document矩阵进行拼接, 达到和Xtrain一样的的规模,100行,15000列,但是还是问题依旧。

 

那看来不是这个原因了。

 

发现在用whos查看变量时,列表中有一项是指明矩阵是否稀疏的,我的矩阵虽然达到了XTrain一样的规模,却没有sparse标志。

为什么呢? 也就是说这样增加矩阵的大小是不能搞出稀疏矩阵来的。那怎样才能弄出稀疏矩阵呢。我想会不会是要通过某种方式进行转换,果然一查,用sparse命令就可以。用这个命令把我的矩阵进行转换,果然,经过转换,pLSA代码接受我的矩阵了,顺利运行完成。

 

真是笨啊,稀疏矩阵不等同于矩阵的size大,就算是3x3的矩阵,如果空元素多,那也是稀疏的啊。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值