Сокращение времени расчета и требований к большой ковариационной матрице

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

Другие вопросы по тегам