【问题标题】:Reducing calculation time and requirements for large covariance matrix减少大协方差矩阵的计算时间和要求
【发布时间】:2018-07-27 23:39:55
【问题描述】:

我目前正在尝试计算约 30k 行矩阵的协方差矩阵(所有值都在 [0,1] 的范围内),并且它需要很长时间(我已经让它运行了一个多小时并且它还没有完成)。

我在较小的示例(7k 行矩阵)中注意到的一件事是,输出的值具有荒谬数量的有效数字(例如 ~10^32),并且可能会减慢速度(并增加文件大小)——是有什么办法可以限制吗?

我一直在一个简单的数据帧上使用 numpys 协方差方法:

import numpy as np
import pandas as pd
import sklearn as sk

df = pd.read_csv('gene_data/genetic_data25.csv')

df = df.set_index('ID_REF')
df = (df-df.min(axis = 0))/(df.max(axis = 0)-df.min(axis = 0))

cov = np.cov(df)

cov = pd.DataFrame(cov)

cov.to_csv('/gemnetics/cov_matrix.csv')

【问题讨论】:

  • 你的矩阵有多少列? cov 的输出应该被标准化,所以那些大数字没有意义。您应该知道是否有一个一维比另一维大得多的矩形矩阵(在您的情况下为行),那么由于空空间,以这种方式求解 cov 矩阵效率低下。
  • 在这种情况下,我们有大约 10^3 列的东西,所以它不是方阵。我没有考虑过空格,谢谢你提出这个问题
  • 请问下一步是什么?可能有一种方法可以用正确的特征值来处理问题,而不是形成整个协方差矩阵。
  • 我正在尝试多种方法来尝试构建有向无环图,使用协方差值作为节点之间的权重(例如矩阵中的行。矩阵是一系列实验中的基因表达值,并且我想看看数据是否可以显示哪些基因组相互作用,以及以何种方式相互作用)。我猜特征值也可以做到这一点。
  • 似乎应该很快;如今,30k x 1k 并不算大,当然 YMMV。也许 df 类中有一些意想不到的开销——也许尝试将 csv 读入 R 或 Octave 并在那里计算协方差。也许尝试列子集以查看所需时间如何扩展,从而估计所有 1k 列所需的时间。从更大的角度来看,我想知道有向图在这里是否合适,因为协方差似乎更自然地是无向的。听起来您正在寻找无向图中的派系——也许已经在这方面做了一些工作。

标签: python numpy statistics covariance-matrix


【解决方案1】:

由于我不熟悉遗传学,因此我将向您提供一般指南并希望它有效。 假设您将数据保存在一个名为X 的矩阵中,该矩阵为 30+k x 1k。您实际上并不需要标准化您的数据(除非它对您无关紧要),但要计算协方差,您必须将其居中。然后就可以计算出正确的特征向量了:

Xp=X-X.mean(axis=0,keepdims=True)
k=Xp.T @ Xp
ev,R=np.linalg.eigh(k)
ev=ev[::-1]
R=R[:,::-1]

此时您应该查看特征值,看看它们是否有任何突然下降(这是 Scree 方法),我们称这个截止数为n。如果没有,那么您只需要选择要保留的特征值的百分比。 下一步将是重构左特征向量:

L=X @ R[:,:n]

现在R.T 告诉您哪些特征向量组合是重要的,而特征向量 (L) 是您基因中最突出的组合。 我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2015-03-31
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多