Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要通过与scipy.linalg.eig类似的特征值分解在pyspark中找到非对称方矩阵的特征向量_Python_Scipy_Pyspark_Apache Spark Mllib_Eigenvector - Fatal编程技术网

Python 需要通过与scipy.linalg.eig类似的特征值分解在pyspark中找到非对称方矩阵的特征向量

Python 需要通过与scipy.linalg.eig类似的特征值分解在pyspark中找到非对称方矩阵的特征向量,python,scipy,pyspark,apache-spark-mllib,eigenvector,Python,Scipy,Pyspark,Apache Spark Mllib,Eigenvector,我是初学者,如果我在什么地方出错,请纠正我 我有一个100万x 100万的方阵。 我想在pyspark中找到它的特征向量。我知道computeSVD给了我特征向量,但这些都是通过SVD得到的,结果是一个密集矩阵,这是一个局部数据结构。我想要scipy.linalg.eig给出的结果 我看到有一个函数使用java中的ARPACK和spark的ScalaAPI进行分解。它会给出与scipy中eig相同的特征向量吗?如果是,有什么方法可以在pyspark中使用它吗?或者是否有其他解决方案。我可以在代码

我是初学者,如果我在什么地方出错,请纠正我

我有一个100万x 100万的方阵。 我想在pyspark中找到它的特征向量。我知道computeSVD给了我特征向量,但这些都是通过SVD得到的,结果是一个密集矩阵,这是一个局部数据结构。我想要scipy.linalg.eig给出的结果

我看到有一个函数使用java中的ARPACK和spark的ScalaAPI进行分解。它会给出与scipy中eig相同的特征向量吗?如果是,有什么方法可以在pyspark中使用它吗?或者是否有其他解决方案。我可以在代码中直接使用ARPACK吗?或者我必须自己编写Arnoldi迭代(例如)?
谢谢你的帮助。

我已经开发了一个python代码来获取一个scipy稀疏矩阵,并创建一个行矩阵作为computeSVD的输入。 这是将csr_矩阵转换为SparseVector列表所需的部分。我使用并行版本,因为顺序版本要慢得多,而且很容易使其并行

from pyspark.ml.linalg import SparseVector
from pyspark.mllib.linalg.distributed import RowMatrix
from multiprocessing.dummy import Pool as ThreadPool 
from functools import reduce
from pyspark.sql import DataFrame


num_row, num_col = fullMatrix.shape
lst_total = [None] * num_row
selected_indices = [i for i in range(num_row)]

def addMllibSparseVector(idx):
    curr = fullMatrix.getrow(idx)
    arr_ind = np.argsort(curr.indices)
    lst_total[idx] = (idx, SparseVector(num_col\
                 , curr.indices[arr_ind], curr.data[arr_ind]),)
pool = ThreadPool() 
pool.map(addMllibSparseVector, selected_indices)
pool.close()
pool.join()
然后我使用下面的代码创建数据帧

import math
lst_dfs = []
batch_size = 5000
num_range = math.ceil(num_row / batch_size)

lst_dfs = [None] * num_range
selected_dataframes = [i for i in range(num_range)]

def makeDataframes(idx):
    start = idx * batch_size
    end = min(start + batch_size, num_row)
    lst_dfs[idx] = sqlContext.createDataFrame(lst_total[start:end]\
        , ["id", "features"])            
pool = ThreadPool() 
pool.map(makeDataframes, selected_dataframes)
pool.close()
pool.join()
然后我将它们减少到1个数据帧并创建行矩阵

raw_df = reduce(DataFrame.unionAll,*lst_dfs)
raw_rdd = raw_df.select('features').rdd.map(list)
raw_rdd.cache() 
mat = RowMatrix(raw_rdd)
svd = mat.computeSVD(100, computeU=True)

我简化了代码,还没有完全测试它。如果有问题,请随时发表评论。

您是否在pyspark中尝试了scipy.linalg.eig?我认为它会起作用。@RishikeshTeke问题是整个矩阵无法存在于驱动程序节点上,并且内存不足。所以我需要一些分布式的东西。我在Pyspark文档中发现了这一点,它可能会有所帮助:对于密集向量,MLlib使用NumPy数组类型,因此您可以简单地传递NumPy数组。对于稀疏向量,用户可以从MLlib构造SparseVector对象,或者传递SciPy SciPy.sparse列向量(如果SciPy在其环境中可用)。在稠密矩阵上,有一种toArray方法,可以将其转换为ndArray,u可以将其提供给scipy.linalg。eig@RishikeshTeke谢谢你的帮助。问题是我不能使用numpy阵列,因为它不适合驱动程序内存。我只需要在分布式矩阵中执行整个操作。我需要一个类似于spark中scipy.linalg.eig的函数,它将以分布式方式运行,而不是在使用本地数据结构(如numpy阵列)的驱动程序上运行。在这种情况下,我建议使用scipy的ARPACK包装器