在Python中创建生成稀疏矩阵(均匀分布高斯分布)

Posted Z.Q.Feng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中创建生成稀疏矩阵(均匀分布高斯分布)相关的知识,希望对你有一定的参考价值。

文章目录


一、前言

在 Python 中产生稀疏矩阵一般使用的是 scipy 包中的 sprase.rand 方法,但是产生的是 0-1 区间内的均匀分布的数,于是便自己写了个生成高斯分布的随机稀疏矩阵函数。


二、准备工作

安装 numpyscipy 包:

pip install -i https://mirrors.aliyun.com/pypi/simple scipy numpy

三、稀疏均匀分布随机矩阵

对标 MATLAB 中的 sprand 函数,我们使用 scipy 中的 sprase.rand 方法即可:

from scipy.sparse import rand

产生一个 m m m n n n 列的服从均匀分布的随机稀疏矩阵,其中 p = 0.1 代表非零元素在此矩阵中所占比例为 10%:

m, n, p = 20, 1, 0.1
M = rand(m, n, p)

矩阵 M 如下:

In [8]: print(M)
  (1, 0)	0.6736398867550694
  (6, 0)	0.990450623569146

注意这里 M 的类型并不是数组,而是 scipy.sparse.coo.coo_matrix 对象,可使用 toarray() 方法或 todense() 方法转换为 matrix 对象或 array 对象。

In [10]: type(M.toarray())
Out[10]: numpy.ndarray

In [11]: type(M.todense())
Out[11]: numpy.matrix

四、稀疏高斯分布随机矩阵

在 scipy 的 sprase 模块中并未看到由此方法,便自己写了个函数,使用了 scipy 包中的 coo_matrix 方法,对标 MATLAB 中的 sprandn 函数:

import numpy as np
from scipy.sparse import coo_matrix

自定义函数如下:

def sprase_rand(m, n, p):
    '''
    Imports
    -------
    import numpy as np
    from scipy.sparse import coo_matrix
    
    Parameters
    ----------
    m : int
        Rows of generate sprase-matrix.
    n : int
        Columns of generate sprase-matrix.
    p : float
        Proportion of non-zero elements in sparse-matrix.

    Returns
    -------
    scipy.sparse.coo.coo_matrix
        Returns a random generated sprase-matrix(m x n) M,
        try print(M) to see it or use M.toarray() for trans 
        M to an array. (Gaussian distribution)
        
    Version: 1.0 writen by z.q.feng @2022.03.13
    '''
    if type(m) != int or type(n) != int:
        raise TypeError('Rows(m) and Columns(n) must be an interger!')
    if p <= 0 or p > 1:
        raise ValueError('p must in (0, 1] !')
    # Counts of non-zero elements in sparse-matrix
    count = int(m * n * p)
    # Indexs of non-zero elements in sparse-matrix
    rows = np.random.randint(0, m, count)
    cols = np.random.randint(0, n, count)
    # Values of non-zero elements in sparse-matrix
    # (Gaussian distribution)
    data = np.random.randn(len(rows))
    return coo_matrix((data, (rows, cols)), shape=(m, n))

同理, m , n m, n m,n 分别为矩阵行数和列数, p p p 为稀疏矩阵中非零元素所占比例,返回的是一个 scipy.sparse.coo.coo_matrix 对象:

m, n, p = 100, 1, 0.1
M = sprase_rand(m, n, p)

生成稀疏矩阵如下:

In [17]: print(M)
  (41, 0)	0.5449276858941307
  (35, 0)	-0.025833278679116962
  (92, 0)	-0.669275138440353
  (4, 0)	0.8758045217206215
  (3, 0)	1.989912762888745
  (0, 0)	0.11984808162782133
  (10, 0)	1.3130062796121102
  (31, 0)	0.3581633202721068
  (33, 0)	1.0432754388670364
  (62, 0)	0.4063437334997744

同理,可使用 toarray() 方法或 todense() 方法填充转换为 matrix 对象或 array 对象。


五、总结

不喜欢写总结。

以上是关于在Python中创建生成稀疏矩阵(均匀分布高斯分布)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Scala 中的 DataFrame 在 Spark 中创建分布式稀疏矩阵

如何在立方体中创建一个均匀的spheries随机分布?

matlab 产生白噪声

生成特定分布随机数的方法

中心极限定理;使用均匀分布产生高斯分布

深度之眼PyTorch训练营第二期 --- 8权值初始化