2016-01-16 3 views
5

Я выполняю обнаружение темы с контролируемым обучением. Тем не менее, мои матрицы очень большие по размеру (202180 x 15000), и я не могу вместить их в модели, которые я хочу. Большая часть матрицы состоит из нулей. Работает только логистическая регрессия. Есть ли способ, которым я могу продолжать работать с той же матрицей, но позволить им работать с моделями, которые я хочу? Как я могу создать свои матрицы по-другому?Как я могу обрабатывать огромные матрицы?

Вот мой код:

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 

нагрузки Vocabulary

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) 

Создать поезд Матрицу

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) 

Сделать тест матрицы

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 

нагрузки Контролируемая Модель

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)) 

ответ

5

Вы можете использовать определенную структуру данных, доступную в scipy пакет называется разреженной матрицей: http://docs.scipy.org/doc/scipy/reference/sparse.html

Согласно definition:

разреженная матрица просто матрица с большим количеством нулевых значений. Напротив, матрица, где многие или большинство элементов отлична от нуля, называется плотной. Нет строгих правил для того, что составляет разреженную матрицу, поэтому мы скажем, что матрица разрежена, если есть какая-то польза от использования ее разреженности. Кроме того, существует множество разреженных матричных форматов, предназначенных для использования разных шаблонов разреженности (структура ненулевых значений в разреженной матрице) и различные методы доступа к матричным записям и манипуляции с ними.