2012-09-06 14 views
18

सामान्य करने के लिए कुशल तरीका मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो एक बड़े स्पैर मैट्रिक्स की पंक्तियों को सामान्य करता है (जैसे कि वे एक के बराबर हैं)।एक Scipy Sparse Matrix

File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 325, in __div__ 
    return self.__truediv__(other) 
File "/usr/lib/python2.6/dist-packages/scipy/sparse/compressed.py", line 230, in __truediv__ 
    raise NotImplementedError 

वहाँ किसी भी यथोचित सरल समाधान कर रहे हैं:

from pylab import * 
import scipy.sparse as sp 

def normalize(W): 
    z = W.sum(0) 
    z[z < 1e-6] = 1e-6 
    return W/z[None,:] 

w = (rand(10,10)<0.1)*rand(10,10) 
w = sp.csr_matrix(w) 
w = normalize(w) 

हालांकि इस निम्न अपवाद देता है? मैंने this पर देखा है, लेकिन अभी भी यह स्पष्ट नहीं है कि वास्तव में विभाजन कैसे करें।

+3

यह मूल रूप से एक डुप्लिकेट है: http: //stackoverflow.c ओम/प्रश्न/12237954/गुणा-तत्व-इन-ए-स्पैस-एरे-साथ-पंक्ति-इन-मैट्रिक्स के साथ, इससे कोई फर्क नहीं पड़ता कि यह पंक्ति के आधार पर गुणात्मक रूप से गुणा या विभाजन है। बेशक अगर किसी के पास एक बेहतर जवाब है, तो महान :) – seberg

+0

ग्रेट - धन्यवाद! – sterne

+0

मैं असहमत हूं, यह एक अलग समस्या है। जिस डुप्लिकेट को आपने इंगित किया है वह तत्व-वार गुणा करता है, जबकि यह प्रश्न प्रत्येक पंक्ति को एक अलग मान से विभाजित करना चाहता है (सभी मानों के समान शून्य तत्वों के बजाय)। नीचे हारून मैकडायड का समाधान कुशलतापूर्वक काम करना चाहिए (और डेटा की प्रतिलिपि की आवश्यकता नहीं है)। – conradlee

उत्तर

29

इसे scikit-learn sklearn.preprocessing.normalize में लागू किया गया है।

from sklearn.preprocessing import normalize 
w_normalized = normalize(w, norm='l1', axis=1) 

axis=1, पंक्तियों से सामान्य चाहिए axis=0 कॉलम के आधार पर सामान्य बनाने में। जगह में मैट्रिक्स को संशोधित करने के लिए वैकल्पिक तर्क copy=False का उपयोग करें।

+2

का डुप्लिकेट है ध्यान दें कि यदि आप सुविधाओं (अक्ष = 0) द्वारा सामान्यीकृत करते हैं तो लौटा मैट्रिक्स प्रकार 'csc' है भले ही डब्ल्यू 'सीएसआर' था। यह अप्रिय हो सकता है अगर आप इसे 'सीएसआर' – Leo

3

यहां मेरा समाधान है।

  • पक्षांतरित प्रत्येक col
  • प्रारूप राशि का पारस्परिक साथ विकर्ण मैट्रिक्स बी के एक
  • calculate राशि
  • ए * बी सामान्य के बराबर होती है
  • पक्षांतरित सी

    import scipy.sparse as sp 
    import numpy as np 
    import math 
    
    minf = 0.0001 
    
    A = sp.lil_matrix((5,5)) 
    b = np.arange(0,5) 
    A.setdiag(b[:-1], k=1) 
    A.setdiag(b) 
    print A.todense() 
    A = A.T 
    print A.todense() 
    
    sum_of_col = A.sum(0).tolist() 
    print sum_of_col 
    c = [] 
    for i in sum_of_col: 
        for j in i: 
         if math.fabs(j)<minf: 
          c.append(0) 
         else: 
          c.append(1/j) 
    
    print c 
    
    B = sp.lil_matrix((5,5)) 
    B.setdiag(c) 
    print B.todense() 
    
    C = A*B 
    print C.todense() 
    C = C.T 
    print C.todense()