减少大协方差矩阵的计算时间和要求

时间:2018-07-26 18:45:27

标签: python numpy statistics covariance-matrix

我目前正在尝试为约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')

1 个答案:

答案 0 :(得分: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)是您基因中最突出的组合。 我希望这会有所帮助。