2014-11-15 2 views
3

У меня есть текстовый файл, содержащий данные, представляющие собой разреженную матрицу в следующем формате:Как вручную создать разреженную матрицу в Python

0 234 345 
0 236 
0 345 365 465 
0 12 35 379 

Данные используются для задачи классификации и каждая строка может считаться вектор функции. Первое значение в каждой строке представляет собой метку, следующие за ней значения представляют собой наличие отдельных функций.

Я пытаюсь создать разреженную матрицу с этими значениями (для использования в задаче машинного обучения с изучением scikit). Я нашел и прочитал scipy.sparse documentation, но я не понимаю, как постепенно наращивать разреженную матрицу с исходными данными, подобными этому.

Примеры, которые я нашел до сих пор, показывают, как взять плотную матрицу и преобразовать ее, или как создать собственную разреженную матрицу с надуманными данными, но нет примеров, которые помогли мне здесь. Я нашел этот связанный вопрос SO (Building and updating a sparse matrix in python using scipy), но пример предполагает, что вы знаете максимальные значения COL, ROW, которых я не знаю, так что тип данных не подходит.

До сих пор у меня есть следующий код, чтобы прочитать документ и анализировать значения в то, что кажется разумным:

def get_sparse_matrix(): 
    matrix = [] 
    with open("data.dat", 'r') as f: 
     for i, line in enumerate(f): 
      row = line.strip().split() 
      label = row[0] 
      features = entry[1:] 
      matrix.append([(i, col) for col in features]) 

    sparse_matrix = #magic happens here 

    return sparse_matrix 

Так вопросы являются,

  • Что является подходящим разреженным матричного типа для использовать здесь?
  • Я направляюсь в правильном направлении с кодом, который у меня есть?

Любая помощь с благодарностью.

+0

Я не понимаю, формат, для каждый элемент в матрице, вам нужны «строка», «кол» и «значение». Где информация «значение»? Чтобы постепенно создавать разреженную матрицу, вы можете использовать: http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.dok_matrix.html#scipy.sparse.dok_matrix – HYRY

+0

Если это необходимо чтобы иметь значение, тогда это может быть 1 или True. Означает ли это это? –

+0

@HYRY hanks для подсказки на dok_matrix, но разве мне все еще нужно знать общее количество столбцов при инициализации dok_matrix? Часть моей проблемы заключается в том, что я не уверен, что будет максимальным значением COL. Я мог бы написать сценарий, который обнаруживает максимальное значение для данного файла данных, но думал, что может существовать некоторый существующий scipy разреженный тип данных матрицы, который не требует, чтобы я это определял. –

ответ

4

Вы можете использовать coo_matrix():

import numpy as np 
from scipy import sparse 
data = """0 234 345 
0 236 
0 345 365 465 
0 12 35 379""" 

column_list = [] 
for line in data.split("\n"): 
    values = [int(x) for x in line.strip().split()[1:]] 
    column_list.append(values) 
lengths = [len(row) for row in column_list] 
cols = np.concatenate(column_list) 
rows = np.repeat(np.arange(len(column_list)), lengths) 
m = sparse.coo_matrix((np.ones_like(rows), (rows, cols))) 

Вот код, чтобы проверить результат:

np.where(m.toarray()) 

выход:

(array([0, 0, 1, 2, 2, 2, 3, 3, 3]), 
array([234, 345, 236, 345, 365, 465, 12, 35, 379])) 
Смежные вопросы