2014-11-15 28 views
3

創建一個稀疏矩陣I具有包含表示具有以下格式的稀疏矩陣數據的文本文件:如何手動在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

我不明白的格式,矩陣中的每個元素都需要'row','col'和'value'。 「價值」信息在哪裏?要增量創建稀疏矩陣,可以使用: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在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]))