ele*_*ora 6 python numpy scipy igraph scikit-learn
我有一个大文件,其中每行有一对8个字符串.就像是:
ab1234gh iu9240gh
Run Code Online (Sandbox Code Playgroud)
在每一行.
此文件实际上代表一个图形,每个字符串都是一个节点ID.我想在文件中读取并直接创建一个scipy稀疏邻接矩阵.然后,我将使用python中提供的众多工具之一在此矩阵上运行PCA
有没有一种巧妙的方法来做到这一点,还是我需要首先在RAM中制作一个图形,然后将其转换为稀疏矩阵?由于文件很大,我想尽可能避免中间步骤.
最后,我将稀疏邻接矩阵提供给http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD.
我认为这是一项常规任务sklearn,所以包中必须有一些工具可以做到这一点,或者是其他SO问题的答案.我们需要添加正确的标签.
但只是根据我的知识numpy和sparse我所做的工作:
制作样本2d数组 - N行,2列,包含字符值:
In [638]: A=np.array([('a','b'),('b','d'),('a','d'),('b','c'),('d','e')])
In [639]: A
Out[639]:
array([['a', 'b'],
['b', 'd'],
['a', 'd'],
['b', 'c'],
['d', 'e']],
dtype='<U1')
Run Code Online (Sandbox Code Playgroud)
使用np.unique来识别唯一的字符串,并作为奖金从这些字符串到原来的阵图.这是任务的主力.
In [640]: k1,k2,k3=np.unique(A,return_inverse=True,return_index=True)
In [641]: k1
Out[641]:
array(['a', 'b', 'c', 'd', 'e'],
dtype='<U1')
In [642]: k2
Out[642]: array([0, 1, 7, 3, 9], dtype=int32)
In [643]: k3
Out[643]: array([0, 1, 1, 3, 0, 3, 1, 2, 3, 4], dtype=int32)
Run Code Online (Sandbox Code Playgroud)
我可以重塑该inverse数组以识别每个条目的行和列A.
In [644]: rows,cols=k3.reshape(A.shape).T
In [645]: rows
Out[645]: array([0, 1, 0, 1, 3], dtype=int32)
In [646]: cols
Out[646]: array([1, 3, 3, 2, 4], dtype=int32)
Run Code Online (Sandbox Code Playgroud)
有了这些,1在每个'交叉点' 构造一个稀疏矩阵是微不足道的.
In [648]: M=sparse.coo_matrix((np.ones(rows.shape,int),(rows,cols)))
In [649]: M
Out[649]:
<4x5 sparse matrix of type '<class 'numpy.int32'>'
with 5 stored elements in COOrdinate format>
In [650]: M.A
Out[650]:
array([[0, 1, 0, 1, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]])
Run Code Online (Sandbox Code Playgroud)
第一行,a第二和第四列中的值,b和d.等等.
============================
原来我有:
In [648]: M=sparse.coo_matrix((np.ones(k1.shape,int),(rows,cols)))
Run Code Online (Sandbox Code Playgroud)
这是错的.所述data阵列应匹配rows和cols形状.在这里它没有引发错误,因为k1恰好具有相同的大小.但是使用不同的混合,唯一值可能会引发错误.
====================
这种方法假设整个数据库,A可以加载到内存中. unique可能需要类似的内存使用.最初,coo矩阵可能不会增加内存使用量,因为它将使用作为参数提供的数组.但任何计算和/或转换csr或其他格式将进一步复制.
我可以想象通过以块为单位加载数据库并使用其他一些结构来获取唯一值和映射来解决内存问题.您甚至可以coo从块构造矩阵.但迟早你会遇到内存问题.scikit代码将生成该稀疏矩阵的一个或多个副本.
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |