2016-01-16 15 views
5

Przeprowadzam wykrywanie tematów z nadzorowanym uczeniem się. Jednak moje macierze są bardzo duże (202180 x 15000) i nie mogę ich dopasować do potrzebnych modeli. Większość macierzy składa się z zer. Działa tylko regresja logistyczna. Czy istnieje sposób, w jaki mogę dalej pracować z tą samą matrycą, ale czy mogę pracować z modelami, których chcę? Jak mogę tworzyć moje matryce w inny sposób?Jak mogę obsługiwać ogromne macierze?

Oto mój kod:

import numpy as np 
import subprocess 
from sklearn.linear_model import SGDClassifier 
from sklearn.linear_model import LogisticRegression 

from sklearn import metrics 

def run(command): 
    output = subprocess.check_output(command, shell=True) 
    return output 

obciążenia Słownictwo

f = open('/Users/win/Documents/wholedata/RightVo.txt','r') 
    vocab_temp = f.read().split() 
    f.close() 
    col = len(vocab_temp) 
    print("Training column size:") 
    print(col) 

Tworzenie Train Matrix

row = run('cat '+'/Users/win/Documents/wholedata/X_tr.txt'+" | wc -l").split()[0] 
print("Training row size:") 
print(row) 
matrix_tmp = np.zeros((int(row),col), dtype=np.int64) 
print("Train Matrix size:") 
print(matrix_tmp.size) 

label_tmp = np.zeros((int(row)), dtype=np.int64) 
f = open('/Users/win/Documents/wholedata/X_tr.txt','r') 
count = 0 
for line in f: 
    line_tmp = line.split() 
    #print(line_tmp) 
    for word in line_tmp[0:]: 
     if word not in vocab_temp: 
      continue 
     matrix_tmp[count][vocab_temp.index(word)] = 1 
    count = count + 1 
f.close() 
print("Train matrix is:\n ") 
print(matrix_tmp) 
print(label_tmp) 
print("Train Label size:") 
print(len(label_tmp)) 

f = open('/Users/win/Documents/wholedata/RightVo.txt','r') 
vocab_tmp = f.read().split() 
f.close() 
col = len(vocab_tmp) 
print("Test column size:") 
print(col) 

Producent matryca Test

row = run('cat '+'/Users/win/Documents/wholedata/X_te.txt'+" | wc -l").split()[0] 
print("Test row size:") 
print(row) 
matrix_tmp_test = np.zeros((int(row),col), dtype=np.int64) 
print("Test matrix size:") 
print(matrix_tmp_test.size) 

label_tmp_test = np.zeros((int(row)), dtype=np.int64) 

f = open('/Users/win/Documents/wholedata/X_te.txt','r') 
count = 0 
for line in f: 
    line_tmp = line.split() 
    #print(line_tmp) 
    for word in line_tmp[0:]: 
     if word not in vocab_tmp: 
      continue 
     matrix_tmp_test[count][vocab_tmp.index(word)] = 1 
    count = count + 1 
f.close() 
print("Test Matrix is: \n") 
print(matrix_tmp_test) 
print(label_tmp_test) 

print("Test Label Size:") 
print(len(label_tmp_test)) 

xtrain=[] 
with open("/Users/win/Documents/wholedata/Y_te.txt") as filer: 
    for line in filer: 
     xtrain.append(line.strip().split()) 
xtrain= np.ravel(xtrain) 
label_tmp_test=xtrain 

ytrain=[] 
with open("/Users/win/Documents/wholedata/Y_tr.txt") as filer: 
    for line in filer: 
     ytrain.append(line.strip().split()) 
ytrain = np.ravel(ytrain) 
label_tmp=ytrain 

obciążenia Nadzorowane model

model = LogisticRegression() 
model = model.fit(matrix_tmp, label_tmp) 
#print(model) 
print("Entered 1") 
y_train_pred = model.predict(matrix_tmp_test) 
print("Entered 2") 
print(metrics.accuracy_score(label_tmp_test, y_train_pred)) 

Odpowiedz

5

Można użyć konkretnej struktury danych dostępnych w scipy pakiet o nazwie rozrzedzony matrycy: http://docs.scipy.org/doc/scipy/reference/sparse.html

Według definition:

rozrzedzony matrycy jest po prostu macierz z dużą liczbą zer. W przeciwieństwie do tego, macierz, w której wiele lub większość wpisów jest niezerowych, jest uważana za gęstą. Nie ma ścisłych reguł dotyczących tego, co stanowi rzadką matrycę, więc powiemy, że macierz jest rzadka, jeśli jest jakaś korzyść z wykorzystania jej niedostatku. Dodatkowo istnieje wiele rzadkich formatów macierzy, które są zaprojektowane do wykorzystywania różnych wzorów rzadkości (struktura niezerowych wartości w rzadkiej macierzy) i różnych metod uzyskiwania dostępu i manipulowania wpisami macierzy.