2017-12-18 242 views
0

我有一个2D numpy的阵列,其看起来像这样,创建从2D numpy的阵列的COO矩阵

[[3, 4, 5, 6], [4, 5, 6, 7], [9, 10, 3, 5]] 

我使用以下代码转换成COO矩阵这样的:

# Flatten 2D array 
data = np.asarray(twod_array).flatten() 
row = np.arange(0, len(data)) 
col = np.arange(0, len(row)) 
# Make COO matrix 
mat = coo_matrix((data, (row, col)), shape=(len(row), len(row))) 

是这是将2D numpy数组转换为COO矩阵的正确方法?

编辑

我所试图做的就是这一点,我有一个coloumn和项目的其他部分。

parts         item 
processor, display, sensor   temp. monitoring system 
fan baldes, motor, sensor    motion detecting fan 
     .          . 
     .          . 

我已转换的数据对上面的数字,使得它们可以被进一步处理。

parts   items 
1, 2, 3  1 
4, 5, 3  2 

所以现在我想把上面的数据输入到LightFM中,所以我创建了一个这样的2D数组。

[[1, 2, 3, 1], [4, 5, 3, 2]] 

但由于LightFM的拟合方法只需要在形状np.float32 coo_matrix [n_users,n_items]其是含有用户 - 项目交互的矩阵。我使用上述方法转换2D阵列。

+0

你为什么觉得这是不正确的?这是否会导致错误? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ没有错误。我正在使用它来训练LightFM模型,并且模型生成的建议非常奇怪。 –

+0

您可以使用'mat.A'来检查。你的预期产出是多少? – Akavall

回答

1
In [301]: A = np.array([[3, 4, 5, 6], [4, 5, 6, 7], [9, 10, 3, 5]]) 
In [302]: A 
Out[302]: 
array([[ 3, 4, 5, 6], 
     [ 4, 5, 6, 7], 
     [ 9, 10, 3, 5]]) 

你创建一个矩阵的方式:

In [305]: data =A.flatten() 
In [306]: M = sparse.coo_matrix((data,(np.arange(len(data)),np.arange(len(data)) 
    ...:))) 
In [307]: M 
Out[307]: 
<12x12 sparse matrix of type '<class 'numpy.int32'>' 
    with 12 stored elements in COOrdinate format> 

print(M)会显示这些12个值与他们的座标。

如果它不是太大,我喜欢将矩阵显示为数组。 M.A是短切的M.toarray()

In [308]: M.A 
Out[308]: 
array([[ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]]) 

看对角 - 这是原始数组的12个值。那是你要的吗? A的原始3x4布局完全丢失。它可能是这12个数字的1d列表。

或者你可以只传递数组到稀疏的构造,生产原

In [309]: M1 = sparse.coo_matrix(A) 
In [310]: M1 
Out[310]: 
<3x4 sparse matrix of type '<class 'numpy.int32'>' 
    with 12 stored elements in COOrdinate format> 
In [311]: M1.A 
Out[311]: 
array([[ 3, 4, 5, 6], 
     [ 4, 5, 6, 7], 
     [ 9, 10, 3, 5]]) 

取而代之的是12×12对角线的稀疏副本,这是没有任何0的一个3x4的阵列。这更有意义,如果A已经有很多0。

你真的知道你需要什么样的稀疏矩阵吗?

+0

我试过这个,但我得到了'ValueError(“并非所有的估计参数都是有限的,” ValueError:并非所有的估计参数都是有限的,你的模型可能已经发散。学习率或规范化特征值和样本权重“。 –

+0

请参阅编辑 –