Сокращение времени расчета и требований к большой ковариационной матрице
В настоящее время я пытаюсь вычислить ковариационную матрицу для матрицы строк ~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 ответ
Поскольку я не знаком с генетикой, я дам вам общие рекомендации и надеюсь, что это сработает. Предположим, у вас есть ваши данные в матрице под названием X
что 30+k на 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
) являются наиболее заметными комбинациями ваших генов. Надеюсь, это поможет.