python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

Posted 蔡军帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)相关的知识,希望对你有一定的参考价值。

    print(train_set.tdm)
    print(type(train_set.tdm))

输出得到:

  (0, 3200)    0.264940780338
  (0, 1682)    0.356545827856
  (0, 3875)    0.404535449364
  (0, 2638)    0.375094236628
  (0, 2643)    0.420086333071
  (0, 558)    0.332314202381
  (0, 2383)    0.215711023304
  (0, 3233)    0.304884643652
  (0, 3848)    0.26822694041
  (1, 1682)    0.0679433740085
  (1, 3586)    0.186001809282
  (1, 1748)    0.224453998729
  (1, 4369)    0.217962362491
  (1, 4102)    0.321977101868
  (1, 3717)    0.11571865147
  (1, 1849)    0.23976007391
  (1, 3019)    0.105831301914
  (1, 2731)    0.133236987271
  (1, 2284)    0.158959982269
  (1, 1129)    0.224453998729
  (1, 4004)    0.14716429302
  (1, 1113)    0.224453998729
  (1, 1239)    0.23282317344
  (1, 4439)    0.17621324335
  (1, 4075)    0.111234138548
  :    :
  (3297, 4296)    0.189022497666
  (3297, 1273)    0.173257613112
  (3297, 611)    0.189022497666
  (3297, 1639)    0.201945480138
  (3297, 1401)    0.196076146399
  (3297, 800)    0.193531186809
  (3297, 4442)    0.213804760507
  (3298, 2383)    0.115351969953
  (3298, 3848)    0.143434978411
  (3298, 3480)    0.166989458436
  (3298, 767)    0.208015125433
  (3298, 3836)    0.115469714921
  (3298, 3877)    0.132381892057
  (3298, 4387)    0.302243669544
  (3298, 2967)    0.182430066726
  (3298, 4184)    0.170734583655
  (3298, 3878)    0.131142324027
  (3298, 3381)    0.202336034891
  (3298, 3959)    0.299487688552
  (3298, 1392)    0.257499357524
  (3298, 3039)    0.266066529253
  (3298, 3599)    0.27026191686
  (3298, 4289)    0.302243669544
  (3298, 484)    0.36124988755
  (3298, 2037)    0.36124988755
<class \'scipy.sparse.csr.csr_matrix\'>

 

说明这个变量train_set.tdm是个scipy.sparse.csr.csr_matrix,类似稀疏矩阵,输出得到的是矩阵中非0的行列坐标及值,现在我们要挑出每一行中值最大的k项。

首先我们知道一个对于稀疏矩阵很方便函数:

 

    #输出非零元素对应的行坐标和列坐标
    nonzero=train_set.tdm.nonzero()
    #nonzero是个tuple
    print(type(nonzero))
    print(nonzero[0])
    print(nonzero[1])
    print(nonzero[1][0])

 

 

 

输出为:

 

<class \'tuple\'>
[   0    0    0 ..., 3298 3298 3298]
[3200 1682 3875 ..., 4289  484 2037]
3200

 

其实train_set.tdm是我文本挖掘tf-idf后得到的权重矩阵,

我要挑出每条记录中权重最大的76个词,根据权重从大到小输出这些词的字典编号到excel
我用一个class来存储这些非零格子的两个信息:一个是这个词权重信息,一个是这个词的字典编号,
lis来存一条记录的所有权重非零词的信息,gather则是所有lis的集合,代码如下:
    class obj:
    def __init__(self):
        self.key=0
        self.weight=0.0


    k=0 #k用来记录是不是一条记录结束了
    lis=[]
    gather=[]
    p=-1 #p用来计数,每走一遍循环+1
    for i in nonzero[0]:#i不一定每循环就+1的,它是nonzero【0】里的数,不懂可以看之前输出的nonzero【0】
        p=p+1
        print(i)
        if k==i:
            a=obj()
            a.key=nonzero[1][p]#这个词的字典编号就是它属于第几列
            a.weight=train_set.tdm[i,nonzero[1][p]]
            lis.append(a)
        else:
            lis.sort(key=lambda obj: obj.weight, reverse=True)#对链表内为类对象的排序
            #print(lis)
            gather.append(lis)
            while k < i:
                k=k+1
            lis=[]
            a=obj()
            a.key=nonzero[1][p]
            a.weight=train_set.tdm[i,nonzero[1][p]]
            lis.append(a)
    gather.append(lis)

最后就是输出到excel中

    myexcel = xlwt.Workbook()
    sheet = myexcel.add_sheet(\'sheet\')
    #si,sj表示输出到第几行第几列
    si=-1
    sj=-1
    for i in gather:
        si=si+1
        for j in i:
            sj=sj+1
            sheet.write(si,sj,str(j.key))
        while sj<=76:
            sj=sj+1
            sheet.write(si,sj,\'-1\')#要是没有那么多词组就用-1代替
        sj=-1
    myexcel.save("attribute76.xls")

 

就如下所示:

 

 

以上是关于python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)的主要内容,如果未能解决你的问题,请参考以下文章

稀疏矩阵转置

K-SVD字典学习及其实现(Python)

如何求稀疏矩阵的全部特征值和特征向量?

推荐系统中矩阵分解算法-funkSVD和ALS

Python 稀疏矩阵访问元素

IEEE Trans 2006 使用K-SVD构造超完备字典以进行稀疏表示(稀疏分解)